{"context":{"domain":"natura-geomarketing"},"layers":{"ApplicationLayer":{"reference":"ApplicationLayer","availableInstances":[{"component":"data2-core@DataSet","reference":"ComponentsDataSet","params":{"pagination":{"size":1000},"filter":{"system":{"$exists":false}},"datasource":{"component":"data2-core-types@ProcessReference","params":{"reference":"ComponentsDataSource"}}}},{"component":"data2-core@DataSet","reference":"UserComponentsDataSet","params":{"pagination":{"size":1000},"master":{"dataset":{"component":"data2-core-types@ProcessReference","params":{"reference":"SystemsDataSet"}},"localField":"system","masterField":"_id"},"datasource":{"component":"data2-core-types@ProcessReference","params":{"reference":"ComponentsDataSource"}}}},{"component":"data2-core@DataSet","reference":"ExternalComponentInstancesDataSet","params":{"pagination":{"size":1000},"master":{"dataset":{"component":"data2-core-types@ProcessReference","params":{"reference":"SystemsDataSet"}},"localField":"system","masterField":"_id"},"datasource":{"component":"data2-core-types@ProcessReference","params":{"reference":"ExternalComponentInstancesDataSource"}}}},{"reference":"ComponentsDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[{"_id":"5e9b5444f137eaacb04b3a30","component":"data2-core-types@Component","params":{"public":true,"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"rgba":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"appearance"},"component":"data2-core-types@ComponentParameter"}}}},"component":"Color","package":"data2-core-types","visibility":"public"},"updatedAt":"2022-01-26T19:56:28.471Z"},{"_id":"5e9f5ff0e6bac0d98aa63597","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"Interaction","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"module":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@InteractiveModuleReference"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"},"prop":{"params":{"autocomplete":{"module":{"component":"data2-core-types@Reference","params":{"reference":"module"}}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}}},"component":"data2-core-types@ComponentParameter"},"args":{"params":{"index":{"component":"data2-core-primitives@Number","params":{"content":3}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Inferred"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"componentOptions":{"inferredComponent":{"params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"params"}}],"body":{"component":"data2-core-types@Getter","params":{"args":[{"component":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"params.executedInstanceParams.module.componentDefinition.component"}}}},"subSchemaPath":{"params":{"portions":[{"component":"data2-core-primitives@String","params":{"content":"interactions."}},{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"params.executedInstanceParams.prop"}}}},{"component":"data2-core-primitives@String","params":{"content":".arguments."}},{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"params.innerSubSchemaPath"}}}}]},"component":"data2-core-functions@StringConcat"},"executedInstanceParams":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"params.executedInstanceParams.module.componentDefinition.params"}}}},"instanceReference":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"params.executedInstanceParams.module.componentDefinition.reference"}}}},"rootExecutedInstanceParams":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"params.rootExecutedInstanceParams"}}}}}],"prop":{"component":"data2-core-primitives@String","params":{"content":"inferComponentType"}},"module":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"InspectorController"}},"_layer":{"component":"data2-core-primitives@String","params":{"content":"UserInterfaceLayer"}}},"component":"data2-core-types@ProcessReference"}}}},"component":"data2-core-functions@Function","break":true}}},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2026-03-17T04:46:27.950Z"},{"_id":"5ea0536be6bac0d98ad3808c","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"DataSetMaster","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"dataset":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetReference"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"description":{"component":"data2-core-primitives@String","params":{"content":"The Master DataSet. The cursor of the Master will control the filter of this DataSet."}}},"component":"data2-core-types@ComponentParameter"},"localField":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetColumnReference"}},"index":{"component":"data2-core-primitives@Number","params":{"content":3}},"controlSettings":{"datasetOrigin":{"component":"data2-core-primitives@String","params":{"content":"self"}},"showFilters":{"params":{"content":false},"component":"data2-core-primitives@Boolean"},"dataSet":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"self"}}}}},"expectedPrimitiveTypes":[],"description":{"component":"data2-core-primitives@String","params":{"content":"The field of this DataSet that should match the data of the Master DataSet Field."}}},"component":"data2-core-types@ComponentParameter"},"masterField":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetColumnReference"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}},"controlSettings":{"showFilters":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"datasetOrigin":{"component":"data2-core-primitives@String","params":{"content":"dataset"}},"dataSet":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"dataSet"}}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"The Master DataSet field that should be used to match with the \"local field\"."}},"dependsOn":[{"component":"data2-core-primitives@String","params":{"content":"dataset"}}],"shouldShow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"defaultEmptyId":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":4}},"expectedPrimitiveTypes":[],"title":{"component":"data2-core-primitives@String","params":{"content":"Default Empty Id"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Id that is sent when the master dataset has no current."}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2023-08-16T22:16:11.612Z"},{"_id":"5ec1bc5144f1ebfde238a2e3","component":"data2-core-types@Component","params":{"component":"Component","package":"data2-core-types","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"component":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}},"visibility":{"component":"data2-core-primitives@String","params":{"content":"private"}},"saveCompiled":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"package":{"params":{"visibility":"private","component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"saveCompiled":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"icon":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":3}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"title":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}},"visibility":"public","saveCompiled":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"description":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Description"}},"index":{"component":"data2-core-primitives@Number","params":{"content":4}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"multiLine":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"preview":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@FileComponentUrlReference"}},"index":{"component":"data2-core-primitives@Number","params":{"content":""}},"visibility":"private"},"component":"data2-core-types@ComponentParameter"},"link":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":5}},"visibility":"private"},"component":"data2-core-types@ComponentParameter"},"extends":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":8}},"visibility":"private"},"component":"data2-core-types@ComponentParameter"},"parameters":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@FieldSet"}},"index":{"component":"data2-core-primitives@Number","params":{"content":9}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"interactions":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@FieldSet"}},"index":{"component":"data2-core-primitives@Number","params":{"content":10}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"returnPrimitiveTypes":{"params":{"oneOf":["data2-core-primitives@String","data2-core-primitives@Boolean","data2-core-primitives@Number","data2-core-primitives@Object","data2-core-primitives@Function","data2-core-primitives@Undefined","data2-core-primitives@Null","data2-core-primitives@Generic"],"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"visibility":"private"},"component":"data2-core-types@ComponentParameter"},"definition":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Definition"}},"index":{"component":"data2-core-primitives@Number","params":{"content":12}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"visibility":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Visibility"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Sets the visibility of the component."}},"visibility":"private","oneOf":[{"params":{"content":"public"},"component":"data2-core-primitives@String"},{"params":{"content":"private"},"component":"data2-core-primitives@String"},{"params":{"content":"deprecated"},"component":"data2-core-primitives@String"}],"index":{"component":"data2-core-primitives@Number","params":{"content":6}}}},"states":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@FieldSet"}},"index":{"component":"data2-core-primitives@Number","params":{"content":9.5}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"renderable":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"parameters":{"dimensions":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Dimensions"}},"simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":102}},"category":"appearance"},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@ComponentParameter"},"wrap":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":101}}},"component":"data2-core-types@ComponentParameter"},"hasReference":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"index":{"component":"data2-core-primitives@Number","params":{"content":8}},"visibility":"private"},"component":"data2-core-types@ComponentParameter"},"inlineParamsControl":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"index":{"component":"data2-core-primitives@Number","params":{"content":""}},"visibility":"beta"},"component":"data2-core-types@ComponentParameter"},"fieldValidation":{"component":"data2-core-types@ComponentParameter","params":{"visibility":"private","component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-functions@Function"}},"arguments":[{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":""}},"title":{"component":"data2-core-primitives@String","params":{"content":"currentValue"}}},"component":"data2-core-types@ComponentParameter"}]}},"componentOptions":{"params":{"component":"data2-core-primitives@Object","index":{"component":"data2-core-primitives@Number","params":{"content":20}},"visibility":"private"},"component":"data2-core-types@ComponentParameter"}}}},"componentOptions":{"contextPopulatedParams":{"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"p"}}],"body":{"params":{"fieldsList":{"params":{"mapper":{"params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"v"}},{"component":"data2-core-primitives@String","params":{"content":"k"}}],"body":{"key":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"k"}}}},"value":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"v.mock"}}}}}},"component":"data2-core-functions@Function","break":true},"array":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"p.executedInstanceParams.parameters"}}}}},"component":"data2-core-functions@ArrayMap"}},"component":"data2-core-types@FieldSet"}},"break":true}}},"updatedAt":"2026-05-22T15:04:19.587Z"},{"_id":"5ecd05ded68ce41360f74b43","component":"data2-core-types@Component","params":{"public":true,"product":"ui","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"position":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Position"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":102}},"description":{"component":"data2-core-primitives@String","params":{"content":"Position and move your block around the Artboard. Clicking the crosshair axis fixates the block's distance to its parent's boundaries in the clicked axis direction. Inner axis are proportional wihle outside axis are absolute."}}},"component":"data2-core-types@ComponentParameter"},"dimensions":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Dimensions"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":103}},"description":{"component":"data2-core-primitives@String","params":{"content":"Size and content-related dimensions of the block."}}},"component":"data2-core-types@ComponentParameter"},"childrenMode":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"content","oneOf":[{"params":{"content":"rows"},"component":"data2-core-primitives@String"},{"params":{"content":"reversed-rows"},"component":"data2-core-primitives@String"},{"params":{"content":"cols"},"component":"data2-core-primitives@String"},{"params":{"content":"reversed-cols"},"component":"data2-core-primitives@String"},{"params":{"content":"grid"},"component":"data2-core-primitives@String"},{"params":{"content":"reference"},"component":"data2-core-primitives@String"}],"index":{"component":"data2-core-primitives@Number","params":{"content":221}},"description":{"component":"data2-core-primitives@String","params":{"content":"Determines how children without \"free transform\" option enabled are placed relative to eachother."}}},"component":"data2-core-types@ComponentParameter"},"onClick":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":311}},"injectContext":[{"component":"data2-core-primitives@String","params":{"content":"mouseEvent"}}],"description":{"component":"data2-core-primitives@String","params":{"content":"Executes an action upon user click."}}},"component":"data2-core-types@ComponentParameter"},"onClickOutside":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":311.1}},"description":{"component":"data2-core-primitives@String","params":{"content":"Executes an action upon user clicking outside this block."}}},"component":"data2-core-types@ComponentParameter"},"onMouseEnter":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":313}},"description":{"component":"data2-core-primitives@String","params":{"content":"Executes an action upon user moving the mouse into the block."}}},"component":"data2-core-types@ComponentParameter"},"onMouseLeave":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":313}},"description":{"component":"data2-core-primitives@String","params":{"content":"Executes an action upon user moving the cursor to outside the block."}}},"component":"data2-core-types@ComponentParameter"},"onVisibleOnScreen":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":314}},"description":{"component":"data2-core-primitives@String","params":{"content":"Triggers an action when the block is appearing on the screen."}}},"component":"data2-core-types@ComponentParameter"},"shadow":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Shadow"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":106}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"description":{"component":"data2-core-primitives@String","params":{"content":"Controls shadows and highlights of your block."}}},"component":"data2-core-types@ComponentParameter"},"filter":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@BitmapFilter"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":106}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"description":{"component":"data2-core-primitives@String","params":{"content":"Makes the contents blurred, grayscale, and many other filters."}}},"component":"data2-core-types@ComponentParameter"},"backdropFilter":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@BitmapFilter"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":106}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"description":{"component":"data2-core-primitives@String","params":{"content":"Applies specified filters to what is behind/underneath the block"}}},"component":"data2-core-types@ComponentParameter"},"border":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Border"}},"description":{"component":"data2-core-primitives@String","params":{"content":"border thickness, color and corner radius"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":100}},"defaultValue":{"preventEvaluation":true,"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}}},"component":"data2-core-types@ComponentParameter"},"fill":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Fill"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":104}},"defaultValue":{"preventEvaluation":true,"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"title":{"component":"data2-core-primitives@String","params":{"content":"Fill"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Related to background color."}}},"component":"data2-core-types@ComponentParameter"},"text":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":211}},"description":{"component":"data2-core-primitives@String","params":{"content":"Text content of the block. If defined, the block's children will not be displayed."}},"multiLine":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"textFormat":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@TextFormat"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":215}},"description":{"component":"data2-core-primitives@String","params":{"content":"Formatting of this block's text content."}}},"component":"data2-core-types@ComponentParameter"},"textColor":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Color"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":214}},"description":{"component":"data2-core-primitives@String","params":{"content":"Block's text content color. Unless specified, children will inherit this value."}}},"component":"data2-core-types@ComponentParameter"},"childrenReference":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@ComponentInstanceReference"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":222}},"shouldShow":{"component":"data2-core-comparison-operators@Identical","preventEvaluation":true,"params":{"subject":"reference","comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":"childrenMode"}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"Applies the content of this block as something referenced from other artboards or a router."}}},"component":"data2-core-types@ComponentParameter"},"textSize":{"params":{"category":"content","component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"index":{"component":"data2-core-primitives@Number","params":{"content":212}},"description":{"component":"data2-core-primitives@String","params":{"content":"Block's text font sizing. Unless specified, children will inherit this value."}}},"component":"data2-core-types@ComponentParameter"},"font":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-web@GoogleFont"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":213}},"description":{"component":"data2-core-primitives@String","params":{"content":"The font face of the block and its children. If not specified, uses the nearest specified parent's font."}}},"component":"data2-core-types@ComponentParameter"},"scroll":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Scroll"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":107}},"description":{"component":"data2-core-primitives@String","params":{"content":"Enable or disable scroll behavior and scrollbars."}}},"component":"data2-core-types@ComponentParameter"},"repeat":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetReference"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":231}},"description":{"component":"data2-core-primitives@String","params":{"content":"Repeats (copies) the children of the block 'N' times.  If this property is a DataSet or an Array, 'N' will be equal to its length. Disable the children's \"free transform\" property to place them one after eachother automatically."}}},"component":"data2-core-types@ComponentParameter"},"repeatFilter":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@FieldSet"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":233}},"shouldShow":{"component":"data2-core-primitives@Boolean","preventEvaluation":true,"params":{"content":{"component":"data2-core-types@Reference","params":{"reference":"repeat"}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"Filters the content of the repeater. Works only when the 'repeater' property is a DataSet. Using this property creates a copy of the DataSet that cannot be controlled/refreshed."}}},"component":"data2-core-types@ComponentParameter"},"repeatEmptyState":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@ComponentInstanceReference"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":235}},"shouldShow":{"component":"data2-core-primitives@Boolean","preventEvaluation":true,"params":{"content":{"component":"data2-core-types@Reference","params":{"reference":"repeat"}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"Displays something else when the repeater is empty ('N' = 0)."}}},"component":"data2-core-types@ComponentParameter"},"repeatLoadingState":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@ComponentInstanceReference"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":234}},"shouldShow":{"component":"data2-core-primitives@Boolean","preventEvaluation":true,"params":{"content":{"component":"data2-core-types@Reference","params":{"reference":"repeat"}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"Displays something else when the repeater's DataSet is loading. Has no effect if the \"repeat\" property is not a DataSet"}}},"component":"data2-core-types@ComponentParameter"},"rotate":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":108}},"description":{"component":"data2-core-primitives@String","params":{"content":"Rotates the block around its center."}}},"component":"data2-core-types@ComponentParameter"},"transitions":{"params":{"category":"appearance","component":"data2-core-types@Transition","index":{"component":"data2-core-primitives@Number","params":{"content":109}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"description":{"component":"data2-core-primitives@String","params":{"content":"Defines transitions with duration, delay, and easing settings. Transitions are how the block should interpolate a change of property over time. Note that not all properties can be transitioned."}}},"component":"data2-core-types@ComponentParameter"},"repeatReference":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":232}},"shouldShow":{"component":"data2-core-primitives@Boolean","preventEvaluation":true,"params":{"content":{"component":"data2-core-types@Reference","params":{"reference":"repeat"}}}},"visibility":"public","description":{"component":"data2-core-primitives@String","params":{"content":"Names the data from the \"repeat\" property for each of the block's children. The data can be accessed in this block's children by using a Reference."}}},"component":"data2-core-types@ComponentParameter"},"childrenOverflow":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":101}},"description":{"component":"data2-core-primitives@String","params":{"content":"When activated, no longer confines the children of this block to its boundaries"}}},"component":"data2-core-types@ComponentParameter"},"hide":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":101}},"description":{"component":"data2-core-primitives@String","params":{"content":"Hidden components will not render and will not occupy space affecting non free-transform elements."}}},"component":"data2-core-types@ComponentParameter"},"opacity":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-types@Opacity","category":"appearance","index":101,"description":{"component":"data2-core-primitives@String","params":{"content":"General transparency of the block and its contents. Children has their opacity value relative to their parents."}}}},"stateDefinitions":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-user-interface@StateDefinition"}},"category":"behaviour","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":301}},"description":{"component":"data2-core-primitives@String","params":{"content":"Defines multiple temporary states initialized with their default values. For example, this can be used to hold states like whether the block is hovered, or the amount of times it was clicked. Any data changed is lost when the artboard page is refreshed."}}},"component":"data2-core-types@ComponentParameter"},"onMouseDown":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":312}},"description":{"component":"data2-core-primitives@String","params":{"content":"Executes an action upon user pressing the mouse click."}}},"component":"data2-core-types@ComponentParameter"},"onMouseUp":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":312}},"description":{"component":"data2-core-primitives@String","params":{"content":"Executes an action upon user releasing the mouse click button."}}},"component":"data2-core-types@ComponentParameter"},"cursor":{"params":{"index":{"component":"data2-core-primitives@Number","params":{"content":311}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Cursor style"}},"oneOf":["alias","all-scroll","auto","cell","context-menu","col-resize","copy","crosshair","default","e-resize","ew-resize","grab","grabbing","help","move","n-resize","ne-resize","nesw-resize","ns-resize","nw-resize","nwse-resize","no-drop","none","not-allowed","pointer","progress","row-resize","s-resize","se-resize","sw-resize","text","w-resize","wait","zoom-in","zoom-out"],"category":"appearance","visibility":"public"},"component":"data2-core-types@ComponentParameter"},"repeatLimit":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":232.1}},"shouldShow":{"component":"data2-core-primitives@Boolean","preventEvaluation":true,"params":{"content":{"component":"data2-core-types@Reference","params":{"reference":"repeat"}}}},"visibility":"public","description":{"component":"data2-core-primitives@String","params":{"content":"Limits the 'N' size of the repeater to a specified amount, omitting further copies of the children."}}},"component":"data2-core-types@ComponentParameter"},"repeatKey":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":232.5}},"shouldShow":{"component":"data2-core-primitives@Boolean","preventEvaluation":true,"params":{"content":{"component":"data2-core-types@Reference","params":{"reference":"repeat"}}}},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"},"tabIndex":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":315}},"description":{"component":"data2-core-primitives@String","params":{"content":"Defines the order of block accessibility when pressing TAB."}}},"component":"data2-core-types@ComponentParameter"},"textDecoration":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@TextDecoration"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":215.1}},"visibility":"public","description":{"component":"data2-core-primitives@String","params":{"content":"Block's text support elements. Unless specified, children will inherit this value."}}},"component":"data2-core-types@ComponentParameter"},"tooltip":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":215.2}},"description":{"component":"data2-core-primitives@String","params":{"content":"Displays a text tooltip when hovering the block."}}},"component":"data2-core-types@ComponentParameter"},"preventUserSelection":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Prevent User Selection"}},"category":"behaviour","description":{"component":"data2-core-primitives@String","params":{"content":"Makes the blocks text unselectable. Great for buttons or any clickable content."}}},"component":"data2-core-types@ComponentParameter"},"ignoreMouseEvents":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Ignore Mouse Events"}},"category":"behaviour","description":{"component":"data2-core-primitives@String","params":{"content":"Ingores any cursor interaction with the block. Children may override this value for themselves.\nAlso ignores default TAB behavior."}}},"component":"data2-core-types@ComponentParameter"},"index":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":314.5}},"description":{"component":"data2-core-primitives@String","params":{"content":"Orders the element depth-wise. A higher value will put the current block on top of its siblings with lesser indexes"}}},"component":"data2-core-types@ComponentParameter"},"disabled":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"category":"behaviour","visibility":"public","description":{"component":"data2-core-primitives@String","params":{"content":"Determines if the block can be clicked to execute the \"onClicked\" interaction or not.\nWhen true, it will replace the cursor to \"not-allowed\" on hovering the element."}}},"component":"data2-core-types@ComponentParameter"},"onInvisibleOnScreen":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":314.1}},"visibility":"public","description":{"component":"data2-core-primitives@String","params":{"content":"Triggers an action when the block is no longer seen on screen."}}},"component":"data2-core-types@ComponentParameter"},"onTouchStart":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":302}},"injectContext":[{"component":"data2-core-primitives@String","params":{"content":"mouseEvent"}}],"description":{"component":"data2-core-primitives@String","params":{"content":"Executes an action upon user touch starts."}}},"component":"data2-core-types@ComponentParameter"},"onTouchEnd":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":303}},"injectContext":[{"component":"data2-core-primitives@String","params":{"content":"mouseEvent"}}],"description":{"component":"data2-core-primitives@String","params":{"content":"Executes an action upon user touch ends."}}},"component":"data2-core-types@ComponentParameter"},"accessibilityRole":{"params":{"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":316}},"description":{"component":"data2-core-primitives@String","params":{"content":"Defines the role of an element, helping assistive technologies understand its purpose (e.g., role=\"button\")."}},"component":"data2-core-primitives@String","oneOf":["banner","navigation","main","complementary","contentinfo","region","alert","dialog","button","checkbox","heading","link","list","listitem","tablist","tab","tabpanel","textbox","progressbar","slider",{"params":{"content":"alertdialog"},"component":"data2-core-primitives@String"}],"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"accessibilityLabel":{"params":{"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":332}},"description":{"component":"data2-core-primitives@String","params":{"content":"Provides a text label for an element that might not have visible text, offering a description for assistive tech."}},"component":"data2-core-primitives@String","visibility":"public"},"component":"data2-core-types@ComponentParameter"},"accessibilityLevel":{"params":{"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":318}},"description":{"component":"data2-core-primitives@String","params":{"content":"Defines the level of an element, helping assistive technologies (e.g., aria-level=\"1\")."}},"component":"data2-core-primitives@String","visibility":"public"},"component":"data2-core-types@ComponentParameter"},"accessibilityHide":{"params":{"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":315.5}},"description":{"component":"data2-core-primitives@String","params":{"content":"If true, hides the Block from screen readers"}},"component":"data2-core-primitives@Boolean","visibility":"public"},"component":"data2-core-types@ComponentParameter"},"onDragEnter":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":311}},"injectContext":[{"component":"data2-core-primitives@String","params":{"content":"mouseEvent"}}],"description":{"component":"data2-core-primitives@String","params":{"content":"Executes an action upon user is dragging a file and enters the block area."}}},"component":"data2-core-types@ComponentParameter"},"onDragLeave":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":311}},"injectContext":[{"component":"data2-core-primitives@String","params":{"content":"mouseEvent"}}],"description":{"component":"data2-core-primitives@String","params":{"content":"Executes an action upon user is dragging a file and leaves the block area."}}},"component":"data2-core-types@ComponentParameter"},"onDrop":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":311}},"injectContext":[{"component":"data2-core-primitives@String","params":{"content":"mouseEvent"}}],"description":{"component":"data2-core-primitives@String","params":{"content":"Executes an action upon user is dragging a file and drops inside the block area."}}},"component":"data2-core-types@ComponentParameter"},"accessibilityModal":{"params":{"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":320}},"description":{"component":"data2-core-primitives@String","params":{"content":"Defines if an element is a modal for accessibility purposes."}},"component":"data2-core-primitives@Boolean","visibility":"private"},"component":"data2-core-types@ComponentParameter"},"transform":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Transform"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":110}},"description":{"component":"data2-core-primitives@String","params":{"content":"Composable list of CSS transforms (translate, scale, rotate, skew, perspective). Order matters — items render left-to-right. Adding any 3D transform automatically applies preserve-3d so children render in 3D space."}},"visibility":"private","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"lightInteraction":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@LightInteraction"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":111}},"description":{"component":"data2-core-primitives@String","params":{"content":"Opts this block into the Artboard's GlobalLights. Configure whether the block casts a shadow per light and whether it catches the light's color as an inner highlight."}},"visibility":"private"},"component":"data2-core-types@ComponentParameter"}}}},"extendable":{"placeholder":"children"},"component":"Block","package":"data2-core-primitives","icon":"square","title":{"component":"data2-core-primitives@String","params":{"content":"Block"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Block is the main primitive for building layouts."}},"preview":{"disabled":true,"component":"data2-core-types@FileComponentUrlReference","params":{}},"visibility":"public"},"updatedAt":"2026-05-20T13:31:51.228Z"},{"_id":"5ed4a856d68ce41360db31b4","component":"data2-core-types@Component","params":{"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"dataset":{"component":"data2-core-types@DataSetReference"},"fields":{"component":"data2-core-types@DataSetColumnReference"}}}},"public":false,"component":"DataGrid","package":"data2-controls","visibility":"deprecated"},"updatedAt":"2022-03-22T14:25:32.194Z"},{"_id":"5ed503bfd68ce41360e5687d","component":"data2-core-types@Component","params":{"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"params":{"children":{"component":"data2-controls@Field","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}}}},"dimensions":{"params":{"reference":"dimensions"},"component":"data2-core-types@Reference"},"position":{"params":{"reference":"position"},"component":"data2-core-types@Reference"},"tabIndex":{"params":{"reference":"tabIndex"},"component":"data2-core-types@Reference"},"style":{"params":{"reference":"style"},"component":"data2-core-types@Reference"}},"component":"data2-core-primitives@Block"}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"dimensions":{"component":"data2-core-types@Dimensions"},"position":{"component":"data2-core-types@Position"},"style":{"component":"data2-core-types@StyleSheet"},"dataset":{"component":"data2-core-types@DataSetReference"},"field":{"component":"data2-core-types@DataSetColumnReference"},"tabIndex":"Number"}}},"public":false,"component":"DataField","package":"data2-blocks","visibility":"deprecated"},"updatedAt":"2022-03-22T14:26:01.789Z"},{"_id":"5ed64d9dd68ce413600996c9","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"Dimensions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"width":{"params":{"component":"data2-core-primitives@Number","saveCompiled":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"height":{"params":{"component":"data2-core-primitives@Number","saveCompiled":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"exactHeight":{"params":{"component":"data2-core-primitives@Number","saveCompiled":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"visibility":"private"},"component":"data2-core-types@ComponentParameter"},"exactWidth":{"params":{"component":"data2-core-primitives@Number","saveCompiled":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"visibility":"private"},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2025-03-07T19:27:31.829Z"},{"_id":"5ed9bed7b9e0891ce913e884","component":"data2-core-types@Component","params":{"package":"data2-core","component":"DataSource","icon":"database","visibility":"private","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"position":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Position"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":101}},"simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"},"dimensions":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Dimensions"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":101}},"simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"defaultValue":{"preventEvaluation":true,"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768}},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"}}}},"renderable":{"dimensions":{"disabled":false,"component":"data2-core-types@Dimensions","params":{"width":1366,"exactWidth":false,"exactHeight":false,"height":768}}}},"updatedAt":"2022-07-06T22:30:08.401Z"},{"_id":"5ef24b8f76b2b8399ed3a9d3","component":"data2-core-types@Component","params":{"component":"DataGridBlock","package":"data2-blocks","icon":"table","public":true,"extends":"data2-core-primitives@Block","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"dataset":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetReference"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"},"fields":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@FieldReference"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":2}}},"component":"data2-core-types@ComponentParameter"},"sortable":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"index":{"component":"data2-core-primitives@Number","params":{"content":8}},"category":"behaviour"},"component":"data2-core-types@ComponentParameter"},"pagination":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"index":{"component":"data2-core-primitives@Number","params":{"content":7}},"category":"behaviour"},"component":"data2-core-types@ComponentParameter"},"onRowDoubleClick":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":6}}},"component":"data2-core-types@ComponentParameter"},"highlightColors":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Color"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":5}},"category":"appearance"},"component":"data2-core-types@ComponentParameter"},"headerColors":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Color"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":3}},"category":"appearance"},"component":"data2-core-types@ComponentParameter"},"rowColors":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Color"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":4}},"category":"appearance"},"component":"data2-core-types@ComponentParameter"},"rowActions":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"html@button"}},"visibility":"private","category":"content","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}}}},"definition":{"preventEvaluation":true,"component":"data2-controls@DataGrid","params":{"style":{"width":"100%","height":"100%"},"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"fields":{"component":"data2-core-types@Reference","params":{"reference":"fields"}},"sortable":{"component":"data2-core-types@Reference","params":{"reference":"sortable"}},"pagination":{"component":"data2-core-types@Reference","params":{"reference":"pagination"}},"onRowDoubleClick":{"component":"data2-core-types@Reference","params":{"reference":"onRowDoubleClick"}},"fill":{"component":"data2-core-types@Reference","params":{"reference":"super.fill"}},"textSize":{"component":"data2-core-types@Reference","params":{"reference":"super.textSize"}},"textColor":{"component":"data2-core-types@Reference","params":{"reference":"super.textColor"}},"rowColors":{"component":"data2-core-types@Reference","params":{"reference":"rowColors"}},"highlightColors":{"component":"data2-core-types@Reference","params":{"reference":"highlightColors"}},"headerColors":{"component":"data2-core-types@Reference","params":{"reference":"headerColors"}},"rowActions":{"component":"data2-core-types@Reference","params":{"reference":"rowActions"}}}},"visibility":"public"},"updatedAt":"2022-01-26T16:33:57.383Z"},{"_id":"5f3e0dbace656fcadc20f2a4","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"Getter","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"module":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@InteractiveModuleReference"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"},"prop":{"params":{"autocomplete":{"preventEvaluation":true,"component":"data2-core-types@FieldSet","params":{"fields":{"module":{"component":"data2-core-types@Reference","params":{"reference":"module"}}}}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}},"dependsOn":[{"component":"data2-core-primitives@String","params":{"content":"module"}}],"parameters":{},"alternativeParameterDefaultType":[{"parameter":{"component":"data2-core-primitives@String","params":{"content":"module"}},"value":{"params":{"reference":"__UIState"},"component":"data2-core-types@InteractiveModuleReference"},"type":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-user-interface@StateProp"}}},"component":"data2-core-types@ComponentParameter"}}],"shouldShow":{"component":"data2-core-primitives@Boolean","params":{"content":true},"preventEvaluation":true}},"component":"data2-core-types@ComponentParameter"},"args":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":3}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"dependsOn":[{"component":"data2-core-primitives@String","params":{"content":"module"}}]},"component":"data2-core-types@ComponentParameter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"module"}},"preview":{"params":{"portions":[{"component":"data2-core-primitives@String","params":{"content":"Getter | "}},{"params":{"compare":[{"component":"data2-core-types@Getter","params":{"module":{"params":{"pattern":{"component":"data2-core-types@Regex","params":{"pattern":"^data\\.states"}},"text":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"prop"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-functions@Match"},"prop":{"component":"data2-core-primitives@String","params":{"content":"0"}}}}],"else":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"prop"}}}},"then":{"params":{"content":"UIState"},"component":"data2-core-primitives@String"}},"component":"data2-core-flow@If"}]},"component":"data2-core-functions@StringConcat"}},"updatedAt":"2026-07-16T15:17:34.946Z"},{"_id":"5f3e0e74ce656fcadc211511","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"FileComponentReference","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"reference":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}},"component":"data2-core-types@ComponentParameter"},"preventEvaluation":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"defaultValue":{"params":{},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2023-02-27T22:37:10.168Z"},{"_id":"5f472ae463c680de4ff296e9","component":"data2-core-types@Component","params":{"product":"registry","package":"data2-core","component":"Data2TableDataSource","extends":"data2-core@DataSource","icon":{"component":"data2-core-primitives@String","params":{"content":"table"}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"table":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"visibility":"private","defaultValue":{"params":{"reference":"reference"},"component":"data2-core-types@Reference"}},"component":"data2-core-types@ComponentParameter"},"schema":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Field"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"description":{"component":"data2-core-primitives@String","params":{"content":"Fields/Columns of the table"}}},"component":"data2-core-types@ComponentParameter"},"multi":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"index":{"component":"data2-core-primitives@Number","params":{"content":4}},"defaultValue":["create"],"autocomplete":{"params":{},"component":"data2-core-primitives@Object"}},"component":"data2-core-types@ComponentParameter"},"policies":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-auth@Policy"}},"index":{"component":"data2-core-primitives@Number","params":{"content":3}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"description":{"component":"data2-core-primitives@String","params":{"content":"Policies for allowing/denying access to the table"}}},"component":"data2-core-types@ComponentParameter"},"semanticSearch":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"index":{"component":"data2-core-primitives@Number","params":{"content":5}},"visibility":"public","saveCompiled":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"semanticSearchFilterFields":{"params":{"index":{"component":"data2-core-primitives@Number","params":{"content":6}},"visibility":"beta","saveCompiled":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"component":"data2-core-primitives@String","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"useEstimatedDocumentCount":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Boolean","visibility":"public","unversioned":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"description":{"component":"data2-core-primitives@String","params":{"content":"If true, will not run a query against the database to count the documents. Instead, will read the total records from the database metadata, avoiding scanning the database, thus improving performance for large tables. \nCaution: activating this will make the `pagination.total` parameter to always return all records of the table, ignoring any filters applied."}}}},"semanticSearchFields":{"params":{"index":{"component":"data2-core-primitives@Number","params":{"content":5}},"visibility":"beta","saveCompiled":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"component":"data2-core-primitives@String","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"schemaSource":{"params":{"component":"data2-core-types@SchemaReference","visibility":"private"},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"private","renderable":{"dimensions":{"disabled":false,"component":"data2-core-types@Dimensions","params":{"width":1366,"exactWidth":false,"exactHeight":false,"height":768}}}},"updatedAt":"2026-05-08T12:46:10.289Z"},{"_id":"5f494791a575399a45020f87","component":"data2-core-types@Component","params":{"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"html@input","params":{"style":{"width":"100%","height":"100%","boxSizing":"border-box","background":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"type","source":"VIRTUAL_COMPONENT_PARAMS"},"component":"data2-core-types@Reference"},"comparisonSubject":"checkbox"}}],"then":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"component":"data2-core-types@DataLinkGetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset","source":"VIRTUAL_COMPONENT_PARAMS"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field","source":"VIRTUAL_COMPONENT_PARAMS"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record","source":"VIRTUAL_COMPONENT_PARAMS"}}}},"comparisonSubject":true}}],"then":{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"checkboxFill"}}}},"rgba(0,118,255,1)"]},"component":"data2-core-logical-operators@Or"},"else":{"params":{"content":"none"},"component":"data2-core-primitives@String"}}},"else":{"params":{"content":"none"},"component":"data2-core-primitives@String"}}},"color":{"params":{"reference":"super.textColor"},"component":"data2-core-types@Reference"},"border":"none","outline":"none","appearance":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"orient","source":"VIRTUAL_COMPONENT_PARAMS"},"component":"data2-core-types@Reference"},"comparisonSubject":"vertical"}}],"then":"slider-vertical","else":"none"}},"cursor":{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"super.cursor"}}}},{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"disabled","source":"VIRTUAL_COMPONENT_PARAMS"},"component":"data2-core-types@Reference"},"comparisonSubject":true}}],"then":{"component":"data2-core-primitives@String","params":{"content":"not-allowed"}},"else":{"component":"data2-core-primitives@String","params":{"content":"auto"}}}}]},"component":"data2-core-logical-operators@Or"},"fontWeight":{"component":"data2-core-primitives@String","params":{"content":"inherit"}},"paddingLeft":{"component":"data2-core-flow@If","params":{"compare":[{"params":{"comparisonSubject":{"params":{},"component":"data2-core-primitives@Undefined"},"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"padding.left"}}}}},"component":"data2-core-comparison-operators@Different"}],"then":{"params":{"portions":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"padding.left"}}}},{"component":"data2-core-primitives@String","params":{"content":"px"}}]},"component":"data2-core-functions@StringConcat"}}},"paddingRight":{"component":"data2-core-flow@If","params":{"compare":[{"params":{"comparisonSubject":{"params":{},"component":"data2-core-primitives@Undefined"},"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"padding.right"}}}}},"component":"data2-core-comparison-operators@Different"}],"then":{"params":{"portions":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"padding.right"}}}},{"component":"data2-core-primitives@String","params":{"content":"px"}}]},"component":"data2-core-functions@StringConcat"}}},"caretColor":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"caretColor"}}}},"textAlign":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"super.textFormat.textAlign"}}},"component":"data2-core-types@Reference"}},"tabIndex":{"component":"data2-core-types@Reference","params":{"reference":"tabIndex","source":"VIRTUAL_COMPONENT_PARAMS"}},"step":{"component":"data2-core-types@Reference","params":{"reference":"step","source":"VIRTUAL_COMPONENT_PARAMS"}},"min":{"component":"data2-core-types@Reference","params":{"reference":"min","source":"VIRTUAL_COMPONENT_PARAMS"}},"max":{"component":"data2-core-types@Reference","params":{"reference":"max","source":"VIRTUAL_COMPONENT_PARAMS"}},"maxLength":{"params":{"then":{"params":{},"component":"data2-core-primitives@Undefined"},"compare":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":"maxLength","source":"VIRTUAL_COMPONENT_PARAMS"}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":""}}},"component":"data2-core-comparison-operators@Equal"}],"else":{"component":"data2-core-types@Reference","params":{"reference":"maxLength","source":"VIRTUAL_COMPONENT_PARAMS"}}},"component":"data2-core-flow@If"},"orient":{"component":"data2-core-types@Reference","params":{"reference":"orient","source":"VIRTUAL_COMPONENT_PARAMS"}},"type":{"component":"data2-core-types@Reference","params":{"reference":"type","source":"VIRTUAL_COMPONENT_PARAMS"}},"placeholder":{"component":"data2-core-logical-operators@Or","params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":"placeholder","source":"VIRTUAL_COMPONENT_PARAMS"}},{"component":"data2-core-types@Reference","params":{"reference":"field","source":"VIRTUAL_COMPONENT_PARAMS"}}]}},"value":{"params":{"expression":{"params":{"content":true},"component":"data2-core-primitives@Boolean"},"defaultCase":{"component":"data2-core-types@DataLinkGetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset","source":"VIRTUAL_COMPONENT_PARAMS"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field","source":"VIRTUAL_COMPONENT_PARAMS"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record","source":"VIRTUAL_COMPONENT_PARAMS"}},"mask":{"component":"data2-core-types@Reference","params":{"reference":"mask","source":"VIRTUAL_COMPONENT_PARAMS"}}}},"cases":[{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"type","source":"VIRTUAL_COMPONENT_PARAMS"},"component":"data2-core-types@Reference"},"comparisonSubject":"date"}},"value":{"component":"data2-core-functions@DateFormat","params":{"date":{"component":"data2-core-types@DataLinkGetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset","source":"VIRTUAL_COMPONENT_PARAMS"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field","source":"VIRTUAL_COMPONENT_PARAMS"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record","source":"VIRTUAL_COMPONENT_PARAMS"}}}},"format":"YYYY-MM-DD"}}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"type","source":"VIRTUAL_COMPONENT_PARAMS"},"component":"data2-core-types@Reference"},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"month"}}}},"value":{"component":"data2-core-functions@DateFormat","params":{"date":{"component":"data2-core-types@DataLinkGetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset","source":"VIRTUAL_COMPONENT_PARAMS"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field","source":"VIRTUAL_COMPONENT_PARAMS"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record","source":"VIRTUAL_COMPONENT_PARAMS"}}}},"format":{"component":"data2-core-primitives@String","params":{"content":"YYYY-MM"}}}}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"type","source":"VIRTUAL_COMPONENT_PARAMS"},"component":"data2-core-types@Reference"},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"datetime-local"}}}},"value":{"component":"data2-core-functions@DateFormat","params":{"date":{"component":"data2-core-types@DataLinkGetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset","source":"VIRTUAL_COMPONENT_PARAMS"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field","source":"VIRTUAL_COMPONENT_PARAMS"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record","source":"VIRTUAL_COMPONENT_PARAMS"}}}},"format":{"component":"data2-core-primitives@String","params":{"content":"YYYY-MM-DDTHH:mm"}}}}}}]},"component":"data2-core-flow@Switch"},"onChange":{"component":"data2-core-types@DataLinkSetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset","source":"VIRTUAL_COMPONENT_PARAMS"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field","source":"VIRTUAL_COMPONENT_PARAMS"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record","source":"VIRTUAL_COMPONENT_PARAMS"}},"recordUpsert":{"component":"data2-core-types@Reference","params":{"reference":"recordUpsert","source":"VIRTUAL_COMPONENT_PARAMS"}},"onChange":{"component":"data2-core-types@Reference","params":{"reference":"onChange","source":"VIRTUAL_COMPONENT_PARAMS"}},"mask":{"component":"data2-core-types@Reference","params":{"reference":"mask","source":"VIRTUAL_COMPONENT_PARAMS"}}}},"defaultChecked":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"type","source":"VIRTUAL_COMPONENT_PARAMS"},"component":"data2-core-types@Reference"},"comparisonSubject":"checkbox"}}],"then":{"component":"data2-core-types@DataLinkGetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset","source":"VIRTUAL_COMPONENT_PARAMS"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field","source":"VIRTUAL_COMPONENT_PARAMS"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record","source":"VIRTUAL_COMPONENT_PARAMS"}}}},"else":""}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"opacity":{"component":"data2-core-flow@If","params":{"compare":[{"params":{"reference":"disabled","source":"VIRTUAL_COMPONENT_PARAMS"},"component":"data2-core-types@Reference"}],"then":0.38,"else":1}},"disabled":{"params":{"reference":"disabled","source":"VIRTUAL_COMPONENT_PARAMS"},"component":"data2-core-types@Reference"},"autoComplete":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Equal","params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":"builder"}},"comparisonSubject":true}}],"then":"new-password","else":{"params":{"compare":{"params":{"comparisonSubject":{"params":{"content":true},"component":"data2-core-primitives@Boolean"},"subject":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"autoComplete"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-comparison-operators@Identical"},"else":{"params":{"components":[{"params":{"reference":"autoComplete","source":"VIRTUAL_COMPONENT_PARAMS"},"component":"data2-core-types@Reference"},{"component":"data2-core-primitives@String","params":{"content":"off"}}]},"component":"data2-core-logical-operators@Or"}},"component":"data2-core-flow@If"}}},"data-lpignore":{"component":"data2-core-flow@If","params":{"compare":[{"params":{"reference":"autoComplete","source":"VIRTUAL_COMPONENT_PARAMS"},"component":"data2-core-types@Reference"}],"then":"","else":"true"}},"onFocus":{"component":"data2-core-types@Reference","params":{"reference":"onFocus","source":"VIRTUAL_COMPONENT_PARAMS"}},"onBlur":{"component":"data2-core-types@Reference","params":{"reference":"onBlur","source":"VIRTUAL_COMPONENT_PARAMS"}},"onKeyPress":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"onKeyPress"}}}},"autoCapitalize":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"autoCapitalize"}}}},"spellCheck":{"params":{"expression":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"spellCheck"}}},"component":"data2-core-types@Reference"},"cases":[{"component":"data2-core-flow@Case","params":{"expression":{"params":{"content":true},"component":"data2-core-primitives@Boolean"},"value":{"component":"data2-core-primitives@String","params":{"content":"true"}}}},{"component":"data2-core-flow@Case","params":{"expression":{"params":{"content":false},"component":"data2-core-primitives@Boolean"},"value":{"component":"data2-core-primitives@String","params":{"content":"false"}}}}]},"component":"data2-core-flow@Switch"}}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"tabIndex":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":210}}},"component":"data2-core-types@ComponentParameter"},"dataset":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@InteractiveModuleReference"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":91}},"description":{"component":"data2-core-primitives@String","params":{"content":"The location of the Data you want to bind this field to."}}},"component":"data2-core-types@ComponentParameter"},"field":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetColumnReference"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":92}},"alternativeParameterDefaultType":[{"parameter":{"component":"data2-core-primitives@String","params":{"content":"dataset"}},"value":{"params":{"reference":"__UIState"},"component":"data2-core-types@InteractiveModuleReference"},"type":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-user-interface@StateProp"}}},"component":"data2-core-types@ComponentParameter"}}],"shouldShow":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"dependsOn":[{"component":"data2-core-primitives@String","params":{"content":"dataset"}}]},"component":"data2-core-types@ComponentParameter"},"record":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Reference"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":203}}},"component":"data2-core-types@ComponentParameter"},"recordUpsert":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":204}}},"component":"data2-core-types@ComponentParameter"},"type":{"params":{"oneOf":["text","number","time","password","checkbox","month","email","range","date",{"component":"data2-core-primitives@String","params":{"content":"datetime-local"}},"color","radio"],"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":101}}},"component":"data2-core-types@ComponentParameter"},"mask":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":103}},"description":{"component":"data2-core-primitives@String","params":{"content":"Applies a mask to the input, changing how the data is visualized, but not the data itself."}}},"component":"data2-core-types@ComponentParameter"},"placeholder":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":102}}},"component":"data2-core-types@ComponentParameter"},"disabled":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":205}},"description":{"component":"data2-core-primitives@String","params":{"content":"Disables user interaction with the field."}}},"component":"data2-core-types@ComponentParameter"},"autoComplete":{"params":{"component":"data2-core-primitives@String","category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":206}},"oneOf":[{"params":{"content":"off"},"component":"data2-core-primitives@String"},{"params":{"content":"on"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"},"step":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":207}}},"component":"data2-core-types@ComponentParameter"},"maxLength":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":208}},"description":{"component":"data2-core-primitives@String","params":{"content":"Maximum length of a text field."}}},"component":"data2-core-types@ComponentParameter"},"min":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":208}}},"component":"data2-core-types@ComponentParameter"},"max":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":209}},"description":{"component":"data2-core-primitives@String","params":{"content":"For numeric inputs, set the maximum allowed value."}}},"component":"data2-core-types@ComponentParameter"},"orient":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"oneOf":[{"params":{"content":"vertical"},"component":"data2-core-primitives@String"},{"params":{"content":"horizontal"},"component":"data2-core-primitives@String"}],"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":104}}},"component":"data2-core-types@ComponentParameter"},"onChange":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":301}}},"component":"data2-core-types@ComponentParameter"},"onFocus":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":302}}},"component":"data2-core-types@ComponentParameter"},"onBlur":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":303}}},"component":"data2-core-types@ComponentParameter"},"onKeyPress":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":304}}},"component":"data2-core-types@ComponentParameter"},"padding":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"parameters":{"left":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}}},"component":"data2-core-types@ComponentParameter"},"right":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}}},"component":"data2-core-types@ComponentParameter"}},"visibility":"public","index":{"component":"data2-core-primitives@Number","params":{"content":110}},"category":"appearance"}},"checkboxFill":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-types@Color","key":{"component":"data2-core-primitives@String","params":{"content":"checkboxFill"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Checkbox Fill"}},"shouldShow":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"type"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"checkbox"}}},"component":"data2-core-comparison-operators@Equal"}}},"autoCapitalize":{"params":{"component":"data2-core-primitives@String","category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":206.1}},"oneOf":[{"params":{"content":"off"},"component":"data2-core-primitives@String"},{"params":{"content":"on"},"component":"data2-core-primitives@String"},{"params":{"content":"words"},"component":"data2-core-primitives@String"},{"params":{"content":"characters"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"},"spellCheck":{"params":{"component":"data2-core-primitives@Boolean","category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":206.2}}},"component":"data2-core-types@ComponentParameter"},"onEnter":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":304}}},"component":"data2-core-types@ComponentParameter"},"caretColor":{"params":{"component":"data2-core-types@Color","category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":111}}},"component":"data2-core-types@ComponentParameter"}}}},"component":"DataFieldBlock","package":"data2-blocks","icon":"keyboard-o","extends":"data2-core-primitives@Block","visibility":"public"},"updatedAt":"2026-03-11T19:02:08.869Z"},{"_id":"5f6b9985a575399a452b2386","component":"data2-core-types@Component","params":{"package":"data2-core-comparison-operators","component":"EqualOrGreaterThan","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"comparisonSubject":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"title":{"component":"data2-core-primitives@String","params":{"content":"Comparison Subject"}}},"component":"data2-core-types@ComponentParameter"},"subject":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}},"title":{"component":"data2-core-primitives@String","params":{"content":"Subject"}}},"component":"data2-core-types@ComponentParameter"}}}},"title":{"component":"data2-core-primitives@String","params":{"content":"EqualOrGreaterThan"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Equivalent to: subject ≥ comparisonSubject."}},"returnPrimitiveTypes":[{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}}],"wrap":{"component":"data2-core-primitives@String","params":{"content":"subject"}}},"updatedAt":"2026-06-16T17:08:46.201Z"},{"_id":"5f6d167ca575399a457b1a7e","component":"data2-core-types@Component","params":{"package":"data2-core-logical-operators","component":"Not","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"subject":{"component":"data2-core-primitives@Boolean"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"subject"}},"inlineParamsControl":{"component":"data2-core-primitives@Boolean","params":{"content":false}}},"updatedAt":"2023-10-19T10:30:47.029Z"},{"_id":"5f7141a1e2d6fd3e21baeed0","component":"data2-core-types@Component","params":{"package":"data2-core-functions","component":"StringConcat","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"portions":{"component":"data2-core-primitives@String","inline":true,"list":true}}}},"returnPrimitiveTypes":["data2-core-primitives@String"],"wrap":{"component":"data2-core-primitives@String","params":{"content":"portions.0"}}},"updatedAt":"2022-09-12T20:29:27.218Z"},{"_id":"5f82227ec8da12be8be3966f","component":"data2-core-types@Component","params":{"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"html@label","params":{"children":[{"component":"html@input","params":{"key":"checkbox","type":"checkbox","style":{"width":18,"height":18,"boxSizing":"border-box","background":{"params":{"reference":"super.fill"},"component":"data2-core-types@Reference"},"color":{"params":{"reference":"super.textColor"},"component":"data2-core-types@Reference"},"appearance":"none","border":"none","outline":"none","cursor":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"disabled"},"component":"data2-core-types@Reference"},"comparisonSubject":true}}],"then":"not-allowed","else":"auto"}}},"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"placeholder":{"component":"data2-core-logical-operators@Or","params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":"placeholder"}},{"component":"data2-core-types@Reference","params":{"reference":"field"}}]}},"checked":{"component":"data2-core-logical-operators@Or","params":{"components":[{"component":"data2-core-types@DataLinkGetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record"}}}},false]}},"onChange":{"component":"data2-core-types@DataLinkSetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record"}}}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"disabled":{"params":{"reference":"disabled"},"component":"data2-core-types@Reference"}}},{"component":"data2-porcelain@Label","params":{"key":"label","super":{"text":{"component":"data2-core-types@Reference","params":{"reference":"label"}},"style":{"marginLeft":10}},"packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}}],"style":{"display":"flex"}}}}},"super":{"fill":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"type"},"component":"data2-core-types@Reference"},"comparisonSubject":"button"}}],"then":{"component":"data2-core-types@PackageGetter","params":{"field":"colors.background-2","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}}}},"font":{"component":"data2-core-types@PackageGetter","params":{"field":"font","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}},"border":{"radius":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"type"},"component":"data2-core-types@Reference"},"comparisonSubject":"button"}}],"then":{"component":"data2-core-types@PackageGetter","params":{"field":"radius.r2","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}}}}},"shadow":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"type"},"component":"data2-core-types@Reference"},"comparisonSubject":"button"}}],"then":{"component":"data2-core-types@PackageGetter","params":{"field":"gums.small","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}}}},"style":{"display":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"type"},"component":"data2-core-types@Reference"},"comparisonSubject":"button"}}],"then":"flex"}},"alignItems":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"type"},"component":"data2-core-types@Reference"},"comparisonSubject":"button"}}],"then":"center"}},"justifyContent":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"type"},"component":"data2-core-types@Reference"},"comparisonSubject":"button"}}],"then":"center"}},"opacity":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"disabled"},"component":"data2-core-types@Reference"},"comparisonSubject":true}}],"then":0.38,"else":1}}," input[type=\"checkbox\"]":{"position":"relative","cursor":"pointer"}," input[type=\"checkbox\"]:before":{"content":" ","display":"block","position":"absolute","width":14,"height":14,"top":0,"left":0,"border":"2px solid","borderColor":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"component":"data2-core-types@PackageGetter","params":{"field":"mode","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}},"comparisonSubject":"dark"}}],"then":{"component":"data2-core-types@PackageGetter","params":{"field":"colors.white-60","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}},"else":{"component":"data2-core-types@PackageGetter","params":{"field":"colors.black-20","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}}}},"borderRadius":2}," input[type=\"checkbox\"]:checked:before":{"border":"2px solid","borderColor":{"component":"data2-core-types@PackageGetter","params":{"field":"colors.primary","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}},"backgroundColor":{"component":"data2-core-types@PackageGetter","params":{"field":"colors.primary","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}}}," input[type=\"checkbox\"]:checked:after":{"content":" ","display":"block","width":5,"height":10,"borderStyle":"solid","borderColor":{"component":"data2-core-types@PackageGetter","params":{"field":"colors.white","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}},"borderWidth":"0 2px 2px 0","transform":"rotate(45deg)","position":"absolute","top":2,"left":6}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"dataset":{"component":"data2-core-types@DataSetReference"},"field":{"component":"data2-core-types@DataSetColumnReference"},"record":{"component":"data2-core-types@Reference"},"label":{"component":"data2-core-primitives@String"},"disabled":{"component":"data2-core-primitives@Boolean"},"type":{"component":"data2-core-primitives@String","oneOf":["normal","button"]},"packageReference":{"component":"data2-core-primitives@String"}}}},"component":"Checkbox","package":"data2-porcelain","icon":"check-square-o","extends":"data2-core-primitives@Block","visibility":"deprecated"}},{"_id":"5f8733a0c8da12be8b7910f8","component":"data2-core-types@Component","params":{"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"html@div","params":{"children":[{"component":"html@input","params":{"key":"input","type":{"component":"data2-core-types@Reference","params":{"reference":"type"}},"style":{"width":"100%","height":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"variation"},"component":"data2-core-types@Reference"},"comparisonSubject":"underlinedLabelAside"}}],"then":"calc(100% - 12px)","else":"100%"}},"minWidth":0,"boxSizing":"border-box","color":{"component":"data2-core-types@PackageGetter","params":{"field":"colors.color-2","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}},"position":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"variation"},"component":"data2-core-types@Reference"},"comparisonSubject":"underlinedLabelAside"}}],"else":"absolute"}},"background":"none","appearance":"none","border":"none","borderBottom":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"variation"},"component":"data2-core-types@Reference"},"comparisonSubject":"underlinedLabelAside"}}],"then":{"component":"data2-core-functions@StringConcat","params":{"portions":["solid 2px ",{"component":"data2-core-types@PackageGetter","params":{"field":"colors.background-4","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}}]}},"else":"none"}},"outline":"none","padding":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"variation"},"component":"data2-core-types@Reference"},"comparisonSubject":"outlined"}}],"then":"0 0 0 1rem","else":0}},"paddingTop":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"variation"},"component":"data2-core-types@Reference"},"comparisonSubject":"underlinedLabelAside"}}],"then":"12px"}},"cursor":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"disabled"},"component":"data2-core-types@Reference"},"comparisonSubject":true}}],"then":"not-allowed","else":"auto"}}},"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"value":{"component":"data2-core-types@DataLinkGetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record"}}}},"onChange":{"component":"data2-core-types@DataLinkSetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record"}}}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"disabled":{"params":{"reference":"disabled"},"component":"data2-core-types@Reference"}}},{"component":"html@label","params":{"key":"label","children":{"component":"data2-core-logical-operators@Or","params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":"label"}},{"component":"data2-core-types@Reference","params":{"reference":"field"}}]}},"style":{"fontFamily":"inherit","top":0,"left":0,"position":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"variation"},"component":"data2-core-types@Reference"},"comparisonSubject":"underlinedLabelAside"}}],"else":"absolute"}},"zIndex":1,"color":{"component":"data2-core-types@PackageGetter","params":{"field":"colors.color-5","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}},"marginRight":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"variation"},"component":"data2-core-types@Reference"},"comparisonSubject":"underlinedLabelAside"}}],"then":8,"else":0}},"pointerEvents":"none","transition":"color 200ms cubic-bezier(0.0, 0, 0.2, 1) 0ms,transform 200ms cubic-bezier(0.0, 0, 0.2, 1) 0ms","transform":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-logical-operators@Or","params":{"components":[{"component":"data2-core-comparison-operators@EqualOrLesserThan","params":{"subject":{"component":"data2-core-functions@Count","params":{"subject":{"component":"data2-core-types@DataLinkGetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record"}}}}}},"comparisonSubject":0}},{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"variation"},"component":"data2-core-types@Reference"},"comparisonSubject":"underlinedLabelAside"}}]}}],"then":{"component":"data2-core-functions@StringConcat","params":{"portions":["translate(",{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"variation"},"component":"data2-core-types@Reference"},"comparisonSubject":"outlined"}}],"then":16,"else":0}},"px, calc(",{"component":"data2-core-types@Reference","params":{"reference":"super.dimensions.height"}},"px / 2 - 10px)) scale(1)"]}},"else":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"variation"},"component":"data2-core-types@Reference"},"comparisonSubject":"outlined"}}],"then":"translate(8px, -2px) scale(0.75)","else":"translate(-6px, -2px) scale(0.75)"}}}}}}},{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"variation"},"component":"data2-core-types@Reference"},"comparisonSubject":"underlinedLabelAside"}}],"then":null,"else":{"component":"html@fieldset","params":{"style":{"boxSizing":"border-box","width":"100%","height":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"variation"},"component":"data2-core-types@Reference"},"comparisonSubject":"outlined"}}],"then":"100%","else":"calc(100% - 12px)"}},"padding":"0 8px","overflow":"hidden","position":"absolute","borderStyle":"solid","borderWidth":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"variation"},"component":"data2-core-types@Reference"},"comparisonSubject":"outlined"}}],"then":1,"else":"0 0 2px"}},"borderRadius":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"variation"},"component":"data2-core-types@Reference"},"comparisonSubject":"outlined"}}],"then":2,"else":0}},"transition":"border-color 200ms cubic-bezier(0.0, 0, 0.2, 1) 0ms","borderColor":{"component":"data2-core-types@PackageGetter","params":{"field":"colors.background-4","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}},"pointerEvents":"none","margin":0},"children":{"component":"html@legend","params":{"style":{"display":"block","visibility":"hidden","fontSize":"0.75em","textAlign":"left","width":"auto","transition":"max-width 50ms cubic-bezier(0.0, 0, 0.2, 1) 0ms","padding":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@EqualOrLesserThan","params":{"subject":{"component":"data2-core-functions@Count","params":{"subject":{"component":"data2-core-types@DataLinkGetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record"}}}}}},"comparisonSubject":0}}],"then":0,"else":"0 5px"}},"maxWidth":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@EqualOrLesserThan","params":{"subject":{"component":"data2-core-functions@Count","params":{"subject":{"component":"data2-core-types@DataLinkGetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record"}}}}}},"comparisonSubject":0}}],"then":0}}},"children":{"component":"data2-core-logical-operators@Or","params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":"label"}},{"component":"data2-core-types@Reference","params":{"reference":"field"}}]}}}}}}}}],"style":{"position":"relative","width":"100%","height":"100%","display":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"variation"},"component":"data2-core-types@Reference"},"comparisonSubject":"underlinedLabelAside"}}],"then":"flex"}},"flexDirection":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"variation"},"component":"data2-core-types@Reference"},"comparisonSubject":"underlinedLabelAside"}}],"then":"row-reverse"}}}}}}},"super":{"font":{"component":"data2-core-types@PackageGetter","params":{"field":"font","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}},"style":{" input:hover ~ fieldset":{"borderColor":{"component":"data2-core-functions@StringConcat","params":{"portions":[{"component":"data2-core-types@PackageGetter","params":{"field":"colors.background-5","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}}," !important"]}}}," input:hover ~ label":{"color":{"component":"data2-core-functions@StringConcat","params":{"portions":[{"component":"data2-core-types@PackageGetter","params":{"field":"colors.color-2","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}}," !important"]}}}," input:hover":{"borderBottomColor":{"component":"data2-core-functions@StringConcat","params":{"portions":[{"component":"data2-core-types@PackageGetter","params":{"field":"colors.background-5","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}}," !important"]}}}," input:focus":{"borderBottomColor":{"component":"data2-core-functions@StringConcat","params":{"portions":[{"component":"data2-core-types@PackageGetter","params":{"field":"colors.primary","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}}," !important"]}}}," input:focus ~ fieldset":{"borderColor":{"component":"data2-core-functions@StringConcat","params":{"portions":[{"component":"data2-core-types@PackageGetter","params":{"field":"colors.primary","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}}," !important"]}}}," input:focus ~ label":{"color":{"component":"data2-core-functions@StringConcat","params":{"portions":[{"component":"data2-core-types@PackageGetter","params":{"field":"colors.primary","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}}," !important"]}},"transform":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"variation"},"component":"data2-core-types@Reference"},"comparisonSubject":"underlinedLabelAside"}}],"else":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"variation"},"component":"data2-core-types@Reference"},"comparisonSubject":"outlined"}}],"then":"translate(8px, -2px) scale(0.75) !important","else":"translate(-6px, -2px) scale(0.75) !important"}}}}}," input:focus ~ fieldset > legend":{"maxWidth":"99999px !important","padding":"0 5px !important"},"opacity":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"disabled"},"component":"data2-core-types@Reference"},"comparisonSubject":true}}],"then":0.38,"else":1}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"variation":{"component":"data2-core-primitives@String","oneOf":["outlined","underlined","underlinedLabelAside"]},"dataset":{"component":"data2-core-types@DataSetReference"},"field":{"component":"data2-core-types@DataSetColumnReference"},"record":{"component":"data2-core-types@Reference"},"label":{"component":"data2-core-primitives@String"},"disabled":{"component":"data2-core-primitives@Boolean"},"type":{"component":"data2-core-primitives@String","oneOf":["text","password","number","email"]},"packageReference":{"component":"data2-core-primitives@String"}}}},"component":"Input","package":"data2-porcelain","icon":"keyboard-o","extends":"data2-core-primitives@Block","visibility":"deprecated"},"updatedAt":"2020-10-14T17:22:35.179Z","createdAt":"2020-10-14T17:22:35.179Z"},{"_id":"5f9738efc8da12be8b086982","component":"data2-core-types@Component","params":{"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{}}},"public":false,"component":"Placeholder","package":"data2-controls","visibility":"deprecated"},"updatedAt":"2022-03-22T14:30:14.233Z"},{"_id":"5faf1800c8da12be8bd4b8c6","component":"data2-core-types@Component","params":{"public":true,"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-controls@MoneyInput","params":{"style":{"width":"100%","height":"100%","boxSizing":"border-box","background":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"type"},"component":"data2-core-types@Reference"},"comparisonSubject":"checkbox"}}],"then":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"component":"data2-core-types@DataLinkGetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record"}}}},"comparisonSubject":true}}],"then":"rgba(0,118,255,1)","else":{"params":{"reference":"super.fill"},"component":"data2-core-types@Reference"}}},"else":{"component":"data2-core-primitives@String","params":{"content":"transparent"}}}},"color":{"params":{"reference":"super.textColor"},"component":"data2-core-types@Reference"},"border":"none","outline":"none","appearance":"none","cursor":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"disabled"},"component":"data2-core-types@Reference"},"comparisonSubject":true}}],"then":"not-allowed","else":"auto"}}},"dataGetter":{"component":"data2-core-types@DataLinkGetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record"}}}},"dataSetter":{"component":"data2-core-types@DataLinkSetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record"}},"recordUpsert":{"component":"data2-core-types@Reference","params":{"reference":"recordUpsert"}},"mask":{"component":"data2-core-types@Reference","params":{"reference":"mask"}}}},"tabIndex":{"component":"data2-core-types@Reference","params":{"reference":"tabIndex"}},"step":{"component":"data2-core-types@Reference","params":{"reference":"step"}},"type":{"component":"data2-core-types@Reference","params":{"reference":"type"}},"preffix":{"component":"data2-core-types@Reference","params":{"reference":"preffix"}},"fixedValue":{"component":"data2-core-types@Reference","params":{"reference":"fixedValue"}},"placeholder":{"component":"data2-core-logical-operators@Or","params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":"placeholder"}},{"component":"data2-core-types@Reference","params":{"reference":"field"}}]}},"defaultChecked":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"type"},"component":"data2-core-types@Reference"},"comparisonSubject":"checkbox"}}],"then":{"component":"data2-core-types@DataLinkGetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record"}}}},"else":""}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"opacity":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"disabled"},"component":"data2-core-types@Reference"},"comparisonSubject":true}}],"then":0.38,"else":1}},"disabled":{"params":{"reference":"disabled"},"component":"data2-core-types@Reference"},"onBlur":{"component":"data2-core-types@Reference","params":{"reference":"onBlur"}},"onFocus":{"component":"data2-core-types@Reference","params":{"reference":"onFocus"}},"onChange":{"component":"data2-core-types@Reference","params":{"reference":"onChange"}}}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"tabIndex":"data2-core-primitives@Number","dataset":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@InteractiveModuleReference"}}},"component":"data2-core-types@ComponentParameter"},"field":{"component":"data2-core-types@DataSetColumnReference"},"record":{"component":"data2-core-types@Reference"},"placeholder":{"component":"data2-core-primitives@String"},"disabled":{"component":"data2-core-primitives@Boolean"},"fixedValue":{"component":"data2-core-primitives@String"},"preffix":{"component":"data2-core-primitives@String"},"onBlur":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour"},"component":"data2-core-types@ComponentParameter"},"onFocus":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour"},"component":"data2-core-types@ComponentParameter"},"onChange":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour"},"component":"data2-core-types@ComponentParameter"}}}},"component":"DataMoneyFieldBlock","package":"data2-blocks","extends":"data2-core-primitives@Block","icon":"usd","visibility":"public"},"updatedAt":"2023-10-26T19:31:44.162Z"},{"_id":"5ec1c29a44f1ebfde2397325","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"FieldSet","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"fields":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}}},"component":"data2-core-types@ComponentParameter"},"fieldsList":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"params":{"fields":{"key":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}},"component":"data2-core-types@ComponentParameter"},"value":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@FieldSet"},"visibility":"public","description":{"component":"data2-core-primitives@String","params":{"content":"Define separately every key and its value. This allows for dynamic keyed objects. If a key conflicts with a key defined in the \"fieldSet\" prop, this one will override it."}}},"component":"data2-core-types@ComponentParameter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"fields"}}},"updatedAt":"2023-12-19T12:20:44.793Z"},{"_id":"5e9f5e05e6bac0d98aa5d6b5","component":"data2-core-types@Component","params":{"package":"html","component":"input","public":false,"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"style":{"component":"data2-core-types@StyleSheet"},"onClick":{"component":"data2-core-types@Interaction"},"onChange":{"component":"data2-core-types@DataLinkSetter"},"type":"String","value":"String"}}},"visibility":"deprecated"},"updatedAt":"2022-03-22T14:22:06.761Z"},{"_id":"5ec3096c44f1ebfde26300a5","component":"data2-core-types@Component","params":{"package":"data2-core-flow","component":"If","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"compare":{"params":{"module":{"params":{},"component":"data2-core-types@InteractiveModuleReference"},"prop":{"component":"data2-core-primitives@String","params":{"content":"loca"}},"args":[],"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Condition"}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"description":{"component":"data2-core-primitives@String","params":{"content":"The value to evaluate. Determines which branch is returned."}}},"component":"data2-core-types@ComponentParameter"},"else":{"params":{"module":{"params":{},"component":"data2-core-web@Window"},"prop":{"component":"data2-core-primitives@String","params":{"content":"localStorage.getItem"}},"args":[{"component":"data2-core-primitives@String","params":{"content":"tryon_deviceid"}}],"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Else"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}},"description":{"component":"data2-core-primitives@String","params":{"content":"The value returned when the condition is falsy."}}},"component":"data2-core-types@ComponentParameter"},"then":{"params":{"module":{"params":{},"component":"data2-core-types@InteractiveModuleReference"},"prop":{"component":"data2-core-primitives@String","params":{"content":"localStorage."}},"args":[],"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Then"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"description":{"component":"data2-core-primitives@String","params":{"content":"The value returned when the condition is truthy."}}},"component":"data2-core-types@ComponentParameter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"then"}},"title":"If","description":"Evaluates a condition and returns the then value if truthy, or the else value otherwise."},"updatedAt":"2026-05-22T15:51:45.916Z"},{"_id":"5ec73d856f2b7c4f04f46617","component":"data2-core-types@Component","params":{"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"style":{"component":"data2-core-types@StyleSheet"},"dataset":{"component":"data2-core-types@DataSetReference"}}}},"public":false,"component":"DataMap","package":"data2-controls","visibility":"deprecated"},"updatedAt":"2022-03-22T14:24:43.846Z"},{"_id":"5eceb27f3888745c0d57155d","component":"data2-core-types@Component","params":{"product":"ui","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"position":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Position"}},"category":"appearance","simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":101}},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"},"dimensions":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Dimensions"}},"category":"appearance","simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":102}},"defaultValue":{"preventEvaluation":true,"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768}},"visibility":"public","description":{"component":"data2-core-primitives@String","params":{"content":"Move and resize the artboard boundaries, direclty affecting how the content is displayed."}}},"component":"data2-core-types@ComponentParameter"},"fill":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Fill"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":103}},"defaultValue":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","preventEvaluation":true},"description":{"component":"data2-core-primitives@String","params":{"content":"Color Background of the artboard."}}},"component":"data2-core-types@ComponentParameter"},"alternativeArtboards":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@ResponsiveArtboards"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":201}},"description":{"component":"data2-core-primitives@String","params":{"content":"Pick alternative artboards for different devices. When configured, the alternative artboard will automatically show instead of the main one on the targeted device."}}},"component":"data2-core-types@ComponentParameter"},"componentClass":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@ComponentClass"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":301}},"description":{"component":"data2-core-primitives@String","params":{"content":"Makes this artboard a component, enabling easy reuse of its content, with the option to configure parameters to be reused in each of the component instances."}}},"component":"data2-core-types@ComponentParameter"},"componentStates":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@ComponentState"}},"category":"behaviour","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":302}},"description":{"component":"data2-core-primitives@String","params":{"content":"When the current artboard is a component, you may configure its states. Each state can be attributed to another artboard, rendering it when the state is set in the instance of the component."}},"shouldShow":{"component":"data2-core-primitives@Boolean","preventEvaluation":true,"params":{"content":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"componentClass"}}}}},"break":false}},"component":"data2-core-types@ComponentParameter"},"childrenOverflow":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":101}},"description":{"component":"data2-core-primitives@String","params":{"content":"No longer confines the content of the Artboard to its boundaries. Overflowing elements will not be cropped."}}},"component":"data2-core-types@ComponentParameter"},"font":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-web@GoogleFont"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":213}},"description":{"component":"data2-core-primitives@String","params":{"content":"The font face of the Artboard and its children."}}},"component":"data2-core-types@ComponentParameter"},"globalLights":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@GlobalLights"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":104}},"description":{"component":"data2-core-primitives@String","params":{"content":"Directional lights applied to descendant blocks that opt-in via lightInteraction. Edit all lights together on the shared 2D pad."}},"visibility":"private"}}}}},"component":"Artboard","package":"data2-core-primitives","icon":"object-group","title":{"component":"data2-core-primitives@String","params":{"content":"Artboard"}},"definition":{"params":{"teste":{"component":"data2-core-primitives@String","params":{}}},"component":"data2-core-types@Definition"}},"updatedAt":"2026-05-20T14:05:41.173Z"},{"_id":"5ed4a2aed68ce41360da86b2","component":"data2-core-types@Component","params":{"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"params":{"children":{"component":"data2-controls@DataGrid","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"fields":{"component":"data2-core-types@Reference","params":{"reference":"fields"}},"style":{"width":"100%","height":"100%"}}},"dimensions":{"params":{"reference":"dimensions"},"component":"data2-core-types@Reference"},"position":{"params":{"reference":"position"},"component":"data2-core-types@Reference"},"style":{"params":{"reference":"style"},"component":"data2-core-types@Reference"}},"component":"data2-core-primitives@Block"}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"dimensions":{"component":"data2-core-types@Dimensions"},"position":{"component":"data2-core-types@Position"},"style":{"component":"data2-core-types@StyleSheet"},"dataset":{"component":"data2-core-types@DataSetReference"},"fields":{"component":"data2-core-types@Background","list":true}}}},"public":false,"component":"DataGrid","package":"data2-blocks","visibility":"deprecated"},"updatedAt":"2022-03-22T14:25:04.919Z"},{"_id":"5ed531fca99e7f2f648cc2ab","component":"data2-core-types@Component","params":{"public":true,"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"latField":{"component":"data2-core-types@Reference","params":{"reference":"latField"}},"lngField":{"component":"data2-core-types@Reference","params":{"reference":"lngField"}},"markerField":{"component":"data2-core-types@Reference","params":{"reference":"markerField"}},"initialCenterLat":{"component":"data2-core-types@Reference","params":{"reference":"initialCenterLat"}},"initialCenterLng":{"component":"data2-core-types@Reference","params":{"reference":"initialCenterLng"}},"initialZoom":{"component":"data2-core-types@Reference","params":{"reference":"initialZoom"}},"provider":{"component":"data2-core-types@Reference","params":{"reference":"provider"}},"style":{"width":"100%","height":"100%"},"polyLineField":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"polyLineField"}}}}},"component":"data2-controls@DataMap"}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"dataset":{"component":"data2-core-types@DataSetReference"},"latField":{"component":"data2-core-types@FieldReference"},"lngField":{"component":"data2-core-types@FieldReference"},"markerField":{"component":"data2-core-types@FieldReference"},"initialCenterLat":{"component":"data2-core-primitives@Number"},"initialCenterLng":{"component":"data2-core-primitives@Number"},"initialZoom":{"component":"data2-core-primitives@Number"},"provider":{"component":"data2-core-primitives@String","oneOf":["OpenStreetMap.Mapnik","OpenStreetMap.DE","OpenStreetMap.CH","OpenStreetMap.France","OpenStreetMap.HOT","OpenStreetMap.BZH","OpenSeaMap","OpenPtMap","OpenTopoMap","OpenRailwayMap","OpenFireMap","SafeCast","Stadia.AlidadeSmooth","Stadia.AlidadeSmoothDark","Stadia.OSMBright","Stadia.Outdoors","Thunderforest.OpenCycleMap","Thunderforest.Transport","Thunderforest.TransportDark","Thunderforest.SpinalMap","Thunderforest.Landscape","Thunderforest.Outdoors","Thunderforest.Pioneer","Thunderforest.MobileAtlas","Thunderforest.Neighbourhood","CyclOSM","Hydda.Full","Hydda.Base","Hydda.RoadsAndLabels","Jawg.Streets","Jawg.Terrain","Jawg.Sunny","Jawg.Dark","Jawg.Light","Jawg.Matrix","MapBox","MapTiler.Streets","MapTiler.Basic","MapTiler.Bright","MapTiler.Pastel","MapTiler.Positron","MapTiler.Hybrid","MapTiler.Toner","MapTiler.Topo","MapTiler.Voyager","Stamen.Toner","Stamen.TonerBackground","Stamen.TonerHybrid","Stamen.TonerLines","Stamen.TonerLabels","Stamen.TonerLite","Stamen.Watercolor","Stamen.Terrain","Stamen.TerrainBackground","Stamen.TerrainLabels","Stamen.TopOSMRelief","Stamen.TopOSMFeatures","TomTom.Basic","TomTom.Hybrid","TomTom.Labels","Esri.WorldStreetMap","Esri.DeLorme","Esri.WorldTopoMap","Esri.WorldImagery","Esri.WorldTerrain","Esri.WorldShadedRelief","Esri.WorldPhysical","Esri.OceanBasemap","Esri.NatGeoWorldMap","Esri.WorldGrayCanvas","OpenWeatherMap.Clouds","OpenWeatherMap.CloudsClassic","OpenWeatherMap.Precipitation","OpenWeatherMap.PrecipitationClassic","OpenWeatherMap.Rain","OpenWeatherMap.RainClassic","OpenWeatherMap.Pressure","OpenWeatherMap.PressureContour","OpenWeatherMap.Wind","OpenWeatherMap.Temperature","OpenWeatherMap.Snow","HERE.normalDay","HERE.normalDayCustom","HERE.normalDayGrey","HERE.normalDayMobile","HERE.normalDayGreyMobile","HERE.normalDayTransit","HERE.normalDayTransitMobile","HERE.normalDayTraffic","HERE.normalNight","HERE.normalNightMobile","HERE.normalNightGrey","HERE.normalNightGreyMobile","HERE.normalNightTransit","HERE.normalNightTransitMobile","HERE.reducedDay","HERE.reducedNight","HERE.basicMap","HERE.mapLabels","HERE.trafficFlow","HERE.carnavDayGrey","HERE.hybridDay","HERE.hybridDayMobile","HERE.hybridDayTransit","HERE.hybridDayGrey","HERE.hybridDayTraffic","HERE.pedestrianDay","HERE.pedestrianNight","HERE.satelliteDay","HERE.terrainDay","HERE.terrainDayMobile","HEREv3.normalDay","HEREv3.normalDayCustom","HEREv3.normalDayGrey","HEREv3.normalDayMobile","HEREv3.normalDayGreyMobile","HEREv3.normalDayTransit","HEREv3.normalDayTransitMobile","HEREv3.normalNight","HEREv3.normalNightMobile","HEREv3.normalNightGrey","HEREv3.normalNightGreyMobile","HEREv3.normalNightTransit","HEREv3.normalNightTransitMobile","HEREv3.reducedDay","HEREv3.reducedNight","HEREv3.basicMap","HEREv3.mapLabels","HEREv3.trafficFlow","HEREv3.carnavDayGrey","HEREv3.hybridDay","HEREv3.hybridDayMobile","HEREv3.hybridDayTransit","HEREv3.hybridDayGrey","HEREv3.pedestrianDay","HEREv3.pedestrianNight","HEREv3.satelliteDay","HEREv3.terrainDay","HEREv3.terrainDayMobile","FreeMapSK","MtbMap","CartoDB.Positron","CartoDB.PositronNoLabels","CartoDB.PositronOnlyLabels","CartoDB.DarkMatter","CartoDB.DarkMatterNoLabels","CartoDB.DarkMatterOnlyLabels","CartoDB.Voyager","CartoDB.VoyagerNoLabels","CartoDB.VoyagerOnlyLabels","CartoDB.VoyagerLabelsUnder","HikeBike.HikeBike","HikeBike.HillShading","BasemapAT.basemap","BasemapAT.grau","BasemapAT.overlay","BasemapAT.terrain","BasemapAT.surface","BasemapAT.highdpi","BasemapAT.orthofoto","nlmaps.standaard","nlmaps.pastel","nlmaps.grijs","nlmaps.luchtfoto","NASAGIBS.ModisTerraTrueColorCR","NASAGIBS.ModisTerraBands367CR","NASAGIBS.ViirsEarthAtNight2012","NASAGIBS.ModisTerraLSTDay","NASAGIBS.ModisTerraSnowCover","NASAGIBS.ModisTerraAOD","NASAGIBS.ModisTerraChlorophyll","NLS","JusticeMap.income","JusticeMap.americanIndian","JusticeMap.asian","JusticeMap.black","JusticeMap.hispanic","JusticeMap.multi","JusticeMap.nonWhite","JusticeMap.white","JusticeMap.plurality","Wikimedia","GeoportailFrance.parcels","GeoportailFrance.ignMaps","GeoportailFrance.maps","GeoportailFrance.orthos","OneMapSG.Default","OneMapSG.Night","OneMapSG.Original","OneMapSG.Grey","OneMapSG.LandLot","USGS.USTopo","USGS.USImagery","USGS.USImageryTopo","WaymarkedTrails.hiking","WaymarkedTrails.cycling","WaymarkedTrails.mtb","WaymarkedTrails.slopes","WaymarkedTrails.riding","WaymarkedTrails.skating"]},"polyLineField":{"component":"data2-core-types@FieldReference"}}}},"component":"DataMap","package":"data2-blocks","icon":"map","extends":"data2-core-primitives@Block","visibility":"public"},"updatedAt":"2022-12-30T18:30:13.513Z"},{"_id":"5ed53597a99e7f2f648cc2ac","component":"data2-core-types@Component","params":{"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"params":{"children":{"component":"data2-controls@Chart","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"title":{"component":"data2-core-types@Reference","params":{"reference":"title"}},"aggregation":{"component":"data2-core-types@Reference","params":{"reference":"aggregation"}},"type":{"component":"data2-core-types@Reference","params":{"reference":"type"}},"style":{"width":"100%","height":"100%"}}},"dimensions":{"params":{"reference":"dimensions"},"component":"data2-core-types@Reference"},"position":{"params":{"reference":"position"},"component":"data2-core-types@Reference"},"style":{"params":{"reference":"style"},"component":"data2-core-types@Reference"}},"component":"data2-core-primitives@Block"}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"dimensions":{"component":"data2-core-types@Dimensions"},"position":{"component":"data2-core-types@Position"},"style":{"component":"data2-core-types@StyleSheet"},"dataset":{"component":"data2-core-types@DataSetReference"},"title":{"component":"String"},"sort":{"component":"Boolean"},"aggregation":{"component":"data2-core-types@DataSetColumnReference"},"type":{"component":"String","oneOf":["Horizontal","Bar","Doughnut"]}}}},"public":false,"component":"Chart","package":"data2-blocks","visibility":"deprecated"},"updatedAt":"2022-03-22T14:27:46.381Z"},{"_id":"5ede861cd68ce41360353f77","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"StyleSheet","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"background":{"component":"data2-core-types@Color","list":true},"borderRadius":"String","whiteSpace":{"component":"String","oneOf":["normal","nowrap","pre","pre-line","pre-wrap","initial","inherit"]},"boxShadow":"String","fontFamily":"String","fontSize":"String","color":"data2-core-types@Color","cursor":{"component":"String","oneOf":["pointer","text","default","auto","not-allowed"]},"textAlign":{"component":"String","oneOf":["center","left","right","justify"]}}}}}},{"_id":"5ef92edd81a6537f79316af2","component":"data2-core-types@Component","params":{"package":"data2-core","component":"Api","icon":"cloud","visibility":"private","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"position":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Position"}}},"component":"data2-core-types@ComponentParameter"},"dimensions":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Dimensions"}},"defaultValue":{"preventEvaluation":true,"params":{"width":300,"height":300},"component":"data2-core-types@Dimensions"},"category":"appearance"},"component":"data2-core-types@ComponentParameter"},"database":{"component":"data2-core-types@ServiceDatabaseReference"},"paginate":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"defaultValue":{"default":{"params":{"content":100},"component":"data2-core-primitives@Number"}}},"component":"data2-core-types@ComponentParameter"},"multi":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"category":"behaviour","defaultValue":{"params":{"content":false},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-types@ComponentParameter"},"url":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"defaultValue":{"component":"data2-core-primitives@String","params":{"content":"someUrl"}}},"component":"data2-core-types@ComponentParameter"},"collection":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"defaultValue":{"component":"data2-core-primitives@String","params":{"content":"someCollection"}}},"component":"data2-core-types@ComponentParameter"},"hooks":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"defaultValue":{"params":{},"component":"data2-core-types@FieldSet"}},"component":"data2-core-types@ComponentParameter"},"schema":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"defaultValue":{"params":{},"component":"data2-core-types@FieldSet"}},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2022-01-21T18:27:51.447Z"},{"_id":"5f0396441ca96def4287d501","component":"data2-core-types@Component","params":{"product":"media","package":"data2-core","component":"Drive","icon":"hdd-o","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"size":{"params":{"category":"content","component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"index":{"component":"data2-core-primitives@Number","params":{"content":200}},"defaultValue":{"params":{"content":10000000000},"component":"data2-core-primitives@Number"},"saveCompiled":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"fileTimeout":{"params":{"category":"behaviour","component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"index":{"component":"data2-core-primitives@Number","params":{"content":201}},"visibility":"private","description":{"component":"data2-core-primitives@String","params":{"content":"The number of days the files are kept in this drive. Files older than this value are deleted.\n Leave empty for no expiration."}}},"component":"data2-core-types@ComponentParameter"},"fileAcceptedFormats":{"params":{"category":"behaviour","component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":204}},"visibility":"private","description":{"component":"data2-core-primitives@String","params":{"content":"List of accepted formats for file upload in this Drive. Example: png, jpg, mp4"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"saveCompiled":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"fileMaxSize":{"params":{"category":"content","component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"index":{"component":"data2-core-primitives@Number","params":{"content":203}},"description":{"component":"data2-core-primitives@String","params":{"content":"Max file size (in bytes) that can be uploaded to the Drive."}},"visibility":"private","saveCompiled":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"policies":{"params":{"index":{"component":"data2-core-primitives@Number","params":{"content":30}},"visibility":"beta","category":"behaviour","component":"data2-core-auth@Policy","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}}}},"renderable":{"dimensions":{"disabled":false,"component":"data2-core-types@Dimensions","params":{"width":1366,"exactWidth":false,"exactHeight":false,"height":768}}},"interactions":{"params":{"fields":{"selectFolder":{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"selectFolder"}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"params":{"content":"data2-core-types@FileComponentReference"},"component":"data2-core-primitives@String"},"title":{"component":"data2-core-primitives@String","params":{"content":"folder"}}}}]}},"selectPreviousFolder":{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"selectPreviousFolder"}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}}}},"open":{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"open"}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"params":{"content":"data2-core-types@FileComponentReference"},"component":"data2-core-primitives@String"},"title":{"component":"data2-core-primitives@String","params":{"content":"File or folder to open"}}}},{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Target"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Where to open the file"}},"visibility":"public","required":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"oneOf":[{"params":{"content":"_blank"},"component":"data2-core-primitives@String"},{"params":{"content":"_self"},"component":"data2-core-primitives@String"},{"params":{"content":"_parent"},"component":"data2-core-primitives@String"},{"params":{"content":"_top"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"}]}},"delete":{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"delete"}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"params":{"content":"data2-core-types@FileComponentReference"},"component":"data2-core-primitives@String"},"title":{"component":"data2-core-primitives@String","params":{"content":"File or folder to delete"}}}}]}},"download":{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"download"}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"params":{"content":"data2-core-types@FileComponentReference"},"component":"data2-core-primitives@String"},"title":{"component":"data2-core-primitives@String","params":{"content":"file"}}}}]}},"createFolder":{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"createFolder"}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"params":{"content":"data2-core-primitives@Object"},"component":"data2-core-primitives@String"},"flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"params":{"fields":{"name":{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"name"}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}}}}},"component":"data2-core-types@FieldSet"}}}]}},"rename":{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"rename"}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"params":{"content":"data2-core-types@FileComponentReference"},"component":"data2-core-primitives@String"},"title":{"component":"data2-core-primitives@String","params":{"content":"FIle or folder"}}}},{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"name"}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}}}]}},"uploadFromFiles":{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"uploadFromFiles"}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Getter"}},"title":{"component":"data2-core-primitives@String","params":{"content":"files"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"parameters":{"params":{"fields":{"folder":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@FileComponentReference"}},"title":{"component":"data2-core-primitives@String","params":{"content":"folder"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}}},"fileNames":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"File names"}},"description":{"component":"data2-core-primitives@String","params":{"content":"List of names to be used to rename the uploaded files."}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}}}},"acceptedFormats":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":4}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"title":{"component":"data2-core-primitives@String","params":{"content":"Accepted formats"}}},"component":"data2-core-types@ComponentParameter"},"fileMaxSize":{"params":{"component":"data2-core-primitives@Number","index":{"component":"data2-core-primitives@Number","params":{"content":3}},"title":{"component":"data2-core-primitives@String","params":{"content":"Max file size"}}},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@FieldSet"},"title":{"component":"data2-core-primitives@String","params":{"content":"options"}}}}]}},"uploadFromUrls":{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"uploadFromUrls"}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"urls"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"parameters":{"params":{"fields":{"folder":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@FileComponentReference"}},"title":{"component":"data2-core-primitives@String","params":{"content":"folder"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}}},"fileNames":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"File names"}},"description":{"component":"data2-core-primitives@String","params":{"content":"List of names to be used to rename the uploaded files."}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}}}},"acceptedFormats":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":4}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"title":{"component":"data2-core-primitives@String","params":{"content":"Accepted formats"}}},"component":"data2-core-types@ComponentParameter"},"fileMaxSize":{"params":{"component":"data2-core-primitives@Number","index":{"component":"data2-core-primitives@Number","params":{"content":3}},"title":{"component":"data2-core-primitives@String","params":{"content":"Max file size"}}},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@FieldSet"},"title":{"component":"data2-core-primitives@String","params":{"content":"options"}}}}]}},"uploadFromPrompt":{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"uploadFromPrompt"}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"parameters":{"params":{"fields":{"folder":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@FileComponentReference"}},"title":{"component":"data2-core-primitives@String","params":{"content":"folder"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}}},"multiple":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"title":{"component":"data2-core-primitives@String","params":{"content":"multiple"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}}}},"fileNames":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"File names"}},"description":{"component":"data2-core-primitives@String","params":{"content":"List of names to be used to rename the uploaded files."}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":3}}}},"acceptedFormats":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":5}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"title":{"component":"data2-core-primitives@String","params":{"content":"Accepted formats"}}},"component":"data2-core-types@ComponentParameter"},"fileMaxSize":{"params":{"component":"data2-core-primitives@Number","index":{"component":"data2-core-primitives@Number","params":{"content":3}},"title":{"component":"data2-core-primitives@String","params":{"content":"Max file size"}}},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@FieldSet"},"flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}}]}},"moveToFolder":{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"moveToFolder"}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"params":{"content":"data2-core-types@FileComponentReference"},"component":"data2-core-primitives@String"},"title":{"component":"data2-core-primitives@String","params":{"content":"FIle or folder"}}}},{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Destination folder"}},"component":{"params":{"content":"data2-core-types@FileComponentReference"},"component":"data2-core-primitives@String"}}}]}},"uploadFromText":{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"uploadFromText"}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"text"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":false}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"parameters":{"params":{"fields":{"folder":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@FileComponentReference"}},"title":{"component":"data2-core-primitives@String","params":{"content":"folder"}}}},"filename":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"filename"}}}}}},"component":"data2-core-types@FieldSet"},"title":{"component":"data2-core-primitives@String","params":{"content":"options"}}}}]}}}},"component":"data2-core-types@FieldSet"}},"updatedAt":"2025-07-03T21:34:09.717Z"},{"_id":"5f46b3f463c680de4fdce11d","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"ArtboardReference","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"reference":"String"}}}}},{"_id":"5f46b40d63c680de4fdce538","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"ResponsiveArtboards","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"mobile":{"component":"data2-core-types@ArtboardReference"},"tablet":{"component":"data2-core-types@ArtboardReference"}}}}}},{"_id":"5f48007aa575399a45c52847","component":"data2-core-types@Component","params":{"component":"String","package":"data2-core-primitives","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"content":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"visibility":"public","saveCompiled":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"list":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"visibility":"private"},"component":"data2-core-types@ComponentParameter"},"unique":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"visibility":"private"},"component":"data2-core-types@ComponentParameter"},"sensitive":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"visibility":"private"},"component":"data2-core-types@ComponentParameter"}}}},"validation":{"required":{"component":"data2-core-primitives@Boolean","default":false},"minLength":{"component":"data2-core-primitives@Number"},"maxLength":{"component":"data2-core-primitives@Number"},"oneOf":{"component":"data2-core-primitives@String"},"regex":{"component":"data2-core-primitives@Regex"}},"returnPrimitiveTypes":["data2-core-primitives@String"]},"updatedAt":"2025-08-12T14:53:44.996Z"},{"_id":"5f48939ba575399a45e142cb","component":"data2-core-types@Component","params":{"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-controls@Chart","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"title":{"component":"data2-core-types@Reference","params":{"reference":"title"}},"aggregation":{"component":"data2-core-types@Reference","params":{"reference":"aggregation"}},"metric":{"component":"data2-core-types@Reference","params":{"reference":"metric"}},"dimension":{"component":"data2-core-types@Reference","params":{"reference":"dimension"}},"xAxis":{"component":"data2-core-types@Reference","params":{"reference":"xAxis"}},"statistic":{"component":"data2-core-types@Reference","params":{"reference":"statistic"}},"type":{"component":"data2-core-types@Reference","params":{"reference":"type"}},"timeUnit":{"component":"data2-core-types@Reference","params":{"reference":"timeUnit"}},"timeUnitStartOf":{"component":"data2-core-types@Reference","params":{"reference":"timeUnitStartOf"}},"timeUnitEndOf":{"component":"data2-core-types@Reference","params":{"reference":"timeUnitEndOf"}},"stacked":{"component":"data2-core-types@Reference","params":{"reference":"stacked"}},"fill":{"component":"data2-core-types@Reference","params":{"reference":"super.fill"}},"textSize":{"component":"data2-core-types@Reference","params":{"reference":"super.textSize"}},"textColor":{"component":"data2-core-types@Reference","params":{"reference":"super.textColor"}},"gridColor":{"component":"data2-core-types@Reference","params":{"reference":"gridColor"}},"style":{"width":"100%","height":"100%"},"dataColors":{"component":"data2-core-types@Reference","params":{"reference":"dataColors"}},"formatLabel":{"component":"data2-core-types@Reference","params":{"reference":"formatLabel"}},"hideLegend":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"hideLegend"}}}},"datalabelColor":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"datalabelColor"}}}},"legendPosition":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"legendPosition"}}}},"sort":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"sort"}}}},"sortValues":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"sortValues"}}}},"hideLabels":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"hideLabels"}}}},"hidePercent":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"hidePercent"}}}}}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"dataset":{"component":"data2-core-types@DataSetReference"},"title":{"component":"String"},"sort":{"params":{"component":"data2-core-primitives@Object","parameters":{"field":{"params":{"component":"data2-core-primitives@String","oneOf":[{"params":{"content":"dimension"},"component":"data2-core-primitives@String"},{"params":{"content":"metric"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"},"order":{"params":{"component":"data2-core-primitives@String","oneOf":[{"params":{"content":"asc"},"component":"data2-core-primitives@String"},{"params":{"content":"desc"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@ComponentParameter"},"type":{"component":"data2-core-primitives@String","oneOf":["Bar","Horizontal","Doughnut","Pie","Line","Radar","BigNumber"]},"metric":{"component":"data2-core-types@FieldReference"},"dimension":{"component":"data2-core-types@FieldReference"},"xAxis":{"component":"data2-core-types@FieldReference"},"statistic":{"component":"data2-core-primitives@String","oneOf":["count","count-unique","sum","average"]},"timeUnit":{"component":"data2-core-primitives@String","oneOf":["day","week","month","quarter","year"]},"timeUnitStartOf":{"component":"data2-core-primitives@String","oneOf":["day","week","month","quarter","year"]},"timeUnitEndOf":{"component":"data2-core-primitives@String","oneOf":["day","week","month","quarter","year"]},"stacked":{"component":"data2-core-primitives@Boolean"},"gridColor":{"component":"data2-core-types@Color"},"dataColors":{"component":"data2-core-types@DataColor","list":true},"hideLegend":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Boolean","visibility":"public"}},"datalabelColor":{"params":{"category":"appearance","visibility":"private","component":"data2-core-types@Color"},"component":"data2-core-types@ComponentParameter"},"legendPosition":{"params":{"component":"data2-core-primitives@String","oneOf":[{"params":{"content":"top"},"component":"data2-core-primitives@String"},{"params":{"content":"bottom"},"component":"data2-core-primitives@String"},{"params":{"content":"left"},"component":"data2-core-primitives@String"},{"params":{"content":"right"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"},"hideLabels":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Boolean","visibility":"public"}},"hidePercent":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Boolean","visibility":"public"}}}}},"public":true,"component":"BlockChart","package":"data2-blocks","icon":"line-chart","extends":"data2-core-primitives@Block","visibility":"public"},"updatedAt":"2025-03-07T00:31:31.346Z"},{"_id":"5f492a45a575399a45fc539c","component":"data2-core-types@Component","params":{"package":"data2-core-primitives","component":"Route","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"content":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@ArtboardReference"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":202}},"description":{"component":"data2-core-primitives@String","params":{"content":"This is what the router should display when the page is accessed."}}},"component":"data2-core-types@ComponentParameter"},"policies":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-auth@Policy"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":310}},"description":{"component":"data2-core-primitives@String","params":{"content":"Defines rules for allowing access to the route or not."}}},"component":"data2-core-types@ComponentParameter"},"path":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":201}},"description":{"component":"data2-core-primitives@String","params":{"content":"Path in which the \"content\" should be accessible.  It should start with a forward slash (/), and subdivisions should be done with forward slashes as well. You may receive parameters as part of the path by adding a colon (:) followed by the name of the parameter.\n\nExample: /path/subpath/:parameter"}}},"component":"data2-core-types@ComponentParameter"},"onEnter":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":301}},"description":{"component":"data2-core-primitives@String","params":{"content":"Action to be executed as soon as the user enters the route."}}},"component":"data2-core-types@ComponentParameter"},"onExit":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":302}},"description":{"component":"data2-core-primitives@String","params":{"content":"An action to be executed as soon as the user leaves the route."}}},"component":"data2-core-types@ComponentParameter"},"name":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":201}},"description":{"component":"data2-core-primitives@String","params":{"content":"Sets the name of the route, shown on the browser's tab."}}},"component":"data2-core-types@ComponentParameter"},"description":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":202}},"multiLine":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"description":{"component":"data2-core-primitives@String","params":{"content":"Describe the routes details or intent here. It should display on links' previews when shared."}}},"component":"data2-core-types@ComponentParameter"},"icon":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@FileComponentUrlReference"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":104}},"description":{"component":"data2-core-primitives@String","params":{"content":"Sets the icon that appears on the browser tab."}}},"component":"data2-core-types@ComponentParameter"},"image":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":104.1}},"description":{"component":"data2-core-primitives@String","params":{"content":"Set an image do be displayed on a link preview when shared."}}},"component":"data2-core-types@ComponentParameter"},"priority":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":201}},"description":{"component":"data2-core-primitives@String","params":{"content":"Signals the importance of this page to your whole website. This value has only affects your sitemap, thus has no effect the sitemap it is disabled by your Router's configuration."}}},"component":"data2-core-types@ComponentParameter"},"changefreq":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":201}},"oneOf":[{"params":{"content":"always"},"component":"data2-core-primitives@String"},{"params":{"content":"hourly"},"component":"data2-core-primitives@String"},{"params":{"content":"daily"},"component":"data2-core-primitives@String"},{"params":{"content":"weekly"},"component":"data2-core-primitives@String"},{"params":{"content":"monthly"},"component":"data2-core-primitives@String"},{"params":{"content":"anual"},"component":"data2-core-primitives@String"},{"params":{"content":"never"},"component":"data2-core-primitives@String"}],"description":{"component":"data2-core-primitives@String","params":{"content":"Indicates how often the current page is updated. This information is passed in the sitemap when available, and has no effect if the router's Sitemap is disabled."}}},"component":"data2-core-types@ComponentParameter"},"notAllowed":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@ArtboardReference"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":202.1}},"description":{"component":"data2-core-primitives@String","params":{"content":"Artboard to display when the route's content has been denied access due to a policy."}}},"component":"data2-core-types@ComponentParameter"},"serverSideRendering":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"category":"behaviour","visibility":"beta","description":{"component":"data2-core-primitives@String","params":{"content":"Enables or Disables Server-Side rendering for this route. Enabling may improve user experience on loading static content.\nIf your \"Content\" has user-specific data, or elements only shown to logged-in users, the server-rendered page will not show those items. After the page is properly loaded in the user's browser, it should display those elements normally."}}},"component":"data2-core-types@ComponentParameter"},"url":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":201}},"description":{"component":"data2-core-primitives@String","params":{"content":"Sets the og:url meta property of the route."}}},"component":"data2-core-types@ComponentParameter"},"headerTags":{"params":{"category":"behaviour","visibility":"public","description":{"component":"data2-core-primitives@String","params":{"content":"List of custom tags to be added to the header"}},"component":"data2-core-primitives@String","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}}}},"preview":{"params":{"portions":[{"component":"data2-core-primitives@String","params":{"content":"Route | "}},{"params":{"reference":"path"},"component":"data2-core-types@Reference"}]},"component":"data2-core-functions@StringConcat"}},"updatedAt":"2025-11-07T15:34:48.077Z"},{"_id":"5f492cc7a575399a45fccdc4","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"DataSetJoin","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"reference":"String","dataset":"data2-core-types@DataSetReference","localField":"data2-core-types@DataSetColumnReference","joinField":"String"}}}}},{"_id":"5f52a278a575399a45d239b4","component":"data2-core-types@Component","params":{"product":"ui","package":"data2-core-primitives","component":"Router","icon":"sitemap","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"position":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Position"}},"simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":101}},"category":"appearance","visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"},"dimensions":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Dimensions"}},"simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":102}},"category":"appearance","definition":{"preventEvaluation":true,"component":"data2-core-types@Dimensions","params":{"width":300,"height":300}},"defaultValue":{"preventEvaluation":true,"params":{"width":300,"height":300},"component":"data2-core-types@Dimensions"},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"},"routes":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Route"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":205}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"description":{"component":"data2-core-primitives@String","params":{"content":"The router's page structure. Defines the routes and their respective content, as well as their rules."}}},"component":"data2-core-types@ComponentParameter"},"initialPath":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":201}},"category":"content","description":{"component":"data2-core-primitives@String","params":{"content":"Define the initial path to be rendered when the router initializes."}}},"component":"data2-core-types@ComponentParameter"},"login":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@ArtboardReference"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":202}},"description":{"component":"data2-core-primitives@String","params":{"content":"Artboard used for login in your application. Whenever a route with a declared policy with an Authentication Strategy gets accessed by a logged-out user, the login artboard will be rendered instead of the route's content."}}},"component":"data2-core-types@ComponentParameter"},"resetPassword":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@ArtboardReference"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":204}},"description":{"component":"data2-core-primitives@String","params":{"content":"Pick an Artboard to be used in a Password Reset flow."}}},"component":"data2-core-types@ComponentParameter"},"notFound":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@ArtboardReference"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":203}},"description":{"component":"data2-core-primitives@String","params":{"content":"The artboard to show when a route with no matching \"path\" is accessed."}}},"component":"data2-core-types@ComponentParameter"},"sitemap":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":210}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"description":{"component":"data2-core-primitives@String","params":{"content":"Enables the auto generation of a Sitemap, for bots and users to be able to explore your application without requiring to directly access every page."}}},"component":"data2-core-types@ComponentParameter"},"splash":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@ArtboardReference"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":210}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"title":{"component":"data2-core-primitives@String","params":{"content":"Splash"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Pick an Artboard to display while the main page content is still loading."}}},"component":"data2-core-types@ComponentParameter"},"notAllowed":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@ArtboardReference"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":203.1}},"description":{"component":"data2-core-primitives@String","params":{"content":"Shows another artboard when the access of a route gets denied by a policy. The \"Not Allowed\" option on the Route Itself takes precedence."}}},"component":"data2-core-types@ComponentParameter"},"onBeforeRouteEnter":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":301}},"description":{"component":"data2-core-primitives@String","params":{"content":"An action to be executed before every route enter, before executing each route's own \"onEnter\" action."}}},"component":"data2-core-types@ComponentParameter"},"onAfterRouteEnter":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":302}},"description":{"component":"data2-core-primitives@String","params":{"content":"An action to be executed after every route enter, after each route's own \"onEnter\" action."}}},"component":"data2-core-types@ComponentParameter"},"onBeforeRouteExit":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":303}},"description":{"component":"data2-core-primitives@String","params":{"content":"An action to be executed before every route exit, before executing each route's own \"onExit\" action."}}},"component":"data2-core-types@ComponentParameter"},"onAfterRouteExit":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":304}},"description":{"component":"data2-core-primitives@String","params":{"content":"An action to be executed after every route exit, after each route's own \"onExit\" action."}}},"component":"data2-core-types@ComponentParameter"}}}},"interactions":{"component":"data2-core-types@FieldSet","params":{"fields":{"goBack":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Function"}},"definition":{"component":"data2-core-functions@Function","params":{"body":{"preventEvaluation":true,"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@This","params":{}},"prop":"history.goBack","args":[]}}}},"icon":{"component":"data2-core-primitives@String","params":{"content":"arrow-left"}},"visibility":"public"}},"goTo":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"definition":{"component":"data2-core-functions@Function","params":{"body":{"preventEvaluation":true,"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@This","params":{}},"prop":"history.push","args":[{"component":"data2-core-types@Reference","params":{"reference":"url"}},{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"preserveQuery"}}}}]}},"parameters":[{"component":"data2-core-primitives@String","params":{"content":"url"}},{"component":"data2-core-primitives@String","params":{"content":"preserveQuery"}}]},"break":true},"icon":{"component":"data2-core-primitives@String","params":{"content":"share"}},"visibility":"public","arguments":[{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Path to route"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Path to redirect user"}},"visibility":"public","required":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Preserve Query"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Preserve query string parameters  preserve query parameters on navigating."}},"visibility":"public","required":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}]}},"open":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Function"}},"definition":{"component":"data2-core-functions@Function","params":{"body":{"preventEvaluation":true,"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@This","params":{}},"prop":"history.push","args":[{"pathname":{"component":"data2-core-types@Reference","params":{"reference":"value"}}}]}},"parameters":["value"]}},"icon":{"component":"data2-core-primitives@String","params":{"content":"share"}},"visibility":"public","arguments":[{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Link to open"}},"description":{"component":"data2-core-primitives@String","params":{"content":""}},"visibility":"public","required":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Target"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Where to open the link"}},"visibility":"public","required":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"oneOf":[{"params":{"content":"_blank"},"component":"data2-core-primitives@String"},{"params":{"content":"_self"},"component":"data2-core-primitives@String"},{"params":{"content":"_parent"},"component":"data2-core-primitives@String"},{"params":{"content":"_top"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"}]}},"close":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Function"}},"definition":{"component":"data2-core-functions@Function","params":{"body":{"preventEvaluation":true,"component":"data2-core-types@Getter","params":{"module":{"params":{},"component":"data2-core-web@Window"},"prop":"close"}},"parameters":["value"]}},"icon":{"component":"data2-core-primitives@String","params":{"content":"times"}},"visibility":"public","arguments":[{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Link to open"}},"description":{"component":"data2-core-primitives@String","params":{"content":""}},"visibility":"public","required":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Target"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Where to open the link"}},"visibility":"public","required":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"oneOf":[{"params":{"content":"_blank"},"component":"data2-core-primitives@String"},{"params":{"content":"_self"},"component":"data2-core-primitives@String"},{"params":{"content":"_parent"},"component":"data2-core-primitives@String"},{"params":{"content":"_top"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"}],"description":{"component":"data2-core-primitives@String","params":{"content":"Closes a window that was opened via router.open."}}}}}}},"title":{"component":"data2-core-primitives@String","params":{"content":"Router"}}},"updatedAt":"2023-07-12T23:16:20.085Z"},{"_id":"5f56fac4a575399a459f7a61","component":"data2-core-types@Component","params":{"product":"ui","package":"data2-core-primitives","component":"Application","icon":"window-maximize","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"position":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Position"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":101}},"simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"},"dimensions":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Dimensions"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":102}},"simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"defaultValue":{"preventEvaluation":true,"component":"data2-core-types@Dimensions","params":{"width":1440,"height":900}},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"},"domain":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":200}},"title":{"component":"data2-core-primitives@String","params":{"content":"Domain"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Subdomain to be used when accessing the application through a data2.app URL, e.g., if the domain is 'site', you'll access your application through site.yoursystemdomain.data2.app. To have your application render on yoursystemdomain.data2.app, use 'app' as the domain value."}},"fieldValidation":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"currentValue"}}],"body":{"params":{"then":{"component":"data2-core-primitives@String","params":{"content":"Domain must not include special characters other than hyphen (-). Only lower case letters are allowed."}},"compare":[{"params":{"comparisonSubject":{"component":"data2-core-primitives@Number","params":{"content":0}},"subject":{"component":"data2-core-types@Getter","params":{"module":{"params":{"pattern":{"component":"data2-core-types@Regex","params":{"pattern":"[^a-z0-9-]","flags":"gm"}},"text":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"currentValue"}}}}},"component":"data2-core-functions@Match"},"prop":{"component":"data2-core-primitives@String","params":{"content":"length"}}}}},"component":"data2-core-comparison-operators@GreaterThan"}]},"component":"data2-core-flow@If"}}},"unversioned":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"name":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":201}},"title":{"component":"data2-core-primitives@String","params":{"content":"Name"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Name to used as the title of the page."}}},"component":"data2-core-types@ComponentParameter"},"shortName":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":201.1}},"title":{"component":"data2-core-primitives@String","params":{"content":"Short Name"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Short name of the web manifest."}}},"component":"data2-core-types@ComponentParameter"},"description":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":202}},"multiLine":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"title":{"component":"data2-core-primitives@String","params":{"content":"Description"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Description to be used in the HTML metatags and in the web app manifest."}}},"component":"data2-core-types@ComponentParameter"},"display":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":203}},"oneOf":["browser","fullscreen","standalone","minimal-ui"],"title":{"component":"data2-core-primitives@String","params":{"content":"Display"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Preferred display mode. This value is used in the Web app manifest. Defaults to 'browser'."}}},"component":"data2-core-types@ComponentParameter"},"orientation":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":204}},"oneOf":["any","natural","portrait","landscape"],"title":{"component":"data2-core-primitives@String","params":{"content":"Orientation"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Default orientation, used in the web app manifest. Defaults to 'any'."}}},"component":"data2-core-types@ComponentParameter"},"themeColor":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Color"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":205}},"title":{"component":"data2-core-primitives@String","params":{"content":"Theme Color"}},"link":{"component":"data2-core-primitives@String","params":{"content":"https://developer.mozilla.org/en-US/docs/Web/Manifest/theme_color"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Default theme color, used in the web app manifest."}}},"component":"data2-core-types@ComponentParameter"},"backgroundColor":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Color"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":206}},"title":{"component":"data2-core-primitives@String","params":{"content":"Background Color"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Placeholder color for the application. Used in the resulting HTML and in the web app manifest."}}},"component":"data2-core-types@ComponentParameter"},"entryPoint":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@ComponentInstanceReference"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":210}},"title":{"component":"data2-core-primitives@String","params":{"content":"Entry Point"}},"description":{"component":"data2-core-primitives@String","params":{"content":"What the application will render, usually an Artboard or a Router."}}},"component":"data2-core-types@ComponentParameter"},"font":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-web@Fonts"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":103}},"title":{"component":"data2-core-primitives@String","params":{"content":"Font"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Fonts that will be used as default, i.e., when the Block doesn't select a Text Font."}}},"component":"data2-core-types@ComponentParameter"},"icon":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@FileComponentUrlReference"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":104}}},"component":"data2-core-types@ComponentParameter"},"appIcon":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":105}},"title":{"component":"data2-core-primitives@String","params":{"content":"App Icon"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Icon to be used in the web app manifest. Can also be used as the iOS Icon if the iOS Icon isn't configured."}}},"component":"data2-core-types@ComponentParameter"},"image":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":106}},"title":{"component":"data2-core-primitives@String","params":{"content":"Image"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Image to be used in the og:image meta tag."}}},"component":"data2-core-types@ComponentParameter"},"responseHeaders":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","index":{"component":"data2-core-primitives@Number","params":{"content":300}},"category":"other","description":{"component":"data2-core-primitives@String","params":{"content":"Sets some HTTP headers in the response. Advanced usage!"}},"visibility":"public","parameters":{"X-Frame-Options":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"X-Frame-Options"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Sets the header X-Frame-Options. For more information on this header, see the link."}},"link":{"component":"data2-core-primitives@String","params":{"content":"https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"oneOf":[{"params":{"content":"DENY"},"component":"data2-core-primitives@String"},{"params":{"content":"SAMEORIGIN"},"component":"data2-core-primitives@String"}],"category":"other","defaultValue":{"preventEvaluation":true,"params":{"content":""},"component":"data2-core-primitives@String"}}},"Content-Security-Policy":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Content Security Policy"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Sets the Content-Security-Policy header."}},"link":{"component":"data2-core-primitives@String","params":{"content":"https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}},"defaultValue":{"preventEvaluation":true,"params":{"content":""},"component":"data2-core-primitives@String"}},"component":"data2-core-types@ComponentParameter"},"X-XSS-Protection":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"X-XSS-Protection"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Sets the header X-XSS-Protection. For more information on this header, see the link."}},"link":{"component":"data2-core-primitives@String","params":{"content":"https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-XSS-Protection"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"oneOf":[{"params":{"content":"DENY"},"component":"data2-core-primitives@String"},{"params":{"content":"SAMEORIGIN"},"component":"data2-core-primitives@String"}],"category":"other","defaultValue":{"preventEvaluation":true,"params":{"content":""},"component":"data2-core-primitives@String"}}}}}},"metaTags":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-web@MetaTag"}},"index":{"component":"data2-core-primitives@Number","params":{"content":301}},"category":"other","description":{"component":"data2-core-primitives@String","params":{"content":"Meta tags that will be set in the HTML."}},"visibility":"public","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}},"scriptTags":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"multiLine":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"visibility":"public"}},"serverSideRendering":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"visibility":"beta","unversioned":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}},"language":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":202.1}},"multiLine":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"title":{"component":"data2-core-primitives@String","params":{"content":"Language"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Language (ISO Code) to be used in the HTML metatags. Examples: en, pt-BR, es"}}},"component":"data2-core-types@ComponentParameter"},"minimalBundle":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"category":"behaviour","visibility":"private","unversioned":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"title":{"component":"data2-core-primitives@String","params":{"content":"Minimal Bundle"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Load only this Application's minimal bundle from storage instead of the full system bundle. Falls back to the full bundle if the minimal bundle is unavailable."}}}},"embeddedBundle":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"category":"behaviour","visibility":"private","unversioned":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"title":{"component":"data2-core-primitives@String","params":{"content":"Embedded Bundle"}},"description":{"component":"data2-core-primitives@String","params":{"content":"If true, embed bundle in html."}}}},"onStaleBundle":{"params":{"component":"data2-core-flow@Series","category":"behaviour","visibility":"private"},"component":"data2-core-types@ComponentParameter"}}}},"renderable":{"dimensions":{"disabled":false,"component":"data2-core-types@Dimensions","params":{"width":1366,"exactWidth":false,"exactHeight":false,"height":768}}}},"updatedAt":"2026-08-12T21:02:01.344Z"},{"_id":"5f5b83eea575399a455f3939","component":"data2-core-types@Component","params":{"public":false,"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"reference":{"component":"String"}}}},"component":"CustomFontFace","package":"data2-core-types","visibility":"deprecated"},"updatedAt":"2022-03-22T14:29:30.508Z"},{"_id":"5f6229cda575399a456c7208","component":"data2-core-types@Component","params":{"product":"ui","public":true,"package":"data2-interface-services","component":"DialogsService","icon":"window-maximize","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"confirmArtboard":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@ArtboardReference"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":202}},"defaultValue":{"preventEvaluation":true,"params":{"preventEvaluation":true},"component":"data2-core-types@ArtboardReference"},"description":{"component":"data2-core-primitives@String","params":{"content":"Artboard to display when the \"confirm\" interaction is triggered."}}},"component":"data2-core-types@ComponentParameter"},"alertArtboard":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@ArtboardReference"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":201}},"defaultValue":{"preventEvaluation":true,"params":{"preventEvaluation":true},"component":"data2-core-types@ArtboardReference"},"description":{"component":"data2-core-primitives@String","params":{"content":"Artboard to display when the \"alert\" interaction is triggered."}}},"component":"data2-core-types@ComponentParameter"},"promptArtboard":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@ArtboardReference"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":201}},"defaultValue":{"preventEvaluation":true,"params":{"preventEvaluation":true},"component":"data2-core-types@ArtboardReference"},"description":{"component":"data2-core-primitives@String","params":{"content":"Artboard to display when the \"prompt\" interaction is triggered."}}},"component":"data2-core-types@ComponentParameter"},"position":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Position"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":101}},"simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"},"dimensions":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Dimensions"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":101}},"simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"defaultValue":{"preventEvaluation":true,"params":{"width":300,"height":300},"component":"data2-core-types@Dimensions"},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"}}}},"interactions":{"component":"data2-core-types@FieldSet","params":{"fields":{"confirm":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"check-circle"}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Message to display"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Message"}}}}]},"component":"data2-core-types@ComponentParameter"},"alert":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"exclamation-circle"}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Message to display"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Message"}}}}]},"component":"data2-core-types@ComponentParameter"},"prompt":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"terminal"}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Message to display"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Message"}}}}]},"component":"data2-core-types@ComponentParameter"},"close":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"times-circle"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"submit":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"paper-plane"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"public"},"updatedAt":"2023-11-01T21:00:55.297Z"},{"_id":"5f628477a575399a457af8fc","component":"data2-core-types@Component","params":{"package":"data2-core-flow","component":"Series","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"actions":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"injectContext":[{"component":"data2-core-primitives@String","params":{"content":"prevResult"}}]},"component":"data2-core-types@ComponentParameter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"actions.0"}}},"updatedAt":"2022-09-12T19:45:24.684Z"},{"_id":"5f64d109a575399a45e26049","component":"data2-core-types@Component","params":{"component":"Boolean","package":"data2-core-primitives","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"content":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"sensitive":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"visibility":"private"},"component":"data2-core-types@ComponentParameter"}}}},"validation":{"required":{"component":"data2-core-primitives@Boolean","default":false}}},"updatedAt":"2023-11-23T21:05:08.514Z"},{"_id":"5f6b9967a575399a452b1de7","component":"data2-core-types@Component","params":{"package":"data2-core-comparison-operators","component":"GreaterThan","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"comparisonSubject":{"params":{"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Comparison Subject"}}},"component":"data2-core-types@ComponentParameter"},"subject":{"params":{"index":{"component":"data2-core-primitives@Number","params":{"content":0}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Subject"}}},"component":"data2-core-types@ComponentParameter"}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"Equivalent to: subject > comparisonSubject."}},"title":{"component":"data2-core-primitives@String","params":{"content":"GreaterThan"}},"returnPrimitiveTypes":[{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}}],"wrap":{"component":"data2-core-primitives@String","params":{"content":"subject"}}},"updatedAt":"2022-09-12T20:18:46.502Z"},{"_id":"5f6b99f8a575399a452b374d","component":"data2-core-types@Component","params":{"package":"data2-core-comparison-operators","component":"Identical","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"comparisonSubject":{"params":{"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Comparison Subject"}}},"component":"data2-core-types@ComponentParameter"},"subject":{"params":{"index":{"component":"data2-core-primitives@Number","params":{"content":0}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Subject"}}},"component":"data2-core-types@ComponentParameter"}}}},"title":{"component":"data2-core-primitives@String","params":{"content":"Identical"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Checks if subject and comparison subject are identical. The difference between Identical and Equal, is that Identical returns false when primitives aren't the same, e.g., \"0\" (primitive: string) isn't identical to 0 (primitive: number), but \"0\" (primitive: string) and 0 (primitive: number) are Equal."}},"returnPrimitiveTypes":[{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}}],"wrap":{"component":"data2-core-primitives@String","params":{"content":"subject"}}},"updatedAt":"2022-09-12T20:19:15.899Z"},{"_id":"5f6cb5c4a575399a456635b9","component":"data2-core-types@Component","params":{"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-controls@DynamicVideo","params":{"children":{"component":"html@source","params":{"src":{"component":"data2-core-types@Reference","params":{"reference":"videoFile"}}}},"muted":{"component":"data2-core-logical-operators@Or","params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":"autoPlay"}},{"component":"data2-core-types@Reference","params":{"reference":"muted"}}]}},"source":{"component":"data2-core-types@Reference","params":{"reference":"videoFile"}},"playsInline":{"component":"data2-core-types@Reference","params":{"reference":"playsInline"}},"chapters":{"component":"data2-core-types@Reference","params":{"reference":"chapters"}},"autoPlay":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Equal","params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":"builder"}},"comparisonSubject":true}}],"then":false,"else":{"component":"data2-core-types@Reference","params":{"reference":"autoPlay"}}}},"loop":{"component":"data2-core-types@Reference","params":{"reference":"loop"}},"controls":{"component":"data2-core-types@Reference","params":{"reference":"showControls"}},"poster":{"component":"data2-core-types@Reference","params":{"reference":"poster"}},"style":{"position":"absolute","width":"100%","height":{"params":{"components":[{"params":{"reference":"style.height"},"component":"data2-core-types@Reference"},{"component":"data2-core-primitives@String","params":{"content":"100%"}}]},"component":"data2-core-logical-operators@Or"},"border":"none","padding":"none","overflow":"hidden"}}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"videoFile":{"component":"data2-core-types@FileComponentUrlReference"},"autoPlay":"Boolean","loop":"Boolean","showControls":"Boolean","muted":"Boolean","chapters":{"component":"data2-core-media@Chapter","list":true},"playsInline":"Boolean","poster":{"component":"data2-core-types@FileComponentUrlReference"}}}},"component":"VideoBlock","package":"data2-blocks","icon":"video-camera","extends":"data2-core-primitives@Block","visibility":"public"},"updatedAt":"2025-01-17T03:37:51.460Z"},{"_id":"5f6b45c4bddb16a2ccb60102","component":"data2-core-types@Package","params":{"reference":"data2-porcelain","defaultValues":{"colors":{"component":"data2-core-types@FieldSet","params":{"fields":{"error":{"component":"data2-core-types@Color","params":{"rgba":"#F83A3A","opacity":1}},"attention":{"component":"data2-core-types@Color","params":{"rgba":"#FFC007","opacity":1}},"success":{"component":"data2-core-types@Color","params":{"rgba":"#00C660","opacity":1}},"primary":{"component":"data2-core-types@Color","params":{"rgba":"#A351CF","opacity":1}},"primaryLighter":{"component":"data2-core-types@Color","params":{"rgba":"#ECDBF4","opacity":1}},"primaryDarker":{"component":"data2-core-types@Color","params":{"rgba":"#8948AD","opacity":1}},"adjacent1":{"component":"data2-core-types@Color","params":{"rgba":"#E251A3","opacity":1}},"adjacent2":{"component":"data2-core-types@Color","params":{"rgba":"#765AD2","opacity":1}},"complementary":{"component":"data2-core-types@Color","params":{"rgba":"#FFFF5B","opacity":1}},"black":{"component":"data2-core-types@Color","params":{"rgba":"#121212","opacity":1}},"black-80":{"component":"data2-core-types@Color","params":{"rgba":"#232323","opacity":1}},"black-60":{"component":"data2-core-types@Color","params":{"rgba":"#343434","opacity":1}},"black-40":{"component":"data2-core-types@Color","params":{"rgba":"#454545","opacity":1}},"black-20":{"component":"data2-core-types@Color","params":{"rgba":"#5e5e5e","opacity":1}},"white":{"component":"data2-core-types@Color","params":{"rgba":"#fefefe","opacity":1}},"white-80":{"component":"data2-core-types@Color","params":{"rgba":"#F9F9F9","opacity":1}},"white-60":{"component":"data2-core-types@Color","params":{"rgba":"#F3F3F3","opacity":1}},"white-40":{"component":"data2-core-types@Color","params":{"rgba":"#EBEBEB","opacity":1}},"white-20":{"component":"data2-core-types@Color","params":{"rgba":"#DFDFDF","opacity":1}},"background-1":{"component":"data2-core-types@Color","comment":"black","params":{"rgba":"#121212","opacity":1}},"background-2":{"component":"data2-core-types@Color","comment":"black-80","params":{"rgba":"#232323","opacity":1}},"background-3":{"component":"data2-core-types@Color","comment":"black-60","params":{"rgba":"#343434","opacity":1}},"background-4":{"component":"data2-core-types@Color","comment":"black-40","params":{"rgba":"#454545","opacity":1}},"background-5":{"component":"data2-core-types@Color","comment":"black-20","params":{"rgba":"#5e5e5e","opacity":1}},"color-1":{"component":"data2-core-types@Color","comment":"white","params":{"rgba":"#fefefe","opacity":1}},"color-2":{"component":"data2-core-types@Color","comment":"white-80","params":{"rgba":"#F9F9F9","opacity":1}},"color-3":{"component":"data2-core-types@Color","comment":"white-60","params":{"rgba":"#F3F3F3","opacity":1}}}}},"gums":{"big-dark":{"component":{"component":"data2-core-types@Shadow","params":{"shadow":[{"offsetX":10,"offsetY":10,"blur":20,"spread":0,"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0, 0, 0)","opacity":0.2}}},{"offsetX":-10,"offsetY":-10,"blur":20,"spread":0,"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(124, 124, 124)","opacity":0.08}}}]}}},"small-dark":{"component":{"component":"data2-core-types@Shadow","params":{"shadow":[{"offsetX":5,"offsetY":5,"blur":10,"spread":0,"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0, 0, 0)","opacity":0.2}}},{"offsetX":-5,"offsetY":-5,"blur":10,"spread":0,"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(124, 124, 124)","opacity":0.08}}}]}}},"small-light":{"component":{"component":"data2-core-types@Shadow","params":{"shadow":[{"offsetX":5,"offsetY":5,"blur":10,"spread":0,"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(28, 28, 28)","opacity":0.1}}},{"offsetX":-5,"offsetY":-5,"blur":10,"spread":0,"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255, 255, 255)","opacity":1}}}]}}},"big-light":{"component":{"component":"data2-core-types@Shadow","params":{"shadow":[{"offsetX":10,"offsetY":10,"blur":20,"spread":0,"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(28, 28, 28)","opacity":0.1}}},{"offsetX":-10,"offsetY":-10,"blur":20,"spread":0,"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255, 255, 255)","opacity":1}}}]}}}},"font":{"component":"data2-core-types@GoogleFont","params":{"fontFamily":"Work Sans"}},"mode":"dark"}},"updatedAt":"2020-09-23T12:55:42.426Z","createdAt":"2020-09-23T12:55:42.426Z"},{"_id":"5f714812e2d6fd3e21bc1387","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"SimpleShadow","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"offsetX":"String","offsetY":"String","blur":"String","color":{"component":"data2-core-types@Color"}}}}}},{"_id":"5f737ab9e2d6fd3e211b1fd1","component":"data2-core-types@Component","params":{"component":"Formula","package":"data2-core-types","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"formula":{"component":"data2-core-primitives@String"},"dataset":{"component":"data2-core-types@DataSetReference"},"variables":{"component":"data2-core-types@FieldSet"}}}},"validation":{"required":{"component":"data2-core-primitives@Boolean","default":false}}}},{"_id":"5f7e8c44c8da12be8bb07aac","component":"data2-core-types@Component","params":{"public":true,"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"html@marquee","params":{"style":{"width":"100%","height":"100%","boxSizing":"border-box","background":{"params":{"reference":"super.fill"},"component":"data2-core-types@Reference"},"color":{"params":{"reference":"super.textColor"},"component":"data2-core-types@Reference"},"border":"none","appearance":"none","outline":"none","textDecoration":"none"},"children":{"params":{"reference":"label"},"component":"data2-core-types@Reference"},"behavior":{"params":{"reference":"behavior"},"component":"data2-core-types@Reference"},"direction":{"params":{"reference":"direction"},"component":"data2-core-types@Reference"},"scrollDelay":{"params":{"reference":"scrollDelay"},"component":"data2-core-types@Reference"},"scrollAmount":{"params":{"reference":"scrollAmount"},"component":"data2-core-types@Reference"},"loop":{"params":{"reference":"loop"},"component":"data2-core-types@Reference"}}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"behavior":{"component":"data2-core-primitives@String"},"direction":{"component":"data2-core-primitives@String"},"scrollDelay":{"component":"data2-core-primitives@Number"},"scrollAmount":{"component":"data2-core-primitives@Number"},"loop":{"component":"data2-core-primitives@Number"},"label":{"component":"data2-core-primitives@String"}}}},"component":"MarqueeBlock","package":"data2-blocks","icon":"link","extends":"data2-core-primitives@Block","visibility":"public"}},{"_id":"5f81b34bc8da12be8bbf3075","component":"data2-core-types@Component","params":{"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":null}},"super":{"border":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@EqualOrLesserThan","params":{"subject":{"component":"data2-core-functions@Count","params":{"subject":{"params":{"reference":"background"},"component":"data2-core-types@Reference"}}},"comparisonSubject":0}}],"else":{"component":"data2-core-types@Border","params":{"radius":{"component":"data2-core-types@PackageGetter","params":{"field":"radius.r3","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}}}}}},"font":{"component":"data2-core-types@PackageGetter","params":{"field":"font","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}},"fill":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@EqualOrLesserThan","params":{"subject":{"component":"data2-core-functions@Count","params":{"subject":{"params":{"reference":"background"},"component":"data2-core-types@Reference"}}},"comparisonSubject":0}}],"else":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"background"},"component":"data2-core-types@Reference"},"comparisonSubject":"faded"}}],"then":{"params":{"field":"colors.background-4","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}},"component":"data2-core-types@PackageGetter"},"else":{"params":{"field":"colors.primary","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}},"component":"data2-core-types@PackageGetter"}}}}},"style":{"padding":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@EqualOrLesserThan","params":{"subject":{"component":"data2-core-functions@Count","params":{"subject":{"params":{"reference":"background"},"component":"data2-core-types@Reference"}}},"comparisonSubject":0}}],"else":".25rem .5rem"}}},"textColor":{"params":{"field":"colors.color-2","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}},"component":"data2-core-types@PackageGetter"}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"background":{"component":"data2-core-primitives@String","oneOf":["primary","faded"]},"packageReference":{"component":"data2-core-primitives@String"}}}},"component":"Label","package":"data2-porcelain","icon":"tag","extends":"data2-core-primitives@Block","visibility":"deprecated"}},{"_id":"5fa416a4c8da12be8bb2a922","component":"data2-core-types@Component","params":{"package":"data2-blocks","component":"OldFilePreview","icon":"file-video-o","extends":"data2-core-primitives@Block","public":true,"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"file":{"component":"data2-core-primitives@String"},"previewText":{"component":"data2-core-primitives@String"},"icon":{"component":"data2-core-primitives@String"}}}},"visibility":"deprecated"}},{"_id":"5faabddcc8da12be8be5c40d","component":"data2-core-types@Component","params":{"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"mask":{"component":"data2-core-primitives@String"},"maskPlaceholder":{"component":"data2-core-primitives@String"},"alwaysShowMask":{"component":"data2-core-primitives@Boolean"}}}},"public":false,"component":"InputMask","package":"data2-controls","visibility":"deprecated"},"updatedAt":"2022-03-22T14:30:38.069Z"},{"_id":"5fc6438bc8da12be8b6a047b","component":"data2-core-types@Component","params":{"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-controls@Carousel","params":{"interval":{"component":"data2-core-types@Reference","params":{"reference":"interval"}},"slides":{"component":"data2-core-types@Reference","params":{"reference":"slides"}}}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"slides":{"component":"data2-core-types@ComponentInstanceReference","list":true},"interval":"Number"}}},"public":true,"component":"CarouselBlock","package":"data2-blocks","extends":"data2-core-primitives@Block","icon":"file-image-o","visibility":"public"}},{"_id":"5ea05435e6bac0d98ad3a651","component":"data2-core-types@DataSetReference","params":{"package":"data2-core-types","component":"DataSetExtend","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"dataset":{"component":"data2-core-types@DataSetReference"},"localField":{"component":"data2-core-types@DataSetColumnReference"},"extendField":{"component":"data2-core-types@DataSetExtendColumnReference","dependsOn":["localField","dataset"]}}}}}},{"_id":"5ec1b7ce44f1ebfde2380e3d","component":"data2-core-types@Component","params":{"package":"data2-core-functions","component":"Function","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"body":"string","parameters":{"params":{"component":"data2-core-primitives@String","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2026-05-04T14:17:38.429Z"},{"_id":"5ec30ac844f1ebfde26332ab","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"DataSetReference","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"reference":"String"}}}}},{"_id":"5ec336b544f1ebfde26991d1","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"Reference","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"reference":{"params":{"component":"data2-core-primitives@String","autocomplete":{"context":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}}},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"public","preview":{"params":{"portions":[{"component":"data2-core-primitives@String","params":{"content":"Reference | "}},{"params":{"components":[{"params":{"reference":"reference"},"component":"data2-core-types@Reference"},{"component":"data2-core-primitives@String","params":{"content":""}}]},"component":"data2-core-logical-operators@Or"}]},"component":"data2-core-functions@StringConcat"},"wrap":{"component":"data2-core-primitives@String","params":{"content":"reference"}}},"updatedAt":"2025-07-17T17:53:33.652Z"},{"_id":"5ec5491a3888745c0d571545","component":"data2-core-types@Component","params":{"definition":{"component":"data2-core-types@Definition"},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"src":"String"}}},"public":false,"component":"img","package":"html","visibility":"deprecated"},"updatedAt":"2022-03-22T14:22:38.202Z"},{"_id":"5ec592e6993f46254ea5282b","component":"data2-core-types@Component","params":{"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"column":"String"}}},"component":"DataSetColumnReference","package":"data2-core-types"}},{"_id":"5ed03a8fd68ce413605ac619","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"Position","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"x":{"params":{"component":"data2-core-primitives@Number","saveCompiled":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"y":{"params":{"component":"data2-core-primitives@Number","saveCompiled":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"left":"Boolean","top":"Boolean","right":"Boolean","bottom":"Boolean","growH":"Boolean","growV":"Boolean","freeTransform":"Boolean","fixed":"Boolean","exactX":{"params":{"component":"data2-core-primitives@Number","saveCompiled":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"visibility":"private"},"component":"data2-core-types@ComponentParameter"},"exactY":{"params":{"component":"data2-core-primitives@Number","saveCompiled":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"visibility":"private"},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2023-10-26T19:42:58.193Z"},{"_id":"5ed48494455d775111ed422a","component":"data2-core-types@Component","params":{"public":false,"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"params":{"children":{"component":"data2-core-types@Reference","params":{"reference":"text"}},"dimensions":{"params":{"reference":"dimensions"},"component":"data2-core-types@Reference"},"position":{"params":{"reference":"position"},"component":"data2-core-types@Reference"},"textColor":{"params":{"reference":"textColor"},"component":"data2-core-types@Reference"},"textSize":{"params":{"reference":"textSize"},"component":"data2-core-types@Reference"}},"component":"data2-core-primitives@Block"}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"dimensions":{"component":"data2-core-types@Dimensions"},"position":{"component":"data2-core-types@Position"},"text":"String","textSize":"Number"}}},"component":"Label","package":"data2-blocks","visibility":"public"}},{"_id":"5ed52254d68ce41360e8edd7","component":"data2-core-types@Component","params":{"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"params":{"children":{"component":"html@input","params":{"style":{"width":"100%","height":"100%","boxSizing":"border-box"},"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"type":{"component":"data2-core-types@Reference","params":{"reference":"type"}},"placeholder":{"component":"data2-core-types@Reference","params":{"reference":"placeholder"}},"value":{"component":"data2-core-types@DataLinkGetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}}}},"onChange":{"component":"data2-core-types@DataLinkSetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}}}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}}}},"dimensions":{"params":{"reference":"dimensions"},"component":"data2-core-types@Reference"},"position":{"params":{"reference":"position"},"component":"data2-core-types@Reference"},"style":{"params":{"reference":"style"},"component":"data2-core-types@Reference"}},"component":"data2-core-primitives@Block"}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"dimensions":{"component":"data2-core-types@Dimensions"},"position":{"component":"data2-core-types@Position"},"style":{"component":"data2-core-types@StyleSheet"},"dataset":{"component":"data2-core-types@DataSetReference"},"field":{"component":"data2-core-types@DataSetColumnReference"},"placeholder":{"component":"String"},"type":{"component":"String","oneOf":["text","number","checkbox","email","password","date","color"]}}}},"public":false,"component":"DataField2","package":"data2-blocks","visibility":"deprecated"},"updatedAt":"2022-03-22T14:26:31.640Z"},{"_id":"5edda6c6b9e0891ce913e885","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"ComponentInstanceReference","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"component":"String","reference":"String"}}}}},{"_id":"5ee2bc3cd68ce41360d88c5a","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"DataLinkSetter","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"dataset":{"component":"data2-core-types@DataSetReference"},"field":{"component":"data2-core-types@DataSetColumnReference"},"record":{"component":"data2-core-types@Reference"},"onChange":{"component":"data2-core-types@Interaction"},"value":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2024-12-02T17:39:57.782Z"},{"_id":"5efc341576b2b8399e02afad","component":"data2-core-types@Component","params":{"package":"data2-core","component":"Database","icon":"database","visibility":"private","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"position":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Position"}},"category":"appearance"},"component":"data2-core-types@ComponentParameter"},"dimensions":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Dimensions"}},"category":"appearance","defaultValue":{"preventEvaluation":true,"params":{"width":300,"height":300},"component":"data2-core-types@Dimensions"}},"component":"data2-core-types@ComponentParameter"},"stack":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"oneOf":["mongo","mysql","postgresql"],"category":"behaviour"},"component":"data2-core-types@ComponentParameter"},"mongo":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"defaultValue":{"host":{"component":"data2-core-primitives@String","params":{"content":""}},"database":{"component":"data2-core-primitives@String","params":{"content":""}},"user":{"component":"data2-core-primitives@String","params":{"content":""}},"password":{"component":"data2-core-primitives@String","params":{"content":""}},"options":{"retryWrites":{"params":{"content":true},"component":"data2-core-primitives@Boolean"},"w":{"component":"data2-core-primitives@String","params":{"content":"majority"}},"useNewUrlParser":{"params":{"content":true},"component":"data2-core-primitives@Boolean"},"useUnifiedTopology":{"params":{"content":true},"component":"data2-core-primitives@Boolean"},"bufferCommands":{"params":{"content":false},"component":"data2-core-primitives@Boolean"},"serverSelectionTimeoutMS":{"params":{"content":20000},"component":"data2-core-primitives@Number"}}}},"component":"data2-core-types@ComponentParameter"},"mysql":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"defaultValue":{"host":{"component":"data2-core-primitives@String","params":{"content":""}},"database":{"component":"data2-core-primitives@String","params":{"content":""}},"user":{"component":"data2-core-primitives@String","params":{"content":""}},"password":{"component":"data2-core-primitives@String","params":{"content":""}}}},"component":"data2-core-types@ComponentParameter"},"postgresql":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"defaultValue":{"host":{"component":"data2-core-primitives@String","params":{"content":""}},"database":{"component":"data2-core-primitives@String","params":{"content":""}},"user":{"component":"data2-core-primitives@String","params":{"content":""}},"password":{"component":"data2-core-primitives@String","params":{"content":""}}}},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2022-01-21T18:33:38.345Z"},{"_id":"5f02b4b41ca96def42658c55","component":"data2-core-types@Component","params":{"package":"data2-core","component":"File","icon":"file-o","visibility":"private","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"name":"string","contentType":"string","extension":"string","size":"number","folder":"string"}}}},"updatedAt":"2023-11-23T21:07:49.902Z"},{"_id":"5f49063ca575399a45f5410c","component":"data2-core-types@Component","params":{"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"html@button","params":{"children":{"component":"data2-core-types@Reference","params":{"reference":"label"}},"style":{"width":"100%","height":"100%","border":"none","cursor":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"disabled"},"component":"data2-core-types@Reference"},"comparisonSubject":true}}],"then":"not-allowed","else":"pointer"}},"background":{"params":{"reference":"super.fill"},"component":"data2-core-types@Reference"},"color":{"params":{"reference":"super.textColor"},"component":"data2-core-types@Reference"},"fontSize":{"params":{"reference":"super.textSize"},"component":"data2-core-types@Reference"},"opacity":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"disabled"},"component":"data2-core-types@Reference"},"comparisonSubject":true}}],"then":0.38,"else":1}}},"disabled":{"params":{"reference":"disabled"},"component":"data2-core-types@Reference"}}}}},"super":{"style":{":hover":{"filter":"brightness(115%)"}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"label":{"component":"data2-core-primitives@String"},"disabled":{"component":"data2-core-primitives@Boolean"}}}},"public":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"component":"ButtonDj","package":"data2-blocks","icon":"caret-square-o-right","extends":"data2-core-primitives@Block","visibility":"deprecated"},"updatedAt":"2022-04-06T14:01:09.286Z"},{"_id":"5f51b32ca575399a459efcd1","component":"data2-core-types@Component","params":{"component":"Field","package":"data2-core-types","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"key":"data2-core-primitives@String","title":"data2-core-primitives@String","component":{"component":"data2-core-primitives@String","oneOf":["data2-core-primitives@String","data2-core-primitives@Boolean"]},"customValidations":{"params":{"visibility":"private"},"component":"data2-core-types@ComponentParameter"},"customListValidations":{"params":{"visibility":"private"},"component":"data2-core-types@ComponentParameter"},"transform":{"params":{"visibility":"private"},"component":"data2-core-types@ComponentParameter"}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"Define the name, the type and the rules for each field."}},"preview":{"params":{"portions":[{"component":"data2-core-primitives@String","params":{"content":"Field | "}},{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"key"}}}}]},"component":"data2-core-functions@StringConcat"}},"updatedAt":"2026-05-08T00:45:06.911Z"},{"_id":"5f51ca6ba575399a45a34cd3","component":"data2-core-types@Component","params":{"component":"Number","package":"data2-core-primitives","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"content":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"list":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"visibility":"private"},"component":"data2-core-types@ComponentParameter"},"sensitive":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"visibility":"private"},"component":"data2-core-types@ComponentParameter"}}}},"validation":{"required":{"component":"data2-core-primitives@Boolean","default":false},"integer":{"component":"data2-core-primitives@Boolean","default":false},"greaterThan":{"component":"data2-core-primitives@Number"},"lessThan":{"component":"data2-core-primitives@Number"},"oneOf":{"component":"data2-core-primitives@Number"}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"content"}}},"updatedAt":"2024-08-23T12:53:36.548Z"},{"_id":"5f56fb31a575399a459f8e99","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"RouterReference","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"reference":{"component":"data2-core-primitives@String"}}}}}},{"_id":"5f58fc8da575399a45f59c2b","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"FileComponentUrlReference","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"reference":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Reference"}},"description":{"component":"data2-core-primitives@String","params":{"content":"File component instance reference."}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}}}},"extension":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Extension"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Requests the file with an extension. If an image, tries to covert it to the requested extension."}},"index":{"component":"data2-core-primitives@Number","params":{"content":14}}}}}}}},"updatedAt":"2022-03-18T19:26:54.302Z"},{"_id":"5f6b5d16a575399a451fd71d","component":"data2-core-types@Component","params":{"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"html@button","params":{"type":"button","children":[{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@EqualOrLesserThan","params":{"subject":{"component":"data2-core-functions@Count","params":{"subject":{"params":{"reference":"icon"},"component":"data2-core-types@Reference"}}},"comparisonSubject":0}}],"then":null,"else":{"component":"html@i","params":{"aria-hidden":"true","className":{"component":"data2-core-functions@StringConcat","params":{"portions":["fa fa-",{"component":"data2-core-types@Reference","params":{"reference":"icon"}}]}},"style":{"marginRight":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@EqualOrLesserThan","params":{"subject":{"component":"data2-core-functions@Count","params":{"subject":{"params":{"reference":"label"},"component":"data2-core-types@Reference"}}},"comparisonSubject":0}}],"then":0,"else":8}}}}}}},{"component":"data2-core-types@Reference","params":{"reference":"label"}}],"style":{"fontFamily":"inherit","background":"none","width":"100%","height":"100%","border":"none","cursor":"pointer","color":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"type"},"component":"data2-core-types@Reference"},"comparisonSubject":"secondary"}}],"then":{"params":{"field":"colors.color-2","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}},"component":"data2-core-types@PackageGetter"},"else":{"component":"data2-core-types@PackageGetter","params":{"field":"colors.primary","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}}}},"fontSize":{"params":{"reference":"super.textSize"},"component":"data2-core-types@Reference"},"textTransform":"uppercase"},"disabled":{"params":{"reference":"disabled"},"component":"data2-core-types@Reference"}}}}},"super":{"style":{"background":{"params":{"field":"colors.background-2","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}},"component":"data2-core-types@PackageGetter"},":hover":{"background":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"disabled"},"component":"data2-core-types@Reference"},"comparisonSubject":true}}],"then":{"component":"data2-core-functions@StringConcat","params":{"portions":[{"params":{"field":"colors.background-2","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}},"component":"data2-core-types@PackageGetter"}," !important"]}},"else":{"component":"data2-core-functions@StringConcat","params":{"portions":[{"params":{"field":"colors.background-3","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}},"component":"data2-core-types@PackageGetter"}," !important"]}}}}},"opacity":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"disabled"},"component":"data2-core-types@Reference"},"comparisonSubject":true}}],"then":0.5,"else":1}}},"font":{"component":"data2-core-types@PackageGetter","params":{"field":"font","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}},"shadow":{"component":"data2-core-types@PackageGetter","params":{"field":"gums.small","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}},"border":{"component":"data2-core-types@Border","params":{"color":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"type"},"component":"data2-core-types@Reference"},"comparisonSubject":"secondary"}}],"then":{"params":{"field":"colors.background-3","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}},"component":"data2-core-types@PackageGetter"},"else":{"component":"data2-core-types@PackageGetter","params":{"field":"colors.primary","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}}}},"radius":{"component":"data2-core-types@PackageGetter","params":{"field":"radius.r2","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}},"width":{"left":1,"top":1,"right":1,"bottom":1}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"icon":{"component":"data2-core-primitives@String"},"label":{"component":"data2-core-primitives@String"},"disabled":{"component":"data2-core-primitives@Boolean"},"type":{"component":"data2-core-primitives@String","oneOf":["primary","secondary"]},"packageReference":{"component":"data2-core-primitives@String"}}}},"component":"ButtonVirtualOld","package":"data2-porcelain","icon":"caret-square-o-right","extends":"data2-core-primitives@Block","visibility":"deprecated"}},{"_id":"5f6b999aa575399a452b27c0","component":"data2-core-types@Component","params":{"package":"data2-core-comparison-operators","component":"EqualOrLesserThan","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"comparisonSubject":{"params":{"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Comparison Subject"}}},"component":"data2-core-types@ComponentParameter"},"subject":{"params":{"index":{"component":"data2-core-primitives@Number","params":{"content":0}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Subject"}}},"component":"data2-core-types@ComponentParameter"}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"Equivalent to: subject ≤ comparisonSubject."}},"returnPrimitiveTypes":[{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}}],"wrap":{"component":"data2-core-primitives@String","params":{"content":"subject"}}},"updatedAt":"2022-09-12T20:06:36.891Z"},{"_id":"5f6b99a4a575399a452b2964","component":"data2-core-types@Component","params":{"package":"data2-core-comparison-operators","component":"Equal","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"comparisonSubject":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Comparison Subject"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"},"subject":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Subject"}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}}},"component":"data2-core-types@ComponentParameter"}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"Equivalent to: subject == comparisonSubject. If either subject or comparisonSubject are missing, it returns true."}},"title":{"component":"data2-core-primitives@String","params":{"content":"Equal"}},"returnPrimitiveTypes":[{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}}],"wrap":{"component":"data2-core-primitives@String","params":{"content":"subject"}}},"updatedAt":"2022-09-12T19:49:41.741Z"},{"_id":"5f6d01a1a575399a4576854b","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"ProcessGetter","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"reference":{"component":"data2-core-primitives@String"},"field":{"component":"data2-core-primitives@String"}}}}}},{"_id":"5f6e0909a575399a45a9d81e","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"Setter","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"module":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@InteractiveModuleReference"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"},"prop":{"params":{"autocomplete":{"module":{"component":"data2-core-types@Reference","params":{"reference":"module"}}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}},"dependsOn":[{"component":"data2-core-primitives@String","params":{"content":"module"}}],"alternativeParameterDefaultType":[{"parameter":{"component":"data2-core-primitives@String","params":{"content":"module"}},"value":{"params":{"reference":"__UIState"},"component":"data2-core-types@InteractiveModuleReference"},"type":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-user-interface@StateProp"}}},"component":"data2-core-types@ComponentParameter"}}],"shouldShow":{"component":"data2-core-primitives@Boolean","params":{"content":true},"preventEvaluation":true}},"component":"data2-core-types@ComponentParameter"},"value":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":3}},"dependsOn":[{"component":"data2-core-primitives@String","params":{"content":"module"}}]},"component":"data2-core-types@ComponentParameter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"then"}},"preview":{"params":{"portions":[{"component":"data2-core-primitives@String","params":{"content":"Setter | "}},{"params":{"compare":[{"component":"data2-core-types@Getter","params":{"module":{"params":{"pattern":{"component":"data2-core-types@Regex","params":{"pattern":"^data\\.states"}},"text":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"prop"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-functions@Match"},"prop":{"component":"data2-core-primitives@String","params":{"content":"0"}}}}],"else":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"prop"}}}},"then":{"params":{"content":"UIState"},"component":"data2-core-primitives@String"}},"component":"data2-core-flow@If"}]},"component":"data2-core-functions@StringConcat"}},"updatedAt":"2023-01-24T17:25:34.597Z"},{"_id":"5f6f7eeee2d6fd3e216ae8a4","component":"data2-core-types@Component","params":{"extendable":{"placeholder":"children"},"package":"data2-blocks","component":"Repeater","public":false,"extends":"data2-core-primitives@Block","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"dataset":{"component":"data2-core-types@DataSetReference"}}}},"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-core-functions@MapRecords","params":{"component":{"component":"data2-core-types@Reference","params":{"reference":"children"}},"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}}}}}},"visibility":"deprecated"},"updatedAt":"2022-03-22T14:29:53.459Z"},{"_id":"5f7289e2e2d6fd3e21f1a3ff","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"Border","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"color":{"component":"data2-core-types@Color"},"width":{"params":{"component":"data2-core-primitives@Object","parameters":{"top":{"params":{"component":"data2-core-primitives@Number"},"component":"data2-core-types@ComponentParameter"},"left":{"params":{"component":"data2-core-primitives@Number"},"component":"data2-core-types@ComponentParameter"},"right":{"params":{"component":"data2-core-primitives@Number"},"component":"data2-core-types@ComponentParameter"},"bottom":{"params":{"component":"data2-core-primitives@Number"},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@ComponentParameter"},"radius":{"leftTop":{"component":"data2-core-primitives@Number"},"rightTop":{"component":"data2-core-primitives@Number"},"leftBottom":{"component":"data2-core-primitives@Number"},"rightBottom":{"component":"data2-core-primitives@Number"}},"type":"Number"}}}},"updatedAt":"2026-05-22T15:03:06.293Z"},{"_id":"5f72aed7e2d6fd3e21f86726","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"DataSetSelectSettings","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"column":"String","value":"String"}}}}},{"_id":"5f8ef794c8da12be8b43934b","component":"data2-core-types@Component","params":{"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"html@label","params":{"children":[{"component":"html@input","params":{"key":"input","type":"radio","style":{"width":18,"height":18,"boxSizing":"border-box","background":{"params":{"reference":"super.fill"},"component":"data2-core-types@Reference"},"color":{"params":{"reference":"super.textColor"},"component":"data2-core-types@Reference"},"appearance":"none","border":"none","outline":"none","cursor":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"disabled"},"component":"data2-core-types@Reference"},"comparisonSubject":true}}],"then":"not-allowed","else":"auto"}}},"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"placeholder":{"component":"data2-core-logical-operators@Or","params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":"placeholder"}},{"component":"data2-core-types@Reference","params":{"reference":"field"}}]}},"value":{"component":"data2-core-types@Reference","params":{"reference":"value"}},"name":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"checked":{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"component":"data2-core-types@DataLinkGetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record"}}}},"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":"value"}}}},"onChange":{"component":"data2-core-types@DataLinkSetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record"}}}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"disabled":{"params":{"reference":"disabled"},"component":"data2-core-types@Reference"}}},{"component":"data2-porcelain@Label","params":{"key":"label","super":{"style":{"marginLeft":10},"text":{"component":"data2-core-types@Reference","params":{"reference":"label"}}},"packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}}],"style":{"display":"flex"}}}}},"super":{"fill":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"type"},"component":"data2-core-types@Reference"},"comparisonSubject":"button"}}],"then":{"component":"data2-core-types@PackageGetter","params":{"field":"colors.background-2","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}}}},"font":{"component":"data2-core-types@PackageGetter","params":{"field":"font","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}},"border":{"radius":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"type"},"component":"data2-core-types@Reference"},"comparisonSubject":"button"}}],"then":{"component":"data2-core-types@PackageGetter","params":{"field":"radius.r2","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}}}}},"shadow":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"type"},"component":"data2-core-types@Reference"},"comparisonSubject":"button"}}],"then":{"component":"data2-core-types@PackageGetter","params":{"field":"gums.small","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}}}},"style":{"display":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"type"},"component":"data2-core-types@Reference"},"comparisonSubject":"button"}}],"then":"flex"}},"alignItems":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"type"},"component":"data2-core-types@Reference"},"comparisonSubject":"button"}}],"then":"center"}},"justifyContent":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"type"},"component":"data2-core-types@Reference"},"comparisonSubject":"button"}}],"then":"center"}},"opacity":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"disabled"},"component":"data2-core-types@Reference"},"comparisonSubject":true}}],"then":0.38,"else":1}}," input[type=\"radio\"]":{"position":"relative","cursor":"pointer"}," input[type=\"radio\"]:before":{"content":" ","display":"block","position":"absolute","width":18,"height":18,"top":0,"left":0,"boxSizing":"border-box","border":"2px solid","borderColor":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"component":"data2-core-types@PackageGetter","params":{"field":"mode","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}},"comparisonSubject":"dark"}}],"then":{"component":"data2-core-types@PackageGetter","params":{"field":"colors.white-60","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}},"else":{"component":"data2-core-types@PackageGetter","params":{"field":"colors.black-20","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}}}},"borderRadius":"100%"}," input[type=\"radio\"]:checked:before":{"border":"2px solid","borderColor":{"component":"data2-core-types@PackageGetter","params":{"field":"colors.primary","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}}}," input[type=\"radio\"]:checked:after":{"content":" ","display":"block","width":6,"height":6,"backgroundColor":{"component":"data2-core-types@PackageGetter","params":{"field":"colors.primary","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}},"borderRadius":"100%","position":"absolute","top":6,"left":6}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"dataset":{"component":"data2-core-types@DataSetReference"},"field":{"component":"data2-core-types@DataSetColumnReference"},"record":{"component":"data2-core-types@Reference"},"label":{"component":"data2-core-primitives@String"},"value":{"component":"data2-core-primitives@String"},"disabled":{"component":"data2-core-primitives@Boolean"},"type":{"component":"data2-core-primitives@String","oneOf":["normal","button"]},"packageReference":{"component":"data2-core-primitives@String"}}}},"component":"Radio","package":"data2-porcelain","icon":"dot-circle-o","extends":"data2-core-primitives@Block","visibility":"deprecated"},"updatedAt":"2020-10-21T18:17:15.342Z","createdAt":"2020-10-20T14:43:56.921Z"},{"_id":"5f92db48c8da12be8b24a6c2","component":"data2-core-types@Component","params":{"component":"Variable","package":"data2-core-types","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"reference":{"component":"data2-core-primitives@String"},"key":{"component":"data2-core-primitives@String"},"initialValue":{"component":"data2-core-primitives@String"},"component":{"component":"data2-core-primitives@String","oneOf":["data2-core-primitives@String","data2-core-primitives@Boolean","data2-core-primitives@Number"]}}}}}},{"_id":"5f95c724c8da12be8bbc9549","component":"data2-core-types@Component","params":{"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"state":{"component":"data2-core-primitives@String"},"artboard":{"component":"data2-core-types@ArtboardReference"}}}},"component":"ComponentState","package":"data2-core-types","preview":{"params":{"reference":"state"},"component":"data2-core-types@Reference"}},"updatedAt":"2022-10-24T19:43:14.227Z"},{"_id":"5f97389ec8da12be8b0859e3","component":"data2-core-types@Component","params":{"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-controls@Placeholder","params":{"fill":{"component":"data2-core-types@Reference","params":{"reference":"super.fill"}},"highlightColor":{"component":"data2-core-types@Reference","params":{"reference":"super.textColor"}},"width":{"component":"data2-core-types@Reference","params":{"reference":"super.dimensions.width"}},"height":{"component":"data2-core-types@Reference","params":{"reference":"super.dimensions.height"}},"duration":{"component":"data2-core-types@Reference","params":{"reference":"duration"}},"delay":{"component":"data2-core-types@Reference","params":{"reference":"delay"}}}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"duration":{"component":"data2-core-primitives@Number","index":0},"delay":{"component":"data2-core-primitives@Number","index":1}}}},"public":true,"component":"Placeholder","package":"data2-blocks","icon":"spinner","extends":"data2-core-primitives@Block","visibility":"public"}},{"_id":"5ea04dbbe6bac0d98ad27232","component":"data2-core-types@Component","params":{"package":"data2-core","component":"DataSet","icon":"table","product":"registry","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"master":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetMaster"}},"index":{"component":"data2-core-primitives@Number","params":{"content":9}},"description":{"component":"data2-core-primitives@String","params":{"content":"An automated filter based on another DataSet.\n Pick a field, a master DataSet, and a Master Field to configure this property.\n When set, this DataSet will only show entries in which the field has the data equal to the Master Field  of the Master DataSet current cursor."}}},"component":"data2-core-types@ComponentParameter"},"datasource":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core@DataSourceReference"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"visibility":"private"},"component":"data2-core-types@ComponentParameter"},"filter":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetFilter"}},"index":{"component":"data2-core-primitives@Number","params":{"content":3}},"arguments":[],"description":{"component":"data2-core-primitives@String","params":{"content":"Initial Filter settings of this DataSet.  Using the interaction \"filter\" overwrites this setting."}}},"component":"data2-core-types@ComponentParameter"},"fields":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@FieldReference"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}},"description":{"component":"data2-core-primitives@String","params":{"content":"Of all fields in the Table, what are those you want present in this DataSet?\nIf left empty, will always get all Table fields."}}},"component":"data2-core-types@ComponentParameter"},"pagination":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"index":{"component":"data2-core-primitives@Number","params":{"content":7}},"parameters":{"size":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Amount of records per page."}},"defaultValue":{"params":{"content":20},"component":"data2-core-primitives@Number"}}},"skip":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Amount of records to skip. For a page size of 5, a skip of 5 will show the second page fully, while a skip of 3 will show 2 elements of the first page."}}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"Limits the amount of data the DataSet retrieves from the table. This can be used to split the amount of records of the DataSet into pages. By default, the DataSet has a limit of 1000 Records."}}},"component":"data2-core-types@ComponentParameter"},"join":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetJoin"}},"visibility":"private","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"extend":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetExtend"}},"visibility":"private"},"component":"data2-core-types@ComponentParameter"},"refreshOnEdit":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"description":{"component":"data2-core-primitives@String","params":{"content":"If enabled, forces a refresh before editing the current cursor."}}},"component":"data2-core-types@ComponentParameter"},"select":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetSelectSettings"}},"index":{"component":"data2-core-primitives@Number","params":{"content":10}},"description":{"component":"data2-core-primitives@String","params":{"content":"Specify which record should be selected when the DataSet initially loads. Has no effect if the AutoSelect is not enabled."}}},"component":"data2-core-types@ComponentParameter"},"autoSelect":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"defaultValue":{"params":{"content":true},"component":"data2-core-primitives@Boolean"},"description":{"component":"data2-core-primitives@String","params":{"content":"When the DataSet is first loaded in a page,  whether it should automatically select its first item or not."}}},"component":"data2-core-types@ComponentParameter"},"sort":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetSort"}},"index":{"component":"data2-core-primitives@Number","params":{"content":8}},"description":{"component":"data2-core-primitives@String","params":{"content":"Sorting settings for the DataSet. Changes the order in which the results show on the DataSet."}}},"component":"data2-core-types@ComponentParameter"},"requiresConfirmation":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"description":{"component":"data2-core-primitives@String","params":{"content":"If active, asks the user to confirm deletion before actually deleting the selected records. You may change the type to be an InteractiveModuleReference, and pick a custom DialogService for using a custom Dialog."}}},"component":"data2-core-types@ComponentParameter"},"policies":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-auth@Policy"}},"index":{"component":"data2-core-primitives@Number","params":{"content":11}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"description":{"component":"data2-core-primitives@String","params":{"content":"Controls for allowing or denying access to the data on the DataSet."}}},"component":"data2-core-types@ComponentParameter"},"pk":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetColumnReference"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Primary field of the table. Should be changed only if the table is a Custom Data Source. Defaults to the \"_id\" field."}}},"component":"data2-core-types@ComponentParameter"},"collation":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"index":{"component":"data2-core-primitives@Number","params":{"content":8.5}},"arguments":[],"visibility":"beta","parameters":{"strength":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}}},"component":"data2-core-types@ComponentParameter"},"locale":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"oneOf":["af","sq","am","ar","hy","as","az","bn","be","bn","bs","bs_Cyrl","bg","my","ca","chr","zh","zh_Hant","hr","cs","da","nl","dz","en","en_US","en_US_POSIX","eo","et","ee","fo","fil","fi","fr","fr_CA","gl","ka","de","de_AT","el","gu","ha","haw","he","hi","hu","is","ig","smn","id","ga","it","ja","kl","kn","kk","km","kok","ko","ky","lkt","lo","lv","ln","lt","dsb","lb","mk","ms","ml","mt","mr","mn","ne","se","nb","nn","or","om","ps","fa","fa_AF","pl","pt","pa","ro","ru","sr","sr_Latn","si","sk","sl","es","sw","sv","ta","te","th","bo","to","tr","uk","hsb","ur","ug","vi","wae","cy","yi","yo","zu"]},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@ComponentParameter"},"visibilityMode":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"visibility":"public","oneOf":[{"params":{"content":"hide_deleted"},"component":"data2-core-primitives@String"},{"params":{"content":"only_show_deleted"},"component":"data2-core-primitives@String"},{"params":{"content":"show_all"},"component":"data2-core-primitives@String"}]}},"aggregations":{"component":"data2-core-types@ComponentParameter","params":{"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-registry@DataSetAggregation"}},"visibility":"public","description":{"component":"data2-core-primitives@String","params":{"content":"Configure settings for counting data, filtering, taking averages and other operations for analysing the data on a table."}}}},"lookupDataSets":{"component":"data2-core-types@ComponentParameter","params":{"visibility":"public","component":"data2-core-primitives@Inferred","componentOptions":{"inferredComponent":{"params":{"body":{"params":{"component":"data2-core-primitives@Object","parameters":{"params":{"fieldsList":{"params":{"array":{"params":{"array":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"param.executedInstanceParams.datasource.instance.schema"}}}},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"field"}}],"body":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"field.component"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Lookup"}}},"component":"data2-core-comparison-operators@Equal"}}}},"component":"data2-core-functions@ArrayFilter"},"mapper":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"field"}}],"body":{"key":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"field.key"}}}},"value":{"params":{"component":"data2-core-types@DataSetReference","fieldValidation":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"currentValue"}}],"body":{"params":{"then":{"component":"data2-core-primitives@String","params":{"content":"Please pick a default DataSet for the lookup field."}},"compare":[{"params":{"comparisonSubject":{"params":{},"component":"data2-core-primitives@Undefined"},"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"currentValue"}}}}},"component":"data2-core-comparison-operators@Equal"}]},"component":"data2-core-flow@If"}}}},"component":"data2-core-types@ComponentParameter"}}}}},"component":"data2-core-functions@ArrayMap"}},"component":"data2-core-types@FieldSet"}},"component":"data2-core-types@ComponentParameter"},"parameters":[{"component":"data2-core-primitives@String","params":{"content":"param"}}]},"component":"data2-core-functions@Function"}}}},"lookupPopulateDepths":{"component":"data2-core-types@ComponentParameter","params":{"visibility":"public","component":"data2-core-primitives@Inferred","componentOptions":{"inferredComponent":{"params":{"body":{"params":{"component":"data2-core-primitives@Object","parameters":{"params":{"fieldsList":{"params":{"array":{"params":{"array":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"param.executedInstanceParams.datasource.instance.schema"}}}},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"field"}}],"body":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"field.component"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Lookup"}}},"component":"data2-core-comparison-operators@Equal"}}}},"component":"data2-core-functions@ArrayFilter"},"mapper":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"field"}}],"body":{"key":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"field.key"}}}},"value":{"params":{"component":"data2-core-primitives@Number"},"component":"data2-core-types@ComponentParameter"}}}}},"component":"data2-core-functions@ArrayMap"}},"component":"data2-core-types@FieldSet"}},"component":"data2-core-types@ComponentParameter"},"parameters":[{"component":"data2-core-primitives@String","params":{"content":"param"}}]},"component":"data2-core-functions@Function"}}}},"versioning":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","key":{"component":"data2-core-primitives@String","params":{"content":"versioning"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Versioning"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Controls versioning behavior."}},"shouldShow":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"domain"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"data2"}}},"component":"data2-core-comparison-operators@Equal"},"saveCompiled":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"visibility":"private","oneOf":[{"params":{"content":"enabled"},"component":"data2-core-primitives@String"},{"params":{"content":"disabled"},"component":"data2-core-primitives@String"}]}},"autoEdit":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"description":{"component":"data2-core-primitives@String","params":{"content":"If true, when the cursor changes, the DataSet automatically saves the previous record and enter in Edit mode for the next record in the cursor."}},"category":"behaviour","visibility":"private"},"component":"data2-core-types@ComponentParameter"},"staticFilter":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetFilter"}},"index":{"component":"data2-core-primitives@Number","params":{"content":3.1}},"description":{"component":"data2-core-primitives@String","params":{"content":"Static Filter settings of this DataSet.  It is not overwritten by filterSettings or filter and it is always applied to the DataSet, along the normal filter."}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"staticPagination":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"index":{"component":"data2-core-primitives@Number","params":{"content":7.1}},"parameters":{"size":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Amount of records per page."}},"defaultValue":{"params":{"content":20},"component":"data2-core-primitives@Number"}}},"skip":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Amount of records to skip. For a page size of 5, a skip of 5 will show the second page fully, while a skip of 3 will show 2 elements of the first page."}}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"Static Pagination settings of this DataSet.  It is not overwritten by pagination or filter and it is always applied to the DataSet, overriding the normal pagination."}},"visibility":"private"},"component":"data2-core-types@ComponentParameter"}}}},"interactions":{"component":"data2-core-types@FieldSet","params":{"fields":{"insert":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"plus-circle"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"save":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"floppy-o"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"edit":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"pencil-square"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"cancel":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"times-circle"}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"key":{"component":"data2-core-primitives@String","params":{"content":"options"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Options"}},"parameters":{"disableRefresh":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Boolean","key":{"component":"data2-core-primitives@String","params":{"content":"disableRefresh"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Disable Refresh"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Disables refresh after cancel."}}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"Cancel options"}}}}]},"component":"data2-core-types@ComponentParameter"},"delete":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"minus-circle"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"refresh":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"refresh"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"filter":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"filter"}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@FieldSet"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Query"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Query to filter dataset."}}}}]},"component":"data2-core-types@ComponentParameter"},"select":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"i-cursor"}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-types@DataSetColumnReference","required":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"title":{"component":"data2-core-primitives@String","params":{"content":"Field"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Field to be used to select Record."}},"defaultValue":{"params":{},"component":"data2-core-types@DataSetColumnReference","preventEvaluation":true},"controlSettings":{"dataSet":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"module"}}}}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Field value"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Value of the field."}},"required":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}}]},"component":"data2-core-types@ComponentParameter"},"next":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"step-forward"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"prev":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"step-backward"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"nextPage":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"params":{"icon":"fa fa-fast-forward","content":"fa-fast-forward"},"component":"data2-core-primitives@String"},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"appendNextPage":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"forward"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"downloadAsCsv":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"table"}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"key":{"component":"data2-core-primitives@String","params":{"content":"options"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Options"}},"parameters":{"delimiter":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Boolean","key":{"component":"data2-core-primitives@String","params":{"content":"delimiter"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Delimiter"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Delimiter for generated file. Default is \",\"."}},"oneOf":[{"params":{"content":","},"component":"data2-core-primitives@String"},{"params":{"content":";"},"component":"data2-core-primitives@String"}]}},"encoding":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Boolean","key":{"component":"data2-core-primitives@String","params":{"content":"encoding"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Encoding"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Encoding for generated file. Default is \"utf-8\"."}},"oneOf":[{"params":{"content":"utf-8"},"component":"data2-core-primitives@String"},{"params":{"content":"windows-1252"},"component":"data2-core-primitives@String"}]}},"shouldPopulateLookups":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Boolean","key":{"component":"data2-core-primitives@String","params":{"content":"shouldPopulateLookups"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Should populate lookups"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Controls whether fully populated data is exported to the CSV."}}}},"brazilianExcelFormat":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Boolean","key":{"component":"data2-core-primitives@String","params":{"content":"brazilianExcelFormat"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Brazilian Excel Format"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Controls whether the CSV will be generated compatible with PT-BR Excel."}}}},"filename":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","key":{"component":"data2-core-primitives@String","params":{"content":"filename"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Filename"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Filename of the downloaded file. By default, it is the reference of the dataset."}}}},"aggregationAt":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Number","key":{"component":"data2-core-primitives@String","params":{"content":"aggregationAt"}},"index":{"component":"data2-core-primitives@Number","params":{"content":100}},"description":{"component":"data2-core-primitives@String","params":{"content":"If the DataSet is holding data from an aggregation, this parameter is used as the index of which aggregation is used to export the data (`aggregated.${aggregationAt}.data`)."}},"title":{"component":"data2-core-primitives@String","params":{"content":"Aggregation At"}}}},"flatten":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Boolean","key":{"component":"data2-core-primitives@String","params":{"content":"flatten"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Flatten"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Converts nested objects into dot-notation columns (e.g., `user.name`)"}}}},"stringify":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Boolean","key":{"component":"data2-core-primitives@String","params":{"content":"stringify"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Stringify"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Turns any complex data, like objects or arrays, into a JSON string within its cell."}}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"Download as CSV options"}}}}]},"component":"data2-core-types@ComponentParameter"},"uploadCsv":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"upload"}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"options"}},"flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"unsetEmptyFields":{"params":{"component":"data2-core-primitives@Boolean","title":{"component":"data2-core-primitives@String","params":{"content":"Unset Empty Fields"}},"key":{"component":"data2-core-primitives@String","params":{"content":"unsetEmptyFields"}},"description":{"component":"data2-core-primitives@String","params":{"content":"If true, will unset  fields that are left empty in CSV from the record."}}},"component":"data2-core-types@ComponentParameter"},"logOnly":{"params":{"component":"data2-core-primitives@Boolean","title":{"component":"data2-core-primitives@String","params":{"content":"Log Only"}},"key":{"component":"data2-core-primitives@String","params":{"content":"logOnly"}},"description":{"component":"data2-core-primitives@String","params":{"content":"If true, only log what is going to be created and updated. Useful to preview what will happen before running uploadCsv for real."}}},"component":"data2-core-types@ComponentParameter"}}}}]},"component":"data2-core-types@ComponentParameter"},"downloadModel":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"download"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"previousPage":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"fa-fast-backward"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"clearFilters":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"minus-circle"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"paginate":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"chevron-circle-right"}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"parameters":{"params":{"fields":{"size":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"title":{"component":"data2-core-primitives@String","params":{"content":"size"}}},"component":"data2-core-types@ComponentParameter"},"skip":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"title":{"component":"data2-core-primitives@String","params":{"content":"skip"}}},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@FieldSet"},"title":{"component":"data2-core-primitives@String","params":{"content":"pagination"}},"flat":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}}}]},"component":"data2-core-types@ComponentParameter"},"toggleSort":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"chevron-circle-right"}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetColumnReference"}},"parameters":{"params":{"fields":{"size":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"title":{"component":"data2-core-primitives@String","params":{"content":"size"}}},"component":"data2-core-types@ComponentParameter"},"skip":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"title":{"component":"data2-core-primitives@String","params":{"content":"skip"}}},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@FieldSet"},"title":{"component":"data2-core-primitives@String","params":{"content":"column"}},"flat":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}}}]},"component":"data2-core-types@ComponentParameter"},"sync":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"params":{"icon":"fa-flash"},"component":"data2-core-types@FontAwesomeIcon"},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"insertRecord":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"plus-circle"}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Record"}}}}]},"component":"data2-core-types@ComponentParameter"},"search":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"Search settings"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Search filter"}},"parameters":{"search":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":0}}}},"language":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":1}}}},"caseSensitive":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Boolean","index":{"component":"data2-core-primitives@Number","params":{"content":2}}}},"diacriticSensitive":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Boolean","index":{"component":"data2-core-primitives@Number","params":{"content":3}}}}}}}],"icon":{"component":"data2-core-primitives@String","params":{"content":"search"}}},"component":"data2-core-types@ComponentParameter"},"saveRecord":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"plus-circle"}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Record"}}}}]},"component":"data2-core-types@ComponentParameter"},"resetFilters":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"filter"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"sort":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"sort"}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@FieldSet"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Sort settings"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Settings to sort the dataset."}}}}]},"component":"data2-core-types@ComponentParameter"},"unselect":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"times-circle"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"downloadAsXlsx":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"file-excel-o"}},"visibility":"public","key":{"component":"data2-core-primitives@String","params":{"content":"downloadAsXlsx"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Download as XLSX"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","key":{"component":"data2-core-primitives@String","params":{"content":"options"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Options"}},"visibility":"public","description":{"component":"data2-core-primitives@String","params":{"content":"Options for downloadAsXlsx"}},"parameters":{"filename":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","key":{"component":"data2-core-primitives@String","params":{"content":"filename"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Filename"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Filename of the downloaded file. By default, it is the reference of the dataset."}}}},"useTitle":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Boolean","key":{"component":"data2-core-primitives@String","params":{"content":"useTitle"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Use Title"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Option to enable using the field title."}}}}},"flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}}]},"component":"data2-core-types@ComponentParameter"},"loadAllPages":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"table"}},"visibility":"public","key":{"component":"data2-core-primitives@String","params":{"content":"loadAllPages"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Load All Pages"}}},"component":"data2-core-types@ComponentParameter"},"exportToCsv":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"align-justify"}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"key":{"component":"data2-core-primitives@String","params":{"content":"options"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Options"}},"parameters":{"delimiter":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Boolean","key":{"component":"data2-core-primitives@String","params":{"content":"delimiter"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Delimiter"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Delimiter for generated file. Default is \",\"."}},"oneOf":[{"params":{"content":","},"component":"data2-core-primitives@String"},{"params":{"content":";"},"component":"data2-core-primitives@String"}]}},"shouldPopulateLookups":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Boolean","key":{"component":"data2-core-primitives@String","params":{"content":"shouldPopulateLookups"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Should populate lookups"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Controls whether fully populated data is exported to the CSV."}}}},"brazilianExcelFormat":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Boolean","key":{"component":"data2-core-primitives@String","params":{"content":"brazilianExcelFormat"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Brazilian Excel Format"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Controls whether the CSV will be generated compatible with PT-BR Excel."}}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"Export to CSV options"}}}}],"key":{"component":"data2-core-primitives@String","params":{"content":"exportToCsv"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Export to CSV"}}},"component":"data2-core-types@ComponentParameter"},"semanticSearch":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"query":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Query"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Query to semantic search"}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}}}},"options":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"Options"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Search options"}},"parameters":{"threshold":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Number"}},"limit":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Number"}},"score":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Boolean"}}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}}}}}}}],"icon":{"params":{"content":"search-plus"},"component":"data2-core-primitives@String"}},"component":"data2-core-types@ComponentParameter"}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"DataSets are how we access a data on a Data² Table.\n It contains rules and specification on what the data coming from the table is.\nE.g. In a table of pets, a dataset could only show dogs with brown fur."}}},"updatedAt":"2025-10-30T18:16:31.570Z"},{"_id":"5ec30dd044f1ebfde263a2d5","component":"data2-core-types@Component","params":{"package":"data2-core-logical-operators","component":"Or","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"components":{"component":"data2-core-primitives@String","list":true}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"components.0"}}},"updatedAt":"2022-09-12T20:24:14.051Z"},{"_id":"5ec571ca993f46254ea5281f","component":"data2-core-types@Component","params":{"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"children":"String","style":{"component":"data2-core-types@StyleSheet"},"behavior":"String"}}},"public":false,"component":"marquee","package":"html","visibility":"deprecated"},"updatedAt":"2022-03-22T14:23:04.911Z"},{"_id":"5ec57770993f46254ea52822","component":"data2-core-types@Component","params":{"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"title":"String","textColor":{"component":"data2-core-types@Color"},"textSize":{"component":"Number"},"dataset":{"component":"data2-core-types@DataSetReference"},"aggregation":{"component":"data2-core-types@DataSetColumnReference"},"type":{"component":"String","oneOf":["Horizontal","Bar","Doughnut"]}}}},"public":false,"component":"Chart","package":"data2-controls","visibility":"deprecated"},"updatedAt":"2022-03-22T14:23:36.739Z"},{"_id":"5ec57e67993f46254ea52824","component":"data2-core-types@Component","params":{"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"field":"String","dataset":{"component":"data2-core-types@DataSetReference"},"lookupField":"String","lookupDisplayField":"String","lookupDataset":{"component":"data2-core-types@DataSetReference"},"multiple":"Boolean"}}},"public":false,"component":"Select","package":"data2-controls","visibility":"deprecated"},"updatedAt":"2022-03-22T14:23:57.343Z"},{"_id":"5ec58cff3ddde34582cdae72","component":"data2-core-types@Component","params":{"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"field":"String","dataset":{"component":"data2-core-types@DataSetReference"}}}},"public":false,"component":"FieldRemote","package":"data2-controls","visibility":"deprecated"},"updatedAt":"2022-03-22T14:24:23.854Z"},{"_id":"5ec59355993f46254ea5282c","component":"data2-core-types@Component","params":{"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"column":"String"}}},"component":"DataSetMasterColumnReference","package":"data2-core-types"}},{"_id":"5ed4bda7a99e7f2f648cc2aa","component":"data2-core-types@Component","params":{"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-core-primitives@Block","params":{"children":{"component":"data2-core-types@Reference","params":{"reference":"label"}},"dimensions":{"params":{"reference":"dimensions"},"component":"data2-core-types@Reference"},"position":{"params":{"reference":"position"},"component":"data2-core-types@Reference"},"style":{"params":{"reference":"style"},"component":"data2-core-types@Reference"},"disable":{"params":{"reference":"disable"},"component":"data2-core-types@Reference"},"onClick":{"params":{"reference":"onClick"},"component":"data2-core-types@Reference"}}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"dimensions":{"component":"data2-core-types@Dimensions"},"position":{"component":"data2-core-types@Position"},"style":{"component":"data2-core-types@StyleSheet"},"onClick":{"component":"data2-core-types@Interaction"},"label":{"component":"String"},"disable":{"component":"Boolean"}}}},"public":false,"component":"Button","package":"data2-blocks","visibility":"deprecated"},"updatedAt":"2022-03-22T14:18:27.258Z"},{"_id":"5ed98f092c78cc536dcb3ab2","component":"data2-core-types@Component","params":{"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition"},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"state":"Boolean"}}},"component":"Led","package":"data3-core-primitives","public":false,"visibility":"deprecated"},"updatedAt":"2022-03-22T14:28:14.106Z"},{"_id":"5ee2bc53d68ce41360d88f70","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"DataLinkGetter","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"dataset":{"component":"data2-core-types@DataSetReference"},"field":{"component":"data2-core-types@DataSetColumnReference"},"record":{"component":"data2-core-types@Reference"}}}}}},{"_id":"5eea49efd68ce41360c75e50","component":"data2-core-types@Component","params":{"product":"connect","package":"data2-core","component":"FeathersDataSource","icon":"database","extends":"data2-core@DataSource","public":true,"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"service":"String","baseUrl":"String","pk":"String","schema":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Field"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"private","renderable":{"dimensions":{"disabled":false,"component":"data2-core-types@Dimensions","params":{"width":1366,"exactWidth":false,"exactHeight":false,"height":768}}}},"updatedAt":"2022-09-19T13:48:15.919Z"},{"_id":"5f02b4881ca96def426585b8","component":"data2-core-types@Component","params":{"package":"data2-core","component":"Folder","icon":"folder","visibility":"private","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"name":"String","folder":"String"}}}}},{"_id":"5f08e5c51ca96def4266038f","component":"data2-core-types@Component","params":{"package":"data2-blocks","component":"OldFileField","extends":"data2-core-primitives@Block","public":true,"icon":"files-o","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"uploadText":{"component":"data2-core-primitives@String"},"replaceText":{"component":"data2-core-primitives@String"},"dataset":{"component":"data2-core-types@DataSetReference"},"record":{"component":"data2-core-types@Reference"},"field":{"component":"data2-core-types@DataSetColumnReference"},"folder":{"component":"data2-core-types@FileComponentReference"},"folderName":{"component":"data2-core-types@FieldReference"},"fileName":{"component":"data2-core-types@FieldReference"},"preview":{"component":"data2-core-primitives@Boolean"},"previewDimensions":{"component":"data2-core-types@Dimensions"},"previewFileName":{"component":"data2-core-primitives@Boolean"},"disabled":{"component":"data2-core-primitives@Boolean"},"autoSave":{"component":"data2-core-primitives@Boolean"},"tabIndex":"Number"}}},"visibility":"deprecated"}},{"_id":"5f4d6ac7a575399a45c38265","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"Shadow","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"type":{"component":"data2-core-primitives@String","oneOf":["outset","inset"]},"offsetX":{"component":"data2-core-primitives@Number"},"offsetY":{"component":"data2-core-primitives@Number"},"blur":{"component":"data2-core-primitives@Number"},"spread":{"component":"data2-core-primitives@Number"},"color":{"component":"data2-core-types@Color"}}}}}},{"_id":"5f51018da575399a457b2721","component":"data2-core-types@Component","params":{"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":"repeat"}},"comparisonSubject":"no-repeat"}}],"else":{"component":"html@div","params":{"style":{"backgroundImage":{"component":"data2-core-functions@StringConcat","params":{"portions":["url(",{"component":"data2-core-types@Reference","params":{"reference":"src"}},")"]}},"backgroundSize":{"component":"data2-core-types@Reference","params":{"reference":"size"}},"backgroundPositionX":{"component":"data2-core-types@Reference","params":{"reference":"positionX"}},"backgroundPositionY":{"component":"data2-core-types@Reference","params":{"reference":"positionY"}},"backgroundRepeat":{"component":"data2-core-types@Reference","params":{"reference":"repeat"}},"position":"relative","width":"100%","height":"100%","border":"none","padding":"none","overflow":"hidden"}}},"then":{"component":"html@img","params":{"src":{"component":"data2-core-types@Reference","params":{"reference":"src"}},"alt":{"component":"data2-core-types@Reference","params":{"reference":"src"}},"width":"100%","height":"100%","loading":"lazy","style":{"objectFit":{"params":{"defaultCase":"none","cases":[{"component":"data2-core-flow@Case","params":{"expression":"cover","value":{"component":"data2-core-types@Reference","params":{"reference":"size"}}}},{"component":"data2-core-flow@Case","params":{"expression":"contain","value":{"component":"data2-core-types@Reference","params":{"reference":"size"}}}},{"component":"data2-core-flow@Case","params":{"expression":"100%","value":"cover"}}],"expression":{"component":"data2-core-types@Reference","params":{"reference":"size"}}},"component":"data2-core-flow@Switch"},"objectPosition":{"component":"data2-core-functions@StringConcat","params":{"portions":[{"component":"data2-core-logical-operators@Or","params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":"positionX"}},"left"]}}," ",{"component":"data2-core-logical-operators@Or","params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":"positionY"}},"top"]}}]}},"display":{"component":"data2-core-primitives@String","params":{"content":"block"}}}}}}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"src":{"component":"data2-core-types@FileComponentUrlReference"},"size":{"component":"data2-core-primitives@String","oneOf":["cover","contain","100%","inherit"]},"positionX":{"component":"data2-core-primitives@String","oneOf":["left","center","right"]},"positionY":{"component":"data2-core-primitives@String","oneOf":["bottom","center","top"]},"repeat":{"component":"data2-core-primitives@String","oneOf":["repeatX","repeatY","repeat","no-repeat"]}}}},"public":true,"component":"ImageBlock","package":"data2-blocks","icon":"picture-o","extends":"data2-core-primitives@Block","visibility":"public"},"updatedAt":"2023-07-11T13:17:15.637Z"},{"_id":"5f52b1caa575399a45d58d13","component":"data2-core-types@Component","params":{"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"html@label","params":{"children":{"component":"data2-core-types@Reference","params":{"reference":"label"}},"style":{"width":"100%","height":"100%","border":"none","display":"inline-block","background":{"params":{"reference":"super.fill"},"component":"data2-core-types@Reference"},"color":{"params":{"reference":"super.textColor"},"component":"data2-core-types@Reference"},"fontSize":{"params":{"reference":"super.textSize"},"component":"data2-core-types@Reference"},"textShadow":{"params":{"reference":"textShadow"},"component":"data2-core-types@Reference"}}}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"label":{"component":"String"},"textShadow":{"component":"data2-core-types@SimpleShadow"}}}},"public":false,"component":"LabelDj","package":"data2-blocks","icon":"tag","extends":"data2-core-primitives@Block","visibility":"deprecated"}},{"_id":"5f557d89a575399a455b31a2","component":"data2-core-types@Component","params":{"product":"id","icon":"id-card","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"position":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Position"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":101}},"simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"},"dimensions":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Dimensions"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":102}},"simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"defaultValue":{"preventEvaluation":true,"component":"data2-core-types@Dimensions","params":{"width":300,"height":300}},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"},"credentials":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@FieldReference"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":202}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"description":{"component":"data2-core-primitives@String","params":{"content":"The fields required to log in at your application."}}},"component":"data2-core-types@ComponentParameter"},"verifier":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetReference"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":201}},"description":{"component":"data2-core-primitives@String","params":{"content":"The DataSet used for authentication. This Authentication strategy will gain control over this DataSet and will automatically filter it to only show the authenticated user."}}},"component":"data2-core-types@ComponentParameter"},"session":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@FieldReference"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":203}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"description":{"component":"data2-core-primitives@String","params":{"content":"The fields that will be present in the user session when logged-in. If left empty the session will have all fields. The fields here are used to match with a user session, meaning that if a change happens to some of the data in the table, the session will be invalidaded. It is advised to only pick fields that should be used to identify the user."}}},"component":"data2-core-types@ComponentParameter"},"role":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetColumnReference"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":212}},"description":{"component":"data2-core-primitives@String","params":{"content":"The role field for the \"Verifier\" DataSet."}}},"component":"data2-core-types@ComponentParameter"},"roleDefault":{"params":{"oneOf":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@Reference","params":{"reference":"verifier"}},"prop":"getField","args":[{"component":"data2-core-types@Reference","params":{"reference":"role"}}]}},"prop":"validation.oneOf"}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":213}},"description":{"component":"data2-core-primitives@String","params":{"content":"Default value for the \"Role\" field."}}},"component":"data2-core-types@ComponentParameter"},"password":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetColumnReference"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":211}},"description":{"component":"data2-core-primitives@String","params":{"content":"The password field for your \"Verifier\" DataSet. Your Authentication Strategy required confirmation of its data when registering a user."}}},"component":"data2-core-types@ComponentParameter"},"email":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetColumnReference"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":210}},"description":{"component":"data2-core-primitives@String","params":{"content":"The email field for your \"Verifier\" DataSet.  Setting a field as an email will make it case insensitive for this Authentication Strategy."}}},"component":"data2-core-types@ComponentParameter"},"resetPassword":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"parameters":{"resetEmail":{"params":{"parameters":{"artboard":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@ArtboardReference"}},"defaultValue":{"preventEvaluation":true,"params":{"preventEvaluation":true},"component":"data2-core-types@ArtboardReference"},"description":{"component":"data2-core-primitives@String","params":{"content":"The artboard used for this email. You may access the reset link with a Reference of \"link\" (without quotes)"}}},"component":"data2-core-types@ComponentParameter"},"subject":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Email's subject"}}},"component":"data2-core-types@ComponentParameter"},"replyTo":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"description":{"component":"data2-core-primitives@String","params":{"content":"If the user wants to reply the email, for whose email the reply will be sent to."}}},"component":"data2-core-types@ComponentParameter"},"from":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"parameters":{"name":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}},"component":"data2-core-types@ComponentParameter"}},"description":{"component":"data2-core-primitives@String","params":{"content":"The name of the sender."}}},"component":"data2-core-types@ComponentParameter"}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"description":{"component":"data2-core-primitives@String","params":{"content":"The settings for the email sent for a user in order to reset its password.."}}},"component":"data2-core-types@ComponentParameter"},"resetSuccessEmail":{"params":{"parameters":{"artboard":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@ArtboardReference"}},"defaultValue":{"preventEvaluation":true,"params":{"preventEvaluation":true},"component":"data2-core-types@ArtboardReference"},"description":{"component":"data2-core-primitives@String","params":{"content":"The artboard used for this email. You may access the reset link with a Reference of \"link\" (without quotes)"}}},"component":"data2-core-types@ComponentParameter"},"subject":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Email's subject"}}},"component":"data2-core-types@ComponentParameter"},"replyTo":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"description":{"component":"data2-core-primitives@String","params":{"content":"If the user wants to reply the email, for whose email the reply will be sent to."}}},"component":"data2-core-types@ComponentParameter"},"from":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"parameters":{"name":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}},"component":"data2-core-types@ComponentParameter"}},"description":{"component":"data2-core-primitives@String","params":{"content":"The name of the sender."}}},"component":"data2-core-types@ComponentParameter"}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"description":{"component":"data2-core-primitives@String","params":{"content":"The settings for the email sent for a user when they successfully has reset their password."}}},"component":"data2-core-types@ComponentParameter"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Settings for the password reset emails of this Authentication Strategy."}}},"component":"data2-core-types@ComponentParameter"},"sessionExpiresIn":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":203.2}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"description":{"component":"data2-core-primitives@String","params":{"content":"Session expiration time in seconds. A session older than this value will be invalidated."}}},"component":"data2-core-types@ComponentParameter"},"sessionRenewal":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":203.2}},"shouldShow":{"component":"data2-core-primitives@Boolean","preventEvaluation":true,"params":{"content":{"component":"data2-core-types@Reference","params":{"reference":"sessionExpiresIn"}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"Allows for renewing the user session."}}},"component":"data2-core-types@ComponentParameter"},"identityProviders":{"params":{"visibility":"public","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-id@ProviderAuthenticationSettings"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Connects an Identity Provider to your Authentication Strategy, adding another way to log in at your app."}}},"component":"data2-core-types@ComponentParameter"},"shouldLoginAfterRegister":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":203.2}},"description":{"component":"data2-core-primitives@String","params":{"content":"If true, logs user in automatically after register. \nDefault: true"}}},"component":"data2-core-types@ComponentParameter"},"sessionShared":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Boolean","key":{"component":"data2-core-primitives@String","params":{"content":"sessionShared"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Session Shared"}},"visibility":"beta","description":{"component":"data2-core-primitives@String","params":{"content":"Controls whether the session is set on a cookie."}}}},"sessionMetadata":{"params":{"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":203.1}},"description":{"component":"data2-core-primitives@String","params":{"content":"Custom metadata that will be attached to the session. If an Error is returned, the login/session will fail."}},"component":"data2-core-flow@Series","visibility":"private"},"component":"data2-core-types@ComponentParameter"}}}},"interactions":{"component":"data2-core-types@FieldSet","params":{"fields":{"login":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"sign-in"}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"credentials":{"params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"credentials"}}},"component":"data2-core-types@ComponentParameter"},"metadata":{"params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"metadata"}}},"component":"data2-core-types@ComponentParameter"}},"visibility":"private"}}]},"component":"data2-core-types@ComponentParameter"},"logout":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"sign-out"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"register":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"user-plus"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"changePassword":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"id-card-o"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"sendResetPasswordEmail":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"envelope"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"resetPassword":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"refresh"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"loginIdentityProvider":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"sign-in"}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@IdentityProviderReference"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Identity Provider"}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Token"}}}}]},"component":"data2-core-types@ComponentParameter"}}}},"component":"AuthenticationStrategy","package":"data2-core"},"updatedAt":"2025-10-27T21:23:29.152Z"},{"_id":"5f57efbaa575399a45c816b8","component":"data2-core-types@Component","params":{"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition"},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"dataset":{"component":"data2-core-types@DataSetReference"}}}},"public":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"component":"DataFilter","package":"data2-controls","extends":"data2-core-primitives@Block","visibility":"deprecated"},"updatedAt":"2022-04-06T13:59:10.333Z"},{"_id":"5f5fb895a575399a4506a936","component":"data2-core-types@Component","params":{"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"fontFamily":{"component":"String"}}}},"component":"GoogleFont","package":"data2-core-web"}},{"_id":"5f612d81a575399a4542af4b","component":"data2-core-types@Component","params":{"component":"Lookup","package":"data2-core-types","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"table":{"component":"data2-core-primitives@String","oneOf":{"preventEvaluation":true,"params":{"array":{"params":{"prop":"getQuickFilteredRecords","module":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"DataComponentInstancesDataSet"}},"_layer":{"component":"data2-core-primitives@String","params":{"content":"HostApplicationLayer"}}},"component":"data2-core-types@ProcessReference"},"args":[{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core@Data2TableDataSource"}}}]},"component":"data2-core-types@Getter"},"mapper":{"params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"item"}}],"body":{"preventEvaluation":true,"params":{"sources":[{"component":"data2-core-types@FieldSet","params":{"fields":{"label":{"params":{"components":[{"params":{"reference":"item.displayName"},"component":"data2-core-types@Reference"},{"params":{"reference":"item.reference"},"component":"data2-core-types@Reference"}]},"component":"data2-core-logical-operators@Or"},"value":{"params":{"reference":"item.reference"},"component":"data2-core-types@Reference"}}}}]},"component":"data2-core-functions@ObjectAssign"}},"component":"data2-core-functions@Function"}},"component":"data2-core-functions@ArrayMap"}},"list":{"component":"data2-core-primitives@Boolean"},"unique":{"component":"data2-core-primitives@Boolean"},"patchable":{"component":"data2-core-primitives@Boolean"},"externalKey":{"component":"data2-core-primitives@String","default":"_id"},"populateDepth":{"component":"data2-core-primitives@Number"}}}},"validation":{"required":{"component":"data2-core-primitives@Boolean","default":false}}}},{"_id":"5f61fd8ba575399a45655c77","component":"data2-core-types@Component","params":{"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"x":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}}},"component":"data2-core-types@ComponentParameter"},"y":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}}},"component":"data2-core-types@ComponentParameter"}}}},"component":"Scroll","package":"data2-core-types"},"updatedAt":"2022-06-20T18:57:28.221Z"},{"_id":"5f6282e8a575399a457ab470","component":"data2-core-types@Component","params":{"package":"data2-core-flow","component":"Parallel","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"actions":{"list":true,"component":"data2-core-types@Interaction"},"concurrency":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Concurrency"}},"description":{"component":"data2-core-primitives@String","params":{"content":"How many concurrent actions can occur at a time. It works as a queue, i.e., as soon as an action is done, another one starts."}},"visibility":"public"}}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"actions.0"}}},"updatedAt":"2023-04-28T20:43:42.110Z"},{"_id":"5f6393aba575399a45a6b16a","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"DataColor","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"value":{"component":"data2-core-primitives@String"},"color":{"component":"data2-core-types@Color"},"field":{"component":"data2-core-types@FieldReference"}}}}}},{"_id":"5f639c5aa575399a45a84e03","component":"data2-core-types@Component","params":{"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-controls@AutoCompleteInput","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"filter":{"component":"data2-core-types@Reference","params":{"reference":"filter"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"tabIndex":{"component":"data2-core-types@Reference","params":{"reference":"tabIndex"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record"}},"optionsDataset":{"component":"data2-core-types@Reference","params":{"reference":"optionsDataset"}},"optionsField":{"component":"data2-core-types@Reference","params":{"reference":"optionsField"}},"optionsLabel":{"component":"data2-core-types@Reference","params":{"reference":"optionsLabel"}},"optionsValue":{"component":"data2-core-types@Reference","params":{"reference":"optionsValue"}},"numeric":{"component":"data2-core-types@Reference","params":{"reference":"numeric"}},"width":{"component":"data2-core-types@Reference","params":{"reference":"super.dimensions.width"}},"height":{"component":"data2-core-types@Reference","params":{"reference":"super.dimensions.height"}},"textSize":{"component":"data2-core-types@Reference","params":{"reference":"super.textSize"}},"textColor":{"component":"data2-core-types@Reference","params":{"reference":"super.textColor"}},"placeholder":{"component":"data2-core-types@Reference","params":{"reference":"placeholder"}},"font":{"component":"data2-core-types@Reference","params":{"reference":"super.font"}},"disabled":{"component":"data2-core-types@Reference","params":{"reference":"disabled"}},"valuesBackgroundColors":{"component":"data2-core-types@Reference","params":{"reference":"valuesBackgroundColors"}},"fieldDefinition":{"component":"data2-core-types@Reference","params":{"reference":"fieldDefinition"}},"minCharactersToAutoComplete":{"component":"data2-core-types@Reference","params":{"reference":"minCharactersToAutoComplete"}},"autoSelectIfMatchOption":{"component":"data2-core-types@Reference","params":{"reference":"autoSelectIfMatchOption"}},"shouldRenderOptions":{"component":"data2-core-types@Reference","params":{"reference":"shouldRenderOptions"}},"mask":{"component":"data2-core-types@Reference","params":{"reference":"mask"}},"options":{"component":"data2-core-types@Reference","params":{"reference":"options"}}}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"dataset":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@InteractiveModuleReference"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"},"field":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@FieldReference"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":2}}},"component":"data2-core-types@ComponentParameter"},"record":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Reference"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":6}}},"component":"data2-core-types@ComponentParameter"},"filter":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":9}}},"component":"data2-core-types@ComponentParameter"},"optionsDataset":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@InteractiveModuleReference"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":3}}},"component":"data2-core-types@ComponentParameter"},"optionsField":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@FieldReference"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":4}}},"component":"data2-core-types@ComponentParameter"},"optionsLabel":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@FieldReference"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":5}}},"component":"data2-core-types@ComponentParameter"},"optionsValue":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@FieldReference"}},"visibility":"private","index":{"component":"data2-core-primitives@Number","params":{"content":6}}},"component":"data2-core-types@ComponentParameter"},"placeholder":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":8}}},"component":"data2-core-types@ComponentParameter"},"valuesBackgroundColors":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataColor"}},"category":"appearance","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":12}}},"component":"data2-core-types@ComponentParameter"},"disabled":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":7}}},"component":"data2-core-types@ComponentParameter"},"numeric":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":10}}},"component":"data2-core-types@ComponentParameter"},"tabIndex":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":11}}},"component":"data2-core-types@ComponentParameter"},"mask":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":12}}},"component":"data2-core-types@ComponentParameter"}}}},"public":true,"extends":"data2-core-primitives@Block","component":"AutoCompleteInput","icon":"magic","package":"data2-blocks","visibility":"public"},"updatedAt":"2021-07-19T22:21:10.618Z"},{"_id":"5f6418cea575399a45c1366c","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"FieldReference","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"key":{"component":"data2-core-primitives@String"}}}}}},{"_id":"5f6b4ed5a575399a451d4189","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"Package","visibility":"private","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"mode":{"component":"data2-core-primitives@String","oneOf":["dark","light"]}}}}}},{"_id":"5f6b998da575399a452b256f","component":"data2-core-types@Component","params":{"package":"data2-core-comparison-operators","component":"LesserThan","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"comparisonSubject":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Comparison Subject"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"},"subject":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Subject"}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}}},"component":"data2-core-types@ComponentParameter"}}}},"returnPrimitiveTypes":[{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}}],"description":{"component":"data2-core-primitives@String","params":{"content":"Equivalent to: subject < comparisonSubject."}},"title":{"component":"data2-core-primitives@String","params":{"content":"LesserThan"}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"subject"}}},"updatedAt":"2022-09-12T20:19:29.076Z"},{"_id":"5f6b9a02a575399a452b3879","component":"data2-core-types@Component","params":{"package":"data2-core-comparison-operators","component":"Different","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"comparisonSubject":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Comparison Subject"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"},"subject":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Subject"}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}}},"component":"data2-core-types@ComponentParameter"}}}},"returnPrimitiveTypes":[{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}}],"wrap":{"component":"data2-core-primitives@String","params":{"content":"subject"}}},"updatedAt":"2022-09-12T19:49:22.471Z"},{"_id":"5f6d161ba575399a457b0697","component":"data2-core-types@Component","params":{"package":"data2-core-logical-operators","component":"And","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"components":{"component":"data2-core-primitives@String","list":true}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"components.0"}}},"updatedAt":"2022-09-12T20:24:32.676Z"},{"_id":"5f729fa7e2d6fd3e21f599fb","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"InteractiveModuleReference","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"reference":"String"}}}}},{"_id":"5f804e93c8da12be8b498dfa","component":"data2-core-types@Component","params":{"public":true,"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"html@textarea","params":{"style":{"width":"100%","height":"100%","resize":"none","boxSizing":"border-box","background":{"params":{"content":"transparent"},"component":"data2-core-primitives@String"},"color":{"params":{"reference":"super.textColor"},"component":"data2-core-types@Reference"},"border":"none","appearance":"none","outline":"none","cursor":{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"super.cursor"}}}},{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"disabled","source":"VIRTUAL_COMPONENT_PARAMS"},"component":"data2-core-types@Reference"},"comparisonSubject":true}}],"then":{"component":"data2-core-primitives@String","params":{"content":"not-allowed"}},"else":{"component":"data2-core-primitives@String","params":{"content":"auto"}}}}]},"component":"data2-core-logical-operators@Or"},"fontWeight":{"component":"data2-core-primitives@String","params":{"content":"inherit"}},"paddingLeft":{"component":"data2-core-flow@If","params":{"compare":[{"params":{"comparisonSubject":{"params":{},"component":"data2-core-primitives@Undefined"},"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"padding.left"}}}}},"component":"data2-core-comparison-operators@Different"}],"then":{"params":{"portions":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"padding.left"}}}},{"component":"data2-core-primitives@String","params":{"content":"px"}}]},"component":"data2-core-functions@StringConcat"}}},"paddingRight":{"component":"data2-core-flow@If","params":{"compare":[{"params":{"comparisonSubject":{"params":{},"component":"data2-core-primitives@Undefined"},"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"padding.right"}}}}},"component":"data2-core-comparison-operators@Different"}],"then":{"params":{"portions":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"padding.right"}}}},{"component":"data2-core-primitives@String","params":{"content":"px"}}]},"component":"data2-core-functions@StringConcat"}}},"paddingTop":{"component":"data2-core-flow@If","params":{"compare":[{"params":{"comparisonSubject":{"params":{},"component":"data2-core-primitives@Undefined"},"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"padding.top"}}}}},"component":"data2-core-comparison-operators@Different"}],"then":{"params":{"portions":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"padding.top"}}}},{"component":"data2-core-primitives@String","params":{"content":"px"}}]},"component":"data2-core-functions@StringConcat"}}},"paddingBottom":{"component":"data2-core-flow@If","params":{"compare":[{"params":{"comparisonSubject":{"params":{},"component":"data2-core-primitives@Undefined"},"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"padding.bottom"}}}}},"component":"data2-core-comparison-operators@Different"}],"then":{"params":{"portions":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"padding.bottom"}}}},{"component":"data2-core-primitives@String","params":{"content":"px"}}]},"component":"data2-core-functions@StringConcat"}}},"caretColor":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"caretColor"}}},"component":"data2-core-types@Reference"},"--d2-placeholder-color":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"placeholderTextColor"}}},"component":"data2-core-types@Reference"},"textAlign":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"super.textFormat.textAlign"}}},"component":"data2-core-types@Reference"}},"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"placeholder":{"component":"data2-core-logical-operators@Or","params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":"placeholder"}},{"component":"data2-core-types@Reference","params":{"reference":"field"}}]}},"value":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"type"},"component":"data2-core-types@Reference"},"comparisonSubject":"date"}}],"then":{"component":"data2-core-functions@DateFormat","params":{"date":{"component":"data2-core-types@DataLinkGetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record"}}}},"format":"YYYY-MM-DD"}},"else":{"component":"data2-core-types@DataLinkGetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record"}}}}}},"onChange":{"component":"data2-core-types@DataLinkSetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset","source":"VIRTUAL_COMPONENT_PARAMS"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field","source":"VIRTUAL_COMPONENT_PARAMS"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record","source":"VIRTUAL_COMPONENT_PARAMS"}},"recordUpsert":{"component":"data2-core-types@Reference","params":{"reference":"recordUpsert","source":"VIRTUAL_COMPONENT_PARAMS"}},"onChange":{"component":"data2-core-types@Reference","params":{"reference":"onChange","source":"VIRTUAL_COMPONENT_PARAMS"}},"mask":{"component":"data2-core-types@Reference","params":{"reference":"mask","source":"VIRTUAL_COMPONENT_PARAMS"}}}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"tabIndex":{"component":"data2-core-types@Reference","params":{"reference":"tabIndex"}},"maxLength":{"component":"data2-core-types@Reference","params":{"reference":"maxLength"}},"opacity":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"disabled"},"component":"data2-core-types@Reference"},"comparisonSubject":true}}],"then":0.38,"else":1}},"disabled":{"params":{"reference":"disabled"},"component":"data2-core-types@Reference"},"onFocus":{"component":"data2-core-types@Reference","params":{"reference":"onFocus"}},"onBlur":{"component":"data2-core-types@Reference","params":{"reference":"onBlur"}},"onKeyPress":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"onKeyPress"}}}},"autoCapitalize":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"autoCapitalize"}}}},"autoComplete":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Equal","params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":"builder"}},"comparisonSubject":true}}],"then":"new-password","else":{"params":{"components":[{"params":{"reference":"autoComplete","source":"VIRTUAL_COMPONENT_PARAMS"},"component":"data2-core-types@Reference"},{"component":"data2-core-primitives@String","params":{"content":"off"}}]},"component":"data2-core-logical-operators@Or"}}},"spellCheck":{"params":{"expression":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"spellCheck"}}},"component":"data2-core-types@Reference"},"cases":[{"component":"data2-core-flow@Case","params":{"expression":{"params":{"content":true},"component":"data2-core-primitives@Boolean"},"value":{"component":"data2-core-primitives@String","params":{"content":"true"}}}},{"component":"data2-core-flow@Case","params":{"expression":{"params":{"content":false},"component":"data2-core-primitives@Boolean"},"value":{"component":"data2-core-primitives@String","params":{"content":"false"}}}}]},"component":"data2-core-flow@Switch"},"lang":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"lang"}}}}}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"dataset":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@InteractiveModuleReference"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":0}}},"component":"data2-core-types@ComponentParameter"},"field":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetColumnReference"}},"category":"behaviour","icon":{"component":"data2-core-primitives@String","params":{"content":""}},"index":{"component":"data2-core-primitives@Number","params":{"content":0.5}},"alternativeParameterDefaultType":[{"parameter":{"component":"data2-core-primitives@String","params":{"content":"dataset"}},"value":{"params":{"reference":"__UIState"},"component":"data2-core-types@InteractiveModuleReference"},"type":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-user-interface@StateProp"}}},"component":"data2-core-types@ComponentParameter"}}],"shouldShow":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"dependsOn":[{"component":"data2-core-primitives@String","params":{"content":"dataset"}}]},"component":"data2-core-types@ComponentParameter"},"record":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Reference"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":5}}},"component":"data2-core-types@ComponentParameter"},"recordUpsert":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":6}}},"component":"data2-core-types@ComponentParameter"},"placeholder":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"},"disabled":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":2}}},"component":"data2-core-types@ComponentParameter"},"tabIndex":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":8}}},"component":"data2-core-types@ComponentParameter"},"maxLength":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":7}}},"component":"data2-core-types@ComponentParameter"},"onFocus":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":302}}},"component":"data2-core-types@ComponentParameter"},"onBlur":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":303}}},"component":"data2-core-types@ComponentParameter"},"onKeyPress":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":304}}},"component":"data2-core-types@ComponentParameter"},"onChange":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","description":{"component":"data2-core-primitives@String","params":{"content":"Sets what should happen when the content is modified."}}}},"padding":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"parameters":{"left":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}}},"component":"data2-core-types@ComponentParameter"},"right":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}}},"component":"data2-core-types@ComponentParameter"},"top":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}}},"component":"data2-core-types@ComponentParameter"},"bottom":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}}},"component":"data2-core-types@ComponentParameter"}},"visibility":"public","index":{"component":"data2-core-primitives@Number","params":{"content":110}},"category":"appearance"}},"autoCapitalize":{"params":{"component":"data2-core-primitives@String","category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":206.1}},"oneOf":[{"params":{"content":"off"},"component":"data2-core-primitives@String"},{"params":{"content":"on"},"component":"data2-core-primitives@String"},{"params":{"content":"words"},"component":"data2-core-primitives@String"},{"params":{"content":"characters"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"},"autoComplete":{"params":{"component":"data2-core-primitives@String","category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":206}},"oneOf":[{"params":{"content":"off"},"component":"data2-core-primitives@String"},{"params":{"content":"on"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"},"spellCheck":{"params":{"component":"data2-core-primitives@Boolean","category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":206.2}}},"component":"data2-core-types@ComponentParameter"},"lang":{"params":{"component":"data2-core-primitives@String","category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":206.3}}},"component":"data2-core-types@ComponentParameter"},"onEnter":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":304}}},"component":"data2-core-types@ComponentParameter"},"caretColor":{"params":{"component":"data2-core-types@Color","category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":111}}},"component":"data2-core-types@ComponentParameter"},"placeholderTextColor":{"params":{"component":"data2-core-types@Color","category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":1.5}}},"component":"data2-core-types@ComponentParameter"}}}},"component":"DataTextBlock","package":"data2-blocks","icon":"file-text","extends":"data2-core-primitives@Block","visibility":"public"},"updatedAt":"2026-04-28T15:09:00.302Z"},{"_id":"5f931b7bc8da12be8b31d2a1","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"ProcessReference","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"reference":"String"}}}}},{"_id":"5fb43e73c8da12be8bde5e6e","component":"data2-core-types@Component","params":{"package":"data2-core-auth","component":"Policy","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"authenticationStrategy":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@InteractiveModuleReference"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"},"allowedRoles":{"params":{"oneOf":{"preventEvaluation":true,"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@Reference","params":{"reference":"authenticationStrategy"}},"prop":"dataset.instance.getField","args":[{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@Reference","params":{"reference":"authenticationStrategy"}},"prop":"roleField.key"}}]}},"prop":"validation.oneOf"}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"blockedRoles":{"params":{"oneOf":{"preventEvaluation":true,"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@Reference","params":{"reference":"authenticationStrategy"}},"prop":"dataset.instance.getField","args":[{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@Reference","params":{"reference":"authenticationStrategy"}},"prop":"roleField.key"}}]}},"prop":"validation.oneOf"}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"allow":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-flow@If"}},"visibility":"beta"},"component":"data2-core-types@ComponentParameter"},"deny":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-flow@If"}},"visibility":"beta"},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2025-07-03T21:48:20.079Z"},{"_id":"5fd2979222b5215848969cde","component":"data2-core-types@Component","params":{"package":"data2-core-functions","component":"DateFormat","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"date":{"component":"data2-core-primitives@Date"},"format":{"component":"data2-core-primitives@String"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"date"}}},"updatedAt":"2026-04-23T16:29:45.020Z"},{"_id":"5fca5a9222b5215848683e2b","component":"data2-core-types@Component","params":{"component":"File","package":"data2-core-types","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"list":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"visibility":"private"},"component":"data2-core-types@ComponentParameter"},"folder":{"component":"data2-core-types@FileComponentReference"},"folderName":{"component":"data2-core-types@FieldReference"},"fileName":{"component":"data2-core-types@FieldReference"},"sensitive":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"visibility":"private"},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2023-11-23T21:08:08.201Z"},{"_id":"60199aa2c2dd12f059004ef1","component":"data2-core-types@Component","params":{"public":true,"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"color":{"component":"data2-core-types@Color"},"offset":{"component":"data2-core-primitives@String"}}}},"component":"ColorGradientStop","package":"data2-core-types","visibility":"public"}},{"_id":"602aedb0c2dd12f059f607b6","component":"data2-core-types@Component","params":{"component":"NumberFormat","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"number":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Number"}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}},"description":{"component":"data2-core-primitives@String","params":{"content":"Number to be formatted."}}},"component":"data2-core-types@ComponentParameter"},"format":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Format"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"description":{"component":"data2-core-primitives@String","params":{"content":"How the number should be formatted. Example: for the number 1, and format '0%', the output would be 100%. For more information, see the link."}},"link":{"component":"data2-core-primitives@String","params":{"content":"http://numeraljs.com/#format"}}},"component":"data2-core-types@ComponentParameter"},"locale":{"params":{"component":"data2-core-primitives@String","oneOf":[{"params":{"content":"en"},"component":"data2-core-primitives@String"},{"params":{"content":"pt-br"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"}}}},"title":{"component":"data2-core-primitives@String","params":{"content":"NumberFormat"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Format number into a string."}},"returnPrimitiveTypes":[{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}],"wrap":{"component":"data2-core-primitives@String","params":{"content":"number"}}},"updatedAt":"2025-08-16T19:48:25.781Z"},{"_id":"6036bc46c2dd12f05997e05b","component":"data2-core-types@Component","params":{"component":"ArrayMap","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"array":{"component":"data2-core-types@Getter"},"mapper":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-functions@Function"}},"arguments":[{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":""}},"title":{"component":"data2-core-primitives@String","params":{"content":"item"}}},"component":"data2-core-types@ComponentParameter"},{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Index"}}},"component":"data2-core-types@ComponentParameter"},{"params":{"component":"data2-core-primitives@Array","title":{"component":"data2-core-primitives@String","params":{"content":"list"}}},"component":"data2-core-types@ComponentParameter"}]},"component":"data2-core-types@ComponentParameter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"array"}},"title":""},"updatedAt":"2026-05-22T14:59:58.302Z"},{"_id":"605b9c73f4da57a543329761","component":"data2-core-types@Component","params":{"package":"data2-core-numerical-operators","component":"Add","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"components":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Components"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"description":{"component":"data2-core-primitives@String","params":{"content":"Numbers to be added."}}},"component":"data2-core-types@ComponentParameter"}}}},"title":{"component":"data2-core-primitives@String","params":{"content":"Add"}},"returnPrimitiveTypes":[{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}}],"description":{"component":"data2-core-primitives@String","params":{"content":""}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"components.0"}}},"updatedAt":"2022-09-12T20:27:37.722Z"},{"_id":"605b9c85f4da57a543329b97","component":"data2-core-types@Component","params":{"package":"data2-core-numerical-operators","component":"Multiply","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"components":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Components"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Numbers that will be multiplied."}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}}}},"title":{"component":"data2-core-primitives@String","params":{"content":"Multiply"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Multiply all the numbers and returns the result."}},"returnPrimitiveTypes":[{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}}],"wrap":{"component":"data2-core-primitives@String","params":{"content":"components.0"}}},"updatedAt":"2022-09-12T20:27:48.667Z"},{"_id":"6079a761d7ec64d5fce3b4f3","component":"data2-core-types@Component","params":{"package":"data2-core-types","public":true,"component":"RepeaterReference","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"reference":{"params":{"component":"data2-core-primitives@String","oneOf":{"component":"data2-core-functions@ArrayMap","params":{"array":{"component":"data2-core-types@Reference","params":{"reference":"__D2_REPEATERS"}},"mapper":"reference"}}},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"public"}},{"_id":"607d9e82f1955d31297b164e","component":"data2-core-types@Component","params":{"package":"data2-core","component":"Store","product":"registry","icon":"archive","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"position":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Position"}},"simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":102}},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"},"dimensions":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Dimensions"}},"category":"appearance","defaultValue":{"preventEvaluation":true,"component":"data2-core-types@Dimensions","params":{"width":300,"height":300}},"index":{"component":"data2-core-primitives@Number","params":{"content":101}},"simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"},"initialData":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@FieldSet"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":203}}},"component":"data2-core-types@ComponentParameter"},"mockData":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@FieldSet"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":204}},"description":{"component":"data2-core-primitives@String","params":{"content":"initialData for mock purposes (only works in Builder and it is not published when genering a Version of your system)."}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"}}}},"interactions":{"params":{"fields":{"get":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Path to prop"}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"required":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}},{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Fallback"}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"required":{"component":"data2-core-primitives@Boolean","params":{"content":false}}}}],"index":{"component":"data2-core-primitives@Number","params":{"content":1}}}},"set":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Path to prop"}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"required":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}},{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Value to set"}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"required":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}}],"visibility":"public","index":{"component":"data2-core-primitives@Number","params":{"content":3}}}},"resetData":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","visibility":"private","flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"pickFields":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"title":{"component":"data2-core-primitives@String","params":{"content":"Pick Fields"}}}},"omitFields":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"title":{"component":"data2-core-primitives@String","params":{"content":"Omit Fields"}}}}}}}],"visibility":"private","index":{"component":"data2-core-primitives@Number","params":{"content":3}}}}}},"component":"data2-core-types@FieldSet"},"renderable":{"dimensions":{"disabled":false,"component":"data2-core-types@Dimensions","params":{"width":1360,"height":800,"exactWidth":false,"exactHeight":false}}}},"updatedAt":"2025-08-11T14:29:31.519Z"},{"_id":"60d11ef797fd5f38beb9bf76","component":"data2-core-types@Component","params":{"component":"Object","package":"data2-core-primitives","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"schema":{"component":"data2-core-types@Field","list":true},"list":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"visibility":"private"},"component":"data2-core-types@ComponentParameter"},"sensitive":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"visibility":"private"},"component":"data2-core-types@ComponentParameter"}}}},"validation":{},"visibility":"private"},"updatedAt":"2023-11-23T21:06:13.982Z"},{"_id":"60de0e59da3861ca654d3ab5","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"Clone","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"module":{"component":"data2-core-types@InteractiveModuleReference"},"params":{"component":"data2-core-types@FieldSet"}}}}}},{"_id":"60e63583da3861ca6516cb3a","component":"data2-core-types@Component","params":{"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{}}},"public":false,"component":"JsonViewer","package":"data2-controls","visibility":"deprecated"},"updatedAt":"2022-03-22T14:41:50.309Z"},{"_id":"60ef33efda3861ca65e2b7bf","component":"data2-core-types@Component","params":{"package":"data2-core-web","component":"Script","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"reference":{"component":"data2-core-primitives@String"},"src":{"component":"data2-core-primitives@String"},"script":{"component":"data2-core-primitives@String","multiLine":true}}}}}},{"_id":"5fd9e0614369e2af95a95e67","component":"data2-core-types@Component","params":{"extends":"data2-core-primitives@Block","public":true,"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"html@i","params":{"aria-hidden":"true","style":{"display":"flex","justifyContent":"center","alignItems":"center","width":"100%","height":"100%","fontSize":{"params":{"reference":"size"},"component":"data2-core-types@Reference"},"color":{"params":{"compare":[{"params":{"subject":{"params":{"reference":"color"},"component":"data2-core-types@Reference"},"pattern":{"component":"data2-core-primitives@String","params":{"content":"gradient"}}},"component":"data2-core-functions@Includes"}],"else":{"params":{"components":[{"params":{"reference":"color"},"component":"data2-core-types@Reference"},{"params":{"reference":"super.textColor"},"component":"data2-core-types@Reference"}]},"component":"data2-core-logical-operators@Or"},"then":{"component":"data2-core-primitives@String","params":{"content":"transparent"}}},"component":"data2-core-flow@If"},"backgroundClip":{"component":"data2-core-primitives@String","params":{"content":"text"}},"WebkitBackgroundClip":{"component":"data2-core-primitives@String","params":{"content":"text"}},"backgroundImage":{"params":{"compare":[{"params":{"subject":{"params":{"reference":"color"},"component":"data2-core-types@Reference"},"pattern":{"component":"data2-core-primitives@String","params":{"content":"gradient"}}},"component":"data2-core-functions@Includes"}],"then":{"params":{"portions":[{"params":{"reference":"color"},"component":"data2-core-types@Reference"}]},"component":"data2-core-functions@StringConcat"},"else":{"component":"data2-core-primitives@String","params":{"content":"linear-gradient(transparent,transparent)"}}},"component":"data2-core-flow@If"},"transition":{"component":"data2-core-primitives@String","params":{"content":"inherit"}}},"className":{"component":"data2-core-functions@StringConcat","params":{"portions":["fa fa-",{"component":"data2-core-types@Reference","params":{"reference":"icon"}}]}}}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"icon":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@FontAwesomeIcon"}},"category":"appearance","dependsOn":[{"component":"data2-core-primitives@String","params":{"content":"iconSet"}}],"parameters":{},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"},"color":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Color"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":3}}},"component":"data2-core-types@ComponentParameter"},"size":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":2}}},"component":"data2-core-types@ComponentParameter"}}}},"component":"Icon","package":"data2-blocks","icon":"star","visibility":"deprecated","title":"FontAwesomeIcon"},"updatedAt":"2023-04-15T00:24:21.103Z"},{"_id":"5fdbbc3b4369e2af9518138b","component":"data2-core-types@Component","params":{"component":"Switch","package":"data2-core-flow","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"expression":"String","cases":{"component":"data2-core-flow@Case","list":true},"defaultCase":"String"}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"defaultCase"}}},"updatedAt":"2025-07-15T15:00:38.347Z"},{"_id":"5ff495d34369e2af95ba4273","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"ExternalSystemService","icon":"exchange","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"system":{"params":{"component":"data2-core-primitives@String","saveCompiled":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"version":{"params":{"component":"data2-core-primitives@String","saveCompiled":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2024-02-23T17:10:10.273Z"},{"_id":"5ff498c94369e2af95ba6f7d","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"ExternalDataSetReference","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"externalSystem":{"component":"data2-core-types@ExternalSystemServiceReference"},"reference":{"component":"data2-core-primitives@String"}}}}}},{"_id":"601034a15c0bce53ad279a08","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"Skill","visibility":"private","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"policies":{"component":"data2-core-auth@Policy","list":true},"action":{"component":"data2-core-flow@Series"},"title":{"component":"data2-core-primitives@String"}}}}}},{"_id":"6048d4d4c2dd12f059dd353d","component":"data2-core-types@Component","params":{"package":"data2-core-functions","component":"Merge","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"lists":{"component":"data2-core-types@DataSetReference","list":true},"column":{"component":"data2-core-types@DataSetColumnReference"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"lists.0"}}},"updatedAt":"2022-12-23T18:42:52.986Z"},{"_id":"6059ffb628c3be06a609da23","component":"data2-core-types@Component","params":{"package":"data2-core","component":"MemoryDataSource","icon":"database","extends":"data2-core@DataSource","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"initialData":{"component":"data2-core-primitives@String","list":true},"pk":"String"}}},"visibility":"private"}},{"_id":"605a44ee28c3be06a615ddcc","component":"data2-core-types@Component","params":{"definition":{"component":"data2-core-types@Definition","params":{"def":{"component":"html@div","params":{"style":{"width":"100%","height":"100%","background":{"component":"data2-core-types@Reference","params":{"reference":"color"}},"maskImage":{"component":"data2-core-functions@StringConcat","params":{"portions":["url(",{"component":"data2-core-types@Reference","params":{"reference":"src"}},")"]}},"WebkitMaskImage":{"component":"data2-core-functions@StringConcat","params":{"portions":["url(",{"component":"data2-core-types@Reference","params":{"reference":"src"}},")"]}},"maskSize":"contain","WebkitMaskSize":"contain","maskRepeat":"no-repeat","WebkitMaskRepeat":"no-repeat","maskPosition":"center","WebkitMaskPosition":"center","StrokeDashArray":{"component":"data2-core-types@Reference","params":{"reference":"StrokeDashArray"}},"StrokeDashOffset":{"component":"data2-core-types@Reference","params":{"reference":"StrokeDashOffset"}},"stroke":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"strokeColor"}}}},"strokeWidth":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"strokeWidth"}}}}}}}},"preventEvaluation":true},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"color":{"component":"data2-core-types@Fill"},"src":{"component":"data2-core-types@FileComponentUrlReference"},"StrokeDashArray":{"params":{"component":"data2-core-primitives@Number"},"component":"data2-core-types@ComponentParameter"},"StrokeDashOffset":{"params":{"component":"data2-core-primitives@Number"},"component":"data2-core-types@ComponentParameter"},"strokeColor":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-types@Color"}},"strokeWidth":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Number"}},"inline":{"params":{"component":"data2-core-primitives@Boolean","defaultValue":{"params":{},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-types@ComponentParameter"}}}},"public":true,"component":"SvgImageBlock","package":"data2-blocks","icon":"star-o","extends":"data2-core-primitives@Block","visibility":"public"},"updatedAt":"2026-07-06T18:05:44.136Z"},{"_id":"605b9c8cf4da57a543329d96","component":"data2-core-types@Component","params":{"package":"data2-core-numerical-operators","component":"Divide","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"components":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Components"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}}}},"title":{"component":"data2-core-primitives@String","params":{"content":"Divide"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Applies division sequentially, example: if components is [4, 2, 2], the result will be 1 (4 / 2 / 2)."}},"returnPrimitiveTypes":[{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}}],"wrap":{"component":"data2-core-primitives@String","params":{"content":"components.0"}}},"updatedAt":"2022-09-12T20:28:19.753Z"},{"_id":"6061c943d7ec64d5fccb2f1c","component":"data2-core-types@Component","params":{"asd":1,"package":"data2-core-functions","component":"Replace","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"haystack":{"params":{"component":"data2-core-primitives@String","multiLine":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"needle":{"params":{"component":"data2-core-primitives@String","multiLine":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"patch":{"params":{"component":"data2-core-primitives@String","multiLine":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"haystack"}}},"updatedAt":"2026-05-08T20:04:02.364Z"},{"_id":"606d2136d7ec64d5fcbb899f","component":"data2-core-types@Component","params":{"component":"Timer","package":"data2-core-types","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"reference":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"visibility":"private"},"component":"data2-core-types@ComponentParameter"},"interval":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Interval to run onTick (in ms)"}}},"component":"data2-core-types@ComponentParameter"},"activeInBuilder":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}}},"component":"data2-core-types@ComponentParameter"},"onTick":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}}},"component":"data2-core-types@ComponentParameter"}}}},"icon":{"params":{"icon":"fa-clock-o"},"component":"data2-core-types@FontAwesomeIcon"}},"updatedAt":"2022-10-14T17:58:32.922Z"},{"_id":"606dd6b5d7ec64d5fcdf9813","component":"data2-core-types@Component","params":{"package":"data2-core-functions","component":"Split","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"haystack":{"component":"data2-core-primitives@String","content":{"params":{"date":{"params":{},"component":"data2-core-functions@DateNow"},"format":{"component":"data2-core-primitives@String","params":{"content":"LL"}}},"component":"data2-core-functions@DateFormat"}},"needle":{"component":"data2-core-primitives@String","content":"video"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"haystack"}}},"updatedAt":"2025-12-15T19:36:42.325Z"},{"_id":"60774872d7ec64d5fc5e0a4c","component":"data2-core-types@Component","params":{"public":true,"component":"StateDefinition","package":"data2-core-user-interface","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"key":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}}},"component":"data2-core-types@ComponentParameter"},"initialValue":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"alternativeParameterDefaultType":[{"parameter":{"component":"data2-core-primitives@String","params":{"content":"component"}},"value":"data2-core-primitives@Boolean","type":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}}},"component":"data2-core-types@ComponentParameter"}},{"parameter":{"component":"data2-core-primitives@String","params":{"content":"component"}},"value":"data2-core-primitives@Number","type":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}}},"component":"data2-core-types@ComponentParameter"}},{"parameter":{"component":"data2-core-primitives@String","params":{"content":"component"}},"value":"data2-core-functions@Function","type":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-functions@Function"}}},"component":"data2-core-types@ComponentParameter"}}],"index":{"component":"data2-core-primitives@Number","params":{"content":2}},"dependsOn":[{"component":"data2-core-primitives@String","params":{"content":"component"}}],"shouldShow":{"component":"data2-core-primitives@Boolean","params":{"content":true},"preventEvaluation":true}},"component":"data2-core-types@ComponentParameter"},"component":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"oneOf":["data2-core-primitives@String","data2-core-primitives@Boolean","data2-core-primitives@Number",{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},{"component":"data2-core-primitives@String","params":{"content":"data2-core-functions@Function"}}],"index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"public","preview":{"params":{"reference":"key"},"component":"data2-core-types@Reference"}},"updatedAt":"2023-10-30T20:32:52.970Z"},{"_id":"607f1aebf1955d3129a4371c","component":"data2-core-types@Component","params":{"component":"Null","package":"data2-core-primitives","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{}}}}},{"_id":"60a63e0822c2a8041f4edc0b","component":"data2-core-types@Component","params":{"package":"data2-core-functions","component":"DateDiff","title":"DateDiff","description":"Calculates the difference between two dates in the specified time unit. Returns the result as a Number. The difference is computed as left - right.","wrap":{"component":"data2-core-primitives@String","params":{"content":"date"}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"left":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Date"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Left Date"}},"description":{"component":"data2-core-primitives@String","params":{"content":"The first date in the comparison. The result is left minus right."}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}}},"right":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Date"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Right Date"}},"description":{"component":"data2-core-primitives@String","params":{"content":"The second date in the comparison. Subtracted from the left date to produce the result."}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}}}},"period":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Period"}},"description":{"component":"data2-core-primitives@String","params":{"content":"The time unit used to express the difference between the two dates."}},"index":{"component":"data2-core-primitives@Number","params":{"content":3}},"oneOf":[{"component":"data2-core-primitives@String","params":{"content":"years"}},{"component":"data2-core-primitives@String","params":{"content":"months"}},{"component":"data2-core-primitives@String","params":{"content":"weeks"}},{"component":"data2-core-primitives@String","params":{"content":"days"}},{"component":"data2-core-primitives@String","params":{"content":"hours"}},{"component":"data2-core-primitives@String","params":{"content":"minutes"}},{"component":"data2-core-primitives@String","params":{"content":"seconds"}}]}}}}}},"updatedAt":"2026-05-22T15:10:52.582Z"},{"_id":"60c9101822c2a8041f93fabb","component":"data2-core-types@Component","params":{"package":"data2-core-functions","component":"Reduce","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"array":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Getter"}}},"component":"data2-core-types@ComponentParameter"},"reducer":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-functions@Function"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"accumulator"}}}},{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"item"}}}},{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"index"}}}}]},"component":"data2-core-types@ComponentParameter"},"initialValue":{"params":{},"component":"data2-core-types@ComponentParameter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"array"}}},"updatedAt":"2022-12-23T18:43:23.865Z"},{"_id":"60edaca1da3861ca65b617c6","component":"data2-core-types@Component","params":{"package":"data2-core-flow","component":"AwaitReady","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"module":{"component":"data2-core-types@InteractiveModuleReference"}}}},"preview":{"params":{"portions":[{"component":"data2-core-primitives@String","params":{"content":"AwaitReady | "}},{"params":{"components":[{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"module"}}}},"prop":{"component":"data2-core-primitives@String","params":{"content":"displayName"}}}},{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"module"}}}},"prop":{"component":"data2-core-primitives@String","params":{"content":"reference"}}}}]},"component":"data2-core-logical-operators@Or"}]},"component":"data2-core-functions@StringConcat"}},"updatedAt":"2023-08-16T19:07:22.592Z"},{"_id":"5fdbbc674369e2af9518164b","component":"data2-core-types@Component","params":{"component":"Case","package":"data2-core-flow","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"expression":"String","value":"String"}}},"preview":{"params":{"portions":[{"component":"data2-core-primitives@String","params":{"content":"Case | "}},{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"expression"}}}}]},"component":"data2-core-functions@StringConcat"}},"updatedAt":"2023-08-09T21:27:40.970Z"},{"_id":"600af5265c0bce53ad8d501d","component":"data2-core-types@Component","params":{"public":true,"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"backgrounds":{"component":"data2-core-types@Background","list":true}}}},"component":"Fill","package":"data2-core-types","visibility":"public"}},{"_id":"60186499c2dd12f059e325e2","component":"data2-core-types@Component","params":{"public":true,"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"colors":{"component":"data2-core-types@ColorGradientStop","list":true},"type":{"component":"data2-core-primitives@String","oneOf":["linear","radial","repeating-linear","repeating-radial","conic"]},"angle":{"component":"data2-core-primitives@Number"}}}},"component":"ColorGradient","package":"data2-core-types","visibility":"public"}},{"_id":"601be018c2dd12f05956a70f","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"PackageGetter","visibility":"private","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"field":{"component":"data2-core-primitives@String"},"packageReference":{"component":"data2-core-primitives@String"}}}}}},{"_id":"602e95f2c2dd12f0597f2d34","component":"data2-core-types@Component","params":{"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-controls@ChatRoom","params":{"roomname":{"component":"data2-core-types@Reference","params":{"reference":"roomname"}}}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"roomname":{"component":"data2-core-primitives@String"}}}},"public":true,"component":"VideoChatBlock","package":"data2-blocks","extends":"data2-core-primitives@Block","icon":"video-camera","visibility":"public"}},{"_id":"603d57a6c2dd12f059b47fba","component":"data2-core-types@Component","params":{"package":"data2-core-functions","component":"DateNow","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{}}}}},{"_id":"6047ea59c2dd12f059b70a99","component":"data2-core-types@Component","params":{"component":"ArrayPush","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"array":{"component":"data2-core-types@Getter"},"item":{"component":"data2-core-primitives@String"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"array"}}},"updatedAt":"2022-12-23T18:38:17.686Z"},{"_id":"604bc223c2dd12f05958ccd1","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"HostComponentReference","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"dummy":{"component":"data2-core-primitives@String"}}}}}},{"_id":"6050ef11c2dd12f0590e5a37","component":"data2-core-types@Component","params":{"component":"ObjectOmit","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"object":{"component":"data2-core-types@Getter"},"omitter":{"component":"data2-core-primitives@String","list":true}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"object"}}},"updatedAt":"2024-08-23T13:14:56.388Z"},{"_id":"60510c66c2dd12f059147c31","component":"data2-core-types@Component","params":{"component":"ObjectSet","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"object":{"component":"data2-core-types@Getter"},"path":{"component":"data2-core-primitives@String"},"value":{"component":"data2-core-primitives@String"}}}}}},{"_id":"6070ea53d7ec64d5fc7d2c10","component":"data2-core-types@Component","params":{"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"model":{"component":"data2-core-types@FileReference"},"lightColor":{"component":"data2-core-types@Color"}}}},"public":false,"component":"ModelViewer","package":"data2-controls","visibility":"deprecated"},"updatedAt":"2022-03-22T14:31:21.458Z"},{"_id":"6070eaf1d7ec64d5fc7d457c","component":"data2-core-types@Component","params":{"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-controls@ModelViewer","params":{"model":{"width":{"component":"data2-core-types@Reference","params":{"reference":"super.dimensions.width"}},"height":{"component":"data2-core-types@Reference","params":{"reference":"super.dimensions.height"}},"anitialias":true,"model":{"component":"data2-core-types@Reference","params":{"reference":"model"}},"lightColor":{"component":"data2-core-types@Reference","params":{"reference":"lightColor"}},"positionX":{"component":"data2-core-types@Reference","params":{"reference":"positionX"}},"positionY":{"component":"data2-core-types@Reference","params":{"reference":"positionY"}},"positionZ":{"component":"data2-core-types@Reference","params":{"reference":"positionZ"}},"rotationX":{"component":"data2-core-types@Reference","params":{"reference":"rotationX"}},"rotationY":{"component":"data2-core-types@Reference","params":{"reference":"rotationY"}},"rotationZ":{"component":"data2-core-types@Reference","params":{"reference":"rotationZ"}}}}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"model":{"component":"data2-core-types@FileReference"},"lightColor":{"component":"data2-core-types@Color"},"rotationX":{"component":"data2-core-primitives@Number"},"rotationY":{"component":"data2-core-primitives@Number"},"rotationZ":{"component":"data2-core-primitives@Number"},"positionX":{"component":"data2-core-primitives@Number"},"positionY":{"component":"data2-core-primitives@Number"},"positionZ":{"component":"data2-core-primitives@Number"}}}},"public":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"component":"ModelViewer","package":"data2-blocks","icon":"cube","extends":"data2-core-primitives@Block","visibility":"deprecated"},"updatedAt":"2022-04-06T14:00:17.985Z"},{"_id":"60774899d7ec64d5fc5e1e2f","component":"data2-core-types@Component","params":{"public":false,"component":"StateGetter","package":"data2-core-user-interface","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"componentId":{"component":"data2-core-primitives@String"},"key":{"component":"data2-core-primitives@String"}}}},"visibility":"deprecated"},"updatedAt":"2022-03-22T14:41:09.465Z"},{"_id":"607748b2d7ec64d5fc5e2c70","component":"data2-core-types@Component","params":{"public":false,"component":"StateSetter","package":"data2-core-user-interface","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"componentId":{"component":"data2-core-primitives@String"},"key":{"component":"data2-core-primitives@String"},"value":{"component":"data2-core-primitives@String"}}}},"visibility":"deprecated"},"updatedAt":"2022-03-22T14:41:31.563Z"},{"_id":"607f1ae2f1955d3129a43615","component":"data2-core-types@Component","params":{"component":"Undefined","package":"data2-core-primitives","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{}}}}},{"_id":"608b13592ad4f87cf58a85b9","component":"data2-core-types@Component","params":{"component":"ArraySlice","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"array":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Getter"}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}}},"component":"data2-core-types@ComponentParameter"},"start":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"},"end":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}}},"component":"data2-core-types@ComponentParameter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"array"}}},"updatedAt":"2022-12-23T18:39:49.343Z"},{"_id":"5fdbb0754369e2af9514749f","component":"data2-core-types@Component","params":{"public":true,"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"horizontalAlignment":{"component":"data2-core-primitives@String","oneOf":["left","center","right"]},"verticalAlignment":{"component":"data2-core-primitives@String","oneOf":["top","middle","bottom"]},"lineHeight":{"component":"data2-core-primitives@Number"},"letterSpacing":{"component":"data2-core-primitives@Number"},"wordWrap":{"params":{"component":"data2-core-primitives@String","oneOf":[{"params":{"content":"break-word"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"},"spaceWrap":{"params":{"component":"data2-core-primitives@String","oneOf":[{"params":{"content":"nowrap"},"component":"data2-core-primitives@String"},{"params":{"content":"pre"},"component":"data2-core-primitives@String"},{"params":{"content":"pre-wrap"},"component":"data2-core-primitives@String"},{"params":{"content":"pre-line"},"component":"data2-core-primitives@String"},{"params":{"content":"break-spaces"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"}}}},"component":"TextFormat","package":"data2-core-types","visibility":"public"},"updatedAt":"2023-11-01T22:35:59.845Z"},{"_id":"5ff498764369e2af95ba68c6","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"ExternalSystemServiceReference","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"reference":"String"}}}}},{"_id":"60019e844369e2af95919c94","component":"data2-core-types@Component","params":{"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"html@iframe","params":{"frameBorder":"0","src":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-types@Reference","params":{"reference":"builder"}}],"then":"about:blank","else":{"component":"data2-core-types@Reference","params":{"reference":"url"}}}},"allow":"autoplay","allowFullScreen":{"component":"data2-core-types@Reference","params":{"reference":"allowFullScreen"}},"loading":"lazy","style":{"position":"absolute","width":"100%","height":"100%","border":"none","padding":"none","overflow":"auto"}}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"url":"String","allowFullScreen":{"component":"data2-core-primitives@Boolean"},"allowAutoPlay":{"component":"data2-core-primitives@Boolean"}}}},"public":true,"component":"IframeBlock","package":"data2-blocks","icon":"chrome","extends":"data2-core-primitives@Block","visibility":"public"}},{"_id":"600dfeb35c0bce53adf1e8e8","component":"data2-core-types@Component","params":{"preview":{"params":{"reference":"title"},"component":"data2-core-types@Reference"},"package":"data2-core-media","component":"Chapter","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"timeStart":"Number","timeEnd":"Number","title":"String","onEnd":{"component":"data2-core-types@Interaction"},"onEnter":{"component":"data2-core-types@Interaction"}}}}}},{"_id":"601ae9c9c2dd12f059304d55","component":"data2-core-types@Component","params":{"public":true,"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"color":{"component":"data2-core-types@ColorGradient"},"gradient":{"component":"data2-core-types@ColorGradient"},"image":{"component":"data2-core-types@FileComponentUrlReference"},"size":{"component":"data2-core-primitives@String","oneOf":["auto","contain","cover"]},"positionX":{"component":"data2-core-primitives@String","oneOf":["left","center","right"]},"positionY":{"component":"data2-core-primitives@String","oneOf":["top","center","bottom"]},"repeat":{"component":"data2-core-primitives@String","oneOf":["repeat","repeat-x","repeat-y","no-repeat","space","round"]},"attachment":{"component":"data2-core-primitives@String","oneOf":["scroll","fixed","local"]},"origin":{"component":"data2-core-primitives@String","oneOf":["border-box","padding-box","content-box"]},"clip":{"component":"data2-core-primitives@String","oneOf":["border-box","padding-box","content-box"]},"skipServerSideProcessing":{"component":"data2-core-primitives@Boolean"}}}},"component":"Background","package":"data2-core-types","visibility":"public"},"updatedAt":"2026-02-22T02:34:52.063Z"},{"_id":"603ed801c2dd12f059fb6d9f","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"ServiceDatabaseReference","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"reference":"String"}}}}},{"_id":"6040d377c2dd12f0595c284e","component":"data2-core-types@Component","params":{"package":"data2-core-functions","component":"Group","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"subject":{"component":"data2-core-primitives@String"},"column":{"component":"data2-core-primitives@String"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"subject"}}},"updatedAt":"2024-12-15T16:42:11.788Z"},{"_id":"6047f928c2dd12f059b9ee92","component":"data2-core-types@Component","params":{"component":"ArrayFilter","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"array":{"component":"data2-core-types@Getter"},"filter":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-functions@Function"}},"arguments":[{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":""}},"title":{"component":"data2-core-primitives@String","params":{"content":"item"}}},"component":"data2-core-types@ComponentParameter"},{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Index"}}},"component":"data2-core-types@ComponentParameter"}]},"component":"data2-core-types@ComponentParameter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"array"}}},"updatedAt":"2022-12-23T18:35:07.031Z"},{"_id":"60548592c2dd12f059ca8823","component":"data2-core-types@Component","params":{"package":"data2-core-types","public":true,"component":"FontAwesomeIcon","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"icon":{"component":"data2-core-primitives@String"}}}},"visibility":"private"},"updatedAt":"2023-04-15T00:28:49.126Z"},{"_id":"605b9c7ef4da57a5433299e2","component":"data2-core-types@Component","params":{"package":"data2-core-numerical-operators","component":"Subtract","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"components":{"component":"data2-core-primitives@Number","list":true}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"components.0"}}},"updatedAt":"2022-09-12T20:27:27.636Z"},{"_id":"6061f17ed7ec64d5fcd5ce4a","component":"data2-core-types@Component","params":{"interactions":{"component":"data2-core-types@FieldSet","params":{"fields":{"goTo":{"visibility":"public","icon":"share"},"play":{"visibility":"public","icon":"play-circle"},"pause":{"visibility":"public","icon":"pause-circle"}}}},"public":false,"component":"DynamicVideo","package":"data2-controls","icon":"video-camera","visibility":"deprecated"},"updatedAt":"2022-03-22T14:31:00.603Z"},{"_id":"606e11ccd7ec64d5fcf1f34b","component":"data2-core-types@Component","params":{"component":"ArrayFind","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"array":{"component":"data2-core-types@Getter"},"filter":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-functions@Function"}},"arguments":[{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":""}},"title":{"component":"data2-core-primitives@String","params":{"content":"item"}}},"component":"data2-core-types@ComponentParameter"},{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Index"}}},"component":"data2-core-types@ComponentParameter"}]},"component":"data2-core-types@ComponentParameter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"array"}}},"updatedAt":"2022-12-23T18:35:33.262Z"},{"_id":"606e1425d7ec64d5fcf2c954","component":"data2-core-types@Component","params":{"component":"Password","package":"data2-core-types","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"unique":{"component":"data2-core-primitives@Boolean"}}}},"validation":{"required":{"component":"data2-core-primitives@Boolean","default":false}}}},{"_id":"6078aa0cd7ec64d5fccdb605","component":"data2-core-types@Component","params":{"public":true,"component":"StateProp","package":"data2-core-user-interface","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"key":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":2}}},"component":"data2-core-types@ComponentParameter"},"componentId":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":0}}},"component":"data2-core-types@ComponentParameter"},"rootStateProp":{"params":{"component":"data2-core-primitives@String","visibility":"private","index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"public"},"updatedAt":"2023-11-09T19:43:34.565Z"},{"_id":"60809cf3f1955d3129c9deb2","component":"data2-core-types@Component","params":{"component":"ArrayFindIndex","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"array":{"component":"data2-core-types@Getter"},"filter":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-functions@Function"}},"arguments":[{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":""}},"title":{"component":"data2-core-primitives@String","params":{"content":"item"}}},"component":"data2-core-types@ComponentParameter"},{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Index"}}},"component":"data2-core-types@ComponentParameter"}]},"component":"data2-core-types@ComponentParameter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"array"}}},"updatedAt":"2023-01-16T21:38:10.043Z"},{"_id":"60809cfcf1955d3129c9e118","component":"data2-core-types@Component","params":{"component":"ArrayFindLastIndex","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"array":{"component":"data2-core-types@Getter"},"filter":{"component":"data2-core-primitives@String"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"array"}}},"updatedAt":"2022-12-23T18:36:40.583Z"},{"_id":"60dcdd43da3861ca652deeb8","component":"data2-core-types@Component","params":{"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"family":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"},"faces":{"params":{"component":"data2-core-primitives@Object","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"src":{"params":{"component":"data2-core-types@FileComponentUrlReference","index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"},"format":{"params":{"component":"data2-core-primitives@String","oneOf":[{"params":{"content":"opentype"},"component":"data2-core-primitives@String"},{"params":{"content":"truetype"},"component":"data2-core-primitives@String"},{"params":{"content":"woff"},"component":"data2-core-primitives@String"},{"params":{"content":"woff2"},"component":"data2-core-primitives@String"},{"params":{"content":"embedded-opentype"},"component":"data2-core-primitives@String"}],"index":{"component":"data2-core-primitives@Number","params":{"content":2}}},"component":"data2-core-types@ComponentParameter"},"style":{"params":{"component":"data2-core-primitives@String","oneOf":[{"params":{"content":"normal"},"component":"data2-core-primitives@String"},{"params":{"content":"italic"},"component":"data2-core-primitives@String"},{"params":{"content":"oblique"},"component":"data2-core-primitives@String"}],"index":{"component":"data2-core-primitives@Number","params":{"content":3}}},"component":"data2-core-types@ComponentParameter"},"weight":{"params":{"component":"data2-core-primitives@String","oneOf":[{"params":{"content":"normal"},"component":"data2-core-primitives@String"},{"params":{"content":"bold"},"component":"data2-core-primitives@String"},{"params":{"content":"100"},"component":"data2-core-primitives@String"},{"params":{"content":"200"},"component":"data2-core-primitives@String"},{"params":{"content":"300"},"component":"data2-core-primitives@String"},{"params":{"content":"400"},"component":"data2-core-primitives@String"},{"params":{"content":"500"},"component":"data2-core-primitives@String"},{"params":{"content":"600"},"component":"data2-core-primitives@String"},{"params":{"content":"700"},"component":"data2-core-primitives@String"},{"params":{"content":"800"},"component":"data2-core-primitives@String"},{"params":{"content":"900"},"component":"data2-core-primitives@String"}],"index":{"component":"data2-core-primitives@Number","params":{"content":4}}},"component":"data2-core-types@ComponentParameter"},"sources":{"params":{"component":"data2-core-primitives@Object","parameters":{"src":{"params":{"component":"data2-core-types@FileComponentUrlReference","index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"},"format":{"params":{"component":"data2-core-primitives@String","oneOf":[{"params":{"content":"opentype"},"component":"data2-core-primitives@String"},{"params":{"content":"truetype"},"component":"data2-core-primitives@String"},{"params":{"content":"woff"},"component":"data2-core-primitives@String"},{"params":{"content":"woff2"},"component":"data2-core-primitives@String"},{"params":{"content":"embedded-opentype"},"component":"data2-core-primitives@String"}],"index":{"component":"data2-core-primitives@Number","params":{"content":2}}},"component":"data2-core-types@ComponentParameter"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}}},"component":"data2-core-types@ComponentParameter"},"display":{"params":{"component":"data2-core-primitives@String","oneOf":[{"params":{"content":"auto"},"component":"data2-core-primitives@String"},{"params":{"content":"block"},"component":"data2-core-primitives@String"},{"params":{"content":"swap"},"component":"data2-core-primitives@String"},{"params":{"content":"fallback"},"component":"data2-core-primitives@String"},{"params":{"content":"optional"},"component":"data2-core-primitives@String"}],"index":{"component":"data2-core-primitives@Number","params":{"content":5}}},"component":"data2-core-types@ComponentParameter"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}}},"component":"data2-core-types@ComponentParameter"}}}},"component":"Font","package":"data2-core-web"},"updatedAt":"2024-04-08T14:26:23.871Z"},{"_id":"60e5eee4da3861ca650af718","component":"data2-core-types@Component","params":{"component":"ComponentParameter","package":"data2-core-types","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"component":{"params":{"component":{"params":{"content":"data2-core-primitives@String"},"component":"data2-core-primitives@String"},"index":{"component":"data2-core-primitives@Number","params":{"content":0}},"required":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"oneOf":{"params":{"mapper":{"params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"c"}}],"body":{"params":{"portions":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"c.params.package"}}}},{"component":"data2-core-primitives@String","params":{"content":"@"}},{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"c.params.component"}}}}]},"component":"data2-core-functions@StringConcat"}},"component":"data2-core-functions@Function","break":true},"array":{"params":{"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}},"module":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"ComponentsDataSet"}},"_layer":{"component":"data2-core-primitives@String","params":{"content":"HostApplicationLayer"}}},"component":"data2-core-types@ProcessReference"}},"component":"data2-core-types@Getter"}},"component":"data2-core-functions@ArrayMap","preventEvaluation":true},"saveCompiled":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"title":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"},"category":{"params":{"oneOf":["appearance","content","behaviour","other"],"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":6}}},"component":"data2-core-types@ComponentParameter"},"icon":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":3}}},"component":"data2-core-types@ComponentParameter"},"description":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":4}}},"component":"data2-core-types@ComponentParameter"},"preview":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@FileComponentUrlReference"}},"index":{"component":"data2-core-primitives@Number","params":{"content":5}}},"component":"data2-core-types@ComponentParameter"},"visibility":{"params":{"oneOf":[{"component":"data2-core-primitives@String","params":{"content":"deprecated"}},"private",{"component":"data2-core-primitives@String","params":{"content":"alpha"}},{"component":"data2-core-primitives@String","params":{"content":"beta"}},"public"],"index":{"component":"data2-core-primitives@Number","params":{"content":6}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}},"component":"data2-core-types@ComponentParameter"},"index":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"index":{"component":"data2-core-primitives@Number","params":{"content":7}}},"component":"data2-core-types@ComponentParameter"},"link":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":8}}},"component":"data2-core-types@ComponentParameter"},"strict":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"description":{"component":"data2-core-primitives@String","params":{"content":"If true, ƒ() suggestions will only suggest matching component types."}}},"component":"data2-core-types@ComponentParameter"},"list":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"description":{"component":"data2-core-primitives@String","params":{"content":"If true, the field is a list."}}},"component":"data2-core-types@ComponentParameter"},"multiLine":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"description":{"component":"data2-core-primitives@String","params":{"content":"If true, the field Control should be multiline."}}}},"simple":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"description":{"component":"data2-core-primitives@String","params":{"content":"If true, the CustomControl should be simple."}}},"component":"data2-core-types@ComponentParameter"},"saveCompiled":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Saves evaluated value instead of the complete definition."}},"visibility":"private"},"component":"data2-core-types@ComponentParameter"},"oneOf":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"autocomplete":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Definition"}}},"component":"data2-core-types@ComponentParameter"},"mock":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@FieldSet"}}},"component":"data2-core-types@ComponentParameter"},"definition":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Definition"}}},"component":"data2-core-types@ComponentParameter"},"defaultValue":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Definition"}}},"component":"data2-core-types@ComponentParameter"},"expectedPrimitiveTypes":{"params":{"oneOf":["data2-core-primitives@String","data2-core-primitives@Boolean","data2-core-primitives@Number","data2-core-primitives@Object","data2-core-primitives@Function","data2-core-primitives@Undefined","data2-core-primitives@Null"],"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"required":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"description":{"component":"data2-core-primitives@String","params":{"content":"If true, the field is required."}}}},"parameters":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}}}},"arguments":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@ComponentParameter"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}},"async":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"description":{"component":"data2-core-primitives@String","params":{"content":"If true, the Function is asynchronous."}}},"component":"data2-core-types@ComponentParameter"},"pure":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"description":{"component":"data2-core-primitives@String","params":{"content":"If true, the Function is pure."}}},"component":"data2-core-types@ComponentParameter"},"returnPrimitiveTypes":{"params":{"oneOf":["data2-core-primitives@String","data2-core-primitives@Boolean","data2-core-primitives@Number","data2-core-primitives@Object","data2-core-primitives@Function","data2-core-primitives@Undefined","data2-core-primitives@Null"],"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"fallbackValue":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Definition"}}},"component":"data2-core-types@ComponentParameter"},"dependsOn":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"shouldShow":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}}}},"flat":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"description":{"component":"data2-core-primitives@String","params":{"content":"If true, the Object should be displayed flattened in Inspector (avoid deep navigation)"}}},"component":"data2-core-types@ComponentParameter"},"fieldValidation":{"component":"data2-core-types@ComponentParameter","params":{"visibility":"private","component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-functions@Function"}},"arguments":[{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":""}},"title":{"component":"data2-core-primitives@String","params":{"content":"currentValue"}}},"component":"data2-core-types@ComponentParameter"}]}},"componentOptions":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object"}},"key":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":0.5}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"unversioned":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Used to show in the Builder inspector if a param isn't versioned, and changes are instantly applied."}},"title":{"component":"data2-core-primitives@String","params":{"content":"Unversioned"}},"key":{"component":"data2-core-primitives@String","params":{"content":"unversioned"}}},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2025-07-03T21:25:43.071Z"},{"_id":"60e6362dda3861ca6516d9b1","component":"data2-core-types@Component","params":{"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-controls@JsonViewer","params":{"json":{"params":{"reference":"json"},"component":"data2-core-types@Reference"},"theme":{"params":{"reference":"theme"},"component":"data2-core-types@Reference"},"collapsed":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"collapsed"}}},"component":"data2-core-types@Reference"}}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"json":{"params":{"component":"data2-core-types@Getter","visibility":"public","index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"},"theme":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"oneOf":["apathy","apathy:inverted","ashes","bespin","brewer","bright:inverted","bright","chalk","codeschool","colors","eighties","embers","flat","google","grayscale","grayscale:inverted","greenscreen","harmonic","hopscotch","isotope","marrakesh","mocha","monokai","ocean","paraiso","pop","railscasts","rjv-default","shapeshifter","shapeshifter:inverted","solarized","summerfruit","summerfruit:inverted","threezerotwofour","tomorrow","tube","twilight"],"visibility":"public","index":{"component":"data2-core-primitives@Number","params":{"content":2}}},"component":"data2-core-types@ComponentParameter"},"collapsed":{"params":{"component":"data2-core-primitives@Number","visibility":"public","index":{"component":"data2-core-primitives@Number","params":{"content":3}}},"component":"data2-core-types@ComponentParameter"}}}},"public":true,"component":"JsonViewer","package":"data2-blocks","icon":"code","extends":"data2-core-primitives@Block","visibility":"public"},"updatedAt":"2023-12-23T18:51:10.276Z"},{"_id":"6104578af302195bad7e7628","component":"data2-core-types@Component","params":{"public":false,"component":"Spinner","package":"data2-controls","icon":"","visibility":"deprecated"},"updatedAt":"2022-03-22T14:42:12.913Z"},{"_id":"6109ae8af302195bad04c800","component":"data2-core-types@Component","params":{"package":"data2-core-functions","component":"DateSubtract","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"date":{"component":"data2-core-primitives@Date","index":0},"count":{"component":"data2-core-primitives@Number","index":1},"period":{"component":"data2-core-primitives@String","oneOf":["milliseconds","seconds","minutes","hours","days","weeks","months","quarters","years"],"index":2}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"date"}}},"updatedAt":"2022-12-28T18:41:20.980Z"},{"_id":"6109aeddf302195bad04d765","component":"data2-core-types@Component","params":{"package":"data2-core-functions","component":"DateStartOf","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"date":{"component":"data2-core-primitives@Date","index":0},"period":{"component":"data2-core-primitives@String","oneOf":["second","minute","hour","date","day","isoWeek","week","quarter","month","year"],"index":1}}}}}},{"_id":"6109b047f302195bad054bd9","component":"data2-core-types@Component","params":{"package":"data2-core-functions","component":"DateParse","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"date":{"component":"data2-core-primitives@String"},"format":{"component":"data2-core-primitives@String"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"date"}}},"updatedAt":"2022-12-28T18:40:00.990Z"},{"_id":"611e74ce92425036c3c8648b","component":"data2-core-types@Component","params":{"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"fontFamily":{"component":"String","oneOf":["system-ui","sans-serif","Arial","Helvetica","Verdana","Gill Sans","Optima","Arial Narrow","serif","Times","Didot","Georgia","Palatino","American Typewriter","monospace","Andale Mono","Courier","Courier New","cursive","Comic Sans MS","Apple Chancery","Bradley Hand","Brush Script MT","Snell Roundhand","fantasy","Impact","Luminari","Chalkduster","Marker Felt","Trattatello"]}}}},"component":"DefaultFont","package":"data2-core-web"}},{"_id":"6123ff1592425036c3729a0a","component":"data2-core-types@Component","params":{"public":true,"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-controls@RichTextEditor","params":{"style":{"width":"100%","height":"100%","boxSizing":"border-box","background":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"type"},"component":"data2-core-types@Reference"},"comparisonSubject":"checkbox"}}],"then":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"component":"data2-core-types@DataLinkGetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record"}}}},"comparisonSubject":true}}],"then":"rgba(0,118,255,1)","else":{"params":{"reference":"super.fill"},"component":"data2-core-types@Reference"}}},"else":{"params":{"reference":"super.fill"},"component":"data2-core-types@Reference"}}},"color":{"params":{"reference":"super.textColor"},"component":"data2-core-types@Reference"},"border":"none","outline":"none","appearance":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"orient"},"component":"data2-core-types@Reference"},"comparisonSubject":"vertical"}}],"then":"slider-vertical","else":"none"}},"cursor":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"disabled"},"component":"data2-core-types@Reference"},"comparisonSubject":true}}],"then":"not-allowed","else":"auto"}}},"value":{"component":"data2-core-types@DataLinkGetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record"}},"mask":{"component":"data2-core-types@Reference","params":{"reference":"mask"}}}},"onChange":{"component":"data2-core-types@DataLinkSetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record"}},"recordUpsert":{"component":"data2-core-types@Reference","params":{"reference":"recordUpsert"}},"onChange":{"component":"data2-core-types@Reference","params":{"reference":"onChange"}},"mask":{"component":"data2-core-types@Reference","params":{"reference":"mask"}}}},"opacity":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"disabled"},"component":"data2-core-types@Reference"},"comparisonSubject":true}}],"then":0.38,"else":1}},"disabled":{"params":{"reference":"disabled"},"component":"data2-core-types@Reference"},"spellCheck":{"params":{"reference":"spellCheck"},"component":"data2-core-types@Reference"},"placeholder":{"component":"data2-core-logical-operators@Or","params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":"placeholder"}},{"component":"data2-core-types@Reference","params":{"reference":"field"}}]}},"toolbar":{"params":{"reference":"toolbar"},"component":"data2-core-types@Reference"},"toolbarFill":{"params":{"reference":"toolbarFill"},"component":"data2-core-types@Reference"},"toolbarTextColor":{"params":{"reference":"toolbarTextColor"},"component":"data2-core-types@Reference"}}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"dataset":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@InteractiveModuleReference"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":91}}},"component":"data2-core-types@ComponentParameter"},"field":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetColumnReference"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":92}}},"component":"data2-core-types@ComponentParameter"},"record":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Reference"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":203}}},"component":"data2-core-types@ComponentParameter"},"recordUpsert":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":204}}},"component":"data2-core-types@ComponentParameter"},"placeholder":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":102}}},"component":"data2-core-types@ComponentParameter"},"disabled":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":205}}},"component":"data2-core-types@ComponentParameter"},"onChange":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":301}}},"component":"data2-core-types@ComponentParameter"},"spellCheck":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":205}}},"component":"data2-core-types@ComponentParameter"},"toolbar":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@FieldSet"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Toolbar options"}}}},"toolbarFill":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Fill"}}}},"toolbarTextColor":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Color"}},"visibility":"private"}}}}},"component":"RichTextEditor","package":"data2-blocks","icon":"keyboard-o","extends":"data2-core-primitives@Block","visibility":"public"},"updatedAt":"2022-03-22T20:33:21.048Z"},{"_id":"6138a0a392425036c35e6412","component":"data2-core-types@Component","params":{"package":"data2-core-web","component":"ScrollIntoView","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"id":{"component":"data2-core-primitives@String"},"alignment":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"visibility":"public","oneOf":[{"params":{"content":"start"},"component":"data2-core-primitives@String"},{"params":{"content":"center"},"component":"data2-core-primitives@String"},{"params":{"content":"end"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"},"behavior":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"visibility":"public","oneOf":[{"params":{"content":"smooth"},"component":"data2-core-primitives@String"},{"params":{"content":"instant"},"component":"data2-core-primitives@String"},{"params":{"content":"auto"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2024-11-12T20:19:04.771Z"},{"_id":"6169ac93976026c073d7e9cb","component":"data2-core-types@Component","params":{"component":"ObjectPick","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"object":{"component":"data2-core-types@Getter"},"picker":{"component":"data2-core-primitives@String","list":true}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"object"}}},"updatedAt":"2023-02-16T18:51:57.461Z"},{"_id":"610aec40f302195bad291894","component":"data2-core-types@Component","params":{"package":"data2-core-functions","component":"DateZone","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"date":{"component":"data2-core-primitives@Date","index":0},"zone":{"component":"data2-core-primitives@String","index":1}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"date"}}},"updatedAt":"2022-12-28T18:39:20.610Z"},{"_id":"61129ae7f302195bad3d943f","component":"data2-core-types@Component","params":{"package":"data2-core-functions","component":"toUpperCase","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"string":{"component":"data2-core-primitives@String"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"string"}}},"updatedAt":"2022-09-12T20:30:31.063Z"},{"_id":"611e97a492425036c3f050c2","component":"data2-core-types@Component","params":{"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"fonts":{"list":true,"component":"data2-core-web@DefaultFont"}}}},"component":"Fonts","package":"data2-core-web"}},{"_id":"61438422fca3809432310874","component":"data2-core-types@Component","params":{"public":true,"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"html@a","params":{"rel":"noopener noreferrer","style":{"width":"100%","height":"100%","boxSizing":"border-box","color":{"params":{"reference":"super.textColor"},"component":"data2-core-types@Reference"},"border":"none","appearance":"none","outline":"none","cursor":"pointer","display":"flex","alignItems":"center","justifyContent":"center","position":"relative","textDecoration":"none"},"children":{"component":"html@span","params":{"style":{"width":"100%","display":"inline-block","position":"relative","whiteSpace":"pre-wrap","top":{"params":{"reference":"super.textFormat.top"},"component":"data2-core-types@Reference"},"left":{"params":{"reference":"super.textFormat.left"},"component":"data2-core-types@Reference"},"transform":{"params":{"reference":"super.textFormat.transform"},"component":"data2-core-types@Reference"},"lineHeight":{"params":{"reference":"super.textFormat.lineHeight"},"component":"data2-core-types@Reference"},"letterSpacing":{"params":{"reference":"super.textFormat.letterSpacing"},"component":"data2-core-types@Reference"},"textAlign":{"params":{"reference":"super.textFormat.textAlign"},"component":"data2-core-types@Reference"}},"children":{"params":{"reference":"label"},"component":"data2-core-types@Reference"}}},"href":{"params":{"reference":"link"},"component":"data2-core-types@Reference"},"target":{"params":{"reference":"target"},"component":"data2-core-types@Reference"}}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"link":{"component":"data2-core-primitives@String"},"label":{"component":"data2-core-primitives@String"},"target":{"component":"data2-core-primitives@String","oneOf":["_parent","_self","_blank","_top"]}}}},"component":"LinkBlock","package":"data2-blocks","icon":"link","extends":"data2-core-primitives@Block","visibility":"public"}},{"_id":"618d8cbc976026c073f76f2c","component":"data2-core-types@Component","params":{"package":"data2-core-web","public":true,"component":"Window","parameters":{"component":"data2-core-types@FieldSet","params":{}},"visibility":"public"}},{"_id":"61045854f302195bad7ea128","component":"data2-core-types@Component","params":{"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-controls@Spinner","params":{"spinner":{"component":"data2-core-types@Reference","params":{"reference":"spinner"}},"color":{"component":"data2-core-types@Reference","params":{"reference":"super.textColor"}},"width":{"component":"data2-core-types@Reference","params":{"reference":"super.dimensions.width"}},"height":{"component":"data2-core-types@Reference","params":{"reference":"super.dimensions.height"}},"speed":{"component":"data2-core-types@Reference","params":{"reference":"speed"}},"size":{"component":"data2-core-types@Reference","params":{"reference":"super.textSize"}},"margin":{"component":"data2-core-logical-operators@Or","params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":"margin"}},0]}}}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"spinner":{"component":"data2-core-primitives@String","oneOf":["Bar","Beat","Bounce","Circle","ClimbingBox","Clip","Clock","Dot","Fade","Grid","Hash","Moon","Pacman","Propagate","Puff","Pulse","Ring","Rise","Rotate","Scale","Sync"],"index":0},"speed":{"component":"data2-core-primitives@Number","index":1}}}},"public":true,"component":"Spinner","package":"data2-blocks","icon":"spinner","extends":"data2-core-primitives@Block","visibility":"public"},"updatedAt":"2025-01-13T18:04:24.324Z"},{"_id":"610d181af302195bad656792","component":"data2-core-types@Component","params":{"package":"data2-core-functions","public":true,"component":"Includes","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"subject":{"params":{"component":{"params":{"content":"data2-core-primitives@String"},"component":"data2-core-primitives@String"},"index":{"component":"data2-core-primitives@Number","params":{"content":0}}},"component":"data2-core-types@ComponentParameter"},"pattern":{"params":{"component":{"params":{"content":"data2-core-primitives@String"},"component":"data2-core-primitives@String"},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"public","wrap":{"component":"data2-core-primitives@String","params":{"content":"subject"}}},"updatedAt":"2022-12-23T18:41:53.452Z"},{"_id":"612506ab92425036c3fd6cce","component":"data2-core-types@Component","params":{"package":"http","component":"Request","visibility":"private","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"data":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"index":{"component":"data2-core-primitives@Number","params":{"content":3}}},"component":"data2-core-types@ComponentParameter"},"headers":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"},"method":{"params":{"oneOf":["POST","GET","PUT","DELETE","PATCH"],"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Request Method"}},"index":{"component":"data2-core-primitives@Number","params":{"content":0.5}}},"component":"data2-core-types@ComponentParameter"},"url":{"component":"data2-core-primitives@String"},"useProxy":{"params":{"component":"data2-core-primitives@Boolean","key":{"component":"data2-core-primitives@String","params":{"content":"useProxy"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Use Proxy"}},"defaultValue":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-types@ComponentParameter"},"testRequest":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-tools@RequestTest"}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}}},"component":"data2-core-types@ComponentParameter"},"responseType":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"oneOf":[{"params":{"content":"arraybuffer"},"component":"data2-core-primitives@String"},{"params":{"content":"document"},"component":"data2-core-primitives@String"},{"params":{"content":"json"},"component":"data2-core-primitives@String"},{"params":{"content":"text"},"component":"data2-core-primitives@String"},{"params":{"content":"stream"},"component":"data2-core-primitives@String"},{"params":{"content":"blob"},"component":"data2-core-primitives@String"},{"params":{"content":"blob-url"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"},"rawResponse":{"component":"data2-core-primitives@Boolean"},"responseHeaderPrefix":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","shouldShow":{"component":"data2-core-primitives@Boolean","params":{"content":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"rawResponse"}}}}},"break":true}}},"maxRedirects":{"params":{"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"component":"data2-core-primitives@Number"},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2024-11-03T00:24:50.163Z"},{"_id":"614dc0e133fad3ebeb88c21b","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"PrevValueSetter","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"module":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@InteractiveModuleReference"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"},"prop":{"params":{"autocomplete":{"module":{"component":"data2-core-types@Reference","params":{"reference":"module"}}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}}},"component":"data2-core-types@ComponentParameter"}}}}}},{"_id":"614df5ca33fad3ebebb9879b","component":"data2-core-types@Component","params":{"product":"connect","icon":"table","public":true,"package":"http","component":"CustomHTTPDataSource","extends":"data2-core@DataSource","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"find":{"component":"http@Request"},"countKey":{"component":"data2-core-primitives@String"},"recordsKey":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":-1}}},"component":"data2-core-types@ComponentParameter"},"patch":{"component":"http@Request"},"create":{"component":"http@Request"},"remove":{"component":"http@Request"},"useSchema":{"params":{"visibility":"private","component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"title":{"component":"data2-core-primitives@String","params":{"content":"useSchema"}}},"component":"data2-core-types@ComponentParameter"},"schema":{"params":{"visibility":"public","component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Field"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Schema"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}}}},"title":{"component":"data2-core-primitives@String","params":{"content":"CustomHTTPDataSource"}},"visibility":"public","definition":{"params":{},"component":"data2-core-types@Definition"},"renderable":{"dimensions":{"disabled":false,"component":"data2-core-types@Dimensions","params":{"width":1366,"exactWidth":false,"exactHeight":false,"height":768}}}},"updatedAt":"2025-07-24T16:15:11.590Z"},{"_id":"6169ac7d976026c073d7c578","component":"data2-core-types@Component","params":{"component":"ObjectUnset","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"object":{"component":"data2-core-types@Getter"},"path":{"component":"data2-core-primitives@String"}}}}}},{"_id":"6169acb5976026c073d80c5f","component":"data2-core-types@Component","params":{"component":"ObjectAssign","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"object":{"component":"data2-core-types@Getter"},"sources":{"component":"data2-core-types@FieldSet","list":true}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"object"}}},"updatedAt":"2024-08-23T13:17:19.799Z"},{"_id":"619798538db3b3abde7c1719","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"BitmapFilter","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"type":{"component":"data2-core-primitives@String","oneOf":["sepia","grayscale","blur","contrast","brightness","invert","hue-rotate","saturate"],"content":"url"},"value":"Number","unit":{"component":"data2-core-primitives@String","oneOf":["px","deg","%"]}}}}},"updatedAt":"2026-04-08T14:59:58.679Z"},{"_id":"619c50a78db3b3abdeffe3a9","component":"data2-core-types@Component","params":{"component":"ArrayShuffle","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"array":{"component":"data2-core-types@Getter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"array"}}},"updatedAt":"2022-12-23T18:39:26.497Z"},{"_id":"6103616af302195bad61f3ac","component":"data2-core-types@Component","params":{"package":"data2-core","component":"Synth","icon":"volume-up","interactions":{"component":"data2-core-types@FieldSet","params":{"fields":{"play":{"visibility":"public","icon":"play"}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"position":{"component":"data2-core-types@Position","simple":true},"dimensions":{"component":"data2-core-types@Dimensions","simple":true},"bpm":{"component":"data2-core-types@Number","simple":true},"octave":{"component":"data2-core-types@String","simple":true},"duration":{"component":"data2-core-types@String","simple":true}}}}}},{"_id":"6109ae7ef302195bad04c4ec","component":"data2-core-types@Component","params":{"package":"data2-core-functions","component":"DateAdd","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"date":{"component":"data2-core-primitives@Date","index":0},"count":{"component":"data2-core-primitives@Number","index":1},"period":{"component":"data2-core-primitives@String","oneOf":["milliseconds","seconds","minutes","hours","days","weeks","months","quarters","years"],"index":2}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"date"}}},"updatedAt":"2022-12-28T18:38:56.768Z"},{"_id":"6109aee3f302195bad04d9b3","component":"data2-core-types@Component","params":{"package":"data2-core-functions","component":"DateEndOf","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"date":{"component":"data2-core-primitives@Date","index":0},"period":{"component":"data2-core-primitives@String","oneOf":["second","minute","hour","date","day","isoWeek","week","quarter","month","year"],"index":1}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"date"}}},"updatedAt":"2022-12-28T18:40:34.913Z"},{"_id":"61129ab7f302195bad3d0b9c","component":"data2-core-types@Component","params":{"package":"data2-core-functions","component":"toLowerCase","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"string":{"component":"data2-core-primitives@String"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"string"}}},"updatedAt":"2022-09-12T20:30:46.614Z"},{"_id":"6123fd2b92425036c370d728","component":"data2-core-types@Component","params":{"public":false,"component":"RichTextEditor","package":"data2-controls","icon":"","visibility":"deprecated"},"updatedAt":"2022-03-22T14:42:34.077Z"},{"_id":"612009a592425036c3f3e06e","component":"data2-core-types@Component","params":{"public":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"params":{"dangerouslySetInnerHTML":{"__html":{"component":"data2-core-types@Reference","params":{"reference":"text"}}}},"component":"html@div"}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"text":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":202}},"multiLine":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}}}},"component":"Html","package":"data2-blocks","icon":"file-text","extends":"data2-core-primitives@Block","visibility":"public"},"updatedAt":"2022-03-31T16:08:35.474Z"},{"_id":"6155ebc6976026c0734a590d","component":"data2-core-types@Component","params":{"package":"data2-core-functions","component":"StringNormalize","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"string":{"component":"data2-core-primitives@String"},"form":{"component":"data2-core-primitives@String"}}}}}},{"_id":"618d4b96976026c073eaf293","component":"data2-core-types@Component","params":{"component":"ArrayJoin","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"array":{"component":"data2-core-types@Getter"},"separator":{"component":"data2-core-primitives@String"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"array"}}},"updatedAt":"2022-12-23T18:37:07.359Z"},{"_id":"61a7e9b28db3b3abde26febc","component":"data2-core-types@Component","params":{"public":true,"parameters":{},"component":"EnvironmentReference","package":"data2-core-types","visibility":"public"}},{"_id":"61b8ae6142211e3ce8ac1cf6","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"DataSourceReference","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"reference":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"oneOf":{"preventEvaluation":true,"params":{"array":{"params":{"prop":"getQuickFilteredRecords","module":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"DataComponentInstancesDataSet"}},"_layer":{"component":"data2-core-primitives@String","params":{"content":"HostApplicationLayer"}}},"component":"data2-core-types@ProcessReference"},"args":[{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core@Data2TableDataSource"}}}]},"component":"data2-core-types@Getter"},"mapper":{"params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"item"}}],"body":{"preventEvaluation":true,"params":{"sources":[{"component":"data2-core-types@FieldSet","params":{"fields":{"label":{"params":{"components":[{"params":{"reference":"item.displayName"},"component":"data2-core-types@Reference"},{"params":{"reference":"item.reference"},"component":"data2-core-types@Reference"}]},"component":"data2-core-logical-operators@Or"},"value":{"params":{"reference":"item.reference"},"component":"data2-core-types@Reference"}}}}]},"component":"data2-core-functions@ObjectAssign"}},"component":"data2-core-functions@Function"}},"component":"data2-core-functions@ArrayMap"}}}}}},"updatedAt":"2021-12-14T21:39:14.260Z"},{"_id":"61ddf7ae6947419456b23d29","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"Regex","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"pattern":{"component":"data2-core-primitives@String"},"flags":{"component":"data2-core-primitives@String"}}}}}},{"_id":"61e187a46947419456154104","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"MailMessageParameters","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"artboard":{"component":"data2-core-types@ArtboardReference"},"subject":{"component":"data2-core-primitives@String"},"type":{"component":"data2-core-primitives@String"},"to":{"component":"data2-core-primitives@String","list":true},"data":{"component":"data2-core-primitives@Object"}}}}}},{"_id":"61f2ef3369474194565ae0f6","component":"data2-core-types@Component","params":{"component":"Delay","package":"data2-core-flow","public":true,"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"delay":{"component":"data2-core-primitives@Number"}}}},"visibility":"public","preview":{"params":{"portions":[{"component":"data2-core-primitives@String","params":{"content":"Delay | "}},{"params":{"reference":"delay"},"component":"data2-core-types@Reference"}]},"component":"data2-core-functions@StringConcat"}},"updatedAt":"2022-09-15T19:54:11.643Z"},{"_id":"61fac3106947419456ac9796","component":"data2-core-types@Component","params":{"component":"Modulo","package":"data2-core-numerical-operators","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"components":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Components"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"description":{"component":"data2-core-primitives@String","params":{"content":"Only the first two numbers will be used."}}},"component":"data2-core-types@ComponentParameter"}}}},"title":{"component":"data2-core-primitives@String","params":{"content":"Modulo"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Applies the module operation to two numbers, i.e., returns the remainder of the division of the first number divided by the second. Example: 5 mod 2 yields 1."}},"returnPrimitiveTypes":[{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}}]},"updatedAt":"2022-03-04T13:48:42.764Z"},{"_id":"620c0f218271aa412955e513","component":"data2-core-types@Component","params":{"public":true,"package":"data2-server-services","component":"Mailer","icon":"envelope","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"policies":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-auth@Policy"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"description":{"component":"data2-core-primitives@String","params":{"content":"Controls for allowing or denying access to the data"}}}}}}},"interactions":{"component":"data2-core-types@FieldSet","params":{"fields":{"send":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Sends email."}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Email data"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Email data to be sent"}},"defaultValue":{"artboard":{"component":"data2-core-primitives@String","params":{"content":""}},"from":{"name":{"component":"data2-core-primitives@String","params":{"content":"NoReply"}},"email":{"component":"data2-core-primitives@String","params":{"content":"noreply@data2.email"}}},"subject":{"component":"data2-core-primitives@String","params":{"content":""}},"data":{},"to":[],"message":{"component":"data2-core-primitives@String","params":{"content":""}}}}}]}}}}},"visibility":"public"},"updatedAt":"2022-02-15T20:47:45.459Z"},{"_id":"620d28658271aa4129919d89","component":"data2-core-types@Component","params":{"public":true,"package":"data2-interface-services","component":"DeviceController","icon":"mobile","visibility":"public","interactions":{"params":{"fields":{"postMessage":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"data"}}}}]},"component":"data2-core-types@ComponentParameter"},"print":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"zoom":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"title":{"component":"data2-core-primitives@String","params":{"content":"zoom"}},"visibility":"public"}}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"}],"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"share":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}}},"component":"data2-core-types@ComponentParameter"},"clipboard.copy":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}}}]},"component":"data2-core-types@ComponentParameter"},"clipboard.paste":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}}}]},"component":"data2-core-types@ComponentParameter"},"download":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Filename"}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Content"}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Options"}},"parameters":{"params":{"fields":{"type":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Mimetype"}}}}}},"component":"data2-core-types@FieldSet"}}}]},"component":"data2-core-types@ComponentParameter"},"downloadUrl":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Filename"}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Url"}}}}]},"component":"data2-core-types@ComponentParameter"},"promptFiles":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"params":{"fields":{"multiple":{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Multiple"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Whether or not to allow selecting multiple files"}},"component":"data2-core-primitives@Boolean"}},"acceptedFormats":{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Accepted Formats"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Accepted file formats"}},"component":"data2-core-primitives@String","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}},"timeout":{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Timeout"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Max milliseconds to wait for file upload"}},"component":"data2-core-primitives@Number"}}}},"component":"data2-core-types@FieldSet"}}}],"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"meetingRecord":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"visibility":"public","definition":{"params":{"actions":[{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"meeting"}},"script":{"component":"data2-core-primitives@String","params":{"content":"(function() {\n  let mediaRecorder;\n  let audioChunks = [];\n  let combinedStream;\n  let audioContext;\n  \n  window.meetingCapture = async function() {\n    try {\n      // Solicitar acesso ao áudio da guia (e vídeo, que será ignorado depois)\n      const tabStream = await navigator.mediaDevices.getDisplayMedia({ \n        video: true, // Necessário para alguns navegadores\n        audio: true\n      });\n      \n      // Remover a trilha de vídeo\n      const tabAudioTrack = tabStream.getAudioTracks()[0];\n      \n      // Solicitar acesso ao microfone\n      const micStream = await navigator.mediaDevices.getUserMedia({ audio: true });\n      const micAudioTrack = micStream.getAudioTracks()[0];\n      \n      // Criar um novo MediaStream com ambas as trilhas de áudio\n      combinedStream = new MediaStream([tabAudioTrack, micAudioTrack]);\n      \n      // Criar um contexto de áudio para misturar os streams\n      audioContext = new AudioContext();\n      const destination = audioContext.createMediaStreamDestination();\n      \n      // Conectar a trilha de áudio da guia\n      const tabSource = audioContext.createMediaStreamSource(new MediaStream([tabAudioTrack]));\n      tabSource.connect(destination);\n      \n      // Conectar a trilha de áudio do microfone\n      const micSource = audioContext.createMediaStreamSource(new MediaStream([micAudioTrack]));\n      micSource.connect(destination);\n      \n      // Iniciar gravação com o stream misturado\n      mediaRecorder = new MediaRecorder(destination.stream);\n      audioChunks = [];\n      mediaRecorder.ondataavailable = (e) => audioChunks.push(e.data);\n      mediaRecorder.start();\n      \n      console.log('Gravação iniciada. Chame meetingCaptureStop() para finalizar.');\n    } catch (error) {\n      console.error('Erro ao iniciar a captura:', error);\n    }\n  };\n  \n  window.meetingCaptureStop = function() {\n    return new Promise((resolve, reject) => {\n      if (!mediaRecorder) {\n        reject('Nenhuma gravação em andamento.');\n        return;\n      }\n      \n      mediaRecorder.onstop = () => {\n        const audioBlob = new Blob(audioChunks, { type: 'audio/webm' });\n        combinedStream.getTracks().forEach(track => track.stop());\n        audioContext.close();\n        \n        resolve(audioBlob);\n        console.log('Gravação finalizada. O arquivo de áudio está pronto para upload.');\n      };\n      \n      mediaRecorder.stop();\n    });\n  };\n})();"}}},"component":"data2-core-web@Script"},{"component":"data2-core-types@Getter","params":{"module":{"params":{},"component":"data2-core-web@Window"},"prop":{"component":"data2-core-primitives@String","params":{"content":"meetingCapture"}}}}]},"component":"data2-core-flow@Series"}},"component":"data2-core-types@ComponentParameter"},"meetingRecordStop":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Filename"}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Content"}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Options"}},"parameters":{"params":{"fields":{"type":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Mimetype"}}}}}},"component":"data2-core-types@FieldSet"}}}],"definition":{"params":{"actions":[{"component":"data2-core-types@Getter","params":{"module":{"params":{},"component":"data2-core-web@Window"},"prop":{"component":"data2-core-primitives@String","params":{"content":"meetingCaptureStop"}}}}]},"component":"data2-core-flow@Series"}},"component":"data2-core-types@ComponentParameter"},"notify":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"visibility":"private","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","parameters":{"title":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":0}},"title":{"component":"data2-core-primitives@String","params":{"content":"title"}}},"component":"data2-core-types@ComponentParameter"},"sound":{"params":{"component":"data2-core-types@FileComponentUrlReference","index":{"component":"data2-core-primitives@Number","params":{"content":1}},"title":{"component":"data2-core-primitives@String","params":{"content":"sound"}}},"component":"data2-core-types@ComponentParameter"}},"flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}}]},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@FieldSet"}},"updatedAt":"2025-02-28T21:14:39.083Z"},{"_id":"620d30f08271aa4129940945","component":"data2-core-types@Component","params":{"package":"data2-core-web","component":"LocalStorage","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{}}}}},{"_id":"620d32d98271aa412994b6f6","component":"data2-core-types@Component","params":{"package":"data2-core-functions","component":"JSONStringify","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"value":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}}},"component":"data2-core-types@ComponentParameter"},"replacer":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"visibility":"deprecated","index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"},"space":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}}},"component":"data2-core-types@ComponentParameter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"value"}}},"updatedAt":"2024-07-06T04:13:35.035Z"},{"_id":"620e55a58271aa4129c61825","component":"data2-core-types@Component","params":{"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"component":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}}},"preventEvaluation":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"system":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}}},"_id":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}}},"reference":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}}},"displayName":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}}},"params":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}}}}}}},"component":"ComponentDefinition","package":"data2-core-types"},"updatedAt":"2022-07-25T19:27:00.107Z"},{"_id":"620d338f8271aa4129951712","component":"data2-core-types@Component","params":{"package":"data2-core-functions","component":"JSONParse","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"text":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}},"component":"data2-core-types@ComponentParameter"},"reviver":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"text"}}},"updatedAt":"2023-12-19T12:22:07.541Z"},{"_id":"620d33a98271aa4129952187","component":"data2-core-types@Component","params":{"package":"data2-core-functions","component":"MathRandom","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{}}}}},{"_id":"620f81bd8271aa4129fb2148","component":"data2-core-types@Component","params":{"icon":"key","product":"id","package":"data2-core-id","component":"KeyVault","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"position":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Position"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":101}},"simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"},"dimensions":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Dimensions"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":102}},"simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"defaultValue":{"preventEvaluation":true,"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768,"exactWidth":false,"exactHeight":false}},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"},"keyPair":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-id@KeyPair"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Key Pair"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Holds the public and encrypted private key."}},"visibility":"private","index":{"component":"data2-core-primitives@Number","params":{"content":10}},"defaultValue":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@Reference","params":{"reference":"environment.layers.UserInterfaceLayer"}},"prop":"getProcess","args":["EncryptionController"]}},"prop":"generateKeyPair"}}}},"keys":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-id@Key"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Key"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"defaultValue":[],"visibility":"private"},"component":"data2-core-types@ComponentParameter"}}}},"title":"KeyVault","renderable":{"dimensions":{"disabled":false,"component":"data2-core-types@Dimensions","params":{"width":1360,"height":800,"exactWidth":false,"exactHeight":false}}},"interactions":{"params":{"fields":{"getValue":{"params":{"component":"data2-core-functions@Function","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"name"}}}}],"visibility":"private"},"component":"data2-core-types@ComponentParameter"},"generateRSA":{"params":{"component":"data2-core-functions@Function","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"alg":{"params":{"component":"data2-core-primitives@String","key":{"component":"data2-core-primitives@String","params":{"content":""}},"title":{"component":"data2-core-primitives@String","params":{"content":"Alg"}}},"component":"data2-core-types@ComponentParameter"}}}}],"visibility":"private"},"component":"data2-core-types@ComponentParameter"},"generateUserRSAKeys":{"component":"data2-core-primitives@String","params":{"content":"2048"}},"generateUserECDHKeys":{"params":{"component":"data2-core-functions@Function","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"curve":{"params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"curve"}},"oneOf":[{"params":{"content":"P-256"},"component":"data2-core-primitives@String"},{"params":{"content":"P-384"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"}}}}],"visibility":"private"},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@FieldSet"}},"updatedAt":"2025-08-27T15:20:12.159Z"},{"_id":"61ddd20e6947419456adaf34","component":"data2-core-types@Component","params":{"package":"data2-core-functions","component":"Match","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"text":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":1}},"description":{"component":"data2-core-primitives@String","params":{"content":"(String): The target string where the search will be performed."}}},"component":"data2-core-types@ComponentParameter"},"pattern":{"params":{"component":"data2-core-types@Regex","index":{"component":"data2-core-primitives@Number","params":{"content":2}},"description":{"component":"data2-core-primitives@String","params":{"content":"(RegExp): The regular expression defining the search criteria and capture groups."}}},"component":"data2-core-types@ComponentParameter"},"excludesInput":{"params":{"component":"data2-core-primitives@Boolean","index":{"component":"data2-core-primitives@Number","params":{"content":3}},"description":{"component":"data2-core-primitives@String","params":{"content":"(Boolean): Optional. If set to true, it prevents the full original text match from being included in the returned array, returning only the specific capture groups."}}},"component":"data2-core-types@ComponentParameter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"text"}},"title":"Match","description":{"component":"data2-core-primitives@String","params":{"content":"The match function is used to search for and extract occurrences of a specific pattern within a string. It scans the provided text and returns an array of the matched results, with the option to filter out the full string match and keep only the captured groups."}}},"updatedAt":"2026-05-20T20:07:26.930Z"},{"_id":"61e008476947419456ea80cd","component":"data2-core-types@Component","params":{"public":true,"package":"data2-core","component":"LocalStorageDataSource","extends":"data2-core@DataSource","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"fields":{"component":"data2-core-primitives@String","list":true},"initialData":{"component":"data2-core-primitives@String"},"pk":{"component":"data2-core-primitives@String"},"name":{"component":"data2-core-primitives@String"}}}},"title":{"component":"data2-core-primitives@String","params":{"content":"CustomHTTPDataSource"}},"visibility":"public","renderable":{"dimensions":{"disabled":false,"component":"data2-core-types@Dimensions","params":{"width":1366,"exactWidth":false,"exactHeight":false,"height":768}}}},"updatedAt":"2022-07-06T22:46:25.498Z"},{"_id":"61faa9e26947419456a3168d","component":"data2-core-types@Component","params":{"component":"ArrayConcat","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"arrays":{"params":{"component":"data2-core-primitives@String","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"description":{"component":"data2-core-primitives@String","params":{"content":"teste description"}}},"component":"data2-core-types@ComponentParameter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"arrays.0"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Takes two or more arrays as input and combines them into a single array. The resulting array contains all elements from the first array followed by all elements from the second array, preserving insertion order. No elements are removed or deduplicated.\n### Example:\n**Input**\n```json\n[1, 2, 3, 4, 5]\n```\n```json\n[3, 4, 5, 6, 7]\n```\n**Output**:\n```json\n[1, 2, 3, 4, 5, 3, 4, 5, 6, 7]\n```\n\n> **Note:** Even if both arrays share common elements, no deduplication is applied. The concatenation is purely additive. The second array is appended to the end of the first as-is, meaning duplicate values will appear multiple times in the resulting array. If deduplication is needed, consider using an **Array Unique** component after concatenation."}}},"updatedAt":"2026-04-15T21:01:56.248Z"},{"_id":"620d205f8271aa41298f72ee","component":"data2-core-types@Component","params":{"product":"connect","icon":"id-card","package":"data2-core-auth","component":"CustomAuthenticationStrategy","interactions":{"component":"data2-core-types@FieldSet","params":{"fields":{"login":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"sign-in"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"logout":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"sign-out"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"register":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"user-plus"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"position":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Position"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":101}},"simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"},"dimensions":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Dimensions"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":102}},"simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"defaultValue":{"preventEvaluation":true,"component":"data2-core-types@Dimensions","params":{"width":300,"height":300}},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"},"login":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-flow@Series"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"},"sessions":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-flow@Series"}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}}},"component":"data2-core-types@ComponentParameter"},"logout":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-flow@Series"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}}},"component":"data2-core-types@ComponentParameter"},"localUsersDataset":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetReference"}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}},"visibility":"private"},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2022-07-06T22:45:22.397Z"},{"_id":"61f53e1c6947419456151f9f","component":"data2-core-types@Component","params":{"public":true,"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"value":{"component":"data2-core-primitives@Number"}}}},"component":"Opacity","package":"data2-core-types","visibility":"public"}},{"_id":"6215097608e952a88dba6d7d","component":"data2-core-types@Component","params":{"package":"data2-core-flow","component":"Step","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"action":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Action"}},"description":{"component":"data2-core-primitives@String","params":{"content":"The interaction to execute when this step runs."}}},"component":"data2-core-types@ComponentParameter"},"onError":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"title":{"component":"data2-core-primitives@String","params":{"content":"On Error"}},"description":{"component":"data2-core-primitives@String","params":{"content":"The interaction to execute if the action throws an error."}}},"component":"data2-core-types@ComponentParameter"},"retries":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"visibility":"private","title":{"component":"data2-core-primitives@String","params":{"content":"Retries"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Number of times to retry the action if it fails before triggering onError."}}},"component":"data2-core-types@ComponentParameter"},"resultName":{"params":{"component":"data2-core-primitives@String","visibility":"public","description":{"component":"data2-core-primitives@String","params":{"content":"Name under which the result of this step will be accessible as a reference in subsequent steps."}},"title":{"component":"data2-core-primitives@String","params":{"content":"Result Name"}}},"component":"data2-core-types@ComponentParameter"}}}},"inlineParamsControl":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"action"}},"title":"Step","description":"Executes an action within a flow and optionally stores the result under a named reference for use in subsequent steps."},"updatedAt":"2026-05-22T17:14:37.451Z"},{"_id":"6233629ee067e2ca5d04daa4","component":"data2-core-types@Component","params":{"package":"data2-core-types","public":false,"component":"SuperReference","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"reference":{"component":"data2-core-primitives@String","autocomplete":{"context":true}}}}},"visibility":"private"},"updatedAt":"2022-03-22T14:43:42.212Z"},{"_id":"6245f6ece0fc64b6bf60875f","component":"data2-core-types@Component","params":{"public":true,"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"name":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Name"}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}}},"component":"data2-core-types@ComponentParameter"},"content":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Content"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"}}}},"component":"MetaTag","package":"data2-core-web","visibility":"private","preview":{"params":{"reference":"name"},"component":"data2-core-types@Reference"}},"updatedAt":"2022-03-31T19:25:09.891Z"},{"_id":"624c4d74e0fc64b6bf41ac26","component":"data2-core-types@Component","params":{"package":"data2-blocks","component":"FileField","extends":"data2-core-primitives@Block","public":true,"icon":"files-o","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"uploadText":{"component":"data2-core-primitives@String"},"replaceText":{"component":"data2-core-primitives@String"},"dataset":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"DataSet"}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@InteractiveModuleReference"}}},"component":"data2-core-types@ComponentParameter"},"record":{"component":"data2-core-types@Reference"},"field":{"component":"data2-core-types@DataSetColumnReference"},"folder":{"component":"data2-core-types@FileComponentReference"},"folderName":{"component":"data2-core-types@FieldReference"},"fileName":{"component":"data2-core-types@FieldReference"},"preview":{"component":"data2-core-primitives@Boolean"},"previewDimensions":{"component":"data2-core-types@Dimensions"},"previewFileName":{"component":"data2-core-primitives@Boolean"},"disabled":{"component":"data2-core-primitives@Boolean"},"autoSave":{"component":"data2-core-primitives@Boolean"},"tabIndex":"Number","multiple":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}}}},"onFilesUploadStart":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","injectContext":[{"component":"data2-core-primitives@String","params":{"content":"mouseEvent"}}],"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"onFilesUploadSuccess":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","injectContext":[{"component":"data2-core-primitives@String","params":{"content":"mouseEvent"}}],"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"onFilesUploadError":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","injectContext":[{"component":"data2-core-primitives@String","params":{"content":"mouseEvent"}}],"visibility":"public"},"component":"data2-core-types@ComponentParameter"}}}},"definition":{"preventEvaluation":true,"component":"data2-blocks@FileFieldControl","params":{"super":{"component":"data2-core-types@Reference","params":{"reference":"super"}},"uploadText":{"component":"data2-core-types@Reference","params":{"reference":"uploadText"}},"replaceText":{"component":"data2-core-types@Reference","params":{"reference":"replaceText"}},"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"folder":{"component":"data2-core-types@Reference","params":{"reference":"folder"}},"folderName":{"component":"data2-core-types@Reference","params":{"reference":"folderName"}},"fileName":{"component":"data2-core-types@Reference","params":{"reference":"fileName"}},"preview":{"component":"data2-core-types@Reference","params":{"reference":"preview"}},"previewDimensions":{"component":"data2-core-types@Reference","params":{"reference":"previewDimensions"}},"previewFileName":{"component":"data2-core-types@Reference","params":{"reference":"previewFileName"}},"disabled":{"component":"data2-core-types@Reference","params":{"reference":"disabled"}},"autoSave":{"component":"data2-core-types@Reference","params":{"reference":"autoSave"}},"tabIndex":{"component":"data2-core-types@Reference","params":{"reference":"tabIndex"}},"multiple":{"component":"data2-core-types@Reference","params":{"reference":"multiple"}},"FileComponentInstancesDataSet":{"component":"data2-core-types@Reference","params":{"reference":"FileComponentInstancesDataSet"}},"onFilesUploadStart":{"component":"data2-core-types@Reference","params":{"reference":"onFilesUploadStart"}},"onFilesUploadSuccess":{"component":"data2-core-types@Reference","params":{"reference":"onFilesUploadSuccess"}},"onFilesUploadError":{"component":"data2-core-types@Reference","params":{"reference":"onFilesUploadError"}}}},"visibility":"public"},"updatedAt":"2023-04-29T18:49:18.129Z"},{"_id":"624c5233e0fc64b6bf425d93","component":"data2-core-types@Component","params":{"package":"data2-blocks","component":"FilePreview","icon":"file-video-o","extends":"data2-core-primitives@Block","public":true,"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"file":{"component":"data2-core-primitives@String"},"previewText":{"component":"data2-core-primitives@String"},"icon":{"component":"data2-core-primitives@String"}}}},"definition":{"preventEvaluation":true,"component":"data2-blocks@FilePreviewControl","params":{"file":{"component":"data2-core-types@Reference","params":{"reference":"file"}},"previewText":{"component":"data2-core-types@Reference","params":{"reference":"previewText"}},"icon":{"component":"data2-core-types@Reference","params":{"reference":"icon"}}}},"visibility":"public"}},{"_id":"625704e2978be06d55f09ec4","component":"data2-core-types@Component","params":{"component":"ArrayChunk","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"array":{"params":{"component":"data2-core-primitives@String","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"description":{"component":"data2-core-primitives@String","params":{"content":"The input array to be split into smaller chunks. Each element will be preserved in the order it appears in the original array."}}},"component":"data2-core-types@ComponentParameter"},"size":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"The maximum number of elements each chunk should contain. The last chunk may contain fewer elements if the array length is not evenly divisible by this value."}}},"component":"data2-core-types@ComponentParameter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"array"}}},"updatedAt":"2026-04-15T19:50:45.750Z"},{"_id":"625d6ab9978be06d5597edc2","component":"data2-core-types@Component","params":{"component":"Sort","package":"data2-core-functions","visibility":"public","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"array":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Getter"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Array"}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}}},"component":"data2-core-types@ComponentParameter"},"order":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"Order"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Order to be used by Sort, ordered by priority."}},"list":true,"parameters":{"field":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"item"}}}},{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"index"}}}}]},"component":"data2-core-types@ComponentParameter"},"order":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"oneOf":[{"params":{"content":"asc"},"component":"data2-core-primitives@String"},{"params":{"content":"desc"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"}}}}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"array"}}},"updatedAt":"2022-12-23T18:43:52.633Z","createdAt":"2022-04-18T13:41:23.258Z"},{"_id":"6260284c978be06d5538ed10","component":"data2-core-types@Component","params":{"component":"Date","package":"data2-core-primitives","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"content":{"component":"data2-core-primitives@String"},"list":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"visibility":"private"},"component":"data2-core-types@ComponentParameter"},"unique":{"component":"data2-core-primitives@Boolean"},"sensitive":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"visibility":"private"},"component":"data2-core-types@ComponentParameter"}}}},"validation":{"required":{"component":"data2-core-primitives@Boolean","default":false}},"returnPrimitiveTypes":["data2-core-primitives@Date"]},"updatedAt":"2023-11-23T21:05:30.452Z"},{"_id":"6284531beb0304060bb3cba6","component":"data2-core-types@Component","params":{"component":"QueryParameter","package":"data2-core-web","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{}}}},"updatedAt":"2022-05-18T01:59:55.733Z","createdAt":"2022-05-18T01:59:55.733Z"},{"_id":"628cbfffa847c1744ef50362","component":"data2-core-types@Component","params":{"package":"data2-cashier","component":"Cart","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"position":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Position"}},"category":"appearance","simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"},"dimensions":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Dimensions"}},"category":"appearance","simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}},"defaultValue":{"preventEvaluation":true,"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768}},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"},"productsDataset":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetReference"}},"category":"appearance","simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":101}}},"component":"data2-core-types@ComponentParameter"},"paymentProvider":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-cashier@PaymentProviderReference"}},"category":"appearance","simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":101}}},"component":"data2-core-types@ComponentParameter"}}}},"title":{"component":"data2-core-primitives@String","params":{"content":"Cart"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"shopping-cart"}},"visibility":"private","interactions":{"params":{"fields":{"addItem":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"cart-plus"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"removeItem":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"cart-arrow-down"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"checkout":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"shopping-bag"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@FieldSet"}},"updatedAt":"2024-06-25T19:30:33.608Z"},{"_id":"628d2d8b565111060e219556","component":"data2-core-types@Component","params":{"component":"PagarMeProvider","package":"data2-cashier","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"position":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Position"}},"category":"appearance","simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":101}},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"},"dimensions":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Dimensions"}},"category":"appearance","simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":102}},"defaultValue":{"preventEvaluation":true,"component":"data2-core-types@Dimensions","params":{"width":400,"height":400}},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"},"secret":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"appearance","simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":101}}},"component":"data2-core-types@ComponentParameter"}}}},"title":{"component":"data2-core-primitives@String","params":{"content":"PagarMe Provider"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"cc-mastercard"}},"visibility":"private"},"updatedAt":"2022-07-06T22:43:46.376Z","createdAt":"2022-05-24T19:10:03.681Z"},{"_id":"628d3bf2a847c1744e34f44a","component":"data2-core-types@Component","params":{"component":"PayPalProvider","package":"data2-cashier","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"position":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Position"}},"category":"appearance","simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":101}},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"},"dimensions":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Dimensions"}},"category":"appearance","simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":102}},"defaultValue":{"preventEvaluation":true,"component":"data2-core-types@Dimensions","params":{"width":400,"height":400}},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"}}}},"title":{"component":"data2-core-primitives@String","params":{"content":"PayPal Provider"}},"icon":"cc-paypal","visibility":"private"},"updatedAt":"2022-07-06T22:43:25.798Z","createdAt":"2022-05-24T19:10:03.681Z"},{"_id":"628d3c0ca847c1744e350128","component":"data2-core-types@Component","params":{"component":"StripeProvider","package":"data2-cashier","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"position":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Position"}},"category":"appearance","simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":101}},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"},"dimensions":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Dimensions"}},"category":"appearance","simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":102}},"defaultValue":{"preventEvaluation":true,"component":"data2-core-types@Dimensions","params":{"width":400,"height":400}},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"}}}},"title":{"component":"data2-core-primitives@String","params":{"content":"Stripe Provider"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"cc-stripe"}},"visibility":"private"},"updatedAt":"2022-07-06T22:43:03.493Z","createdAt":"2022-05-24T19:10:03.681Z"},{"_id":"628d44c6a847c1744e3dfcbf","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"PaymentProviderReference","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"reference":"String"}}}}},{"_id":"628e781e25e0de0609d20af9","component":"data2-core-types@Component","params":{"product":"media","component":"DynamicImage","package":"data2-core-media","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"position":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Position"}},"category":"appearance","simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":101}},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"},"dimensions":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Dimensions"}},"category":"appearance","simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":102}},"defaultValue":{"preventEvaluation":true,"component":"data2-core-types@Dimensions","params":{"width":800,"height":500}},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"},"scaleFactor":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}}},"component":"data2-core-types@ComponentParameter"},"policies":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-auth@Policy"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"description":{"component":"data2-core-primitives@String","params":{"content":"Controls for allowing or denying access to the data"}}}}}}},"title":{"component":"data2-core-primitives@String","params":{"content":"Dynamic Image"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"camera-retro"}},"visibility":"public","interactions":{"params":{"fields":{"print":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"params":{"icon":"fa-print"},"component":"data2-core-types@FontAwesomeIcon"},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"parameters":{"params":{"fields":{"width":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Width of print"}}},"component":"data2-core-types@ComponentParameter"},"height":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Height of print"}}},"component":"data2-core-types@ComponentParameter"},"component":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@UserComponentInterface"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Component to Print"}}},"component":"data2-core-types@ComponentParameter"},"scaleFactor":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"title":{"component":"data2-core-primitives@String","params":{"content":"scale factor"}}},"component":"data2-core-types@ComponentParameter"},"title":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Title of file"}}}}}},"component":"data2-core-types@FieldSet"},"flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}}]},"component":"data2-core-types@ComponentParameter"},"webPrint":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"params":{"icon":"fa-globe"},"component":"data2-core-types@FontAwesomeIcon"},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"parameters":{"params":{"fields":{"width":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Width of print"}}},"component":"data2-core-types@ComponentParameter"},"height":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Height of print"}}},"component":"data2-core-types@ComponentParameter"},"url":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Web Address to Print"}}},"component":"data2-core-types@ComponentParameter"},"title":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Title of file"}}}}}},"component":"data2-core-types@FieldSet"},"flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}}]},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@FieldSet"}},"updatedAt":"2023-01-23T21:41:48.954Z","createdAt":"2022-05-25T18:40:30.888Z"},{"_id":"629102ea12df7506096d622a","component":"data2-core-types@Component","params":{"component":"UserComponentReference","package":"data2-core-types","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"reference":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}},"component":"data2-core-types@ComponentParameter"}}}},"title":{"component":"data2-core-primitives@String","params":{"content":"User Component Reference"}},"icon":{"params":{"icon":"fa-paint-brush"},"component":"data2-core-types@FontAwesomeIcon"},"visibility":"private"},"updatedAt":"2022-05-27T16:57:55.859Z","createdAt":"2022-05-27T16:57:14.127Z"},{"_id":"6296714710ec9b060a686a26","component":"data2-core-types@Component","params":{"component":"UserComponentInterface","package":"data2-core-types","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{}}}},"updatedAt":"2022-05-31T19:49:27.642Z","createdAt":"2022-05-31T19:49:27.642Z"},{"_id":"629961b6124771821a084a3f","component":"data2-core-types@Component","params":{"package":"data2-rush","component":"Listener","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"position":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Position"}},"category":"appearance","simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"},"dimensions":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Dimensions"}},"category":"appearance","simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}},"defaultValue":{"preventEvaluation":true,"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768}},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"}}}},"title":{"component":"data2-core-primitives@String","params":{"content":"Listener"}},"icon":"microphone","visibility":"private","interactions":{"params":{"fields":{"exec":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"cart-plus"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@FieldSet"}},"updatedAt":"2022-07-06T22:40:03.830Z"},{"_id":"629aa05c124771821a37fd60","component":"data2-core-types@Component","params":{"package":"data2-core-id","component":"Key","preview":{"params":{"reference":"title"},"component":"data2-core-types@Reference"},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"value":{"params":{"component":"data2-core-primitives@String","index":1},"component":"data2-core-types@ComponentParameter"},"name":{"params":{"component":"data2-core-primitives@String","index":0,"title":{"component":"data2-core-primitives@String","params":{"content":"Name"}}},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2022-06-07T19:55:28.888Z"},{"_id":"62a0f8cad7fd053166e83c20","component":"data2-core-types@Component","params":{"package":"data2-core-id","component":"NanoId","visibility":"public","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"alphabet":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String"}},"size":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Number"}}}}}},"updatedAt":"2024-09-05T23:19:08.765Z"},{"_id":"62a7303a6ebde0060a10aef2","component":"data2-core-types@Component","params":{"component":"GraphQLQuery","package":"http","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{}}},"title":"GraphQLQuery","icon":{"params":{"icon":"fa-connectdevelop"},"component":"data2-core-types@FontAwesomeIcon"},"visibility":"public","returnPrimitiveTypes":"data2-core-primitives@Object"},"updatedAt":"2022-11-11T18:37:05.713Z","createdAt":"2022-06-13T12:40:26.050Z"},{"_id":"62aa6c18916b97060b98ffdd","component":"data2-core-types@Component","params":{"component":"x3gqnGyiV_S-AaK4bDwWs","package":"data2-virtuals","title":"getCurrentSystem","visibility":"private","definition":{"params":{"module":{"params":{"_layer":{"component":"data2-core-primitives@String","params":{"content":"HostApplicationLayer"}},"reference":{"component":"data2-core-primitives@String","params":{"content":"SystemsDataSet"}}},"component":"data2-core-types@ProcessReference"},"prop":{"params":{"compare":[{"params":{"reference":"field"},"component":"data2-core-types@Reference"}],"else":{"component":"data2-core-primitives@String","params":{"content":"cursor.current"}},"then":{"params":{"portions":[{"component":"data2-core-primitives@String","params":{"content":"cursor.current."}},{"params":{"reference":"field"},"component":"data2-core-types@Reference"}]},"component":"data2-core-functions@StringConcat"}},"component":"data2-core-flow@If"}},"component":"data2-core-types@Getter"},"parameters":{"params":{"fields":{"field":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@FieldSet"}},"updatedAt":"2022-06-29T17:59:02.832Z","createdAt":"2022-06-15T23:32:40.953Z"},{"_id":"62b2355b18187a6cb1f08ecb","component":"data2-core-types@Component","params":{"component":"TranslatableText","package":"data2-core-types","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"translations":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"category":"content","simple":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"index":{"component":"data2-core-primitives@Number","params":{"content":101}},"title":{"component":"data2-core-primitives@String","params":{"content":"Translations"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"text":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"content","simple":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"index":{"component":"data2-core-primitives@Number","params":{"content":101}},"title":{"component":"data2-core-primitives@String","params":{"content":"Text"}}},"component":"data2-core-types@ComponentParameter"},"locale":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"content","simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":101}},"title":{"component":"data2-core-primitives@String","params":{"content":"Locale"}}},"component":"data2-core-types@ComponentParameter"}},"shouldShow":{"params":{"content":{"params":{"reference":"defaultText"},"component":"data2-core-types@Reference"}},"component":"data2-core-primitives@Boolean","preventEvaluation":true,"break":true}},"component":"data2-core-types@ComponentParameter"},"locale":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"appearance","simple":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"index":{"component":"data2-core-primitives@Number","params":{"content":101}},"title":{"component":"data2-core-primitives@String","params":{"content":"Locale"}},"shouldShow":{"params":{"content":{"params":{"reference":"defaultText"},"component":"data2-core-types@Reference"}},"component":"data2-core-primitives@Boolean","preventEvaluation":true,"break":true}},"component":"data2-core-types@ComponentParameter"},"defaultText":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"appearance","simple":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"index":{"component":"data2-core-primitives@Number","params":{"content":101}},"title":{"component":"data2-core-primitives@String","params":{"content":"Default Text"}}},"component":"data2-core-types@ComponentParameter"}}}},"title":"TranslatableText","visibility":"private"},"updatedAt":"2024-07-01T22:26:26.439Z","createdAt":"2022-05-24T19:10:03.681Z"},{"_id":"62bcca4bc8f80c23ec6f2bd2","component":"data2-core-types@Component","params":{"package":"data2-core-types","public":false,"component":"This","parameters":{"component":"data2-core-types@FieldSet","params":{}},"visibility":"public"}},{"_id":"62e2f099d435e269de45ad1c","component":"data2-core-types@Component","params":{"package":"data2-core","component":"Process","icon":"cube","visibility":"private","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"reference":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}}},"componentDefinition":{"component":"data2-core-types@ComponentParameter","params":{"component":{"params":{"content":"data2-core-types@ComponentDefinition"},"component":"data2-core-primitives@String"}}}}}}},"updatedAt":"2022-08-01T19:58:58.004Z"},{"_id":"62f2ba46527e414c4c90b0c9","component":"data2-core-types@Component","params":{"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"html@a","params":{"style":{"width":"100%","height":"100%","boxSizing":"border-box","border":"none","appearance":"none","outline":"none","cursor":"pointer","display":"flex","alignItems":"center","justifyContent":"center","position":"absolute","textDecoration":"none","top":0,"left":0,"zIndex":1},"rel":"noopener noreferrer","href":{"params":{"reference":"link"},"component":"data2-core-types@Reference"},"target":{"params":{"reference":"target"},"component":"data2-core-types@Reference"},"onClick":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-logical-operators@Not","params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-functions@Match","params":{"text":{"params":{"reference":"link"},"component":"data2-core-types@Reference"},"pattern":"^http"}},"prop":"length"}}}},{"params":{"reference":"super.onClick"},"component":"data2-core-types@Reference"},{"component":"data2-core-logical-operators@Not","params":{"subject":{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"target"},"component":"data2-core-types@Reference"},"comparisonSubject":"_blank"}}}}],"then":{"params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"event"}}],"body":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"module":{"params":{"reference":"event"},"component":"data2-core-types@Reference"},"prop":"button"},"component":"data2-core-types@Getter"},"comparisonSubject":0}},{"component":"data2-core-logical-operators@Not","params":{"subject":{"component":"data2-core-logical-operators@Or","params":{"components":[{"params":{"module":{"params":{"reference":"event"},"component":"data2-core-types@Reference"},"prop":"metaKey"},"component":"data2-core-types@Getter"},{"params":{"module":{"params":{"reference":"event"},"component":"data2-core-types@Reference"},"prop":"altKey"},"component":"data2-core-types@Getter"},{"params":{"module":{"params":{"reference":"event"},"component":"data2-core-types@Reference"},"prop":"ctrlKey"},"component":"data2-core-types@Getter"},{"params":{"module":{"params":{"reference":"event"},"component":"data2-core-types@Reference"},"prop":"shiftKey"},"component":"data2-core-types@Getter"}]}}}}],"then":{"params":{"module":{"params":{"reference":"event"},"component":"data2-core-types@Reference"},"prop":{"component":"data2-core-primitives@String","params":{"content":"preventDefault"}}},"component":"data2-core-types@Getter"}}}},"component":"data2-core-functions@Function"}}},"children":{"component":"html@span","params":{"style":{"width":"100%","display":"inline-block","position":"relative","whiteSpace":"pre-wrap","top":{"params":{"reference":"super.textFormat.top"},"component":"data2-core-types@Reference"},"left":{"params":{"reference":"super.textFormat.left"},"component":"data2-core-types@Reference"},"transform":{"params":{"reference":"super.textFormat.transform"},"component":"data2-core-types@Reference"},"lineHeight":{"params":{"reference":"super.textFormat.lineHeight"},"component":"data2-core-types@Reference"},"letterSpacing":{"params":{"reference":"super.textFormat.letterSpacing"},"component":"data2-core-types@Reference"},"textAlign":{"params":{"reference":"super.textFormat.textAlign"},"component":"data2-core-types@Reference"}},"children":{"params":{"reference":"label"},"component":"data2-core-types@Reference"}}}}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"link":{"component":"data2-core-primitives@String"},"target":{"component":"data2-core-primitives@String","oneOf":["_parent","_self","_blank","_top"]}}}},"component":"Link","package":"data2-blocks","icon":"link","extends":"data2-core-primitives@Block","visibility":"private"}},{"_id":"62fd47af77c914c6acaa3679","component":"data2-core-types@Component","params":{"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"line":{"params":{"oneOf":["overline","underline","line-through"],"component":"data2-core-primitives@String","description":{"component":"data2-core-primitives@String","params":{"content":"Sets the decoration line style."}}},"component":"data2-core-types@ComponentParameter"},"color":{"params":{"component":"data2-core-types@Color","description":{"component":"data2-core-primitives@String","params":{"content":"Sets the color of the decoration."}}},"component":"data2-core-types@ComponentParameter"},"style":{"params":{"oneOf":["solid","wavy","dotted","dashed","double"],"component":"data2-core-primitives@String","description":{"component":"data2-core-primitives@String","params":{"content":"Sets the style of the decoration line."}}},"component":"data2-core-types@ComponentParameter"},"thickness":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"Sets the thickness of the decoration."}}},"component":"data2-core-types@ComponentParameter"}}}},"component":"TextDecoration","package":"data2-core-types","visibility":"public"},"updatedAt":"2023-07-11T18:35:50.022Z"},{"_id":"631667071f40e120a9aec0f0","component":"data2-core-types@Component","params":{"public":true,"package":"data2-interface-services","component":"CursorController","icon":"mouse-pointer","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{}}},"visibility":"public"}},{"_id":"6329c5b85a870cfe32be0616","component":"data2-core-types@Component","params":{"public":true,"package":"data2-interface-services","component":"HotkeysService","icon":"keyboard-o","product":"ui","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"dimensions":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Dimensions"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":101}},"simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"defaultValue":{"preventEvaluation":true,"params":{"width":300,"height":300},"component":"data2-core-types@Dimensions"},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"},"initialEnabled":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}}},"component":"data2-core-types@ComponentParameter"},"initialShortcuts":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"parameters":{"params":{"fields":{"description":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}},"component":"data2-core-types@ComponentParameter"},"keys":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"options":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"parameters":{"params":{"fields":{"passive":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}}},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@FieldSet"}},"component":"data2-core-types@ComponentParameter"},"handler":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}}},"component":"data2-core-types@ComponentParameter"},"event":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"oneOf":[{"params":{"content":"keydown"},"component":"data2-core-primitives@String"},{"params":{"content":"keyup"},"component":"data2-core-primitives@String"},{"params":{"content":"keypress"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@FieldSet"},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}}}},"interactions":{"component":"data2-core-types@FieldSet","params":{"fields":{"enableHandlers":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}}},"component":"data2-core-types@ComponentParameter"},"disableHandlers":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}}},"component":"data2-core-types@ComponentParameter"},"addShortcut":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"parameters":{"params":{"fields":{"description":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}},"component":"data2-core-types@ComponentParameter"},"keys":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"options":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"parameters":{"params":{"fields":{"passive":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}}},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@FieldSet"}},"component":"data2-core-types@ComponentParameter"},"handler":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}}},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@FieldSet"},"list":{"component":"data2-core-primitives@Boolean","params":{"content":false}}},"component":"data2-core-types@ComponentParameter"}]},"component":"data2-core-types@ComponentParameter"},"clearShortcut":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}}]},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"public","states":{"params":{},"component":"data2-core-types@FieldSet"}},"updatedAt":"2022-10-14T15:28:42.673Z"},{"_id":"632b6a785a870cfe32101bf8","component":"data2-core-types@Component","params":{"package":"data2-interface-services","component":"SpeechSynthesisService","icon":{"params":{"icon":"fa-volume-up"},"component":"data2-core-types@FontAwesomeIcon"},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"dimensions":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Dimensions"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":101}},"simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"defaultValue":{"preventEvaluation":true,"params":{"width":300,"height":300},"component":"data2-core-types@Dimensions"},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"},"voice":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"oneOf":["Alex","Alice","Alva","Amelie","Anna","Carmit","Damayanti","Daniel","Diego","Ellen","Fiona","Fred","Ioana","Joana","Jorge","Juan","Kanya","Karen","Kyoko","Laura","Lekha","Luca","Luciana","Maged","Mariska","Mei-Jia","Melina","Milena","Moira","Monica","Nora","Paulina","Rishi","Samantha","Sara","Satu","Sin-ji","Tessa","Thomas","Ting-Ting","Veena","Victoria","Xander","Yelda","Yuna","Yuri","Zosia","Zuzana","Google Deutsch","Google US English","Google UK English Female","Google UK English Male","Google español","Google español de Estados Unidos","Google français","Google हिन्दी","Google Bahasa Indonesia","Google italiano","Google 日本語","Google 한국의","Google Nederlands","Google polski","Google português do Brasil","Google русский","Google 普通话（中国大陆）","Google 粤語（香港）","Google 國語（臺灣）"],"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"lang":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"oneOf":["ar-SA","cs-CZ","da-DK","de-DE","el-GR","en","en-AU","en-GB","en-IE","en-IN","en-US","en-ZA","es-AR","es-ES","es-MX","es-US","fi-FI","fr-CA","fr-FR","he-IL","hi-IN","hu-HU","id-ID","it-IT","ja-JP","ko-KR","nb-NO","nl-BE","nl-NL","pl-PL","pt-BR","pt-PT","ro-RO","ru-RU","sk-SK","sv-SE","th-TH","tr-TR","zh-CN","zh-HK","zh-TW"]},"component":"data2-core-types@ComponentParameter"}}}},"interactions":{"component":"data2-core-types@FieldSet","params":{"fields":{"cancel":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}}},"component":"data2-core-types@ComponentParameter"},"pause":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}}},"component":"data2-core-types@ComponentParameter"},"speak":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}}}]},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"public","states":{"params":{},"component":"data2-core-types@FieldSet"}},"updatedAt":"2022-09-21T21:39:51.106Z"},{"_id":"632b88285a870cfe32166631","component":"data2-core-types@Component","params":{"product":"ui","package":"data2-interface-services","component":"AudioService","icon":{"params":{"icon":"fa-volume-up"},"component":"data2-core-types@FontAwesomeIcon"},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"dimensions":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Dimensions"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":101}},"simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"defaultValue":{"preventEvaluation":true,"params":{"width":300,"height":300},"component":"data2-core-types@Dimensions"},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"},"src":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@FileComponentUrlReference"}}},"component":"data2-core-types@ComponentParameter"}}}},"interactions":{"component":"data2-core-types@FieldSet","params":{"fields":{"pause":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}}},"component":"data2-core-types@ComponentParameter"},"play":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}}}]},"component":"data2-core-types@ComponentParameter"},"goTo":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"title":{"component":"data2-core-primitives@String","params":{"content":"timestamp"}}}}]},"component":"data2-core-types@ComponentParameter"},"setSrc":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@FileComponentUrlReference"}},"title":{"component":"data2-core-primitives@String","params":{"content":"src"}}}}]},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"public","states":{"params":{},"component":"data2-core-types@FieldSet"}},"updatedAt":"2022-09-21T22:35:01.941Z"},{"_id":"6331f4725a870cfe32ea4c94","component":"data2-core-types@Component","params":{"component":"Virtual","package":"data2-core-types","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"definition":{"component":"data2-core-primitives@String"}}}},"validation":{}}},{"_id":"6335a6d05a870cfe3282562e","component":"data2-core-types@Component","params":{"icon":"connectdevelop","public":false,"package":"data2-core","component":"GraphQLAPI","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"serviceUrl":{"component":"data2-core-primitives@String"}}}},"title":{"component":"data2-core-primitives@String","params":{"content":"GraphQL API"}},"visibility":"public","renderable":{"dimensions":{"disabled":false,"component":"data2-core-types@Dimensions","params":{"width":1366,"exactWidth":false,"exactHeight":false,"height":768}}},"interactions":{"params":{"fields":{"execQuery":{"params":{},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@FieldSet"}},"updatedAt":"2022-11-11T14:10:17.692Z"},{"_id":"633ad7675a870cfe322fa356","component":"data2-core-types@Component","params":{"component":"CreateArray","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"length":{"component":"data2-core-primitives@Number"}}}}}},{"_id":"6349a413c06fa8444e047f7a","component":"data2-core-types@Component","params":{"product":"ui","component":"Timer","package":"data2-interface-services","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"interval":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Interval to run onTick (in ms)"}}},"component":"data2-core-types@ComponentParameter"},"activeInBuilder":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}}},"component":"data2-core-types@ComponentParameter"},"onTick":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}}},"component":"data2-core-types@ComponentParameter"},"autoStart":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}}},"component":"data2-core-types@ComponentParameter"},"preventConcurrentExecution":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}}},"component":"data2-core-types@ComponentParameter"}}}},"icon":{"params":{"icon":"fa-clock-o"},"component":"data2-core-types@FontAwesomeIcon"},"interactions":{"params":{"fields":{"start":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}}},"stop":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}}}},"reset":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"index":{"component":"data2-core-primitives@Number","params":{"content":3}}}},"toggle":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"index":{"component":"data2-core-primitives@Number","params":{"content":4}}}}}},"component":"data2-core-types@FieldSet"}},"updatedAt":"2024-11-13T16:54:01.966Z"},{"_id":"6356fae8c06fa8444e936090","component":"data2-core-types@Component","params":{"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"querySelector":{"component":"String"}}}},"component":"QuerySelector","package":"data2-core-web","definition":{"params":{"compare":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"querySelector"}}}},"then":{"component":"data2-core-types@Getter","params":{"module":{"params":{},"component":"data2-core-web@Window"},"args":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"querySelector"}}}}],"prop":{"component":"data2-core-primitives@String","params":{"content":"querySelector"}}}}},"component":"data2-core-flow@If"}},"updatedAt":"2024-10-09T13:45:15.555Z"},{"_id":"635712dfc06fa8444e98ad5d","component":"data2-core-types@Component","params":{"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"command":{"component":"String"}}}},"component":"CurlParser","package":"http"}},{"_id":"636e99f37bcf559c0a869526","component":"data2-core-types@Component","params":{"visibility":"public","package":"data2-core-functions","component":"Capitalize","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"string":{"component":"data2-core-primitives@String"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"string"}}},"updatedAt":"2022-11-11T19:02:41.586Z"},{"_id":"63784c747bcf559c0ac30bec","component":"data2-core-types@Component","params":{"component":"ArrayRemoveItemAt","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"array":{"component":"data2-core-types@Getter"},"index":{"component":"data2-core-primitives@Number"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"array"}}},"updatedAt":"2022-12-23T18:39:03.065Z"},{"_id":"6384f992e920c80b07437910","component":"data2-core-types@Component","params":{"package":"http","component":"FormData","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"data":{"params":{"component":"data2-core-primitives@Object"},"component":"data2-core-types@ComponentParameter"},"dataList":{"params":{"component":"data2-core-primitives@Object","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"key":{"params":{"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"},"value":{"params":{"index":{"component":"data2-core-primitives@Number","params":{"content":2}},"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"},"options":{"params":{"index":{"component":"data2-core-primitives@Number","params":{"content":3}},"component":"data2-core-primitives@Object","parameters":{"filename":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"},"contentType":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":2}}},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2025-06-06T18:46:31.766Z"},{"_id":"6397a19fe920c80b07719c04","component":"data2-core-types@Component","params":{"package":"data2-core-ai","component":"Assistant","icon":"user","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"premisses":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Premisses"}},"icon":{"params":{"icon":"fa-play-circle-o"},"component":"data2-core-types@FontAwesomeIcon"},"multiLine":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":3}}},"component":"data2-core-types@ComponentParameter"},"behaviour":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Behaviour"}},"icon":{"params":{"icon":"fa-play-circle-o"},"component":"data2-core-types@FontAwesomeIcon"},"multiLine":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}}},"component":"data2-core-types@ComponentParameter"},"_context":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Context"}},"icon":{"params":{"icon":"fa-play-circle-o"},"component":"data2-core-types@FontAwesomeIcon"},"multiLine":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"},"answerPreffix":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Answer Prefix"}},"icon":{"params":{"icon":"fa-play-circle-o"},"component":"data2-core-types@FontAwesomeIcon"},"multiLine":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":4}}},"component":"data2-core-types@ComponentParameter"},"model":{"params":{"visibility":"private","component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":5}},"oneOf":[{"params":{"content":"openai.gpt-4o"},"component":"data2-core-primitives@String"},{"component":"data2-core-primitives@String","params":{"content":"openai.gpt-5.4-nano"}},{"component":"data2-core-primitives@String","params":{"content":"openai.gpt-5.4-mini"}},{"component":"data2-core-primitives@String","params":{"content":"openai.gpt-5.4"}},{"component":"data2-core-primitives@String","params":{"content":"anthropic.claude-haiku-4-5-20251001-v1:0"}},{"component":"data2-core-primitives@String","params":{"content":"anthropic.claude-sonnet-4-5-20250929-v1:0"}},{"params":{"content":"Pliskin²"},"component":"data2-core-primitives@String"},{"params":{"content":"cerebras"},"component":"data2-core-primitives@String"}],"defaultValue":{"component":"data2-core-primitives@String","params":{"content":"cerebras"}}},"component":"data2-core-types@ComponentParameter"},"creativity":{"params":{"visibility":"private","component":"data2-core-primitives@Number","index":{"component":"data2-core-primitives@Number","params":{"content":6}},"description":{"component":"data2-core-primitives@String","params":{"content":"Number from 0 to 100. The higher the number, the more creative (and less predictable) the Assistant will be."}}},"component":"data2-core-types@ComponentParameter"}}}},"renderable":{"dimensions":{"disabled":false,"component":"data2-core-types@Dimensions","params":{"width":1360,"height":800,"exactWidth":false,"exactHeight":false}}},"interactions":{"component":"data2-core-types@FieldSet","params":{"fields":{"consult":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Consult"}},"component":{"component":"data2-core-primitives@String","params":{"content":""}},"icon":{"params":{"icon":"fa-magic"},"component":"data2-core-types@FontAwesomeIcon"},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Prompt"}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Aditional Context"}},"visibility":"public"}},{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"Params"}},"visibility":"public","parameters":{"options":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"Options"}},"visibility":"public","parameters":{"countTokens":{"params":{"component":"data2-core-primitives@Boolean","title":{"component":"data2-core-primitives@String","params":{"content":"Count Tokens"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}}}},"images":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":1}},"visibility":"private","title":{"component":"data2-core-primitives@String","params":{"content":"Images"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}}}}]},"component":"data2-core-types@ComponentParameter"},"draw":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Consult"}},"component":{"component":"data2-core-primitives@String","params":{"content":""}},"icon":{"params":{"icon":"fa-paint-brush"},"component":"data2-core-types@FontAwesomeIcon"},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","parameters":{"prompt":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Prompt"}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}}}},"images":{"params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Images"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"},"options":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Options"}},"parameters":{"size":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"size"}},"oneOf":[{"params":{"content":"256x256"},"component":"data2-core-primitives@String"},{"params":{"content":"512x512"},"component":"data2-core-primitives@String"},{"params":{"content":"1024x1024"},"component":"data2-core-primitives@String"}]}},"quantity":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"title":{"component":"data2-core-primitives@String","params":{"content":"quantity"}}}},"model":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"model"}},"oneOf":[{"params":{"content":"replicate"},"component":"data2-core-primitives@String"},{"component":"data2-core-primitives@String","params":{"content":"stability"}},{"component":"data2-core-primitives@String","params":{"content":"amazon"}}],"visibility":"private"}},"style":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"style"}},"oneOf":["3d-model","analog-film","anime","cinematic","comic-book","digital-art","enhance","fantasy-art","isometric","line-art","low-poly","modeling-compound","neon-punk","origami","photographic","pixel-art","tile-texture"],"visibility":"private"}}},"index":{"component":"data2-core-primitives@Number","params":{"content":10}}}}},"flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}}],"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"summarize":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Summarize"}},"component":{"component":"data2-core-primitives@String","params":{"content":""}},"icon":{"params":{"icon":"fa-book"},"component":"data2-core-types@FontAwesomeIcon"},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Content"}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Prompt"}}}}]},"component":"data2-core-types@ComponentParameter"},"listen":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Listen"}},"component":{"component":"data2-core-primitives@String","params":{"content":""}},"icon":{"params":{"icon":"fa-assistive-listening-systems"},"component":"data2-core-types@FontAwesomeIcon"},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Getter"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Audio File"}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Prompt"}}}},{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Options"}},"component":"data2-core-primitives@Object","parameters":{"speed":{"component":"data2-core-types@ComponentParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"speed"}},"component":"data2-core-primitives@Number"}},"language":{"component":"data2-core-types@ComponentParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"speed"}},"component":"data2-core-primitives@String","oneOf":["af","ar","hy","az","be","bs","bg","ca","zh","hr","cs","da","nl","en","et","fi","fr","gl","de","el","he","hi","hu","is","id","it","ja","kn","kk","ko","lv","lt","mk","ms","mr","mi","ne","no","fa","pl","pt","ro","ru","sr","sk","sl","es","sw","sv","tl","ta","th","tr","uk","ur","vi","cy"]}}},"visibility":"private"}}]},"component":"data2-core-types@ComponentParameter"},"speak":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Speak"}},"component":{"component":"data2-core-primitives@String","params":{"content":""}},"icon":{"params":{"icon":"fa-commenting-o"},"component":"data2-core-types@FontAwesomeIcon"},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Prompt"}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","parameters":{"language":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Language"}},"component":"data2-core-primitives@String","oneOf":["arb","cmn-CN","cy-GB","da-DK","de-DE","en-AU","en-GB","en-GB-WLS","en-IN","en-US","es-ES","es-MX","es-US","fr-CA","fr-FR","is-IS","it-IT","ja-JP","hi-IN","ko-KR","nb-NO","nl-NL","pl-PL","pt-BR","pt-PT","ro-RO","ru-RU","sv-SE","tr-TR","en-NZ","en-ZA","ca-ES","de-AT","yue-CN","ar-AE","fi-FI","en-IE","nl-BE","fr-BE"]},"component":"data2-core-types@ComponentParameter"},"voice":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Voice"}},"component":"data2-core-primitives@String","oneOf":["Aditi","Amy","Astrid","Bianca","Brian","Camila","Carla","Carmen","Celine","Chantal","Conchita","Cristiano","Dora","Emma","Enrique","Ewa","Filiz","Gabrielle","Geraint","Giorgio","Gwyneth","Hans","Ines","Ivy","Jacek","Jan","Joanna","Joey","Justin","Karl","Kendra","Kevin","Kimberly","Lea","Liv","Lotte","Lucia","Lupe","Mads","Maja","Marlene","Mathieu","Matthew","Maxim","Mia","Miguel","Mizuki","Naja","Nicole","Olivia","Penelope","Raveena","Ricardo","Ruben","Russell","Salli","Seoyeon","Takumi","Tatyana","Vicki","Vitoria","Zeina","Zhiyu","Aria","Ayanda","Arlet","Hannah","Arthur","Daniel","Liam","Pedro","Kajal","Hiujin","Laura","Elin","Ida","Suvi","Ola","Hala","Andres","Sergio","Remi","Adriano","Thiago","Ruth","Stephen","Kazuha","Tomoko","Niamh","Sofie","Lisa","Isabelle","Zayd","Danielle","Gregory"]},"component":"data2-core-types@ComponentParameter"},"speed":{"params":{"component":"data2-core-primitives@Number"},"component":"data2-core-types@ComponentParameter"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Options"}}}}],"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"reply":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Consult"}},"component":{"component":"data2-core-primitives@String","params":{"content":""}},"icon":{"params":{"icon":"fa-wechat"},"component":"data2-core-types@FontAwesomeIcon"},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"messages"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"component":"data2-core-primitives@Object"}},{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Aditional Context"}},"visibility":"public"}},{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"Params"}},"visibility":"public","parameters":{"options":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"Options"}},"visibility":"public","parameters":{"countTokens":{"params":{"component":"data2-core-primitives@Boolean","title":{"component":"data2-core-primitives@String","params":{"content":"Count Tokens"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"}}}}}}}]},"component":"data2-core-types@ComponentParameter"},"search":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Search"}},"component":{"component":"data2-core-primitives@String","params":{"content":""}},"icon":{"params":{"icon":"fa-search"},"component":"data2-core-types@FontAwesomeIcon"},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"prompt"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"Options"}},"visibility":"public"}}],"visibility":"private"},"component":"data2-core-types@ComponentParameter"},"textExtract":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Text Extract"}},"component":{"component":"data2-core-primitives@String","params":{"content":""}},"icon":{"params":{"icon":"fa-file-text-o"},"component":"data2-core-types@FontAwesomeIcon"},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Getter"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Image File"}}}},{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Options"}},"component":"data2-core-primitives@Object","parameters":{"pdfPageChunkSize":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Number","title":{"component":"data2-core-primitives@String","params":{"content":"pdfPageChunkSize"}}}}}}}],"visibility":"public"},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2026-06-20T20:38:35.861Z"},{"_id":"639b2c01e920c80b07058025","component":"data2-core-types@Component","params":{"package":"data2-core-functions","component":"StringTrim","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"string":{"component":"data2-core-primitives@String"}}}},"returnPrimitiveTypes":["data2-core-primitives@String"],"wrap":{"component":"data2-core-primitives@String","params":{"content":"string"}}},"updatedAt":"2022-09-12T20:29:27.218Z"},{"_id":"63a5e350e920c80b07715d99","component":"data2-core-types@Component","params":{"component":"ArrayReject","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"array":{"component":"data2-core-types@Getter"},"filter":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-functions@Function"}},"arguments":[{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":""}},"title":{"component":"data2-core-primitives@String","params":{"content":"item"}}},"component":"data2-core-types@ComponentParameter"},{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"title":{"component":"data2-core-primitives@String","params":{"content":"index"}}},"component":"data2-core-types@ComponentParameter"}]},"component":"data2-core-types@ComponentParameter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"array"}}},"updatedAt":"2022-12-23T18:38:40.673Z"},{"_id":"63ac4b5ee920c80b07ecb724","component":"data2-core-types@Component","params":{"public":false,"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-controls@SyntheticInput","params":{"value":{"params":{"expression":{"params":{"content":true},"component":"data2-core-primitives@Boolean"},"defaultCase":{"component":"data2-core-types@DataLinkGetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record"}},"mask":{"component":"data2-core-types@Reference","params":{"reference":"mask"}}}},"cases":[{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"type"},"component":"data2-core-types@Reference"},"comparisonSubject":"date"}},"value":{"component":"data2-core-functions@DateFormat","params":{"date":{"component":"data2-core-types@DataLinkGetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record"}}}},"format":"YYYY-MM-DD","strict":false}}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"type"},"component":"data2-core-types@Reference"},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"month"}}}},"value":{"component":"data2-core-functions@DateFormat","params":{"date":{"component":"data2-core-types@DataLinkGetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record"}}}},"format":{"component":"data2-core-primitives@String","params":{"content":"YYYY-MM"}},"strict":false}}}}]},"component":"data2-core-flow@Switch"},"onChange":{"component":"data2-core-types@DataLinkSetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record"}},"recordUpsert":{"component":"data2-core-types@Reference","params":{"reference":"recordUpsert"}},"onChange":{"component":"data2-core-types@Reference","params":{"reference":"onChange"}},"mask":{"component":"data2-core-types@Reference","params":{"reference":"mask"}}}},"defaultChecked":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"type"},"component":"data2-core-types@Reference"},"comparisonSubject":"checkbox"}}],"then":{"component":"data2-core-types@DataLinkGetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record"}}}},"else":""}}}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"tabIndex":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":210}}},"component":"data2-core-types@ComponentParameter"},"dataset":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@InteractiveModuleReference"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":91}}},"component":"data2-core-types@ComponentParameter"},"field":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetColumnReference"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":92}},"alternativeParameterDefaultType":[{"parameter":{"component":"data2-core-primitives@String","params":{"content":"dataset"}},"value":{"params":{"reference":"__UIState"},"component":"data2-core-types@InteractiveModuleReference"},"type":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-user-interface@StateProp"}}},"component":"data2-core-types@ComponentParameter"}}],"shouldShow":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"dependsOn":[{"component":"data2-core-primitives@String","params":{"content":"dataset"}}]},"component":"data2-core-types@ComponentParameter"},"record":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Reference"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":203}}},"component":"data2-core-types@ComponentParameter"},"recordUpsert":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":204}}},"component":"data2-core-types@ComponentParameter"},"type":{"params":{"oneOf":["time","month","text","number","checkbox","email","password","range","date","color","radio"],"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":101}}},"component":"data2-core-types@ComponentParameter"},"mask":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":103}}},"component":"data2-core-types@ComponentParameter"},"placeholder":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":102}}},"component":"data2-core-types@ComponentParameter"},"disabled":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":205}}},"component":"data2-core-types@ComponentParameter"},"autoComplete":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":206}}},"component":"data2-core-types@ComponentParameter"},"step":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":207}}},"component":"data2-core-types@ComponentParameter"},"maxLength":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":208}}},"component":"data2-core-types@ComponentParameter"},"min":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":208}}},"component":"data2-core-types@ComponentParameter"},"max":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":209}}},"component":"data2-core-types@ComponentParameter"},"orient":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"oneOf":[{"params":{"content":"vertical"},"component":"data2-core-primitives@String"},{"params":{"content":"horizontal"},"component":"data2-core-primitives@String"}],"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":104}}},"component":"data2-core-types@ComponentParameter"},"onChange":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":301}}},"component":"data2-core-types@ComponentParameter"},"onFocus":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":302}}},"component":"data2-core-types@ComponentParameter"},"onBlur":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":303}}},"component":"data2-core-types@ComponentParameter"},"onKeyPress":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":304}}},"component":"data2-core-types@ComponentParameter"}}}},"component":"SynthDataFieldBlock","package":"data2-blocks","icon":"keyboard-o","extends":"data2-core-primitives@Block","visibility":"private"},"updatedAt":"2022-10-03T18:40:22.290Z"},{"_id":"63ac4c8ce920c80b07ecd454","component":"data2-core-types@Component","params":{"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"dataset":{"component":"data2-core-types@DataSetReference"},"fields":{"component":"data2-core-types@DataSetColumnReference"}}}},"public":false,"visibility":"private","component":"SyntheticInput","extends":"data2-core-primitives@Block","package":"data2-controls"},"updatedAt":"2022-03-22T14:25:32.194Z"},{"_id":"63adc37dbe3dea0726f4d34c","component":"data2-core-types@Component","params":{"component":"Min","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"values":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2022-12-29T16:42:37.446Z","createdAt":"2022-12-29T16:42:37.446Z"},{"_id":"63adc396be3dea0726f4d35e","component":"data2-core-types@Component","params":{"component":"Max","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"values":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2022-12-29T16:43:02.834Z","createdAt":"2022-12-29T16:43:02.834Z"},{"_id":"63c99c1b55ade32bcabc8031","component":"data2-core-types@Component","params":{"component":"Uniq","package":"data2-core-functions","visibility":"public","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"array":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Getter"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Array"}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}}},"component":"data2-core-types@ComponentParameter"},"field":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String"}}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"array"}}},"updatedAt":"2023-02-01T20:32:39.032Z","createdAt":"2023-01-19T13:41:23.258Z"},{"_id":"63cad59c55ade32bcad59361","component":"data2-core-types@Component","params":{"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-controls@MarkdownViewer","params":{"markdown":{"params":{"reference":"markdown"},"component":"data2-core-types@Reference"},"removeDefaultPadding":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"removeDefaultPadding"}}}}}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"markdown":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"defaultTarget":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String"}},"removeDefaultPadding":{"params":{"visibility":"public","component":"data2-core-primitives@Boolean"},"component":"data2-core-types@ComponentParameter"}}}},"component":"MarkdownViewer","package":"data2-blocks","icon":"code","extends":"data2-core-primitives@Block","visibility":"public"},"updatedAt":"2025-06-23T05:59:15.356Z"},{"_id":"63cad64255ade32bcad5a183","component":"data2-core-types@Component","params":{"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{}}},"public":false,"component":"MarkdownViewer","package":"data2-controls","visibility":"deprecated"},"updatedAt":"2023-01-20T14:41:50.309Z"},{"_id":"63d273738eefdf063478d61e","component":"data2-core-types@Component","params":{"component":"UrlEncodedFormData","package":"http","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"data":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}}},"component":"data2-core-types@ComponentParameter"}}}},"title":"UrlEncodedFormData"},"updatedAt":"2023-01-26T12:45:19.712Z","createdAt":"2023-01-26T12:34:59.989Z"},{"_id":"63d7b5fecca41e063525ae8b","component":"data2-core-types@Component","params":{"component":"RequestDefinition","package":"http","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{}}},"title":"RequestDefinition"},"updatedAt":"2023-01-30T12:20:14.295Z","createdAt":"2023-01-30T12:20:14.295Z"},{"_id":"63ee67b1316bab28ad81a790","component":"data2-core-types@Component","params":{"package":"data2-rush","component":"Schedule","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"content":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}},"component":"data2-core-types@ComponentParameter"}}}},"title":{"component":"data2-core-primitives@String","params":{"content":"Schedule"}},"icon":"clock-o"},"updatedAt":"2022-07-06T22:40:03.830Z"},{"_id":"63ee6909316bab28ad81cf12","component":"data2-core-types@Component","params":{"package":"data2-cashier","component":"Subscription","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"position":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Position"}},"category":"appearance","simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"},"dimensions":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Dimensions"}},"category":"appearance","simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}},"defaultValue":{"preventEvaluation":true,"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768}},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"},"productsDataset":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetReference"}},"category":"appearance","simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":101}}},"component":"data2-core-types@ComponentParameter"},"paymentProvider":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-cashier@PaymentProviderReference"}},"category":"appearance","simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":101}}},"component":"data2-core-types@ComponentParameter"}}}},"title":{"component":"data2-core-primitives@String","params":{"content":"Cart"}},"icon":"users","visibility":"private","interactions":{"params":{"fields":{"addItem":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"cart-plus"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"removeItem":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"cart-arrow-down"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"checkout":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"shopping-bag"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@FieldSet"}},"updatedAt":"2022-07-06T22:42:14.824Z"},{"_id":"63ee691e316bab28ad81d1fc","component":"data2-core-types@Component","params":{"package":"data2-cashier","component":"Product","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"position":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Position"}},"category":"appearance","simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"},"dimensions":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Dimensions"}},"category":"appearance","simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}},"defaultValue":{"preventEvaluation":true,"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768}},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"},"productsDataset":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetReference"}},"category":"appearance","simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":101}}},"component":"data2-core-types@ComponentParameter"},"paymentProvider":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-cashier@PaymentProviderReference"}},"category":"appearance","simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":101}}},"component":"data2-core-types@ComponentParameter"}}}},"title":{"component":"data2-core-primitives@String","params":{"content":"Cart"}},"icon":"gift","visibility":"private","interactions":{"params":{"fields":{"addItem":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"cart-plus"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"removeItem":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"cart-arrow-down"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"checkout":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"shopping-bag"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@FieldSet"}},"updatedAt":"2022-07-06T22:42:14.824Z"},{"_id":"64064b1b1803cb0b5c1e52c4","component":"data2-core-types@Component","params":{"package":"data2-core-functions","component":"DateRange","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"start":{"component":"data2-core-primitives@Date","index":0},"end":{"component":"data2-core-primitives@Date","index":1}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"start"}}},"updatedAt":"2022-12-28T18:38:56.768Z"},{"_id":"6407a74c1803cb0b5c3d08c8","component":"data2-core-types@Component","params":{"package":"data2-core-connect","component":"Mailer","icon":"envelope","interactions":{"component":"data2-core-types@FieldSet","params":{"fields":{"send":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Sends email"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Email data"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Email data to be sent"}},"parameters":{"params":{"fields":{"from":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"parameters":{"name":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}},"component":"data2-core-types@ComponentParameter"}},"index":{"component":"data2-core-primitives@Number","params":{"content":5}}},"component":"data2-core-types@ComponentParameter"},"subject":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}}},"component":"data2-core-types@ComponentParameter"},"to":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":6}}},"component":"data2-core-types@ComponentParameter"},"bcc":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":8}}},"component":"data2-core-types@ComponentParameter"},"cc":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":7}}},"component":"data2-core-types@ComponentParameter"},"message":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2.1}}},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@FieldSet"}}}],"visibility":"private"}},"sendEmail":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Sends email"}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"params":{"fields":{"mailTemplate":{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Mail Template"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Mail Template"}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@InstanceReference"}},"controlSettings":{"componentFilter":{"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"componentInstance"}}],"body":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"componentInstance.component"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"data2-core-connect@MailTemplate"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"componentInstance.params.parent.params.reference"}}}},"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"module.reference"}}}}},"component":"data2-core-comparison-operators@Equal"}]},"component":"data2-core-logical-operators@And"}},"break":true}}}},"templateParameters":{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Template Parameters"}},"componentOptions":{"inferredComponent":{"params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"p"}}],"body":{"params":{"component":"data2-core-primitives@Object","parameters":{"params":{"fieldsList":{"params":{"array":{"params":{"module":{"params":{"array":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"ServiceComponentInstancesDataSet"}},"_layer":{"component":"data2-core-primitives@String","params":{"content":"HostApplicationLayer"}}},"component":"data2-core-types@ProcessReference"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"c"}}],"body":{"params":{"components":[{"params":{"comparisonSubject":{"params":{"content":"data2-core-connect@MailTemplate"},"component":"data2-core-primitives@String"},"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"c.component"}}}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"p.rootExecutedInstanceParams.args.0.mailTemplate"}}}},"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"c.reference"}}}}},"component":"data2-core-comparison-operators@Equal"}]},"component":"data2-core-logical-operators@And"}}}},"component":"data2-core-functions@ArrayFind"},"prop":{"component":"data2-core-primitives@String","params":{"content":"templateParameters"}}},"component":"data2-core-types@Getter"},"mapper":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"value"}}],"body":{"key":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"value"}}}},"prop":{"component":"data2-core-primitives@String","params":{"content":"key"}}}},"value":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"value"}}}}}}}},"component":"data2-core-functions@ArrayMap"}},"component":"data2-core-types@FieldSet"},"title":{"component":"data2-core-primitives@String","params":{"content":"Template Parameters"}}},"component":"data2-core-types@ComponentParameter"}},"component":"data2-core-functions@Function","break":true}},"visibility":"private","component":"data2-core-primitives@Inferred"}}}},"component":"data2-core-types@FieldSet"}}}]}},"sendEmailDebug":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"DEBUUUUUUUUG"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"template"}},"component":"data2-core-types@InstanceReference"}},{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Reference"}},"title":{"component":"data2-core-primitives@String","params":{"content":"navigationTest"}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Reference"}},"title":{"component":"data2-core-primitives@String","params":{"content":"navigationTest2"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Inferred"}},"componentOptions":{"inferredComponent":{"params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"params"}}],"body":{"params":{"compare":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"params.executedInstanceParams.banana"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"verde"}}},"component":"data2-core-comparison-operators@Equal"}],"then":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"else":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Reference"}}},"component":"data2-core-flow@If"}},"component":"data2-core-functions@Function","break":true}},"title":{"component":"data2-core-primitives@String","params":{"content":"inferredTest"}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Inferred"}},"componentOptions":{"inferredComponent":{"params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"params"}}],"body":{"params":{"compare":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"params.executedInstanceParams.banana"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"verde"}}},"component":"data2-core-comparison-operators@Equal"}],"then":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"else":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Reference"}}},"component":"data2-core-flow@If"}},"component":"data2-core-functions@Function","break":true}},"title":{"component":"data2-core-primitives@String","params":{"content":"inferredTestList"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}}],"visibility":"private"}},"sendInvite":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Sends invite"}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"params":{"fields":{"date":{"component":"data2-core-types@ComponentParameter","params":{"title":"date","component":"data2-core-primitives@Date"}},"hour":{"component":"data2-core-types@ComponentParameter","params":{"title":"hour","component":"data2-core-primitives@Number"}},"minutes":{"component":"data2-core-types@ComponentParameter","params":{"title":"minutes","component":"data2-core-primitives@Number"}},"durationHour":{"component":"data2-core-types@ComponentParameter","params":{"title":"durationHour","component":"data2-core-primitives@Number"}},"durationMinute":{"component":"data2-core-types@ComponentParameter","params":{"title":"durationMinute","component":"data2-core-primitives@Number"}},"title":{"component":"data2-core-types@ComponentParameter","params":{"title":"title","component":"data2-core-primitives@String"}},"description":{"component":"data2-core-types@ComponentParameter","params":{"title":"description","component":"data2-core-primitives@String"}},"location":{"component":"data2-core-types@ComponentParameter","params":{"title":"location","component":"data2-core-primitives@String"}},"uid":{"component":"data2-core-types@ComponentParameter","params":{"title":"uid","component":"data2-core-primitives@String"}},"sequence":{"component":"data2-core-types@ComponentParameter","params":{"title":"sequence","component":"data2-core-primitives@Number"}},"categories":{"component":"data2-core-types@ComponentParameter","params":{"title":"categories","component":"data2-core-primitives@String"}},"status":{"component":"data2-core-types@ComponentParameter","params":{"title":"status","component":"data2-core-primitives@String"}},"method":{"component":"data2-core-types@ComponentParameter","params":{"title":"method","component":"data2-core-primitives@String"}},"busyStatus":{"component":"data2-core-types@ComponentParameter","params":{"title":"busyStatus","component":"data2-core-primitives@String"}},"to":{"component":"data2-core-types@ComponentParameter","params":{"title":"to","component":"data2-core-primitives@String"}}}},"component":"data2-core-types@FieldSet"}}}]}}}}},"visibility":"public","renderable":{"dimensions":{"disabled":false,"component":"data2-core-types@Dimensions","params":{"width":1366,"exactWidth":false,"exactHeight":false,"height":768}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"policies":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-auth@Policy"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"description":{"component":"data2-core-primitives@String","params":{"content":"Controls for allowing or denying access to the data"}}}}}}}},"updatedAt":"2024-08-13T01:15:40.837Z"},{"_id":"6407ac921803cb0b5c3d7f22","component":"data2-core-types@Component","params":{"public":true,"package":"data2-core-connect","component":"MailTemplate","icon":"envelope","visibility":"public","parameters":{"params":{"fields":{"artboard":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@ArtboardReference"}},"index":{"component":"data2-core-primitives@Number","params":{"content":3}}},"component":"data2-core-types@ComponentParameter"},"from":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"parameters":{"name":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}},"component":"data2-core-types@ComponentParameter"}},"index":{"component":"data2-core-primitives@Number","params":{"content":5}}},"component":"data2-core-types@ComponentParameter"},"subject":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}}},"component":"data2-core-types@ComponentParameter"},"to":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":6}}},"component":"data2-core-types@ComponentParameter"},"bcc":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":8}}},"component":"data2-core-types@ComponentParameter"},"cc":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":7}}},"component":"data2-core-types@ComponentParameter"},"message":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2.1}}},"component":"data2-core-types@ComponentParameter"},"parent":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@InstanceReference"}},"visibility":"private","index":{"component":"data2-core-primitives@Number","params":{"content":1}},"controlSettings":{"componentFilter":[{"component":"data2-core-primitives@String","params":{"content":"data2-core-connect@Mailer"}}]}},"component":"data2-core-types@ComponentParameter"},"replyTo":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":9}}},"component":"data2-core-types@ComponentParameter"},"templateParameters":{"params":{"component":"data2-core-types@PrimitiveParameter","index":{"component":"data2-core-primitives@Number","params":{"content":10}},"title":{"component":"data2-core-primitives@String","params":{"content":"Template Parameters"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"attachments":{"params":{"key":{"component":"data2-core-primitives@String","params":{"content":"attachments"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Attachments"}},"component":"data2-core-primitives@Object","description":{"component":"data2-core-primitives@String","params":{"content":"Attachments to be sent on the e-mail."}},"index":{"component":"data2-core-primitives@Number","params":{"content":600}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"content":{"params":{"component":"data2-core-primitives@String","key":{"component":"data2-core-primitives@String","params":{"content":"content"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Content"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Contents of the file. Limit 5MB."}},"index":{"component":"data2-core-primitives@Number","params":{"content":20}}},"component":"data2-core-types@ComponentParameter"},"filename":{"params":{"component":"data2-core-primitives@String","key":{"component":"data2-core-primitives@String","params":{"content":"filename"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Filename"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Name that will be displayed to the recipient."}},"index":{"component":"data2-core-primitives@Number","params":{"content":10}}},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@ComponentParameter"},"policies":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-auth@Policy"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"description":{"component":"data2-core-primitives@String","params":{"content":"Controls for allowing or denying access to the data"}}}}}},"component":"data2-core-types@FieldSet"},"componentOptions":{"contextPopulatedParams":{"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"p"}}],"body":{"params":{"fieldsList":{"params":{"mapper":{"params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"v"}}],"body":{"key":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"v.key"}}}},"value":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"v.mock"}}}}}},"component":"data2-core-functions@Function","break":true},"array":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"p.executedInstanceParams.templateParameters"}}}}},"component":"data2-core-functions@ArrayMap"}},"component":"data2-core-types@FieldSet"}},"break":true}}},"updatedAt":"2025-07-16T20:10:44.248Z"},{"_id":"64086a961803cb0b5c4bf774","component":"data2-core-types@Component","params":{"package":"data2-core-media","component":"ExtractTextFromPDF","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"file":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"File"}},"description":{"component":"data2-core-primitives@String","params":{"content":"PDF File to have the text extracted."}}},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"public"}},{"_id":"640873991803cb0b5c4cac3b","component":"data2-core-types@Component","params":{"package":"data2-core-media","component":"ExtractTextFromFile","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"file":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"File"}},"description":{"component":"data2-core-primitives@String","params":{"content":"File to have the text extracted."}}},"component":"data2-core-types@ComponentParameter"},"encoding":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Encoding"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Enconding of the file"}},"oneOf":[{"params":{"content":"UTF-8"},"component":"data2-core-primitives@String"},{"params":{"content":"UTF-16"},"component":"data2-core-primitives@String"},{"params":{"content":"iso-8859-1"},"component":"data2-core-primitives@String"},{"params":{"content":"windows-1252"},"component":"data2-core-primitives@String"}],"defaultValue":{"params":{"content":"UTF-8"},"component":"data2-core-primitives@String"}},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"public"},"updatedAt":"2025-08-22T16:53:17.466Z"},{"_id":"6408ce8dfb4a0d06340a385a","component":"data2-core-types@Component","params":{"component":"SubString","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"string":{"params":{"index":{"component":"data2-core-primitives@Number","params":{"content":0}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}},"component":"data2-core-types@ComponentParameter"},"start":{"params":{"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}}},"component":"data2-core-types@ComponentParameter"},"end":{"params":{"index":{"component":"data2-core-primitives@Number","params":{"content":2}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}}},"component":"data2-core-types@ComponentParameter"}}}},"title":"SubString"},"updatedAt":"2023-03-08T18:06:05.231Z","createdAt":"2023-03-08T18:06:05.231Z"},{"_id":"641080472ca92b0633f34e51","component":"data2-core-types@Component","params":{"component":"CalculateAiTokens","package":"data2-core-types","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"prompt":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"multiLine":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}}}},"title":"CalculateAiTokens"},"updatedAt":"2023-03-14T14:10:15.104Z","createdAt":"2023-03-14T14:10:15.104Z"},{"_id":"6418a5f25e956b06389b55f9","component":"data2-core-types@Component","params":{"component":"IdentityProvider","package":"data2-core-id","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"getSessionPayload":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"http@Request"}}}},"getProviderId":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Reference"}}}},"sessionNamespace":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"visibility":"public"}}}}},"title":"IdentityProvider","visibility":"public"},"updatedAt":"2023-06-26T18:48:27.016Z","createdAt":"2023-03-20T18:29:06.486Z"},{"_id":"6418ba7212979394b3036038","component":"data2-core-types@Component","params":{"component":"IdentityProviderReference","package":"data2-core-types","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"reference":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}}}}}},"title":"IdentityProviderReference","visibility":"public"},"updatedAt":"2023-03-28T17:25:36.761Z","createdAt":"2023-03-20T19:56:34.802Z"},{"_id":"641c91904625490637c2b696","component":"data2-core-types@Component","params":{"component":"ExtractTextFromDocX","package":"data2-core-media","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"file":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"File"}},"description":{"component":"data2-core-primitives@String","params":{"content":"PDF File to have the text extracted."}}},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"public"},"updatedAt":"2023-03-23T17:51:59.273Z","createdAt":"2023-03-23T17:51:12.007Z"},{"_id":"6425992884bcee362f85ccc9","component":"data2-core-types@Component","params":{"component":"ProviderAuthenticationSettings","package":"data2-core-id","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"providerField":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@FieldReference"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"description":{"component":"data2-core-primitives@String","params":{"content":"Pick the column in the DataSet that represents an ID by the Identity Provider."}}}},"identityProvider":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@IdentityProviderReference"}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}},"description":{"component":"data2-core-primitives@String","params":{"content":"The Third party identity provider to be allowed in this Authentication Strategy."}}}},"allowSignup":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"visibility":"public","index":{"component":"data2-core-primitives@Number","params":{"content":2}},"description":{"component":"data2-core-primitives@String","params":{"content":"When logging in with a user that has no match in the verifier, should create a new user instead of denying the login."}}}},"onBeforeCreateSession":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-flow@Series","visibility":"public","index":{"component":"data2-core-primitives@Number","params":{"content":3}},"description":{"component":"data2-core-primitives@String","params":{"content":"Action to be executed before creating the user session."}}}},"omitSessionToken":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"visibility":"public","index":{"component":"data2-core-primitives@Number","params":{"content":2}},"description":{"component":"data2-core-primitives@String","params":{"content":"If true, omits the key \"sessionToken\" from credentials when creating the session."}}}},"shouldForwardErrors":{"component":"data2-core-types@ComponentParameter","params":{"index":{"component":"data2-core-primitives@Number","params":{"content":10}},"description":{"component":"data2-core-primitives@String","params":{"content":"If true, will send to client eventual errors when logging in with ID Provider. Useful for debugging the integration."}},"component":"data2-core-primitives@Boolean"}}}}},"visibility":"private","title":"ProviderAuthenticationSettings","inlineParamsControl":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"updatedAt":"2024-12-13T13:12:44.753Z","createdAt":"2023-03-30T14:14:00.761Z"},{"_id":"6426b3ccafeb670636eaa344","component":"data2-core-types@Component","params":{"component":"S3FileUpload","package":"http","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"file":{"params":{},"component":"data2-core-types@ComponentParameter"},"uploadUrl":{"params":{},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2023-03-31T10:19:56.412Z","createdAt":"2023-03-31T10:19:56.412Z"},{"_id":"64343c6ed39def0637f1bb22","component":"data2-core-types@Component","params":{"component":"JwtVerify","package":"data2-core-id","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"token":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}}},"verifyingKey":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}}},"audience":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}}},"algorithm":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"shouldShow":{"component":"data2-core-primitives@Boolean","preventEvaluation":true,"params":{"content":{"params":{"subject":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"verifyingKey"}}}},"pattern":{"component":"data2-core-primitives@String","params":{"content":"https://"}}},"component":"data2-core-functions@Includes"},{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"verifyingKey"}}}},"pattern":{"component":"data2-core-primitives@String","params":{"content":"http://"}}},"component":"data2-core-functions@Includes"}]},"component":"data2-core-logical-operators@Or"}},"component":"data2-core-logical-operators@Not"}},"break":false}}},"keytype":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"oneOf":[{"params":{"content":"pkcs8"},"component":"data2-core-primitives@String"},{"params":{"content":"spki"},"component":"data2-core-primitives@String"},{"params":{"content":"x509"},"component":"data2-core-primitives@String"}],"shouldShow":{"component":"data2-core-primitives@Boolean","preventEvaluation":true,"params":{"content":{"params":{"subject":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"verifyingKey"}}}},"pattern":{"component":"data2-core-primitives@String","params":{"content":"https://"}}},"component":"data2-core-functions@Includes"},{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"verifyingKey"}}}},"pattern":{"component":"data2-core-primitives@String","params":{"content":"http://"}}},"component":"data2-core-functions@Includes"}]},"component":"data2-core-logical-operators@Or"}},"component":"data2-core-logical-operators@Not"}},"break":false}}}}}},"inlineParamsControl":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"visibility":"public"},"updatedAt":"2025-01-08T15:30:12.597Z","createdAt":"2023-04-10T16:42:22.906Z"},{"_id":"643612c3ac93122e727ec45b","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"RemixIcon","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"icon":{"component":"data2-core-primitives@String"}}}},"visibility":"deprecated"},"updatedAt":"2023-04-15T01:01:15.470Z","createdAt":"2023-04-12T02:08:21.900Z"},{"_id":"6436f04bac93122e72906101","component":"data2-core-types@Component","params":{"extends":"data2-core-primitives@Block","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"html@i","params":{"aria-hidden":"true","style":{"display":"flex","justifyContent":"center","alignItems":"center","width":"100%","height":"100%","fontSize":{"params":{"reference":"size"},"component":"data2-core-types@Reference"},"color":{"params":{"compare":[{"params":{"subject":{"params":{"reference":"color"},"component":"data2-core-types@Reference"},"pattern":{"component":"data2-core-primitives@String","params":{"content":"gradient"}}},"component":"data2-core-functions@Includes"}],"else":{"params":{"components":[{"params":{"reference":"color"},"component":"data2-core-types@Reference"},{"params":{"reference":"super.textColor"},"component":"data2-core-types@Reference"}]},"component":"data2-core-logical-operators@Or"},"then":{"component":"data2-core-primitives@String","params":{"content":"transparent"}}},"component":"data2-core-flow@If"},"backgroundClip":{"component":"data2-core-primitives@String","params":{"content":"text"}},"WebkitBackgroundClip":{"component":"data2-core-primitives@String","params":{"content":"text"}},"backgroundImage":{"params":{"compare":[{"params":{"subject":{"params":{"reference":"color"},"component":"data2-core-types@Reference"},"pattern":{"component":"data2-core-primitives@String","params":{"content":"gradient"}}},"component":"data2-core-functions@Includes"}],"then":{"params":{"portions":[{"params":{"reference":"color"},"component":"data2-core-types@Reference"}]},"component":"data2-core-functions@StringConcat"},"else":{"component":"data2-core-primitives@String","params":{"content":"linear-gradient(transparent,transparent)"}}},"component":"data2-core-flow@If"},"transition":{"component":"data2-core-primitives@String","params":{"content":"inherit"}}},"className":{"component":"data2-core-types@Reference","params":{"reference":"icon"}}}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"icon":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-web@Icon"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"},"color":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Color"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":3}}},"component":"data2-core-types@ComponentParameter"},"size":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":2}}},"component":"data2-core-types@ComponentParameter"}}}},"component":"IconBlock","title":"Icon","package":"data2-blocks","icon":"star","visibility":"public"},"updatedAt":"2023-04-17T13:12:55.171Z","createdAt":"2023-04-12T17:48:40.724Z"},{"_id":"6439ef81a9851b0634520016","component":"data2-core-types@Component","params":{"component":"Icon","package":"data2-core-web","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"icon":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}},"title":{"component":"data2-core-primitives@String","params":{"content":"Icon"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Icon to be used."}},"defaultValue":{"params":{},"component":"data2-core-types@Definition"}}},"iconSet":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}},"title":{"component":"data2-core-primitives@String","params":{"content":"Icon Set"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Set of icons to be used."}},"defaultValue":{"params":{},"component":"data2-core-types@Definition"},"visibility":"public"}}}}},"title":"Icon","visibility":"public"},"updatedAt":"2023-08-17T13:03:29.815Z","createdAt":"2023-04-15T00:27:45.831Z"},{"_id":"643d76777d0ae595851a3b3a","component":"data2-core-types@Component","params":{"product":"rush","package":"data2-rush","component":"HTTPListener","icon":"globe","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"handler":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Handler"}},"icon":{"params":{"icon":"fa-play-circle-o"},"component":"data2-core-types@FontAwesomeIcon"},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-flow@Series"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Actions that are executed by the listener. The following parameters are accessible by using Reference: `body`, `headers`, `query` and `method`."}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}}},"component":"data2-core-types@ComponentParameter"},"insertLogsDataSet":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-types@DataSetReference","key":{"component":"data2-core-primitives@String","params":{"content":"insertLogsDataSet"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Insert Logs DataSet"}},"description":{"component":"data2-core-primitives@String","params":{"content":"This parameter is used to save the execution logs. It should be auto-populated when the listener is created."}},"visibility":"private","defaultValue":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetReference"}},"params":{"reference":{"params":{"portions":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"reference"}}}},{"component":"data2-core-primitives@String","params":{"content":"LogInsertDataSet"}}]},"component":"data2-core-functions@StringConcat"}}},"component":"data2-core-types@ComponentDefinition"}}},"readLogsDataSet":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-types@DataSetReference","key":{"component":"data2-core-primitives@String","params":{"content":"readLogsDataSet"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Read Logs DataSet"}},"description":{"component":"data2-core-primitives@String","params":{"content":"This parameter is used by the renderable to show the listener execution logs. It should be auto-populated when the listener is created."}},"visibility":"private","defaultValue":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetReference"}},"params":{"reference":{"params":{"portions":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"reference"}}}},{"component":"data2-core-primitives@String","params":{"content":"LogReadDataSet"}}]},"component":"data2-core-functions@StringConcat"}}},"component":"data2-core-types@ComponentDefinition"}}},"enableExecutionLogs":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Boolean","key":{"component":"data2-core-primitives@String","params":{"content":"enableExecutionLogs"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Enable Execution Logs"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Controls whether the listener will save execution logs."}},"visibility":"public","index":{"component":"data2-core-primitives@Number","params":{"content":1}},"unversioned":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"defaultValue":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}}},"shouldLogRequestBody":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Boolean","key":{"component":"data2-core-primitives@String","params":{"content":"shouldLogRequestBody"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Should Log Request Body"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Controls whether the body will be recorded."}},"visibility":"public","flat":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"shouldShow":{"component":"data2-core-primitives@Boolean","params":{"content":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"enableExecutionLogs"}}},"component":"data2-core-types@Reference"}},"break":true,"preventEvaluation":true},"index":{"component":"data2-core-primitives@Number","params":{"content":10}},"defaultValue":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}}},"shouldLogRequestHeaders":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Boolean","key":{"component":"data2-core-primitives@String","params":{"content":"shouldLogRequestHeaders"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Should Log Request Headers"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Controls whether the request headers will be recorded."}},"visibility":"public","flat":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"shouldShow":{"component":"data2-core-primitives@Boolean","params":{"content":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"enableExecutionLogs"}}},"component":"data2-core-types@Reference"}},"break":true,"preventEvaluation":true},"index":{"component":"data2-core-primitives@Number","params":{"content":20}}}},"omitHeaders":{"component":"data2-core-types@ComponentParameter","params":{"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"component":"data2-core-primitives@String","key":{"component":"data2-core-primitives@String","params":{"content":"omitHeaders"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Omit Headers"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Headers to be omitted from the request when logging. The headers are all lower case"}},"defaultValue":[{"component":"data2-core-primitives@String","params":{"content":"authorization"}}],"index":{"component":"data2-core-primitives@Number","params":{"content":21}},"visibility":"public","shouldShow":{"component":"data2-core-primitives@Boolean","params":{"content":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"shouldLogRequestHeaders"}}},"component":"data2-core-types@Reference"}},"preventEvaluation":true,"break":true}}},"omitBodyKeys":{"component":"data2-core-types@ComponentParameter","params":{"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"component":"data2-core-primitives@String","key":{"component":"data2-core-primitives@String","params":{"content":"omitBodyKeys"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Omit Body Keys"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Keys to be omitted from the request body when logging."}},"index":{"component":"data2-core-primitives@Number","params":{"content":11}},"shouldShow":{"component":"data2-core-primitives@Boolean","params":{"content":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"shouldLogRequestBody"}}},"component":"data2-core-types@Reference"}},"preventEvaluation":true,"break":true},"visibility":"public"}},"policies":{"params":{"component":"data2-core-auth@Policy","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"visibility":"public","index":{"component":"data2-core-primitives@Number","params":{"content":0.1}}},"component":"data2-core-types@ComponentParameter"},"rawResponse":{"params":{"component":"data2-core-primitives@Boolean","visibility":"public","index":{"component":"data2-core-primitives@Number","params":{"content":999}},"description":{"component":"data2-core-primitives@String","params":{"content":"Raw Response HTTP Listeners expects an object with the keys content and headers at the end of the handler.\n\n{\n  \"content\" : \"xxx\",\n  \"headers\": {\n    \"Content-Type\":\"application/json\"\n  }\n}"}}},"component":"data2-core-types@ComponentParameter"}}}},"inlineParamsControl":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"renderable":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768,"exactWidth":1366,"exactHeight":768}}},"interactions":{"params":{"fields":{"invoke":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-functions@Function","description":{"component":"data2-core-primitives@String","params":{"content":"Invokes remote listener"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"params"}},"flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"body":{"params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"body"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"},"headers":{"params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"headers"}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}}},"component":"data2-core-types@ComponentParameter"}}}}],"visibility":"public"}},"invokeWithUpdates":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-functions@Function","description":{"component":"data2-core-primitives@String","params":{"content":"Invokes remote listener with updates"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"params"}},"flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"body":{"params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"body"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"},"headers":{"params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"headers"}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}}},"component":"data2-core-types@ComponentParameter"}},"defaultValue":{"component":"data2-core-types@FieldSet","params":{"fields":{}}}}},{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-functions@Function"}},"title":{"component":"data2-core-primitives@String","params":{"content":"onUpdate"}},"arguments":[{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"title":{"component":"data2-core-primitives@String","params":{"content":"data"}},"defaultValue":{"component":"data2-core-primitives@String","params":{"content":"data"}}},"component":"data2-core-types@ComponentParameter"}],"defaultValue":{"preventEvaluation":true,"disabled":false,"component":"data2-core-functions@Function","params":{"body":{"params":{"actions":[]},"component":"data2-core-flow@Series"},"parameters":[{"component":"data2-core-primitives@String","params":{"content":"data"}}]}}},"component":"data2-core-types@ComponentParameter"}],"visibility":"private"}}}},"component":"data2-core-types@FieldSet"}},"updatedAt":"2026-04-02T20:20:33.295Z","createdAt":"2023-04-17T16:38:44.391Z"},{"_id":"643ef5a87d0ae595853b9102","component":"data2-core-types@Component","params":{"package":"data2-core-registry","component":"DataSetAggregation","visibility":"private","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"expressions":{"component":"data2-core-types@ComponentParameter","params":{"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-registry@DataSetAggregationExpression"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"description":{"component":"data2-core-primitives@String","params":{"content":"Here you can define the operations to be executed on the grouped data, like counting records, taking an average of a field, and more."}}}},"filter":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}},"description":{"component":"data2-core-primitives@String","params":{"content":"Filter out some of the Records from the analysis."}}}},"group":{"component":"data2-core-types@ComponentParameter","params":{"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-registry@DataSetAggregationField"}},"index":{"component":"data2-core-primitives@Number","params":{"content":3}},"description":{"component":"data2-core-primitives@String","params":{"content":"Group DataSet records by a common value in their columns. If multiple columns are picked, only records with all the picked columns matching will be grouped."}}}},"sort":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"index":{"component":"data2-core-primitives@Number","params":{"content":4}},"description":{"component":"data2-core-primitives@String","params":{"content":"Change the data order from the Aggregation."}}}}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"Controls and settings for analyzing data on a DataSet."}}},"updatedAt":"2023-07-13T15:40:47.152Z"},{"_id":"64406b957d0ae595855ce209","component":"data2-core-types@Component","params":{"product":"rush","package":"data2-rush","component":"Scheduler","icon":"clock-o","visibility":"public","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"action":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Action"}},"icon":{"params":{"icon":"fa-play-circle-o"},"component":"data2-core-types@FontAwesomeIcon"},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-flow@Series"}},"index":1},"component":"data2-core-types@ComponentParameter"},"enabled":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Enabled"}},"icon":{"params":{"icon":"fa-play-circle-o"},"component":"data2-core-types@FontAwesomeIcon"},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"index":2,"unversioned":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"schedule":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Schedule"}},"icon":{"params":{"icon":"fa-play-circle-o"},"component":"data2-core-types@FontAwesomeIcon"},"component":"data2-rush@Schedule","index":10,"unversioned":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"scheduleTimezone":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Timezone"}},"icon":{"params":{"icon":"fa-play-circle-o"},"component":"data2-core-types@FontAwesomeIcon"},"index":11,"unversioned":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"component":"data2-rush@ScheduleTimezone"},"component":"data2-core-types@ComponentParameter"},"startDate":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Start Date"}},"icon":{"params":{"icon":"fa-play-circle-o"},"component":"data2-core-types@FontAwesomeIcon"},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Date"}},"index":99,"unversioned":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"endDate":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"End Date"}},"icon":{"params":{"icon":"fa-play-circle-o"},"component":"data2-core-types@FontAwesomeIcon"},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Date"}},"index":100,"unversioned":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"insertLogsDataSet":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-types@DataSetReference","key":{"component":"data2-core-primitives@String","params":{"content":"insertLogsDataSet"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Insert Logs DataSet"}},"description":{"component":"data2-core-primitives@String","params":{"content":"This parameter is used to save the execution logs. It should be auto-populated when the listener is created."}},"visibility":"private","defaultValue":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetReference"}},"params":{"reference":{"params":{"portions":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"reference"}}}},{"component":"data2-core-primitives@String","params":{"content":"LogInsertDataSet"}}]},"component":"data2-core-functions@StringConcat"}}},"component":"data2-core-types@ComponentDefinition"}}},"readLogsDataSet":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-types@DataSetReference","key":{"component":"data2-core-primitives@String","params":{"content":"readLogsDataSet"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Read Logs DataSet"}},"description":{"component":"data2-core-primitives@String","params":{"content":"This parameter is used by the renderable to show the listener execution logs. It should be auto-populated when the listener is created."}},"visibility":"private","defaultValue":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetReference"}},"params":{"reference":{"params":{"portions":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"reference"}}}},{"component":"data2-core-primitives@String","params":{"content":"LogReadDataSet"}}]},"component":"data2-core-functions@StringConcat"}}},"component":"data2-core-types@ComponentDefinition"}}},"enableExecutionLogs":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Boolean","key":{"component":"data2-core-primitives@String","params":{"content":"enableExecutionLogs"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Enable Execution Logs"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Controls whether the listener will save execution logs."}},"visibility":"public","index":{"component":"data2-core-primitives@Number","params":{"content":1}},"unversioned":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}}}}},"renderable":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768,"exactWidth":1366,"exactHeight":768}}}},"updatedAt":"2024-08-13T18:41:29.927Z","createdAt":"2023-04-19T22:19:36.197Z"},{"_id":"644831fb4cbb9e44047b6b8d","component":"data2-core-types@Component","params":{"package":"data2-core-registry","component":"DataSetAggregationExpression","visibility":"private","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"operation":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"oneOf":[{"params":{"content":"count"},"component":"data2-core-primitives@String"},{"params":{"content":"sum"},"component":"data2-core-primitives@String"},{"params":{"content":"avg"},"component":"data2-core-primitives@String"},{"params":{"content":"max"},"component":"data2-core-primitives@String"},{"params":{"content":"min"},"component":"data2-core-primitives@String"}],"description":{"component":"data2-core-primitives@String","params":{"content":"The operation to be performed at the field."}}}},"field":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetColumnReference"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}},"description":{"component":"data2-core-primitives@String","params":{"content":"The field to apply the operation to"}}}},"as":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":3}},"description":{"component":"data2-core-primitives@String","params":{"content":"The name of the field after the applied operation."}}}}}}},"inlineParamsControl":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"description":{"component":"data2-core-primitives@String","params":{"content":"Apply an operation to a field in an Aggregation."}}},"updatedAt":"2023-07-13T15:51:36.541Z"},{"_id":"64483e7f4cbb9e44047c8810","component":"data2-core-types@Component","params":{"package":"data2-core-registry","component":"DataSetAggregationField","visibility":"private","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"field":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetColumnReference"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"description":{"component":"data2-core-primitives@String","params":{"content":"The column you want to group the items by."}}}},"as":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":3}},"description":{"component":"data2-core-primitives@String","params":{"content":"The name of the field after grouping."}}}},"dataTransformer":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":2}},"visibility":"public","oneOf":[{"params":{"content":"year"},"component":"data2-core-primitives@String"},{"params":{"content":"month"},"component":"data2-core-primitives@String"},{"params":{"content":"week"},"component":"data2-core-primitives@String"}],"description":{"component":"data2-core-primitives@String","params":{"content":"Apply a data transformation to the field before grouping them."}}}}}}},"inlineParamsControl":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"description":{"component":"data2-core-primitives@String","params":{"content":"Control for the grouping settings for an aggregation."}}},"updatedAt":"2023-07-13T15:48:23.688Z"},{"_id":"644bd94a3012225bf198c794","component":"data2-core-types@Component","params":{"package":"data2-core-functions","component":"Slugify","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"string":{"component":"data2-core-primitives@String"}}}},"returnPrimitiveTypes":["data2-core-primitives@String"],"wrap":{"component":"data2-core-primitives@String","params":{"content":"string"}},"visibility":"public"},"updatedAt":"2024-08-02T17:58:41.798Z"},{"_id":"645e8d505bbbecaee6a9c12d","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"Error","visibility":"public","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"message":{"component":"data2-core-types@ComponentParameter","params":{"index":{"component":"data2-core-primitives@Number","params":{"content":0}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}}},"code":{"component":"data2-core-types@ComponentParameter","params":{"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"component":"data2-core-primitives@Number"}},"data":{"component":"data2-core-types@ComponentParameter","params":{"index":{"component":"data2-core-primitives@Number","params":{"content":2}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}}}}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"A Data² Error. Can be used in a Series to stop executing the next steps of it."}}},"updatedAt":"2023-09-14T13:45:22.876Z"},{"_id":"646d2729903d327946c95fec","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"InstanceReference","visibility":"private","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"mode":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"visibility":"private","index":{"component":"data2-core-primitives@Number","params":{"content":3}}},"component":"data2-core-types@ComponentParameter"},"reference":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}}},"component":"data2-core-types@ComponentParameter"},"component":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2023-05-23T21:03:36.804Z"},{"_id":"646e81ee903d327946e7119c","component":"data2-core-types@Component","params":{"component":"JwtSign","package":"data2-core-id","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"payload":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}}}},"headers":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}}}},"expirationTime":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}}},"privateKey":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}}},"algorithm":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"shouldShow":{"component":"data2-core-primitives@Boolean","preventEvaluation":true,"params":{"content":{"params":{"subject":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"privateKey"}}}},"pattern":{"component":"data2-core-primitives@String","params":{"content":"https://"}}},"component":"data2-core-functions@Includes"},{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"privateKey"}}}},"pattern":{"component":"data2-core-primitives@String","params":{"content":"http://"}}},"component":"data2-core-functions@Includes"}]},"component":"data2-core-logical-operators@Or"}},"component":"data2-core-logical-operators@Not"}},"break":false},"oneOf":[{"params":{"content":"RS256"},"component":"data2-core-primitives@String"},{"params":{"content":"HS256"},"component":"data2-core-primitives@String"}]}},"keytype":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"oneOf":[{"params":{"content":"pkcs8"},"component":"data2-core-primitives@String"},{"params":{"content":"spki"},"component":"data2-core-primitives@String"},{"params":{"content":"x509"},"component":"data2-core-primitives@String"},{"params":{"content":"secret"},"component":"data2-core-primitives@String"}],"shouldShow":{"component":"data2-core-primitives@Boolean","preventEvaluation":true,"params":{"content":{"params":{"subject":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"privateKey"}}}},"pattern":{"component":"data2-core-primitives@String","params":{"content":"https://"}}},"component":"data2-core-functions@Includes"},{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"privateKey"}}}},"pattern":{"component":"data2-core-primitives@String","params":{"content":"http://"}}},"component":"data2-core-functions@Includes"}]},"component":"data2-core-logical-operators@Or"}},"component":"data2-core-logical-operators@Not"}},"break":false}}}}}},"inlineParamsControl":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"visibility":"public"},"updatedAt":"2024-09-09T01:19:02.277Z","createdAt":"2023-05-24T21:27:54.502Z"},{"_id":"646ea41f46d7280637267fd9","component":"data2-core-types@Component","params":{"component":"Base64Decode","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"string":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}},"component":"data2-core-types@ComponentParameter"}}}},"title":"Base64Decode"},"updatedAt":"2023-05-24T23:57:23.463Z","createdAt":"2023-05-24T23:56:15.292Z"},{"_id":"646ea5876a4b830637346685","component":"data2-core-types@Component","params":{"component":"Base64Encode","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"string":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2023-05-25T00:02:15.907Z","createdAt":"2023-05-25T00:02:15.907Z"},{"_id":"6491d957c91d9255f4a20306","component":"data2-core-types@Component","params":{"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"string":{"component":"String"}}}},"component":"QueryStringParse","package":"data2-core-web"}},{"_id":"649b5381c91d9255f46789bf","component":"data2-core-types@Component","params":{"component":"PrimitiveParameter","package":"data2-core-types","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"component":{"params":{"component":{"params":{"content":"data2-core-primitives@String"},"component":"data2-core-primitives@String"},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"required":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"oneOf":[{"params":{"content":"data2-core-primitives@String"},"component":"data2-core-primitives@String"},{"params":{"content":"data2-core-primitives@Boolean"},"component":"data2-core-primitives@String"},{"params":{"content":"data2-core-primitives@Number"},"component":"data2-core-primitives@String"}],"saveCompiled":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"oneOf":{"params":{"component":"data2-core-primitives@Inferred","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}},"dependsOn":[{"component":"data2-core-primitives@String","params":{"content":"component"}}],"shouldShow":{"params":{"subject":[{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}}],"pattern":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"component"}}}}},"component":"data2-core-functions@Includes"},"componentOptions":{"inferredComponent":{"params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"p"}}],"body":{"params":{"then":{"params":{"component":"data2-core-primitives@Number","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}},"dependsOn":[{"component":"data2-core-primitives@String","params":{"content":"component"}}],"shouldShow":{"params":{"subject":[{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}}],"pattern":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"component"}}}}},"component":"data2-core-functions@Includes"}},"component":"data2-core-types@ComponentParameter"},"else":{"params":{"component":"data2-core-primitives@String","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}},"dependsOn":[{"component":"data2-core-primitives@String","params":{"content":"component"}}],"shouldShow":{"params":{"subject":[{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}}],"pattern":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"component"}}}}},"component":"data2-core-functions@Includes"}},"component":"data2-core-types@ComponentParameter"},"compare":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"p.executedInstanceParams.component"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}}},"component":"data2-core-comparison-operators@Equal"}]},"component":"data2-core-flow@If"}},"component":"data2-core-functions@Function","break":true}}},"component":"data2-core-types@ComponentParameter"},"key":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"list":{"params":{"component":"data2-core-primitives@Boolean","index":{"component":"data2-core-primitives@Number","params":{"content":3}}},"component":"data2-core-types@ComponentParameter"},"mock":{"params":{"component":"data2-core-primitives@Inferred","index":{"component":"data2-core-primitives@Number","params":{"content":4}},"dependsOn":[{"component":"data2-core-primitives@String","params":{"content":"component"}}],"shouldShow":{"params":{"content":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"component"}}}}},"component":"data2-core-primitives@Boolean","break":true},"componentOptions":{"inferredComponent":{"params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"p"}}],"body":{"params":{"component":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"p.executedInstanceParams.component"}}}},"list":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"p.executedInstanceParams.list"}}}},"shouldShow":{"params":{"content":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"component"}}}}},"component":"data2-core-primitives@Boolean","break":true},"dependsOn":[{"component":"data2-core-primitives@String","params":{"content":"component"}}]},"component":"data2-core-types@ComponentParameter"}},"component":"data2-core-functions@Function","break":true}}},"component":"data2-core-types@ComponentParameter"}}}},"inlineParamsControl":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"visibility":"public"},"updatedAt":"2023-11-10T16:52:01.914Z"},{"_id":"64a46b47c91d9255f4275929","component":"data2-core-types@Component","params":{"component":"Ceil","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"value":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}}},"component":"data2-core-types@ComponentParameter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"value"}}},"updatedAt":"2025-08-12T16:39:19.532Z","createdAt":"2022-12-29T16:43:02.834Z"},{"_id":"64a46b4ec91d9255f4275a63","component":"data2-core-types@Component","params":{"component":"Round","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"value":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}}},"component":"data2-core-types@ComponentParameter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"value"}}},"updatedAt":"2025-08-12T16:40:35.039Z","createdAt":"2022-12-29T16:43:02.834Z"},{"_id":"64a46b53c91d9255f4275ac3","component":"data2-core-types@Component","params":{"component":"Floor","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"value":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}}},"component":"data2-core-types@ComponentParameter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"value"}}},"updatedAt":"2025-08-12T16:40:00.545Z","createdAt":"2022-12-29T16:43:02.834Z"},{"_id":"64a85b11c91d9255f47c37e0","component":"data2-core-types@Component","params":{"package":"data2-core-connect","component":"HttpClient","icon":"globe","parameters":{"policies":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-auth@Policy"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"description":{"component":"data2-core-primitives@String","params":{"content":"Controls for allowing or denying access to the data"}}},"component":"data2-core-types@ComponentParameter"}},"interactions":{"params":{"fields":{"sendRequest":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Sends request"}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"params":{"fields":{"request":{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Request"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Request"}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@InstanceReference"}},"controlSettings":{"componentFilter":{"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"componentInstance"}}],"body":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"componentInstance.component"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"data2-core-connect@HttpRequest"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"componentInstance.params.parent.params.reference"}}}},"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"module.reference"}}}}},"component":"data2-core-comparison-operators@Equal"}]},"component":"data2-core-logical-operators@And"}},"break":true}}}},"requestParameters":{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Request Parameters"}},"componentOptions":{"inferredComponent":{"params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"p"}}],"body":{"params":{"component":"data2-core-primitives@Object","parameters":{"params":{"fieldsList":{"params":{"array":{"params":{"module":{"params":{"array":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"ServiceComponentInstancesDataSet"}},"_layer":{"component":"data2-core-primitives@String","params":{"content":"HostApplicationLayer"}}},"component":"data2-core-types@ProcessReference"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"c"}}],"body":{"params":{"components":[{"params":{"comparisonSubject":{"params":{"content":"data2-core-connect@HttpRequest"},"component":"data2-core-primitives@String"},"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"c.component"}}}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"p.rootExecutedInstanceParams.args.0.request"}}}},"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"c.reference"}}}}},"component":"data2-core-comparison-operators@Equal"}]},"component":"data2-core-logical-operators@And"}}}},"component":"data2-core-functions@ArrayFind"},"prop":{"component":"data2-core-primitives@String","params":{"content":"options.requestParameters"}}},"component":"data2-core-types@Getter"},"mapper":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"value"}}],"body":{"key":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"value"}}}},"prop":{"component":"data2-core-primitives@String","params":{"content":"key"}}}},"value":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"value"}}}}}}}},"component":"data2-core-functions@ArrayMap"}},"component":"data2-core-types@FieldSet"},"title":{"component":"data2-core-primitives@String","params":{"content":"Request Parameters"}}},"component":"data2-core-types@ComponentParameter"}},"component":"data2-core-functions@Function","break":true}},"visibility":"public","component":"data2-core-primitives@Inferred"}}}},"component":"data2-core-types@FieldSet"}}}]}},"getRequestParameters":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Get request parameters"}},"visibility":"private","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"params":{"fields":{"request":{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Request"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Request"}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@InstanceReference"}},"controlSettings":{"componentFilter":{"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"componentInstance"}}],"body":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"componentInstance.component"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"data2-core-connect@HttpRequest"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"componentInstance.params.parent.params.reference"}}}},"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"module.reference"}}}}},"component":"data2-core-comparison-operators@Equal"}]},"component":"data2-core-logical-operators@And"}},"break":true}}}},"requestParameters":{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Request Parameters"}},"componentOptions":{"inferredComponent":{"params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"p"}}],"body":{"params":{"component":"data2-core-primitives@Object","parameters":{"params":{"fieldsList":{"params":{"array":{"params":{"module":{"params":{"array":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"ServiceComponentInstancesDataSet"}},"_layer":{"component":"data2-core-primitives@String","params":{"content":"HostApplicationLayer"}}},"component":"data2-core-types@ProcessReference"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"c"}}],"body":{"params":{"components":[{"params":{"comparisonSubject":{"params":{"content":"data2-core-connect@HttpRequest"},"component":"data2-core-primitives@String"},"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"c.component"}}}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"p.rootExecutedInstanceParams.args.0.request"}}}},"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"c.reference"}}}}},"component":"data2-core-comparison-operators@Equal"}]},"component":"data2-core-logical-operators@And"}}}},"component":"data2-core-functions@ArrayFind"},"prop":{"component":"data2-core-primitives@String","params":{"content":"options.requestParameters"}}},"component":"data2-core-types@Getter"},"mapper":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"value"}}],"body":{"key":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"value"}}}},"prop":{"component":"data2-core-primitives@String","params":{"content":"key"}}}},"value":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"value"}}}}}}}},"component":"data2-core-functions@ArrayMap"}},"component":"data2-core-types@FieldSet"},"title":{"component":"data2-core-primitives@String","params":{"content":"Request Parameters"}}},"component":"data2-core-types@ComponentParameter"}},"component":"data2-core-functions@Function","break":true}},"visibility":"public","component":"data2-core-primitives@Inferred"}}}},"component":"data2-core-types@FieldSet"}}}]}},"getCurlCommand":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Get curl command from Request"}},"visibility":"private","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"params":{"fields":{"request":{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Request"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Request"}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@InstanceReference"}},"controlSettings":{"componentFilter":{"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"componentInstance"}}],"body":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"componentInstance.component"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"data2-core-connect@HttpRequest"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"componentInstance.params.parent.params.reference"}}}},"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"module.reference"}}}}},"component":"data2-core-comparison-operators@Equal"}]},"component":"data2-core-logical-operators@And"}},"break":true}}}},"requestParameters":{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Request Parameters"}},"componentOptions":{"inferredComponent":{"params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"p"}}],"body":{"params":{"component":"data2-core-primitives@Object","parameters":{"params":{"fieldsList":{"params":{"array":{"params":{"module":{"params":{"array":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"ServiceComponentInstancesDataSet"}},"_layer":{"component":"data2-core-primitives@String","params":{"content":"HostApplicationLayer"}}},"component":"data2-core-types@ProcessReference"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"c"}}],"body":{"params":{"components":[{"params":{"comparisonSubject":{"params":{"content":"data2-core-connect@HttpRequest"},"component":"data2-core-primitives@String"},"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"c.component"}}}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"p.rootExecutedInstanceParams.args.0.request"}}}},"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"c.reference"}}}}},"component":"data2-core-comparison-operators@Equal"}]},"component":"data2-core-logical-operators@And"}}}},"component":"data2-core-functions@ArrayFind"},"prop":{"component":"data2-core-primitives@String","params":{"content":"options.requestParameters"}}},"component":"data2-core-types@Getter"},"mapper":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"value"}}],"body":{"key":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"value"}}}},"prop":{"component":"data2-core-primitives@String","params":{"content":"key"}}}},"value":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"value"}}}}}}}},"component":"data2-core-functions@ArrayMap"}},"component":"data2-core-types@FieldSet"},"title":{"component":"data2-core-primitives@String","params":{"content":"Request Parameters"}}},"component":"data2-core-types@ComponentParameter"}},"component":"data2-core-functions@Function","break":true}},"visibility":"public","component":"data2-core-primitives@Inferred"}},"pretty":{"params":{"component":"data2-core-primitives@Boolean","defaultValue":{"params":{"content":true},"component":"data2-core-primitives@Boolean"},"title":{"component":"data2-core-primitives@String","params":{"content":"Pretty"}}},"component":"data2-core-types@ComponentParameter"},"useMocks":{"params":{"component":"data2-core-primitives@Boolean","defaultValue":{"params":{"content":false},"component":"data2-core-primitives@Boolean"},"title":{"component":"data2-core-primitives@String","params":{"content":"Use Mock"}}},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@FieldSet"}}}]}}}},"component":"data2-core-types@FieldSet"},"visibility":"public","renderable":{"dimensions":{"disabled":false,"component":"data2-core-types@Dimensions","params":{"width":1366,"exactWidth":false,"exactHeight":false,"height":768}}}},"updatedAt":"2026-01-09T17:29:47.531Z"},{"_id":"64a85b25c91d9255f47c39e7","component":"data2-core-types@Component","params":{"package":"data2-core-connect","component":"HttpRequest","icon":"envelope","visibility":"private","parameters":{"params":{"fields":{"parent":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@InstanceReference"}},"visibility":"private","index":{"component":"data2-core-primitives@Number","params":{"content":1}},"controlSettings":{"componentFilter":[{"component":"data2-core-primitives@String","params":{"content":"data2-core-connect@HttpClient"}}]}},"component":"data2-core-types@ComponentParameter"},"method":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":2}},"oneOf":[{"params":{"content":"GET"},"component":"data2-core-primitives@String"},{"params":{"content":"POST"},"component":"data2-core-primitives@String"},{"params":{"content":"PATCH"},"component":"data2-core-primitives@String"},{"params":{"content":"PUT"},"component":"data2-core-primitives@String"},{"params":{"content":"OPTIONS"},"component":"data2-core-primitives@String"},{"params":{"content":"DELETE"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"},"url":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":3}}},"component":"data2-core-types@ComponentParameter"},"headers":{"params":{"component":"data2-core-primitives@Object","index":{"component":"data2-core-primitives@Number","params":{"content":4}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"key":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"},"value":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@ComponentParameter"},"data":{"params":{"component":"data2-core-primitives@Object","index":{"component":"data2-core-primitives@Number","params":{"content":5}}},"component":"data2-core-types@ComponentParameter"},"responseType":{"params":{"component":"data2-core-primitives@String","oneOf":[{"params":{"content":"arraybuffer"},"component":"data2-core-primitives@String"},{"params":{"content":"document"},"component":"data2-core-primitives@String"},{"params":{"content":"json"},"component":"data2-core-primitives@String"},{"params":{"content":"text"},"component":"data2-core-primitives@String"},{"params":{"content":"stream"},"component":"data2-core-primitives@String"},{"params":{"content":"blob"},"component":"data2-core-primitives@String"},{"params":{"content":"blob-url"},"component":"data2-core-primitives@String"}],"index":{"component":"data2-core-primitives@Number","params":{"content":6}}},"component":"data2-core-types@ComponentParameter"},"rawResponse":{"params":{"index":{"component":"data2-core-primitives@Number","params":{"content":7}},"component":"data2-core-primitives@Boolean"},"component":"data2-core-types@ComponentParameter"},"useProxy":{"params":{"index":{"component":"data2-core-primitives@Number","params":{"content":8}},"component":"data2-core-primitives@Boolean","defaultValue":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-types@ComponentParameter"},"query":{"params":{"component":"data2-core-primitives@Object","index":{"component":"data2-core-primitives@Number","params":{"content":4.1}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"key":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"},"value":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@ComponentParameter"},"authentication":{"params":{"component":"data2-core-primitives@Object","index":{"component":"data2-core-primitives@Number","params":{"content":4.9}},"parameters":{"type":{"params":{"component":"data2-core-primitives@String","oneOf":[{"params":{"content":"Basic"},"component":"data2-core-primitives@String"},{"params":{"content":"Bearer"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"},"data":{"params":{"component":"data2-core-primitives@Object"},"component":"data2-core-types@ComponentParameter"}},"visibility":"private"},"component":"data2-core-types@ComponentParameter"},"requestParameters":{"params":{"component":"data2-core-types@PrimitiveParameter","index":{"component":"data2-core-primitives@Number","params":{"content":10}},"title":{"component":"data2-core-primitives@String","params":{"content":"Request Parameters"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"useCurl":{"params":{"index":{"component":"data2-core-primitives@Number","params":{"content":9}},"component":"data2-core-primitives@Boolean","dependsOn":[{"component":"data2-core-primitives@String","params":{"content":"useProxy"}}],"shouldShow":{"params":{"content":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"useProxy"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-primitives@Boolean","break":true}},"component":"data2-core-types@ComponentParameter"},"responseHeaderPrefix":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":6.1}}},"component":"data2-core-types@ComponentParameter"},"policies":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-auth@Policy"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"description":{"component":"data2-core-primitives@String","params":{"content":"Controls for allowing or denying access to the data"}}},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@FieldSet"},"componentOptions":{"contextPopulatedParams":{"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"p"}}],"body":{"params":{"fieldsList":{"params":{"mapper":{"params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"v"}}],"body":{"key":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"v.key"}}}},"value":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"v.mock"}}}}}},"component":"data2-core-functions@Function","break":true},"array":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"p.executedInstanceParams.requestParameters"}}}}},"component":"data2-core-functions@ArrayMap"}},"component":"data2-core-types@FieldSet"}},"break":true}}},"updatedAt":"2026-03-17T05:12:13.870Z"},{"_id":"64aca559c91d9255f4d32a50","component":"data2-core-types@Component","params":{"package":"data2-core-connect","component":"__HttpRequestBody","visibility":"private","parameters":{"params":{"fields":{"parent":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@InstanceReference"}},"visibility":"private","index":{"component":"data2-core-primitives@Number","params":{"content":1}},"controlSettings":{"componentFilter":[{"component":"data2-core-primitives@String","params":{"content":"data2-core-connect@HttpClient"}}]}},"component":"data2-core-types@ComponentParameter"},"method":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":2}},"oneOf":[{"params":{"content":"GET"},"component":"data2-core-primitives@String"},{"params":{"content":"POST"},"component":"data2-core-primitives@String"},{"params":{"content":"PATCH"},"component":"data2-core-primitives@String"},{"params":{"content":"PUT"},"component":"data2-core-primitives@String"},{"params":{"content":"OPTIONS"},"component":"data2-core-primitives@String"},{"params":{"content":"DELETE"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"},"url":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":3}}},"component":"data2-core-types@ComponentParameter"},"headers":{"params":{"component":"data2-core-primitives@Object","index":{"component":"data2-core-primitives@Number","params":{"content":4}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"key":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"},"value":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@ComponentParameter"},"data":{"params":{"component":"data2-core-primitives@Object","index":{"component":"data2-core-primitives@Number","params":{"content":5}}},"component":"data2-core-types@ComponentParameter"},"responseType":{"params":{"component":"data2-core-primitives@String","oneOf":[{"params":{"content":"arraybuffer"},"component":"data2-core-primitives@String"},{"params":{"content":"document"},"component":"data2-core-primitives@String"},{"params":{"content":"json"},"component":"data2-core-primitives@String"},{"params":{"content":"text"},"component":"data2-core-primitives@String"},{"params":{"content":"stream"},"component":"data2-core-primitives@String"},{"params":{"content":"blob"},"component":"data2-core-primitives@String"},{"params":{"content":"blob-url"},"component":"data2-core-primitives@String"}],"index":{"component":"data2-core-primitives@Number","params":{"content":6}}},"component":"data2-core-types@ComponentParameter"},"rawResponse":{"params":{"index":{"component":"data2-core-primitives@Number","params":{"content":7}},"component":"data2-core-primitives@Boolean"},"component":"data2-core-types@ComponentParameter"},"useProxy":{"params":{"index":{"component":"data2-core-primitives@Number","params":{"content":8}},"component":"data2-core-primitives@Boolean","defaultValue":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-types@ComponentParameter"},"query":{"params":{"component":"data2-core-primitives@Object","index":{"component":"data2-core-primitives@Number","params":{"content":4.1}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"key":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"},"value":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@ComponentParameter"},"authentication":{"params":{"component":"data2-core-primitives@Object","index":{"component":"data2-core-primitives@Number","params":{"content":4.9}},"parameters":{"type":{"params":{"component":"data2-core-primitives@String","oneOf":[{"params":{"content":"Basic"},"component":"data2-core-primitives@String"},{"params":{"content":"Bearer"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"},"data":{"params":{"component":"data2-core-primitives@Object"},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@FieldSet"}},"updatedAt":"2023-08-17T20:45:17.472Z"},{"_id":"64c28b135652482f13285370","component":"data2-core-types@Component","params":{"package":"data2-core-web","component":"FocusField","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"id":{"component":"data2-core-primitives@String"}}}}},"updatedAt":"2023-04-26T19:58:33.046Z"},{"_id":"64d0e185e6833f0644f07d1c","component":"data2-core-types@Component","params":{"component":"LoggerService","package":"data2-interface-services","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{}}},"title":"LoggerService","visibility":"private","icon":{"component":"data2-core-primitives@String","params":{"content":"terminal"}},"interactions":{"params":{"fields":{"log":{"params":{"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"message"}},"title":{"component":"data2-core-primitives@String","params":{"content":"message"}},"component":"data2-core-primitives@String","description":{"component":"data2-core-primitives@String","params":{"content":"Message to be logged."}},"visibility":"public","icon":{"component":"data2-core-primitives@String","params":{"content":"comment"}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","key":{"component":"data2-core-primitives@String","params":{"content":"additionalInfo"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Additional Info"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Any additional info to be logged."}},"visibility":"public"}},{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","key":{"component":"data2-core-primitives@String","params":{"content":"returnValue"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Return Value"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Value that will be returned by the function."}},"visibility":"public"}}],"icon":{"component":"data2-core-primitives@String","params":{"content":"comment"}}},"component":"data2-core-types@ComponentParameter"},"toggleShouldOutput":{"params":{"icon":{"component":"data2-core-primitives@String","params":{"content":"toggle-off"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Turns on/off logging to console."}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Boolean","key":{"component":"data2-core-primitives@String","params":{"content":"shouldOutput"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Should Output"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Optional value to set shouldOutput to. Otherwise, it just toggle on/off."}}}}]},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@FieldSet"}},"updatedAt":"2024-03-07T20:05:25.993Z","createdAt":"2023-08-07T12:20:21.648Z"},{"_id":"64d40acce4f9069248ae210a","component":"data2-core-types@Component","params":{"component":"IsArray","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"value":{"component":"data2-core-types@Getter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"value"}}},"updatedAt":"2022-12-23T18:37:07.359Z"},{"_id":"652037d0c10b43bc8fc51e44","component":"data2-core-types@Component","params":{"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-controls@CodeEditor","params":{"style":{"width":"100%","boxSizing":"border-box","background":{"params":{"components":[{"params":{"reference":"super.fill"},"component":"data2-core-types@Reference"},{"params":{"rgba":"rgba(20,20,20,1)"},"component":"data2-core-types@Color"}]},"component":"data2-core-logical-operators@Or"},"color":{"params":{"components":[{"params":{"reference":"super.textColor"},"component":"data2-core-types@Reference"},{"params":{"rgba":"rgba(255,255,255,1)"},"component":"data2-core-types@Color"}]},"component":"data2-core-logical-operators@Or"},"border":"none","outline":"none","appearance":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"orient"},"component":"data2-core-types@Reference"},"comparisonSubject":"vertical"}}],"then":"slider-vertical","else":"none"}},"cursor":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"disabled"},"component":"data2-core-types@Reference"},"comparisonSubject":true}}],"then":"not-allowed","else":"auto"}},"fontSize":{"params":{"components":[{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"super.textSize"}}},"component":"data2-core-types@Reference"},{"params":{"content":12},"component":"data2-core-primitives@Number"}]},"component":"data2-core-logical-operators@Or"},"minHeight":"100%"},"value":{"component":"data2-core-types@DataLinkGetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record"}},"mask":{"component":"data2-core-types@Reference","params":{"reference":"mask"}}}},"onChange":{"component":"data2-core-types@DataLinkSetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record"}},"recordUpsert":{"component":"data2-core-types@Reference","params":{"reference":"recordUpsert"}},"onChange":{"component":"data2-core-types@Reference","params":{"reference":"onChange"}},"mask":{"component":"data2-core-types@Reference","params":{"reference":"mask"}}}},"opacity":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"disabled"},"component":"data2-core-types@Reference"},"comparisonSubject":true}}],"then":0.38,"else":1}},"disabled":{"params":{"reference":"disabled"},"component":"data2-core-types@Reference"},"language":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"language"}}},"component":"data2-core-types@Reference"}}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"dataset":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@InteractiveModuleReference"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":91}}},"component":"data2-core-types@ComponentParameter"},"field":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetColumnReference"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":92}}},"component":"data2-core-types@ComponentParameter"},"record":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Reference"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":203}}},"component":"data2-core-types@ComponentParameter"},"recordUpsert":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":204}}},"component":"data2-core-types@ComponentParameter"},"disabled":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":205}}},"component":"data2-core-types@ComponentParameter"},"onChange":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":301}}},"component":"data2-core-types@ComponentParameter"},"language":{"params":{"component":"data2-core-primitives@String","oneOf":[{"params":{"content":"graphql"},"component":"data2-core-primitives@String"},{"params":{"content":"javascript"},"component":"data2-core-primitives@String"},{"params":{"content":"cshtml"},"component":"data2-core-primitives@String"},{"params":{"content":"markup"},"component":"data2-core-primitives@String"},{"params":{"content":"clike"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"},"tabSize":{"params":{"component":"data2-core-primitives@Number"},"component":"data2-core-types@ComponentParameter"}}}},"component":"CodeEditor","package":"data2-blocks","icon":"terminal","extends":"data2-core-primitives@Block","visibility":"public"},"updatedAt":"2024-07-30T14:12:56.704Z"},{"_id":"652dad65c10b43bc8fdc26d3","component":"data2-core-types@Component","params":{"component":"VoiceRecorderService","package":"data2-interface-services","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"dataset":{"params":{"component":"data2-core-types@InteractiveModuleReference","visibility":"public","index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"},"prop":{"params":{"component":"data2-core-user-interface@StateProp","visibility":"public","index":{"component":"data2-core-primitives@Number","params":{"content":2}}},"component":"data2-core-types@ComponentParameter"}}}},"interactions":{"params":{"fields":{"startRecording":{"params":{"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"stopRecording":{"params":{"visibility":"public"},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@FieldSet"},"icon":{"params":{"icon":"fa-microphone"},"component":"data2-core-types@FontAwesomeIcon"},"visibility":"public"},"updatedAt":"2024-09-08T22:54:15.398Z"},{"_id":"6561080acda0c21750d151cd","component":"data2-core-types@Component","params":{"product":"whatsapp","package":"data2-core-connect","component":"WhatsAppMessenger","visibility":"private","title":{"component":"data2-core-primitives@String","params":{"content":"WhatsApp Messenger"}},"icon":{"params":{"icon":"fa-whatsapp"},"component":"data2-core-types@FontAwesomeIcon"},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"provider":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Provider"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Unofficial WhatsApp provider. Currently supports 'zapi'. 'baileys' is reserved for future use."}},"index":{"component":"data2-core-primitives@Number","params":{"content":0.1}}}},"providerInstanceId":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Provider Instance ID"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Z-API instance id. Populated automatically after Allocate."}},"index":{"component":"data2-core-primitives@Number","params":{"content":0.2}},"saveCompiled":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"visibility":"private"}},"providerInstanceToken":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Provider Instance Token"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Z-API instance token. Populated automatically after Allocate. Can be rebound to a KeyVault getter for encryption at rest."}},"index":{"component":"data2-core-primitives@Number","params":{"content":0.3}},"saveCompiled":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"visibility":"private"}},"webhooks":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"Webhooks"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Per-event webhook URLs the provider POSTs to. Edit via the Renderable's Webhooks tab — each URL is pushed to Z-API individually."}},"index":{"component":"data2-core-primitives@Number","params":{"content":0.4}},"parameters":{"onReceive":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"On receive"}},"description":{"component":"data2-core-primitives@String","params":{"content":"URL called for inbound messages."}}}},"onSend":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"On send"}},"description":{"component":"data2-core-primitives@String","params":{"content":"URL called when outbound messages are accepted by the provider."}}}},"onMessageStatus":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"On message status"}},"description":{"component":"data2-core-primitives@String","params":{"content":"URL called for delivery/read receipt updates."}}}},"onConnect":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"On connect"}},"description":{"component":"data2-core-primitives@String","params":{"content":"URL called when the messenger reconnects to WhatsApp."}}}},"onDisconnect":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"On disconnect"}},"description":{"component":"data2-core-primitives@String","params":{"content":"URL called when the messenger disconnects from WhatsApp."}}}},"onPresence":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"On presence"}},"description":{"component":"data2-core-primitives@String","params":{"content":"URL called for chat presence updates (typing, online)."}}}}}}},"phoneNumber":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Phone Number"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Phone number in raw digit format (e.g. 5511939208891). Populated automatically after sign-in. Informational only."}},"index":{"component":"data2-core-primitives@Number","params":{"content":0.5}},"saveCompiled":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"visibility":"private"}},"policies":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-auth@Policy"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"description":{"component":"data2-core-primitives@String","params":{"content":"Controls for allowing or denying access to the data"}}}}}}},"interactions":{"component":"data2-core-types@FieldSet","params":{"fields":{"allocate":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Provisions a new Z-API instance for this WhatsAppMessenger. Persists the returned providerInstanceId and providerInstanceToken back to the component params. Builder-only — invokes Data2's partner billing."}},"visibility":"private","arguments":[]}},"sign":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Returns the QR code for sign-in. Pass format='image' (default) for a base64 data URL ready for <img src>, or format='payload' for the raw text encoded inside the QR (render with a local QR library)."}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Format"}},"description":{"component":"data2-core-primitives@String","params":{"content":"'image' (default) or 'payload'"}}}}]}},"getStatus":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Returns the connection status: { connected, phoneNumber? }."}},"visibility":"public","arguments":[]}},"getInstanceInfo":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Returns a dump of the underlying provider instance: name, connection status, payment status, subscription expiry, all 6 webhook URLs, and current settings (autoRead, callReject, notifySentByMe, etc.)."}},"visibility":"public","arguments":[]}},"applySettings":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Applies a partial settings update to the underlying provider instance. Provide any subset of: autoReadMessages, autoReadStatuses, autoRejectCalls, callRejectMessage, notifySentByMe, disableQueueingWhenDisconnected. Omitted fields are left unchanged. Builder-only — settings are operator-level configuration."}},"visibility":"private","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"Settings"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Partial settings object. Each field is optional — omitted fields are left unchanged."}},"parameters":{"autoReadMessages":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Boolean","title":{"component":"data2-core-primitives@String","params":{"content":"Auto-read messages"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Mark inbound messages as read automatically."}}}},"autoReadStatuses":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Boolean","title":{"component":"data2-core-primitives@String","params":{"content":"Auto-read statuses"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Mark status (story) views as read automatically."}}}},"autoRejectCalls":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Boolean","title":{"component":"data2-core-primitives@String","params":{"content":"Auto-reject calls"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Automatically reject incoming voice/video calls."}}}},"callRejectMessage":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Call-reject message"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Optional message sent to the caller after auto-rejecting a call."}}}},"notifySentByMe":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Boolean","title":{"component":"data2-core-primitives@String","params":{"content":"Notify sent-by-me"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Forward outbound webhook events for messages this instance sent."}}}},"disableQueueingWhenDisconnected":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Boolean","title":{"component":"data2-core-primitives@String","params":{"content":"Disable queueing when disconnected"}},"description":{"component":"data2-core-primitives@String","params":{"content":"When disconnected, drop sends instead of queueing them for delivery on reconnect."}}}}}}}]}},"disconnect":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Logs the messenger out of WhatsApp. The instance remains allocated."}},"visibility":"public","arguments":[]}},"configureWebhook":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Pushes the component's webhooks to the provider. Pass an explicit { onReceive, onSend, onMessageStatus, onConnect, onDisconnect, onPresence } object to override, or omit to use the saved values. Builder-only — webhook URLs are operator-level configuration."}},"visibility":"private","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"Webhooks"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Optional. Per-event URL map; omit to use the saved values."}},"parameters":{"onReceive":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"On receive"}},"description":{"component":"data2-core-primitives@String","params":{"content":"URL called for inbound messages."}}}},"onSend":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"On send"}},"description":{"component":"data2-core-primitives@String","params":{"content":"URL called when outbound messages are accepted by the provider."}}}},"onMessageStatus":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"On message status"}},"description":{"component":"data2-core-primitives@String","params":{"content":"URL called for delivery/read receipt updates."}}}},"onConnect":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"On connect"}},"description":{"component":"data2-core-primitives@String","params":{"content":"URL called when the messenger reconnects to WhatsApp."}}}},"onDisconnect":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"On disconnect"}},"description":{"component":"data2-core-primitives@String","params":{"content":"URL called when the messenger disconnects from WhatsApp."}}}},"onPresence":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"On presence"}},"description":{"component":"data2-core-primitives@String","params":{"content":"URL called for chat presence updates (typing, online)."}}}}}}}]}},"syncInstanceName":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Renames the underlying provider instance to the canonical <systemDomain>-<systemId>-<reference> format so the Z-API dashboard shows which Messenger each instance belongs to. Server computes the canonical name — no args. Idempotent. Builder-only."}},"visibility":"private","arguments":[]}},"getQueueCount":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Returns the number of outbound messages currently waiting in the Z-API send queue. Useful for monitoring backpressure or detecting a stuck instance."}},"visibility":"public","arguments":[]}},"clearQueue":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Deletes all outbound messages currently waiting in the Z-API send queue. Destructive — confirm before calling."}},"visibility":"public","arguments":[]}},"sendMessage":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Sends a WhatsApp message (text, image, video, audio, document, location, contacts, reaction)."}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-whatsapp@WhatsAppMessage","title":{"component":"data2-core-primitives@String","params":{"content":"Message"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Message payload. Use a WhatsAppMessage component or provide { to, type, text/image/video/audio/document/location/contacts/reaction }."}}}}]}},"sendText":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Sends a text message. Shortcut for sendMessage({ type: 'text', to, text })."}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"To"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Recipient phone number (raw digits, e.g. 5511939208891)."}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Text"}},"description":{"component":"data2-core-primitives@String","params":{"content":"The text message body."}}}}]}},"sendImage":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Sends an image. Provide { link } or { id } and optionally { caption }."}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"To"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Recipient phone number."}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"Image"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Image object with link or id, and optional caption."}},"parameters":{"link":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Link"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Public URL of the image."}}}},"id":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"ID"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Provider media ID."}}}},"caption":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Caption"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Optional caption for the image."}}}}}}}]}},"sendVideo":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Sends a video. Provide { link } or { id } and optionally { caption }."}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"To"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Recipient phone number."}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"Video"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Video object with link or id, and optional caption."}},"parameters":{"link":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Link"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Public URL of the video."}}}},"id":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"ID"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Provider media ID."}}}},"caption":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Caption"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Optional caption for the video."}}}}}}}]}},"sendAudio":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Sends an audio file. Provide { link } or { id }."}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"To"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Recipient phone number."}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"Audio"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Audio object with link or id."}},"parameters":{"link":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Link"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Public URL of the audio file."}}}},"id":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"ID"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Provider media ID."}}}}}}}]}},"sendDocument":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Sends a document. Provide { link } or { id } and optionally { caption, filename }."}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"To"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Recipient phone number."}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"Document"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Document object with link or id, and optional caption/filename."}},"parameters":{"link":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Link"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Public URL of the document."}}}},"id":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"ID"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Provider media ID."}}}},"caption":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Caption"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Optional caption for the document."}}}},"filename":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Filename"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Filename displayed to the recipient."}}}}}}}]}},"sendLocation":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Sends a location pin."}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"To"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Recipient phone number."}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"Location"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Location with latitude, longitude, and optional name/address."}},"parameters":{"latitude":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Number","title":{"component":"data2-core-primitives@String","params":{"content":"Latitude"}}}},"longitude":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Number","title":{"component":"data2-core-primitives@String","params":{"content":"Longitude"}}}},"name":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Name"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Name of the location."}}}},"address":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Address"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Address of the location."}}}}}}}]}},"sendContacts":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Sends one or more contact cards."}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"To"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Recipient phone number."}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"Contacts"}},"description":{"component":"data2-core-primitives@String","params":{"content":"List of contact objects following the WhatsApp contacts format."}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}}]}},"sendReaction":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Reacts to a previously-received message with an emoji."}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"To"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Recipient phone number."}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Message ID"}},"description":{"component":"data2-core-primitives@String","params":{"content":"ID of the message to react to."}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Emoji"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Reaction emoji (single character)."}}}}]}},"subscribe":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Activates the paid subscription on a trial instance. Z-API begins billing Data2's partner account ($20/month) for this instance. Pass withCalls=true to enable WhatsApp voice/video call support (if available on the partner plan). Builder-only — billing-relevant."}},"visibility":"private","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Boolean","title":{"component":"data2-core-primitives@String","params":{"content":"With Calls"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Optional. Enable voice/video call support. Defaults to false."}}}}]}},"unsubscribe":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Cancels the Z-API subscription. The instance stays usable through the end of the current billing month, then stops renewing. Does not remove the instance or clear credentials — use deleteInstance for that. Builder-only — billing-relevant."}},"visibility":"private","arguments":[]}},"deleteInstance":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Decouples the WhatsAppMessenger from its underlying provider instance: cancels the Z-API subscription, then wipes providerInstanceId, providerInstanceToken, and phoneNumber from this component so the Renderable returns to 'not allocated'. Z-API has no immediate-delete endpoint — billing for the current cycle still applies. Builder-only — destructive."}},"visibility":"private","arguments":[]}},"normalize":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"TODO: not implemented yet. Will normalize a provider webhook payload (Z-API/Baileys) into a subset of the official NormalizedEvent shape. For now, read raw fields directly in your HTTPListener flow."}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-types@Any","title":{"component":"data2-core-primitives@String","params":{"content":"Body"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Raw provider webhook body to normalize."}}}}]}},"deallocate":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Deprecated — superseded by deleteInstance, which both cancels the Z-API subscription and clears the component's credentials in one call."}},"visibility":"deprecated","arguments":[]}}}}},"definition":{"params":{"actions":[]},"component":"data2-core-flow@Series"},"renderable":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768}}}},"updatedAt":"2026-05-14T00:00:00.000Z","createdAt":"2023-11-24T19:12:01.989Z"},{"_id":"6563b437b51f410936dbba75","component":"data2-core-types@Component","params":{"component":"Trick","package":"data2-core-ai","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"code":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"code"}}}}}}}},"updatedAt":"2023-11-26T21:10:15.642Z","createdAt":"2023-11-26T21:10:15.642Z"},{"_id":"656518306640ab0923bd8bc7","component":"data2-core-types@Component","params":{"component":"Response","package":"data2-rush","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"statusCode":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Number","key":{"component":"data2-core-primitives@String","params":{"content":"statusCode"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Status Code"}},"description":{"component":"data2-core-primitives@String","params":{"content":"HTTP status code number."}}}},"data":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-types@FieldSet","key":{"component":"data2-core-primitives@String","params":{"content":"data"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Data"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Response body."}}}},"headers":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-types@FieldSet","key":{"component":"data2-core-primitives@String","params":{"content":"headers"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Headers"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Response headers."}}}}}}},"title":"Response","description":{"component":"data2-core-primitives@String","params":{"content":"Response object for usage with Rush HTTP Listener. Can be used for an early response return."}},"visibility":"public"},"updatedAt":"2023-12-12T21:00:03.992Z","createdAt":"2023-11-27T22:29:04.286Z"},{"_id":"6571d3d7a460a0092ae7cdcc","component":"data2-core-types@Component","params":{"component":"GoogleSheets","package":"data2-core-connect","parameters":{"component":"data2-core-types@FieldSet","params":{"fieldsList":[{"key":{"component":"data2-core-primitives@String","params":{"content":"spreadsheetId"}},"value":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Spreadsheet ID"}},"icon":{"params":{"icon":"fa-table"},"component":"data2-core-types@FontAwesomeIcon"},"multiLine":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"key":{"component":"data2-core-primitives@String","params":{"content":"spreadsheetId"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Google Sheets ID. Can be found in the sheet URL: \"https://docs.google.com/spreadsheets/d/SPREADSHEET_ID/\""}}},"component":"data2-core-types@ComponentParameter"}},{"key":{"component":"data2-core-primitives@String","params":{"content":"defaultSheet"}},"value":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Default Sheet"}},"icon":{"params":{"icon":"fa-newspaper-o"},"component":"data2-core-types@FontAwesomeIcon"},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}},"key":{"component":"data2-core-primitives@String","params":{"content":"defaultSheet"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Default sheet to be used by the integration."}}},"component":"data2-core-types@ComponentParameter"}},{"key":{"component":"data2-core-primitives@String","params":{"content":"policies"}},"value":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-auth@Policy"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":3}},"key":{"component":"data2-core-primitives@String","params":{"content":"policies"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Controls for allowing or denying access to the data"}}}}}]}},"title":"Google Sheets","icon":{"component":"data2-core-primitives@String","params":{"content":"google"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Data² Connect integration with Google Sheets"}},"visibility":"private","interactions":{"params":{"fieldsList":[{"key":{"component":"data2-core-primitives@String","params":{"content":"read"}},"value":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Read"}},"component":{"component":"data2-core-primitives@String","params":{"content":""}},"icon":{"params":{"icon":"fa-file-text"},"component":"data2-core-types@FontAwesomeIcon"},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","parameters":{"sheet":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Sheet"}},"component":"data2-core-primitives@String","description":{"component":"data2-core-primitives@String","params":{"content":"Optional: uses default sheet if not specified. Sheet name, such as \"Sheet1\"."}},"index":{"component":"data2-core-primitives@Number","params":{"content":15}}},"component":"data2-core-types@ComponentParameter"},"range":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Range"}},"component":"data2-core-primitives@String","description":{"component":"data2-core-primitives@String","params":{"content":"Optional. Range of cells to get, e.g., A1:B3"}},"index":{"component":"data2-core-primitives@Number","params":{"content":12}}},"component":"data2-core-types@ComponentParameter"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Read arguments"}}}}],"visibility":"private","description":{"component":"data2-core-primitives@String","params":{"content":"Read from spreadsheet"}}},"component":"data2-core-types@ComponentParameter"}},{"key":{"component":"data2-core-primitives@String","params":{"content":"append"}},"value":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Append"}},"component":{"component":"data2-core-primitives@String","params":{"content":""}},"icon":{"params":{"icon":"fa-bars"},"component":"data2-core-types@FontAwesomeIcon"},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","parameters":{"sheet":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Sheet"}},"component":"data2-core-primitives@String","description":{"component":"data2-core-primitives@String","params":{"content":"Optional: uses default sheet if not specified. Sheet name, such as \"Sheet1\"."}},"index":{"component":"data2-core-primitives@Number","params":{"content":15}}},"component":"data2-core-types@ComponentParameter"},"range":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Range"}},"component":"data2-core-primitives@String","description":{"component":"data2-core-primitives@String","params":{"content":"Optional. Range of cells to get, e.g., A1:B3"}},"index":{"component":"data2-core-primitives@Number","params":{"content":12}}},"component":"data2-core-types@ComponentParameter"},"values":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Values"}},"component":"data2-core-primitives@String","description":{"component":"data2-core-primitives@String","params":{"content":"Required. Values to be appended."}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Arguments"}}}}],"visibility":"private","description":{"component":"data2-core-primitives@String","params":{"content":"Append to sheet"}}},"component":"data2-core-types@ComponentParameter"}}]},"component":"data2-core-types@FieldSet"}},"updatedAt":"2026-08-07T22:18:22.611Z","createdAt":"2023-12-07T14:16:55.317Z"},{"_id":"65843017d3014e092deb5682","component":"data2-core-types@Component","params":{"component":"FindNearestPoint","package":"data2-core-ai","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"queryVector":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Number","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}},"dataVectors":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Number","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}}}}},"title":"FindNearestPoint"},"updatedAt":"2023-12-21T12:37:18.664Z","createdAt":"2023-12-21T12:31:19.622Z"},{"_id":"65c66e404a7aa1092f048791","component":"data2-core-types@Component","params":{"component":"CSVStringify","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"data":{"params":{"component":"data2-core-types@Getter","index":{"component":"data2-core-primitives@Number","params":{"content":0}},"description":{"component":"data2-core-primitives@String","params":{"content":"Can be any of:\n- An array of arrays\n- An array of objects\n- An object explicitly defining fields and data"}}},"component":"data2-core-types@ComponentParameter"},"config":{"params":{"description":{"component":"data2-core-primitives@String","params":{"content":"Optional config parameters"}},"visibility":"beta","component":"data2-core-primitives@Object","parameters":{"columns":{"params":{"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"component":"data2-core-primitives@String","description":{"component":"data2-core-primitives@String","params":{"content":"If data is an array of objects this option can be used to manually specify the keys (columns) you expect in the objects. If not set the keys of the first objects are used as column."}}},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2025-07-15T21:18:05.674Z","createdAt":"2024-02-09T18:26:08.542Z"},{"_id":"65c66ea74a7aa1092f04893b","component":"data2-core-types@Component","params":{"component":"CSVParse","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"csv":{"params":{"component":"data2-core-primitives@String","description":{"component":"data2-core-primitives@String","params":{"content":"CSV string to parse"}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}}},"component":"data2-core-types@ComponentParameter"},"config":{"params":{"component":"data2-core-primitives@Object","description":{"component":"data2-core-primitives@String","params":{"content":"Optional config parameters"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"visibility":"private"},"component":"data2-core-types@ComponentParameter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"csv"}}},"updatedAt":"2026-01-06T19:47:24.607Z","createdAt":"2024-02-09T18:27:51.195Z"},{"_id":"65cd210b3ad594d4f1b110db","component":"data2-core-types@Component","params":{"package":"data2-rush","component":"ScheduleTimezone","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"content":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"defaultValue":{"params":{"module":{"params":{"module":{"params":{"module":{"params":{"module":{"params":{},"component":"data2-core-web@Window"},"prop":{"component":"data2-core-primitives@String","params":{"content":"Intl"}}},"component":"data2-core-types@Getter"},"prop":{"component":"data2-core-primitives@String","params":{"content":"DateTimeFormat"}}},"component":"data2-core-types@Getter"},"prop":{"component":"data2-core-primitives@String","params":{"content":"resolvedOptions"}}},"component":"data2-core-types@Getter"},"prop":{"component":"data2-core-primitives@String","params":{"content":"timeZone"}}},"component":"data2-core-types@Getter"}},"component":"data2-core-types@ComponentParameter"}}}},"title":{"component":"data2-core-primitives@String","params":{"content":"ScheduleTimezone"}},"icon":"globe","visibility":"private"},"updatedAt":"2024-02-14T20:46:26.569Z"},{"_id":"65f330e71902cc41389b7130","component":"data2-core-types@Component","params":{"visibility":"public","package":"data2-core-functions","component":"Template","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"string":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":0}}},"component":"data2-core-types@ComponentParameter"},"data":{"params":{"component":"data2-core-primitives@Object","index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"string"}}},"updatedAt":"2024-03-14T17:19:26.546Z"},{"_id":"6622d92cb9f5c5ee69ae48d9","component":"data2-core-types@Component","params":{"component":"IsDate","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"value":{"component":"data2-core-types@Getter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"value"}}},"createdAt":"2024-04-19T18:37:07.359Z"},{"_id":"6622d92cb9f5c5ee69ae48da","component":"data2-core-types@Component","params":{"component":"IsNumber","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"value":{"component":"data2-core-types@Getter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"value"}}},"createdAt":"2024-04-19T18:37:07.359Z"},{"_id":"6622d92cb9f5c5ee69ae48db","component":"data2-core-types@Component","params":{"component":"IsNaN","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"value":{"component":"data2-core-types@Getter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"value"}}},"createdAt":"2024-04-19T18:37:07.359Z"},{"_id":"6622d92cb9f5c5ee69ae48dc","component":"data2-core-types@Component","params":{"component":"IsBoolean","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"value":{"component":"data2-core-types@Getter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"value"}}},"createdAt":"2024-04-19T18:37:07.359Z"},{"_id":"6622d92cb9f5c5ee69ae48dd","component":"data2-core-types@Component","params":{"component":"IsString","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"value":{"component":"data2-core-types@Getter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"value"}}},"createdAt":"2024-04-19T18:37:07.359Z"},{"_id":"6622d92cb9f5c5ee69ae48de","component":"data2-core-types@Component","params":{"component":"IsFunction","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"value":{"component":"data2-core-types@Getter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"value"}}},"createdAt":"2024-04-19T18:37:07.359Z"},{"_id":"6622d92cb9f5c5ee69ae48df","component":"data2-core-types@Component","params":{"component":"IsObject","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"value":{"component":"data2-core-types@Getter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"value"}}},"createdAt":"2024-04-19T18:37:07.359Z"},{"_id":"6622d92cb9f5c5ee69ae48e0","component":"data2-core-types@Component","params":{"component":"IsNil","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"value":{"component":"data2-core-types@Getter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"value"}}},"createdAt":"2024-04-19T18:37:07.359Z"},{"_id":"662a6de2552f2dfd5436b6e8","component":"data2-core-types@Component","params":{"component":"FileToBase64","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"file":{"params":{"component":"data2-core-primitives@String","description":{"component":"data2-core-primitives@String","params":{"content":"File to transform to Base64"}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}}},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2024-04-25T18:27:51.195Z","createdAt":"2024-04-25T18:27:51.195Z"},{"_id":"664f6d54295cba31f58e7f65","component":"data2-core-types@Component","params":{"component":"FileFromBase64","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"base64":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":1}}}},"contentType":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":3}}}},"fileName":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":2}}}}}}}},"updatedAt":"2024-05-23T16:46:40.691Z","createdAt":"2024-04-25T18:27:51.195Z"},{"_id":"66de4e734d41709d67075e72","component":"data2-core-types@Component","params":{"component":"JwtDecode","package":"data2-core-id","parameters":{"payload":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}}}},"privateKey":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}}}},"visibility":"public"},"updatedAt":"2025-01-16T00:39:01.440Z","createdAt":"2024-09-09T01:25:07.915Z"},{"_id":"66fdb019e3b3600723092662","component":"data2-core-types@Component","params":{"package":"data2-core-web","component":"ScrollTo","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"id":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"},"position":{"params":{"component":"data2-core-primitives@String","oneOf":[{"params":{"content":"top"},"component":"data2-core-primitives@String"},{"params":{"content":"bottom"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2024-10-02T20:52:49.035Z"},{"_id":"66ff1dfafb9eca40c1f6bf2b","component":"data2-core-types@Component","params":{"component":"FileUrlToBase64","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"url":{"params":{"component":"data2-core-primitives@String","description":{"component":"data2-core-primitives@String","params":{"content":"File to transform to Base64"}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}}},"component":"data2-core-types@ComponentParameter"}}}}}},{"_id":"67281c95143117b8d9289926","component":"data2-core-types@Component","params":{"component":"LocalAssistant","package":"data2-core-ai","parameters":{},"title":"LocalAssistant","interactions":{"initialize":{"params":{},"component":"data2-core-types@ComponentParameter"}}},"updatedAt":"2024-11-04T01:00:05.769Z","createdAt":"2024-11-04T01:00:05.769Z"},{"_id":"672a3925c363a5d578b62dd1","component":"data2-core-types@Component","params":{"component":"CsvToXlsx","package":"data2-core-media","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"input":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String"}}}}},"title":"CsvToXlsx"},"updatedAt":"2024-11-05T15:26:55.971Z","createdAt":"2024-11-05T15:26:29.873Z"},{"_id":"673147f169fb93907bee351a","component":"data2-core-types@Component","params":{"component":"PowerCordSocket","package":"data2-core-connect","parameters":{"clientId":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String"}},"onMessage":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-types@Interaction"}},"onError":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-types@Interaction"}},"onOpen":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-types@Interaction"}},"onClose":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-types@Interaction"}},"autoConnect":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Boolean","defaultValue":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}}}},"interactions":{"connect":{"component":"data2-core-types@ComponentParameter","params":{}},"close":{"component":"data2-core-types@ComponentParameter","params":{}},"subscribe":{"component":"data2-core-types@ComponentParameter","params":{"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"room"}},"component":"data2-core-primitives@String"}}]}},"emit":{"component":"data2-core-types@ComponentParameter","params":{"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":""}},"title":{"component":"data2-core-primitives@String","params":{"content":"event"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@ComponentParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":""}},"title":{"component":"data2-core-primitives@String","params":{"content":"room"}},"component":"data2-core-primitives@String"}}]}},"unsubscribe":{"component":"data2-core-types@ComponentParameter","params":{"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"room"}},"component":"data2-core-primitives@String"}}]}}}},"updatedAt":"2025-01-14T03:22:44.768Z","createdAt":"2024-11-10T23:55:29.737Z"},{"_id":"674fc22e14eb9637921bb979","component":"data2-core-types@Component","params":{"component":"SmartSwitch","package":"data2-core-ai","icon":"user","interactions":{"detectUseCase":{"params":{"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Prompt"}},"key":{"component":"data2-core-primitives@String","params":{"content":"prompt"}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Goal"}},"key":{"component":"data2-core-primitives@String","params":{"content":"goal"}}}},{"component":"data2-core-types@ComponentParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"useCaseLabelKey"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Use Case Label Key"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@ComponentParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"useCases"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Use Cases List"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"component":"data2-core-primitives@Object"}}]},"component":"data2-core-types@ComponentParameter"}},"renderable":{"dimensions":{"disabled":false,"component":"data2-core-types@Dimensions","params":{"width":1360,"height":800,"exactWidth":false,"exactHeight":false}}}},"updatedAt":"2024-12-15T18:10:01.772Z","createdAt":"2024-12-04T02:45:02.609Z"},{"_id":"679bdf4eec1c10c0d55723e2","component":"data2-core-types@Component","params":{"component":"UriDecode","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"string":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}},"component":"data2-core-types@ComponentParameter"}}}},"title":"UriDecode"},"updatedAt":"2025-01-30T23:57:23.463Z","createdAt":"2025-01-30T23:56:15.292Z"},{"_id":"679bdf60ec1c10c0d55723e3","component":"data2-core-types@Component","params":{"component":"UriEncode","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"string":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}},"component":"data2-core-types@ComponentParameter"}}}},"title":"UriEncode"},"updatedAt":"2025-01-30T23:57:23.463Z","createdAt":"2025-01-30T23:56:15.292Z"},{"_id":"67aea2591088ff6d51215d09","component":"data2-core-types@Component","params":{"component":"VoiceActivityRecorderService","package":"data2-interface-services","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{}}},"title":"VoiceActivityRecorderService","visibility":"private","interactions":{"start":{"params":{},"component":"data2-core-types@ComponentParameter"},"stop":{"params":{},"component":"data2-core-types@ComponentParameter"}}},"updatedAt":"2025-02-14T02:01:45.056Z","createdAt":"2025-02-14T01:54:33.951Z"},{"_id":"67b3ec882b4fa5f211409520","component":"data2-core-types@Component","params":{"component":"HttpRequestBody","package":"data2-core-connect","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"type":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","oneOf":[{"params":{"content":"raw"},"component":"data2-core-primitives@String"},{"params":{"content":"binary"},"component":"data2-core-primitives@String"},{"params":{"content":"form-data"},"component":"data2-core-primitives@String"},{"params":{"content":"x-www-form-urlencoded"},"component":"data2-core-primitives@String"},{"params":{"content":"graphql"},"component":"data2-core-primitives@String"}]}},"file":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-types@FileComponentUrlReference","dependsOn":[{"component":"data2-core-primitives@String","params":{"content":"type"}}],"shouldShow":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"type"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"binary"}}},"component":"data2-core-comparison-operators@Equal"}}},"form":{"component":"data2-core-types@ComponentParameter","params":{"component":"http@FormData","dependsOn":[{"component":"data2-core-primitives@String","params":{"content":"type"}}],"shouldShow":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"type"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"form-data"}}},"component":"data2-core-comparison-operators@Equal"}}},"data":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","dependsOn":[{"component":"data2-core-primitives@String","params":{"content":"type"}}],"shouldShow":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"type"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"raw"}}},"component":"data2-core-comparison-operators@Equal"}}},"urlEncodedForm":{"component":"data2-core-types@ComponentParameter","params":{"component":"http@UrlEncodedFormData","dependsOn":[{"component":"data2-core-primitives@String","params":{"content":"type"}}],"shouldShow":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"type"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"x-www-form-urlencoded"}}},"component":"data2-core-comparison-operators@Equal"}}},"graphQlQuery":{"component":"data2-core-types@ComponentParameter","params":{"component":"http@GraphQLQuery","dependsOn":[{"component":"data2-core-primitives@String","params":{"content":"type"}}],"shouldShow":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"type"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"graphql"}}},"component":"data2-core-comparison-operators@Equal"}}}}}},"inlineParamsControl":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"updatedAt":"2025-02-18T02:56:07.495Z","createdAt":"2025-02-18T02:12:24.441Z"},{"_id":"67ca3615a93fb9cbb7c8fa17","component":"data2-core-types@Component","params":{"component":"DataViz","package":"data2-controls","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"data":{"component":"data2-core-types@ComponentParameter","params":{}}}}},"title":"DataViz"},"updatedAt":"2025-03-06T23:56:05.086Z","createdAt":"2025-03-06T23:56:05.086Z"},{"_id":"67ca36a1a93fb9cbb7c9009a","component":"data2-core-types@Component","params":{"component":"BlockDataViz","package":"data2-blocks","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"dataset":{"params":{"component":"data2-core-types@InteractiveModuleReference"},"component":"data2-core-types@ComponentParameter"},"idField":{"params":{"component":"data2-core-types@DataSetColumnReference"},"component":"data2-core-types@ComponentParameter"},"parentField":{"params":{"component":"data2-core-types@DataSetColumnReference"},"component":"data2-core-types@ComponentParameter"}}}},"icon":"line-chart","visibility":"public","extends":"data2-core-primitives@Block","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-controls@DataViz","params":{"parentField":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"parentField"}}}},"idField":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"idField"}}}},"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}}}}}},"public":true},"updatedAt":"2025-03-07T00:34:19.780Z","createdAt":"2025-03-06T23:58:25.536Z"},{"_id":"67ead981f5b5deb2f8ba1f01","component":"data2-core-types@Component","params":{"product":"rush","package":"data2-rush","component":"EmailListener","icon":"envelope","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"handler":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Handler"}},"icon":{"params":{"icon":"fa-play-circle-o"},"component":"data2-core-types@FontAwesomeIcon"},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-flow@Series"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Actions that are executed by the listener. The following parameters are accessible by using Reference: `body`, `headers`, `query` and `method`."}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}}},"component":"data2-core-types@ComponentParameter"},"attachmentsDrive":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-types@DriveReference","key":{"component":"data2-core-primitives@String","params":{"content":"attachmentsDrive"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Attachments Drive"}},"description":{"component":"data2-core-primitives@String","params":{"content":"This parameter is used to save the emails' attachments. It should be auto-populated when the listener is created."}},"visibility":"private","defaultValue":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DriveReference"}},"params":{"reference":{"params":{"portions":[{"component":"data2-core-primitives@String","params":{"content":"d2-rush-email-drive--"}},{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"reference"}}}}]},"component":"data2-core-functions@StringConcat"}}},"component":"data2-core-types@ComponentDefinition"}}},"insertLogsDataSet":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-types@DataSetReference","key":{"component":"data2-core-primitives@String","params":{"content":"insertLogsDataSet"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Insert Logs DataSet"}},"description":{"component":"data2-core-primitives@String","params":{"content":"This parameter is used to save the execution logs. It should be auto-populated when the listener is created."}},"visibility":"private","defaultValue":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetReference"}},"params":{"reference":{"params":{"portions":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"reference"}}}},{"component":"data2-core-primitives@String","params":{"content":"LogInsertDataSet"}}]},"component":"data2-core-functions@StringConcat"}}},"component":"data2-core-types@ComponentDefinition"}}},"readLogsDataSet":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-types@DataSetReference","key":{"component":"data2-core-primitives@String","params":{"content":"readLogsDataSet"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Read Logs DataSet"}},"description":{"component":"data2-core-primitives@String","params":{"content":"This parameter is used by the renderable to show the listener execution logs. It should be auto-populated when the listener is created."}},"visibility":"private","defaultValue":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetReference"}},"params":{"reference":{"params":{"portions":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"reference"}}}},{"component":"data2-core-primitives@String","params":{"content":"LogReadDataSet"}}]},"component":"data2-core-functions@StringConcat"}}},"component":"data2-core-types@ComponentDefinition"}}},"enableExecutionLogs":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Boolean","key":{"component":"data2-core-primitives@String","params":{"content":"enableExecutionLogs"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Enable Execution Logs"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Controls whether the listener will save execution logs."}},"visibility":"public","index":{"component":"data2-core-primitives@Number","params":{"content":1}},"unversioned":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"defaultValue":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}}},"emailAliases":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","key":{"component":"data2-core-primitives@String","params":{"content":"emailAliases"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Email aliases"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Custom email names that route to this handler, like support@yourdomain.data2.email. Must be unique, otherwise conflicts may happen."}},"saveCompiled":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"unversioned":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"fieldValidation":{"disabled":true,"component":"data2-core-functions@Function","params":{}},"visibility":"public"}}}}},"inlineParamsControl":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"renderable":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768,"exactWidth":1366,"exactHeight":768}}}},"updatedAt":"2025-04-03T17:43:37.182Z","createdAt":"2025-03-31T17:59:15.868Z"},{"_id":"67fd48946f69d741e3f3349b","component":"data2-core-types@Component","params":{"component":"ObjectId","package":"data2-core-primitives","parameters":{"component":"data2-core-types@FieldSet","params":{}},"visibility":"public"},"updatedAt":"2025-04-14T17:39:50.723Z","createdAt":"2025-04-14T17:39:50.723Z"},{"_id":"6841e951f220c5f37f02d9bf","component":"data2-core-types@Component","params":{"component":"AwsService","package":"data2-core-connect","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"region":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"},"accessKey":{"params":{"component":"data2-core-types@Getter","index":{"component":"data2-core-primitives@Number","params":{"content":2}}},"component":"data2-core-types@ComponentParameter"},"secret":{"params":{"component":"data2-core-types@Getter","index":{"component":"data2-core-primitives@Number","params":{"content":3}}},"component":"data2-core-types@ComponentParameter"},"policies":{"params":{"component":"data2-core-auth@Policy","index":{"component":"data2-core-primitives@Number","params":{"content":5}},"category":"behaviour","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}}}},"title":"AWSService","icon":{"component":"data2-core-primitives@String","params":{"content":"cubes"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Data² Connect integration with AWS Services"}},"visibility":"private","interactions":{"params":{"fields":{"s3Put":{"params":{"component":"data2-core-functions@Function","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","parameters":{"bucket":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":1}},"title":{"component":"data2-core-primitives@String","params":{"content":"bucket"}}},"component":"data2-core-types@ComponentParameter"},"key":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":2}},"title":{"component":"data2-core-primitives@String","params":{"content":"key"}}},"component":"data2-core-types@ComponentParameter"},"content":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":3}},"title":{"component":"data2-core-primitives@String","params":{"content":"content"}}},"component":"data2-core-types@ComponentParameter"},"contentType":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":4}},"title":{"component":"data2-core-primitives@String","params":{"content":"contentType"}}},"component":"data2-core-types@ComponentParameter"}},"flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}}]},"component":"data2-core-types@ComponentParameter"},"athenaQuery":{"params":{"component":"data2-core-functions@Function","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","parameters":{"query":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":2}},"title":{"component":"data2-core-primitives@String","params":{"content":"query"}}},"component":"data2-core-types@ComponentParameter"},"database":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":1}},"title":{"component":"data2-core-primitives@String","params":{"content":"database"}}},"component":"data2-core-types@ComponentParameter"},"outputLocation":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":10}},"title":{"component":"data2-core-primitives@String","params":{"content":"outputLocation"}}},"component":"data2-core-types@ComponentParameter"}},"flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}}]},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@FieldSet"}},"updatedAt":"2025-06-05T19:04:57.303Z","createdAt":"2025-06-05T14:16:55.317Z"},{"_id":"68434278f220c5f37fa04db4","component":"data2-core-types@Component","params":{"component":"FileBinary","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"value":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"},"filename":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":2}}},"component":"data2-core-types@ComponentParameter"},"contentType":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":3}}},"component":"data2-core-types@ComponentParameter"},"as":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":3}},"oneOf":[{"params":{"content":"auto"},"component":"data2-core-primitives@String"},{"params":{"content":"buffer"},"component":"data2-core-primitives@String"},{"params":{"content":"blob"},"component":"data2-core-primitives@String"},{"params":{"content":"file"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"private"},"updatedAt":"2025-06-06T19:49:14.785Z","createdAt":"2024-04-25T18:27:51.195Z"},{"_id":"6877ef4b8581eedc3b65c764","component":"data2-core-types@Component","params":{"component":"PhoneListener","package":"data2-rush","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"handler":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Handler"}},"icon":{"params":{"icon":"fa-play-circle-o"},"component":"data2-core-types@FontAwesomeIcon"},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-flow@Series"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Actions that are executed by the listener. The following parameters are accessible by using Reference: `body`, `headers`, `query` and `method`."}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}}},"component":"data2-core-types@ComponentParameter"},"attachmentsDrive":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-types@DriveReference","key":{"component":"data2-core-primitives@String","params":{"content":"attachmentsDrive"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Attachments Drive"}},"description":{"component":"data2-core-primitives@String","params":{"content":"This parameter is used to save the emails' attachments. It should be auto-populated when the listener is created."}},"visibility":"private","defaultValue":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DriveReference"}},"params":{"reference":{"params":{"portions":[{"component":"data2-core-primitives@String","params":{"content":"d2-rush-email-drive--"}},{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"reference"}}}}]},"component":"data2-core-functions@StringConcat"}}},"component":"data2-core-types@ComponentDefinition"}}},"insertLogsDataSet":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-types@DataSetReference","key":{"component":"data2-core-primitives@String","params":{"content":"insertLogsDataSet"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Insert Logs DataSet"}},"description":{"component":"data2-core-primitives@String","params":{"content":"This parameter is used to save the execution logs. It should be auto-populated when the listener is created."}},"visibility":"private","defaultValue":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetReference"}},"params":{"reference":{"params":{"portions":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"reference"}}}},{"component":"data2-core-primitives@String","params":{"content":"LogInsertDataSet"}}]},"component":"data2-core-functions@StringConcat"}}},"component":"data2-core-types@ComponentDefinition"}}},"readLogsDataSet":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-types@DataSetReference","key":{"component":"data2-core-primitives@String","params":{"content":"readLogsDataSet"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Read Logs DataSet"}},"description":{"component":"data2-core-primitives@String","params":{"content":"This parameter is used by the renderable to show the listener execution logs. It should be auto-populated when the listener is created."}},"visibility":"private","defaultValue":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetReference"}},"params":{"reference":{"params":{"portions":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"reference"}}}},{"component":"data2-core-primitives@String","params":{"content":"LogReadDataSet"}}]},"component":"data2-core-functions@StringConcat"}}},"component":"data2-core-types@ComponentDefinition"}}},"enableExecutionLogs":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Boolean","key":{"component":"data2-core-primitives@String","params":{"content":"enableExecutionLogs"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Enable Execution Logs"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Controls whether the listener will save execution logs."}},"visibility":"public","index":{"component":"data2-core-primitives@Number","params":{"content":1}},"unversioned":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"defaultValue":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}}},"emailAliases":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","key":{"component":"data2-core-primitives@String","params":{"content":"emailAliases"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Email aliases"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Custom email names that route to this handler, like support@yourdomain.data2.email. Must be unique, otherwise conflicts may happen."}},"saveCompiled":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"unversioned":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"fieldValidation":{"disabled":true,"component":"data2-core-functions@Function","params":{}},"visibility":"public"}}}}},"inlineParamsControl":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"icon":{"component":"data2-core-primitives@String","params":{"content":"phone"}},"product":"rush","renderable":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768,"exactWidth":1366,"exactHeight":768}}},"interactions":{"sendDTMF":{"component":"data2-core-types@ComponentDefinition","params":{"params":{"sequence":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"},"digitInterval":{"params":{"component":"data2-core-primitives@Number"},"component":"data2-core-types@ComponentParameter"},"digitDuration":{"params":{"component":"data2-core-primitives@Number"},"component":"data2-core-types@ComponentParameter"},"method":{"params":{"component":"data2-core-primitives@String","oneOf":[{"params":{"content":"rfc2833"},"component":"data2-core-primitives@String"},{"params":{"content":"audio"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"},"callId":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"}}}},"hangup":{"component":"data2-core-types@ComponentDefinition","params":{"params":{"callId":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"}}}}}},"updatedAt":"2025-08-16T20:16:23.118Z","createdAt":"2025-07-16T18:28:27.757Z"},{"_id":"68a62bfd308004bab53fdec1","component":"data2-core-types@Component","params":{"component":"Encrypt","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"value":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"},"password":{"params":{"component":"data2-core-primitives@String","shouldShow":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"type"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"symmetrical"}}},"component":"data2-core-comparison-operators@Equal"}},"component":"data2-core-types@ComponentParameter"},"salt":{"params":{"component":"data2-core-primitives@String","shouldShow":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"type"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"symmetrical"}}},"component":"data2-core-comparison-operators@Equal"}},"component":"data2-core-types@ComponentParameter"},"publicKey":{"params":{"component":"data2-core-primitives@String","multiLine":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"shouldShow":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"type"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"asymmetrical"}}},"component":"data2-core-comparison-operators@Equal"}},"component":"data2-core-types@ComponentParameter"},"type":{"params":{"component":"data2-core-primitives@String","defaultValue":{"params":{"content":"symmetrical"},"component":"data2-core-primitives@String"},"oneOf":[{"params":{"content":"symmetrical"},"component":"data2-core-primitives@String"},{"params":{"content":"asymmetrical"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"private"},"updatedAt":"2025-08-27T16:01:09.327Z","createdAt":"2025-08-20T20:11:41.740Z"},{"_id":"68a65ef11fce3aa94f670af8","component":"data2-core-types@Component","params":{"component":"Decrypt","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"value":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"},"password":{"params":{"component":"data2-core-primitives@String","shouldShow":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"type"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"symmetrical"}}},"component":"data2-core-comparison-operators@Equal"}},"component":"data2-core-types@ComponentParameter"},"salt":{"params":{"component":"data2-core-primitives@String","shouldShow":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"type"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"symmetrical"}}},"component":"data2-core-comparison-operators@Equal"}},"component":"data2-core-types@ComponentParameter"},"privateKey":{"params":{"component":"data2-core-primitives@String","multiLine":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"shouldShow":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"type"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"asymmetrical"}}},"component":"data2-core-comparison-operators@Equal"}},"component":"data2-core-types@ComponentParameter"},"type":{"params":{"component":"data2-core-primitives@String","defaultValue":{"params":{"content":"symmetrical"},"component":"data2-core-primitives@String"},"oneOf":[{"params":{"content":"symmetrical"},"component":"data2-core-primitives@String"},{"params":{"content":"asymmetrical"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"private"},"updatedAt":"2025-08-27T16:02:35.313Z","createdAt":"2025-08-20T23:49:05.596Z"},{"_id":"68b1d255ac2138dbd7b33469","component":"data2-core-types@Component","params":{"component":"HexToString","package":"data2-core-functions","parameters":{"hex":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String"}}},"title":"HexToString"},"updatedAt":"2025-08-29T16:16:57.005Z","createdAt":"2025-08-29T16:16:21.501Z"},{"_id":"68b71f27d84239013ed8c0a9","component":"data2-core-types@Component","params":{"component":"Return","package":"data2-core-flow","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"result":{"params":{"component":"data2-core-types@Reference"},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"public"},"updatedAt":"2026-04-06T13:00:35.612Z","createdAt":"2025-09-02T16:45:27.971Z"},{"_id":"68c35f63911fcc052ff8fca2","component":"data2-core-types@Component","params":{"component":"XMLParse","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"text":{"params":{"component":"data2-core-primitives@String","multiLine":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"private"},"updatedAt":"2025-09-11T23:46:43.049Z","createdAt":"2025-09-11T23:46:43.049Z"},{"_id":"68c4584b8870ff8fa3752f81","component":"data2-core-types@Component","params":{"component":"XMLStringify","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"value":{"params":{"component":"data2-core-primitives@Object"},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"private"},"updatedAt":"2025-09-12T17:29:53.564Z","createdAt":"2025-09-12T17:28:43.875Z"},{"_id":"68d6f4b9986de5abfa480e4e","component":"data2-core-types@Component","params":{"component":"Throttle","package":"data2-core-flow","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"action":{"params":{"component":"data2-core-flow@Series","description":{"component":"data2-core-primitives@String","params":{"content":"The core action or function to be debounced."}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"},"wait":{"params":{"component":"data2-core-primitives@Number","index":{"component":"data2-core-primitives@Number","params":{"content":2}},"description":{"component":"data2-core-primitives@String","params":{"content":"The debounce delay in milliseconds. Invocations within this window are ignored (except for leading edge if enabled), and the action executes once at the end of the window using the most recent event."}}},"component":"data2-core-types@ComponentParameter"},"leading":{"params":{"component":"data2-core-primitives@Boolean","index":{"component":"data2-core-primitives@Number","params":{"content":3}},"description":{"component":"data2-core-primitives@String","params":{"content":"If true, executes the action immediately on the first invocation (leading edge), then resets the timer. Subsequent calls within wait are ignored until the timer completes. Useful for immediate feedback in UX flows like search inputs."}}},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"private"},"updatedAt":"2025-11-25T15:32:58.062Z","createdAt":"2025-09-26T20:16:57.835Z"},{"_id":"68ffd0db16a54e797472f6f0","component":"data2-core-types@Component","params":{"component":"Debounce","package":"data2-core-flow","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"wait":{"params":{"component":"data2-core-primitives@Number","index":{"component":"data2-core-primitives@Number","params":{"content":2}},"description":{"component":"data2-core-primitives@String","params":{"content":"The throttle window in milliseconds. The action executes at most once per interval, based on leading/trailing rules, using the latest event in the window."}}},"component":"data2-core-types@ComponentParameter"},"action":{"params":{"component":"data2-core-types@InteractiveModuleReference","description":{"component":"data2-core-primitives@String","params":{"content":"The core action or function to be throttled."}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"},"leading":{"params":{"component":"data2-core-primitives@Boolean","index":{"component":"data2-core-primitives@Number","params":{"content":3}},"description":{"component":"data2-core-primitives@String","params":{"content":"If true, triggers execution immediately on the first call within a window (leading edge). Any pending trailing timeout is cleared to avoid overlap. Ideal for responsive starts in events like scrolling."}}},"component":"data2-core-types@ComponentParameter"},"trailing":{"params":{"component":"data2-core-primitives@Boolean","index":{"component":"data2-core-primitives@Number","params":{"content":4}},"description":{"component":"data2-core-primitives@String","params":{"content":"If true, schedules an execution at the end of the window if no leading fire occurred or if calls continue. Uses remaining time calculation for precise alignment. Ensures the final event in a burst isn't dropped."}}},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"private"},"updatedAt":"2025-11-25T15:31:27.209Z","createdAt":"2025-10-27T20:06:51.565Z"},{"_id":"68ffe12b6869727b970b02f4","component":"data2-core-types@Component","params":{"component":"ArrayReverse","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"array":{"params":{"component":"data2-core-primitives@String","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"private","wrap":{"component":"data2-core-primitives@String","params":{"content":"array"}}},"updatedAt":"2025-11-03T17:29:35.028Z","createdAt":"2025-10-27T21:16:27.773Z"},{"_id":"6903958a31c63269886baf19","component":"data2-core-types@Component","params":{"component":"FocusElement","package":"data2-core-web","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"ariaLabel":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"},"id":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"},"className":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"},"selector":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2025-10-30T19:08:03.880Z","createdAt":"2025-10-30T16:42:50.422Z"},{"_id":"690a349e378338d21a37c35f","component":"data2-core-types@Component","params":{"component":"DecryptMetaFlowPayload","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"payload":{"params":{"component":"data2-core-primitives@Object"},"component":"data2-core-types@ComponentParameter"},"privateKey":{"params":{"component":"data2-core-primitives@String","multiLine":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"public"},"updatedAt":"2026-07-08T17:06:38.336Z","createdAt":"2025-11-04T17:11:55.738Z"},{"_id":"690c9114ae4d6d06f917016a","component":"data2-core-types@Component","params":{"component":"EncryptMetaFlowPayload","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"data":{"params":{"component":"data2-core-primitives@Object"},"component":"data2-core-types@ComponentParameter"},"aesKeyBuffer":{"params":{"component":"data2-core-primitives@String","multiLine":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"initialVectorBuffer":{"params":{"component":"data2-core-primitives@String","multiLine":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"public"},"updatedAt":"2026-07-08T17:07:22.363Z","createdAt":"2025-11-06T12:14:12.743Z"},{"_id":"691356d5c94a87fcd0569df8","component":"data2-core-types@Component","params":{"component":"MarkdownToHTML","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"markdown":{"params":{"component":"data2-core-primitives@String","multiLine":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"private"},"updatedAt":"2025-11-11T15:31:33.649Z","createdAt":"2025-11-11T15:31:33.649Z"},{"_id":"6924f95e15f85827e134aeeb","component":"data2-core-types@Component","params":{"component":"XlsxToCsv","package":"data2-core-media","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"input":{"params":{"component":"data2-core-types@Reference"},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2025-11-25T00:33:34.725Z","createdAt":"2025-11-25T00:33:34.725Z"},{"_id":"692639d93aea4e87c65a103e","component":"data2-core-types@Component","params":{"component":"Crawler","package":"data2-core-connect","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"policies":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-auth@Policy","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}}}}},"visibility":"private","title":"Crawler","interactions":{"params":{"fields":{"search":{"params":{"component":"data2-core-functions@Function","title":{"component":"data2-core-primitives@String","params":{"content":"Scrape"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"query":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","description":{"component":"data2-core-primitives@String","params":{"content":"Text to be searched"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"title":{"component":"data2-core-primitives@String","params":{"content":"Query"}}}},"sources":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","description":{"component":"data2-core-primitives@String","params":{"content":"Sources: web, images, news"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"oneOf":[{"component":"data2-core-primitives@String","params":{"content":"web"}},{"component":"data2-core-primitives@String","params":{"content":"images"}},{"component":"data2-core-primitives@String","params":{"content":"news"}}],"index":{"component":"data2-core-primitives@Number","params":{"content":2}},"title":{"component":"data2-core-primitives@String","params":{"content":"Sources"}}}},"includeDomains":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","description":{"component":"data2-core-primitives@String","params":{"content":"List of domains to include in search"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":3}},"title":{"component":"data2-core-primitives@String","params":{"content":"Include Domains"}}}},"excludeDomains":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","description":{"component":"data2-core-primitives@String","params":{"content":"List of domains to exclude in search"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":4}},"title":{"component":"data2-core-primitives@String","params":{"content":"Exclude Domains"}}}}}}}],"description":{"component":"data2-core-primitives@String","params":{"content":"Discovers relevant web resources based on a user query."}}},"component":"data2-core-types@ComponentParameter"},"scrape":{"params":{"component":"data2-core-functions@Function","title":{"component":"data2-core-primitives@String","params":{"content":"Scrape"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"url":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","description":{"component":"data2-core-primitives@String","params":{"content":"Url to be scraped"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"title":{"component":"data2-core-primitives@String","params":{"content":"Url"}}}},"formats":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","description":{"component":"data2-core-primitives@String","params":{"content":"List of formats to return: markdown, html, links, images, json, branding, summary"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}},"title":{"component":"data2-core-primitives@String","params":{"content":"Url"}},"oneOf":[{"component":"data2-core-primitives@String","params":{"content":"markdown"}},{"component":"data2-core-primitives@String","params":{"content":"summary"}},{"component":"data2-core-primitives@String","params":{"content":"html"}},{"component":"data2-core-primitives@String","params":{"content":"links"}},{"component":"data2-core-primitives@String","params":{"content":"images"}},{"component":"data2-core-primitives@String","params":{"content":"json"}},{"component":"data2-core-primitives@String","params":{"content":"branding"}}]}}}}}],"description":{"component":"data2-core-primitives@String","params":{"content":"Fetches content from a given URL and transform it into structured, easily consumable formats such as JSON, Markdown, or HTML."}}},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@FieldSet"},"icon":{"component":"data2-core-primitives@String","params":{"content":"search"}},"renderable":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768}}}},"updatedAt":"2026-06-08T19:15:09.718Z","createdAt":"2025-11-25T23:20:57.294Z"},{"_id":"6928b36e8cf58c66aa7b1e23","component":"data2-core-types@Component","params":{"component":"Amortization","package":"data2-core-financial","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"principal":{"params":{"component":"data2-core-primitives@Number"},"component":"data2-core-types@ComponentParameter"},"rate":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"The interest rate per period (expressed as a decimal, e.g., 0.05 for 5%)."}}},"component":"data2-core-types@ComponentParameter"},"totalPayments":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"The total number of payment periods over the life of the loan."}}},"component":"data2-core-types@ComponentParameter"},"type":{"params":{"component":"data2-core-primitives@String","description":{"component":"data2-core-primitives@String","params":{"content":"The payment frequency type - 'month' for monthly payments or 'year' for annual payments. Defaults to year if not specified."}},"oneOf":[{"component":"data2-core-primitives@String","params":{"content":"month"}},{"component":"data2-core-primitives@String","params":{"content":"year"}}]},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"private"},"updatedAt":"2025-11-28T13:38:51.091Z","createdAt":"2025-11-27T20:24:14.666Z"},{"_id":"6929a6cfe2f281c163e63071","component":"data2-core-types@Component","params":{"component":"CompoundAnnualGrowthRate","package":"data2-core-financial","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"beginningValue":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"The initial value of the investment at the start of the period."}}},"component":"data2-core-types@ComponentParameter"},"endingValue":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"The final value of the investment at the end of the period."}}},"component":"data2-core-types@ComponentParameter"},"periods":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"The number of time periods (usually years) over which the growth occurred."}}},"component":"data2-core-types@ComponentParameter"}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"Calculates the Compound Annual Growth Rate (CAGR), which represents the mean annual growth rate of an investment over a specified period of time."}},"visibility":"private"},"updatedAt":"2025-11-28T13:42:39.312Z","createdAt":"2025-11-28T13:42:39.312Z"},{"_id":"6929a7d84fb3cc9e6acd5a25","component":"data2-core-types@Component","params":{"component":"CompoundInterest","package":"data2-core-financial","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"rate":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"The interest rate per period (expressed as a decimal, e.g., 0.05 for 5%)."}}},"component":"data2-core-types@ComponentParameter"},"compoundingsPerPeriod":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"The number of times interest is compounded per period (e.g., 12 for monthly compounding in a year)."}}},"component":"data2-core-types@ComponentParameter"},"principal":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"The initial principal amount invested or deposited."}}},"component":"data2-core-types@ComponentParameter"},"periods":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"The total number of periods the money is invested or borrowed for."}}},"component":"data2-core-types@ComponentParameter"}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"Calculates the compound interest earned on an investment, accounting for interest earned on both the principal and accumulated interest."}},"visibility":"private"},"updatedAt":"2025-11-28T13:47:04.902Z","createdAt":"2025-11-28T13:47:04.902Z"},{"_id":"6929a82ed010d94e2e251edb","component":"data2-core-types@Component","params":{"component":"DiscountFactor","package":"data2-core-financial","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"rate":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"The discount rate per period (expressed as a decimal, e.g., 0.05 for 5%)."}}},"component":"data2-core-types@ComponentParameter"},"periods":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"The number of periods into the future for which to calculate the discount factor."}}},"component":"data2-core-types@ComponentParameter"}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"Calculates the discount factor used to convert future cash flows to present value, accounting for the time value of money."}}},"updatedAt":"2025-11-28T13:48:30.957Z","createdAt":"2025-11-28T13:48:30.957Z"},{"_id":"6929a8e4db66c4cf3d9b542b","component":"data2-core-types@Component","params":{"component":"ExtendedInternalRateOfReturn","package":"data2-core-financial","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"cashFlows":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"An array of cash flow values, where negative values represent investments and positive values represent returns."}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"dates":{"params":{"component":"data2-core-primitives@Date","description":{"component":"data2-core-primitives@String","params":{"content":"An array of dates corresponding to each cash flow, used to determine the exact timing of each flow."}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"guess":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"An initial guess for the rate of return. Used as a starting point for the iterative calculation. Defaults to 0.1 (10%) if not provided."}}},"component":"data2-core-types@ComponentParameter"}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"Calculates the Extended Internal Rate of Return (XIRR) for a series of cash flows occurring at irregular time intervals. More accurate than IRR for non-periodic cash flows."}},"visibility":"private"},"updatedAt":"2025-11-28T13:51:32.678Z","createdAt":"2025-11-28T13:51:32.678Z"},{"_id":"6929a99d4e8169fc118f3dd8","component":"data2-core-types@Component","params":{"component":"FutureValue","package":"data2-core-financial","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"rate":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"The interest rate per period (expressed as a decimal, e.g., 0.05 for 5%)."}}},"component":"data2-core-types@ComponentParameter"},"cashFlow":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"The payment amount made each period."}}},"component":"data2-core-types@ComponentParameter"},"periods":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"The total number of payment periods."}}},"component":"data2-core-types@ComponentParameter"}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"Calculates the future value of an investment based on periodic, constant payments and a constant interest rate."}},"visibility":"private"},"updatedAt":"2025-11-28T13:54:37.805Z","createdAt":"2025-11-28T13:54:37.805Z"},{"_id":"6929aa1f4e8169fc118f41f5","component":"data2-core-types@Component","params":{"component":"InflationAdjustedReturn","package":"data2-core-financial","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"investmentReturn":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"The nominal rate of return on the investment (expressed as a decimal, e.g., 0.08 for 8%)."}}},"component":"data2-core-types@ComponentParameter"},"inflationRate":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"The rate of inflation for the period (expressed as a decimal, e.g., 0.03 for 3%)."}}},"component":"data2-core-types@ComponentParameter"}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"Calculates the real rate of return on an investment after adjusting for inflation, showing the actual purchasing power gain or loss."}},"visibility":"private"},"updatedAt":"2025-11-28T13:56:47.197Z","createdAt":"2025-11-28T13:56:47.197Z"},{"_id":"6929aae48cf58c66aa7f2454","component":"data2-core-types@Component","params":{"component":"InternalRateOfReturn","package":"data2-core-financial","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"initialInvestment":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"The initial amount invested (usually a negative value representing cash outflow)."}}},"component":"data2-core-types@ComponentParameter"},"cashFlows":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"An array of cash flows expected to be received in future periods. Positive values represent inflows, negative values represent outflows."}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"Calculates the Internal Rate of Return (IRR), which is the discount rate that makes the net present value of all cash flows equal to zero. Used to evaluate the profitability of potential investments."}},"visibility":"private"},"updatedAt":"2025-11-28T14:00:04.225Z","createdAt":"2025-11-28T14:00:04.225Z"},{"_id":"6929ab95c9d4b9f9b2a06b22","component":"data2-core-types@Component","params":{"component":"LeverageRatio","package":"data2-core-financial","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"totalLiabilities":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"The total liabilities of the company or entity."}}},"component":"data2-core-types@ComponentParameter"},"totalDebts":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"The total debt obligations of the company or entity."}}},"component":"data2-core-types@ComponentParameter"},"totalIncome":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"The total income or revenue of the company or entity."}}},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"private"},"updatedAt":"2025-11-28T14:03:01.340Z","createdAt":"2025-11-28T14:03:01.340Z"},{"_id":"6929ac33bc5b01de7353b8cc","component":"data2-core-types@Component","params":{"component":"NetPresentValue","package":"data2-core-financial","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"rate":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"The discount rate per period used to calculate present value (expressed as a decimal, e.g., 0.1 for 10%)."}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":false}}},"component":"data2-core-types@ComponentParameter"},"initialInvestment":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"The initial amount invested at the start (usually a negative value representing cash outflow)."}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":false}}},"component":"data2-core-types@ComponentParameter"},"cashFlows":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"An array of expected cash flows for each period. Positive values represent inflows, negative values represent outflows."}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"Calculates the Net Present Value (NPV) of an investment, which is the difference between the present value of cash inflows and the initial investment. A positive NPV indicates a profitable investment."}},"visibility":"private"},"updatedAt":"2025-11-28T14:05:39.574Z","createdAt":"2025-11-28T14:05:39.574Z"},{"_id":"6929acbcbc5b01de7353bdba","component":"data2-core-types@Component","params":{"component":"Payment","package":"data2-core-financial","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"rate":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"The interest rate per period (expressed as a decimal, e.g., 0.05 for 5% per period)."}}},"component":"data2-core-types@ComponentParameter"},"numberOfPayments":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"The total number of payment periods for the loan or annuity."}}},"component":"data2-core-types@ComponentParameter"},"principal":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"The present value or principal amount of the loan or annuity."}}},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"private","description":{"component":"data2-core-primitives@String","params":{"content":"Calculates the periodic payment amount for a loan or annuity based on constant payments and a constant interest rate."}}},"updatedAt":"2025-11-28T14:07:56.673Z","createdAt":"2025-11-28T14:07:56.673Z"},{"_id":"6929ad844e8169fc118f5e02","component":"data2-core-types@Component","params":{"component":"PaybackPeriod","package":"data2-core-financial","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"periods":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"The number of periods over which cash flows occur."}}},"component":"data2-core-types@ComponentParameter"},"cashFlows":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"An array of cash flow values for each period. The sum of these flows should eventually equal or exceed the initial investment."}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"Calculates the payback period, which is the time required to recover the initial investment from the cash flows generated by the investment."}},"visibility":"private"},"updatedAt":"2025-11-28T14:11:16.726Z","createdAt":"2025-11-28T14:11:16.726Z"},{"_id":"6929ae16db66c4cf3d9b7c91","component":"data2-core-types@Component","params":{"component":"PresentValue","package":"data2-core-financial","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"rate":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"The discount rate per period (expressed as a decimal, e.g., 0.05 for 5%)."}}},"component":"data2-core-types@ComponentParameter"},"cashFlow":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"The cash flow amount received each period (or a single future cash flow)."}}},"component":"data2-core-types@ComponentParameter"},"periods":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"The number of periods over which cash flows occur."}}},"component":"data2-core-types@ComponentParameter"}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"Calculates the present value of an investment or series of future cash flows, discounted at a specified rate. Shows what future money is worth today."}},"visibility":"private"},"updatedAt":"2025-11-28T14:13:42.175Z","createdAt":"2025-11-28T14:13:42.175Z"},{"_id":"6929aeb88cf58c66aa7f4205","component":"data2-core-types@Component","params":{"component":"ProfitabilityIndex","package":"data2-core-financial","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"rate":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"The discount rate per period used to calculate present value (expressed as a decimal, e.g., 0.1 for 10%)."}}},"component":"data2-core-types@ComponentParameter"},"initialInvestment":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"The initial amount invested at the start of the project."}}},"component":"data2-core-types@ComponentParameter"},"cashFlows":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"An array of expected future cash flows for each period."}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"Calculates the Profitability Index (PI), which is the ratio of the present value of future cash flows to the initial investment. A PI greater than 1 indicates a good investment."}},"visibility":"private"},"updatedAt":"2025-11-28T14:16:24.158Z","createdAt":"2025-11-28T14:16:24.158Z"},{"_id":"6929b261c8c9d84b4a481983","component":"data2-core-types@Component","params":{"component":"ReturnOnInvestment","package":"data2-core-financial","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"initialInvestment":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"The initial amount invested or cost of the investment."}}},"component":"data2-core-types@ComponentParameter"},"earnings":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"The total earnings or profit generated from the investment (not including the initial investment)."}}},"component":"data2-core-types@ComponentParameter"}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"Calculates the Return on Investment (ROI), which measures the gain or loss generated on an investment relative to the amount invested. Expressed as a percentage."}},"visibility":"private"},"updatedAt":"2025-11-28T14:32:01.026Z","createdAt":"2025-11-28T14:32:01.026Z"},{"_id":"6929d755db66c4cf3d9cb58b","component":"data2-core-types@Component","params":{"component":"ModifiedInternalRateOfReturn","package":"data2-core-financial","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"cashFlows":{"params":{"component":"data2-core-primitives@Number","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"description":{"component":"data2-core-primitives@String","params":{"content":"An array of cash flows including the initial investment (negative) and all subsequent cash flows. For example: [-10000, 3000, 4000, 5000, 6000]."}}},"component":"data2-core-types@ComponentParameter"},"financeRate":{"params":{"component":"data2-core-primitives@Number","list":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"description":{"component":"data2-core-primitives@String","params":{"content":"The cost of capital or financing rate for negative cash flows (expressed as a decimal, e.g., 0.10 for 10%). This is typically your borrowing rate."}}},"component":"data2-core-types@ComponentParameter"},"reinvestRate":{"params":{"component":"data2-core-primitives@Number","list":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"description":{"component":"data2-core-primitives@String","params":{"content":"The rate at which positive cash flows can be reinvested (expressed as a decimal, e.g., 0.08 for 8%). This should be a realistic, conservative rate like a savings account or money market rate."}}},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"private","description":{"component":"data2-core-primitives@String","params":{"content":"Calculates the Modified Internal Rate of Return (MIRR), which provides a more realistic measure of investment returns by assuming cash flows are reinvested at a specified reinvestment rate rather than at the IRR itself. This addresses the unrealistic reinvestment assumption of traditional IRR."}}},"updatedAt":"2025-11-28T17:09:41.486Z","createdAt":"2025-11-28T17:09:41.486Z"},{"_id":"6936cdcc7e09c9a53acc74dd","component":"data2-core-types@Component","params":{"component":"ColorParse","package":"data2-core-color","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"color":{"params":{"component":"data2-core-primitives@String","description":{"component":"data2-core-primitives@String","params":{"content":"Any valid color string (hex, rgb, hsl, named colors, etc.)"}}},"component":"data2-core-types@ComponentParameter"}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"Parses any color string into a color object."}}},"updatedAt":"2025-12-08T13:13:47.988Z","createdAt":"2025-12-08T13:08:28.407Z"},{"_id":"6936d02290fed746465aaefb","component":"data2-core-types@Component","params":{"component":"ColorFormatHex","package":"data2-core-color","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"color":{"params":{"component":"data2-core-primitives@String","description":{"component":"data2-core-primitives@String","params":{"content":"Any color input (string or color object)"}}},"component":"data2-core-types@ComponentParameter"}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"Formats a color as a hexadecimal string."}},"visibility":"private"},"updatedAt":"2025-12-08T13:20:17.166Z","createdAt":"2025-12-08T13:18:26.032Z"},{"_id":"6936d0f07e09c9a53acc9b62","component":"data2-core-types@Component","params":{"component":"ColorFormatRgb","package":"data2-core-color","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"color":{"params":{"component":"data2-core-primitives@String","description":{"component":"data2-core-primitives@String","params":{"content":"Any color input (string or color object)"}}},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"private","description":{"component":"data2-core-primitives@String","params":{"content":"Formats a color as an RGB string."}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"color"}}},"updatedAt":"2025-12-08T17:38:29.742Z","createdAt":"2025-12-08T13:21:52.113Z"},{"_id":"6936d13bd9ebe2bf171cf41f","component":"data2-core-types@Component","params":{"component":"ColorFormatHsl","package":"data2-core-color","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"color":{"params":{"component":"data2-core-primitives@String","description":{"component":"data2-core-primitives@String","params":{"content":"Any color input (string or color object)"}}},"component":"data2-core-types@ComponentParameter"}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"Formats a color as an HSL string."}},"visibility":"private"},"updatedAt":"2025-12-08T13:23:07.711Z","createdAt":"2025-12-08T13:23:07.711Z"},{"_id":"6936d1a47e09c9a53acca3fe","component":"data2-core-types@Component","params":{"component":"ColorToRgb","package":"data2-core-color","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"color":{"params":{"component":"data2-core-primitives@String","description":{"component":"data2-core-primitives@String","params":{"content":"Any color input"}}},"component":"data2-core-types@ComponentParameter"}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"Converts a color to the RGB color space."}},"visibility":"private"},"updatedAt":"2025-12-08T13:24:52.757Z","createdAt":"2025-12-08T13:24:52.757Z"},{"_id":"6936d1e58166a81317fe545c","component":"data2-core-types@Component","params":{"component":"ColorToHsl","package":"data2-core-color","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"color":{"params":{"component":"data2-core-primitives@String","description":{"component":"data2-core-primitives@String","params":{"content":"Any color input"}}},"component":"data2-core-types@ComponentParameter"}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"Converts a color to the HSL color space."}},"visibility":"private"},"updatedAt":"2025-12-08T13:25:57.942Z","createdAt":"2025-12-08T13:25:57.942Z"},{"_id":"6936d2487e09c9a53accac14","component":"data2-core-types@Component","params":{"component":"ColorToOklch","package":"data2-core-color","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"color":{"params":{"component":"data2-core-primitives@String","description":{"component":"data2-core-primitives@String","params":{"content":"Any color input"}}},"component":"data2-core-types@ComponentParameter"}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"Converts a color to the OKLCH color space (perceptually uniform)."}},"visibility":"private"},"updatedAt":"2025-12-08T13:27:36.897Z","createdAt":"2025-12-08T13:27:36.897Z"},{"_id":"6936d3d28166a81317fe6b2b","component":"data2-core-types@Component","params":{"component":"ColorInterpolate","package":"data2-core-color","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"colors":{"params":{"component":"data2-core-primitives@String","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"description":{"component":"data2-core-primitives@String","params":{"content":"Array of colors to interpolate between (minimum 2), any color input."}}},"component":"data2-core-types@ComponentParameter"},"mode":{"params":{"component":"data2-core-primitives@String","oneOf":[{"component":"data2-core-primitives@String","params":{"content":"rgb"}},{"component":"data2-core-primitives@String","params":{"content":"hsl"}},{"component":"data2-core-primitives@String","params":{"content":"lab"}},{"component":"data2-core-primitives@String","params":{"content":"lch"}},{"component":"data2-core-primitives@String","params":{"content":"oklch"}}],"description":{"component":"data2-core-primitives@String","params":{"content":"Interpolation color space (default: `'rgb'`)"}}},"component":"data2-core-types@ComponentParameter"},"t":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"Position between colors, 0-1 (default: `0.5`)"}}},"component":"data2-core-types@ComponentParameter"}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"Interpolates between two or more colors."}},"visibility":"private"},"updatedAt":"2025-12-08T13:34:10.160Z","createdAt":"2025-12-08T13:34:10.160Z"},{"_id":"6936d4ae5c11770e0c2371a1","component":"data2-core-types@Component","params":{"component":"ColorClampChroma","package":"data2-core-color","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"color":{"params":{"component":"data2-core-primitives@String","description":{"component":"data2-core-primitives@String","params":{"content":"Any color input"}}},"component":"data2-core-types@ComponentParameter"},"mode":{"params":{"component":"data2-core-primitives@String","oneOf":[{"component":"data2-core-primitives@String","params":{"content":"rgb"}},{"component":"data2-core-primitives@String","params":{"content":"hsl"}},{"component":"data2-core-primitives@String","params":{"content":"lab"}},{"component":"data2-core-primitives@String","params":{"content":"lch"}},{"component":"data2-core-primitives@String","params":{"content":"oklch"}}],"description":{"component":"data2-core-primitives@String","params":{"content":"Color space to use for clamping (default: `'lch'`)"}}},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"private","description":{"component":"data2-core-primitives@String","params":{"content":"Clamps the chroma of a color to fit within the displayable RGB gamut."}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"color"}}},"updatedAt":"2025-12-08T17:37:33.203Z","createdAt":"2025-12-08T13:37:50.525Z"},{"_id":"6936d4f848846f0a319652c8","component":"data2-core-types@Component","params":{"component":"ColorDisplayable","package":"data2-core-color","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"color":{"params":{"component":"data2-core-primitives@String","description":{"component":"data2-core-primitives@String","params":{"content":"Any color input"}}},"component":"data2-core-types@ComponentParameter"}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"Checks if a color is displayable in the RGB gamut."}},"visibility":"private"},"updatedAt":"2025-12-08T13:39:04.398Z","createdAt":"2025-12-08T13:39:04.398Z"},{"_id":"693aed79da7df2f2d94426c2","component":"data2-core-types@Component","params":{"component":"Preset","package":"data2-presets","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"constructType":{"params":{},"component":"data2-core-types@ComponentParameter"},"params":{"params":{},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2025-12-11T16:12:41.748Z","createdAt":"2025-12-11T16:12:41.748Z"},{"_id":"6948984825397ecddc468c33","component":"data2-core-types@Component","params":{"component":"Preset","package":"data2-core-presets","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"constructType":{"params":{},"component":"data2-core-types@ComponentParameter"},"params":{"params":{},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2025-12-22T01:00:56.846Z","createdAt":"2025-12-22T01:00:56.846Z"},{"_id":"696a63da54e81cfebef64bf3","component":"data2-core-types@Component","params":{"component":"ObjectKeys","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"object":{"params":{"component":"data2-core-primitives@Object"},"component":"data2-core-types@ComponentParameter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"object"}}},"updatedAt":"2026-01-16T20:00:43.259Z","createdAt":"2026-01-16T16:14:18.200Z"},{"_id":"696a98799aa139cbb010e654","component":"data2-core-types@Component","params":{"component":"ObjectValues","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"object":{"params":{"component":"data2-core-primitives@Object"},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"private","wrap":{"component":"data2-core-primitives@String","params":{"content":"object"}}},"updatedAt":"2026-01-16T19:58:49.632Z","createdAt":"2026-01-16T19:58:49.632Z"},{"_id":"696a99ad83077819f1ec6099","component":"data2-core-types@Component","params":{"component":"ObjectEntries","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"object":{"params":{"component":"data2-core-primitives@Object"},"component":"data2-core-types@ComponentParameter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"object"}}},"updatedAt":"2026-01-16T20:03:57.779Z","createdAt":"2026-01-16T20:03:57.779Z"},{"_id":"6970f45dec887f581a71bba9","component":"data2-core-types@Component","params":{"component":"JSONToMarkdown","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{}}},"visibility":"private"},"updatedAt":"2026-01-21T15:44:29.910Z","createdAt":"2026-01-21T15:44:29.910Z"},{"_id":"697a8713bec05a29dedc55c8","component":"data2-core-types@Component","params":{"package":"data2-core-functions","component":"DateToObjectId","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"date":{"component":"data2-core-primitives@Date"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"date"}}},"updatedAt":"2026-01-28T21:57:06.254Z","createdAt":"2026-01-28T21:57:06.254Z"},{"_id":"697a8adabec05a29dedf2ea2","component":"data2-core-types@Component","params":{"package":"data2-core-functions","component":"ObjectIdToDate","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"objectId":{"component":"data2-core-primitives@String"}}}}},"updatedAt":"2026-01-28T21:57:06.254Z","createdAt":"2026-01-28T21:57:06.254Z"},{"_id":"6995d25a435c5ee7daab816c","component":"data2-core-types@Component","params":{"component":"ToFixed","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"value":{"params":{"component":"data2-core-primitives@Number"},"component":"data2-core-types@ComponentParameter"},"decimals":{"params":{"component":"data2-core-primitives@Number"},"component":"data2-core-types@ComponentParameter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"value"}},"visibility":"private"},"updatedAt":"2026-02-18T14:53:14.791Z","createdAt":"2026-02-18T14:53:14.791Z"},{"_id":"699c80a1cbf5f052ddccd9c6","component":"data2-core-types@Component","params":{"component":"ObjectMerge","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"objects":{"params":{"component":"data2-core-primitives@Object","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2026-02-23T16:52:28.074Z","createdAt":"2026-02-23T16:30:25.638Z"},{"_id":"69b302bf32d9ab56cbf7aed6","component":"data2-core-types@Component","params":{"product":"whatsapp","package":"data2-whatsapp","component":"WhatsAppAccount","visibility":"private","title":{"component":"data2-core-primitives@String","params":{"content":"WhatsApp Account"}},"icon":{"params":{"icon":"fa-whatsapp"},"component":"data2-core-types@FontAwesomeIcon"},"renderable":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768,"exactWidth":1366,"exactHeight":768}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"provider":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Provider"}},"description":{"component":"data2-core-primitives@String","params":{"content":"WhatsApp Business API provider."}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"oneOf":[{"component":"data2-core-primitives@String","params":{"content":"meta"}},{"component":"data2-core-primitives@String","params":{"content":"twilio"}}],"defaultValue":{"component":"data2-core-primitives@String","params":{"content":"meta"}}}},"providerAccountId":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Provider Account ID"}},"description":{"component":"data2-core-primitives@String","params":{"content":"WhatsApp Business Account ID (WABA). Populated automatically after Embedded Signup."}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}}}},"keyVault":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-types@InteractiveModuleReference","title":{"component":"data2-core-primitives@String","params":{"content":"Key Vault"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Key Vault that stores the access token. Auto-created when this component is added."}},"visibility":"private","controlSettings":{"componentFilter":[{"component":"data2-core-primitives@String","params":{"content":"data2-core-id@KeyVault"}}]}}},"policies":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-auth@Policy"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"description":{"component":"data2-core-primitives@String","params":{"content":"Controls for allowing or denying access to the data"}}}}}}},"interactions":{"component":"data2-core-types@FieldSet","params":{"fields":{"listTemplates":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Lists message templates from the WhatsApp Business Account."}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"Query params"}}}}]}},"createTemplate":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Creates a new message template."}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"Template definition"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Template object following Meta's Message Template API schema."}}}}]}},"deleteTemplate":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Deletes a message template by name."}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Template name"}}}}]}}}}}}},{"_id":"69b302c832d9ab56cbf7aed8","component":"data2-core-types@Component","params":{"product":"whatsapp","package":"data2-whatsapp","component":"WhatsAppNumber","visibility":"private","title":{"component":"data2-core-primitives@String","params":{"content":"WhatsApp Number"}},"icon":{"params":{"icon":"fa-whatsapp"},"component":"data2-core-types@FontAwesomeIcon"},"renderable":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768,"exactWidth":1366,"exactHeight":768}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"whatsAppAccount":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-types@InteractiveModuleReference","title":{"component":"data2-core-primitives@String","params":{"content":"WhatsApp Account"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Reference to the WhatsAppAccount that owns this number."}},"index":{"component":"data2-core-primitives@Number","params":{"content":0.5}},"controlSettings":{"componentFilter":[{"component":"data2-core-primitives@String","params":{"content":"data2-whatsapp@WhatsAppAccount"}}]}}},"providerNumberId":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Provider Number ID"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Phone Number ID from Meta. Populated automatically after Embedded Signup."}},"index":{"component":"data2-core-primitives@Number","params":{"content":0.6}},"saveCompiled":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"visibility":"private"}},"phoneNumber":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Phone Number"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Phone number in raw digit format (e.g. 5511939208891). Populated automatically after Embedded Signup."}},"index":{"component":"data2-core-primitives@Number","params":{"content":0.7}},"saveCompiled":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"visibility":"private"}},"drive":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-types@InteractiveModuleReference","title":{"component":"data2-core-primitives@String","params":{"content":"Drive"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Drive for media file storage. Auto-created when this component is added."}},"visibility":"private","controlSettings":{"componentFilter":[{"component":"data2-core-primitives@String","params":{"content":"data2-core@Drive"}}]}}},"enableExecutionLogs":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Boolean","key":{"component":"data2-core-primitives@String","params":{"content":"enableExecutionLogs"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Enable Execution Logs"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Controls whether the listener will save execution logs."}},"visibility":"public","index":{"component":"data2-core-primitives@Number","params":{"content":1}},"unversioned":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"defaultValue":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}}},"insertLogsDataSet":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-types@DataSetReference","key":{"component":"data2-core-primitives@String","params":{"content":"insertLogsDataSet"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Insert Logs DataSet"}},"description":{"component":"data2-core-primitives@String","params":{"content":"DataSet used to save execution logs. Auto-populated when the number is created."}},"visibility":"private","defaultValue":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetReference"}},"params":{"reference":{"params":{"portions":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"reference"}}}},{"component":"data2-core-primitives@String","params":{"content":"LogInsertDataSet"}}]},"component":"data2-core-functions@StringConcat"}}},"component":"data2-core-types@ComponentDefinition"}}},"readLogsDataSet":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-types@DataSetReference","key":{"component":"data2-core-primitives@String","params":{"content":"readLogsDataSet"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Read Logs DataSet"}},"description":{"component":"data2-core-primitives@String","params":{"content":"DataSet used to display execution logs. Auto-populated when the number is created."}},"visibility":"private","defaultValue":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetReference"}},"params":{"reference":{"params":{"portions":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"reference"}}}},{"component":"data2-core-primitives@String","params":{"content":"LogReadDataSet"}}]},"component":"data2-core-functions@StringConcat"}}},"component":"data2-core-types@ComponentDefinition"}}},"onMessage":{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"onMessage"}},"icon":{"params":{"icon":"fa-play-circle-o"},"component":"data2-core-types@FontAwesomeIcon"},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-flow@Series"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Actions executed when a WhatsApp message is received. The following parameters are accessible by using Reference: `message`, `from`, `timestamp`."}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}}}},"onStatus":{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"onStatus"}},"icon":{"params":{"icon":"fa-play-circle-o"},"component":"data2-core-types@FontAwesomeIcon"},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-flow@Series"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Actions executed when a WhatsApp message is received. The following parameters are accessible by using Reference: `status`, `from`, `timestamp`."}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}}}},"registrationStatus":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Registration Status"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Registration status: active or deregistered"}},"index":{"component":"data2-core-primitives@Number","params":{"content":0.8}},"saveCompiled":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"visibility":"private"}},"registrationPin":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Registration Pin"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Registration pin: 6-digit pin"}},"index":{"component":"data2-core-primitives@Number","params":{"content":0.81}},"saveCompiled":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"visibility":"private"}},"policies":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-auth@Policy"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"description":{"component":"data2-core-primitives@String","params":{"content":"Controls for allowing or denying access to the data"}}}}}}},"interactions":{"component":"data2-core-types@FieldSet","params":{"fields":{"sendMessage":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Sends a WhatsApp message (text, image, video, audio, document, location, contacts, reaction, interactive, template)."}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-whatsapp@WhatsAppMessage","title":{"component":"data2-core-primitives@String","params":{"content":"Message"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Message payload. Use a WhatsAppMessage component or provide { to, type, text/template/image/video/audio/document/location/contacts/reaction/interactive }."}}}}]}},"sendText":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Sends a text message. Shortcut for sendMessage({ type: 'text', to, text })."}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"To"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Recipient phone number."}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Text"}},"description":{"component":"data2-core-primitives@String","params":{"content":"The text message body."}}}}]}},"sendImage":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Sends an image message. Provide { link } or { id } and optionally { caption }."}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"To"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Recipient phone number."}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"Image"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Image object with link or id, and optional caption."}},"parameters":{"link":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Link"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Public URL of the image."}}}},"id":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"ID"}},"description":{"component":"data2-core-primitives@String","params":{"content":"WhatsApp media ID."}}}},"caption":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Caption"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Optional caption for the image."}}}}}}}]}},"sendVideo":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Sends a video message. Provide { link } or { id } and optionally { caption }."}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"To"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Recipient phone number."}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"Video"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Video object with link or id, and optional caption."}},"parameters":{"link":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Link"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Public URL of the video."}}}},"id":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"ID"}},"description":{"component":"data2-core-primitives@String","params":{"content":"WhatsApp media ID."}}}},"caption":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Caption"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Optional caption for the video."}}}}}}}]}},"sendAudio":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Sends an audio message. Provide { link } or { id }."}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"To"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Recipient phone number."}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"Audio"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Audio object with link or id."}},"parameters":{"link":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Link"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Public URL of the audio file."}}}},"id":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"ID"}},"description":{"component":"data2-core-primitives@String","params":{"content":"WhatsApp media ID."}}}}}}}]}},"sendDocument":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Sends a document message. Provide { link } or { id } and optionally { caption, filename }."}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"To"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Recipient phone number."}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"Document"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Document object with link or id, and optional caption/filename."}},"parameters":{"link":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Link"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Public URL of the document."}}}},"id":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"ID"}},"description":{"component":"data2-core-primitives@String","params":{"content":"WhatsApp media ID."}}}},"caption":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Caption"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Optional caption for the document."}}}},"filename":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Filename"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Filename displayed to the recipient."}}}}}}}]}},"sendLocation":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Sends a location message with coordinates and optional name/address."}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"To"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Recipient phone number."}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"Location"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Location with latitude, longitude, and optional name/address."}},"parameters":{"latitude":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Number","title":{"component":"data2-core-primitives@String","params":{"content":"Latitude"}}}},"longitude":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Number","title":{"component":"data2-core-primitives@String","params":{"content":"Longitude"}}}},"name":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Name"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Name of the location."}}}},"address":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Address"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Address of the location."}}}}}}}]}},"sendContacts":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Sends a contacts message with a list of vCard-like contact objects."}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"To"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Recipient phone number."}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"Contacts"}},"description":{"component":"data2-core-primitives@String","params":{"content":"List of contact objects following the WhatsApp contacts format."}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}}]}},"sendReaction":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Sends a reaction (emoji) to an existing message."}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"To"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Recipient phone number."}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Message ID"}},"description":{"component":"data2-core-primitives@String","params":{"content":"The wamid of the message to react to."}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Emoji"}},"description":{"component":"data2-core-primitives@String","params":{"content":"The emoji to react with. Send empty string to remove reaction."}}}}]}},"getStatus":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Fetches the number's status from the provider, including quality rating, messaging limit tier, and webhook subscription state."}},"visibility":"private","arguments":[]}},"resubscribeWebhook":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Re-subscribes the WABA to receive webhooks. Use this if incoming messages stop arriving."}},"visibility":"private","arguments":[]}}}}}},"updatedAt":"2026-03-19T04:50:44.696Z"},{"_id":"69b302cf32d9ab56cbf7aeda","component":"data2-core-types@Component","params":{"product":"whatsapp","package":"data2-whatsapp","component":"WhatsAppMessage","visibility":"private","icon":{"params":{"icon":"fa-whatsapp"},"component":"data2-core-types@FontAwesomeIcon"},"title":{"component":"data2-core-primitives@String","params":{"content":"WhatsApp Message"}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"type":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Message Type"}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}},"oneOf":[{"component":"data2-core-primitives@String","params":{"content":"text"}},{"component":"data2-core-primitives@String","params":{"content":"template"}},{"component":"data2-core-primitives@String","params":{"content":"image"}},{"component":"data2-core-primitives@String","params":{"content":"video"}},{"component":"data2-core-primitives@String","params":{"content":"audio"}},{"component":"data2-core-primitives@String","params":{"content":"document"}},{"component":"data2-core-primitives@String","params":{"content":"location"}},{"component":"data2-core-primitives@String","params":{"content":"contacts"}},{"component":"data2-core-primitives@String","params":{"content":"reaction"}},{"component":"data2-core-primitives@String","params":{"content":"interactive"}}],"defaultValue":{"component":"data2-core-primitives@String","params":{"content":"text"}}}},"to":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"To"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Recipient phone number in international format (e.g. 5511999998888)."}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}}},"text":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Text"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Message body text. Used when type is 'text'."}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}},"shouldShow":{"component":"data2-core-primitives@Boolean","params":{"content":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"type"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"text"}}},"component":"data2-core-comparison-operators@Equal"}},"break":true,"preventEvaluation":true}}},"template":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"Template"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Template definition. Used when type is 'template'."}},"index":{"component":"data2-core-primitives@Number","params":{"content":3}},"flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"name":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Template name"}}}},"language":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Language code"}},"defaultValue":{"component":"data2-core-primitives@String","params":{"content":"en_US"}}}},"components":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"title":{"component":"data2-core-primitives@String","params":{"content":"Template components"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Variable components for header, body, and button parameters."}}}}},"shouldShow":{"component":"data2-core-primitives@Boolean","params":{"content":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"type"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"template"}}},"component":"data2-core-comparison-operators@Equal"}},"break":true,"preventEvaluation":true}}},"image":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"Image"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Image payload. Provide a link or media id, and optional caption."}},"index":{"component":"data2-core-primitives@Number","params":{"content":4}},"flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"link":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Link"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Public URL of the image."}}}},"id":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Media ID"}},"description":{"component":"data2-core-primitives@String","params":{"content":"WhatsApp media ID."}}}},"caption":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Caption"}}}}},"shouldShow":{"component":"data2-core-primitives@Boolean","params":{"content":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"type"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"image"}}},"component":"data2-core-comparison-operators@Equal"}},"break":true,"preventEvaluation":true}}},"video":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"Video"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Video payload. Provide a link or media id, and optional caption."}},"index":{"component":"data2-core-primitives@Number","params":{"content":5}},"flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"link":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Link"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Public URL of the video."}}}},"id":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Media ID"}},"description":{"component":"data2-core-primitives@String","params":{"content":"WhatsApp media ID."}}}},"caption":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Caption"}}}}},"shouldShow":{"component":"data2-core-primitives@Boolean","params":{"content":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"type"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"video"}}},"component":"data2-core-comparison-operators@Equal"}},"break":true,"preventEvaluation":true}}},"audio":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"Audio"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Audio payload. Provide a link or media id."}},"index":{"component":"data2-core-primitives@Number","params":{"content":6}},"flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"link":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Link"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Public URL of the audio file."}}}},"id":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Media ID"}},"description":{"component":"data2-core-primitives@String","params":{"content":"WhatsApp media ID."}}}}},"shouldShow":{"component":"data2-core-primitives@Boolean","params":{"content":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"type"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"audio"}}},"component":"data2-core-comparison-operators@Equal"}},"break":true,"preventEvaluation":true}}},"document":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"Document"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Document payload. Provide a link or media id, and optional caption/filename."}},"index":{"component":"data2-core-primitives@Number","params":{"content":7}},"flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"link":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Link"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Public URL of the document."}}}},"id":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Media ID"}},"description":{"component":"data2-core-primitives@String","params":{"content":"WhatsApp media ID."}}}},"caption":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Caption"}}}},"filename":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Filename"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Filename displayed to the recipient."}}}}},"shouldShow":{"component":"data2-core-primitives@Boolean","params":{"content":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"type"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"document"}}},"component":"data2-core-comparison-operators@Equal"}},"break":true,"preventEvaluation":true}}},"location":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"Location"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Location payload with coordinates and optional name/address."}},"index":{"component":"data2-core-primitives@Number","params":{"content":8}},"flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"latitude":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Number","title":{"component":"data2-core-primitives@String","params":{"content":"Latitude"}}}},"longitude":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Number","title":{"component":"data2-core-primitives@String","params":{"content":"Longitude"}}}},"name":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Name"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Name of the location."}}}},"address":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Address"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Address of the location."}}}}},"shouldShow":{"component":"data2-core-primitives@Boolean","params":{"content":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"type"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"location"}}},"component":"data2-core-comparison-operators@Equal"}},"break":true,"preventEvaluation":true}}},"contacts":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"Contacts"}},"description":{"component":"data2-core-primitives@String","params":{"content":"List of contact objects following the WhatsApp contacts format."}},"index":{"component":"data2-core-primitives@Number","params":{"content":9}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"shouldShow":{"component":"data2-core-primitives@Boolean","params":{"content":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"type"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"contacts"}}},"component":"data2-core-comparison-operators@Equal"}},"break":true,"preventEvaluation":true}}},"reaction":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"Reaction"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Reaction payload with message_id and emoji."}},"index":{"component":"data2-core-primitives@Number","params":{"content":10}},"flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"message_id":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Message ID"}},"description":{"component":"data2-core-primitives@String","params":{"content":"The wamid of the message to react to."}}}},"emoji":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Emoji"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Emoji to react with. Empty string removes the reaction."}}}}},"shouldShow":{"component":"data2-core-primitives@Boolean","params":{"content":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"type"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"reaction"}}},"component":"data2-core-comparison-operators@Equal"}},"break":true,"preventEvaluation":true}}},"interactive":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"Interactive"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Interactive message payload (buttons, lists, etc). Free-form object matching the WhatsApp interactive message format."}},"index":{"component":"data2-core-primitives@Number","params":{"content":11}},"shouldShow":{"component":"data2-core-primitives@Boolean","params":{"content":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"type"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"interactive"}}},"component":"data2-core-comparison-operators@Equal"}},"break":true,"preventEvaluation":true}}}}}}}},{"_id":"69bad48959d9f49bf4f7a7a6","component":"data2-core-types@Component","params":{"component":"VerifyKey","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"data":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"},"signature":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"},"publicKey":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"},"secret":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"},"algorithm":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"},"enconding":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"private"},"updatedAt":"2026-03-18T17:04:02.775Z","createdAt":"2026-03-18T16:36:25.537Z"},{"_id":"69ce863ef957ff92d9be5caf","component":"data2-core-types@Component","params":{"package":"data2-rush","component":"Emit","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"payload":{"params":{"component":"data2-core-types@FieldSet"},"component":"data2-core-types@ComponentParameter"}}}},"title":{"component":"data2-core-primitives@String","params":{"content":"Emit"}},"visibility":"private"},"updatedAt":"2026-04-02T15:06:25.909Z","createdAt":"2026-04-02T15:06:25.909Z"},{"_id":"69f0d9f077fdebabbb9ddafa","component":"data2-core-types@Component","params":{"component":"Race","package":"data2-core-flow","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"actions":{"params":{"component":"data2-core-flow@Series","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"description":{"component":"data2-core-primitives@String","params":{"content":"Array of actions to race. Can also be a function/expression that resolves to an array"}}},"component":"data2-core-types@ComponentParameter"},"concurrency":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Concurrency"}},"description":{"component":"data2-core-primitives@String","params":{"content":"How many concurrent actions can occur at a time. It works as a queue, i.e., as soon as an action is done, another one starts."}},"visibility":"public"}},"onlySuccess":{"params":{"component":"data2-core-primitives@Boolean","defaultValue":{"params":{"content":true},"component":"data2-core-primitives@Boolean"},"description":{"component":"data2-core-primitives@String","params":{"content":"Ignores rejections and returns the first successful result"}}},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"private","wrap":{"component":"data2-core-primitives@String","params":{"content":"actions.0"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Runs multiple actions in parallel and resolves with the first one that finishes — useful for \"whichever responds first wins\" patterns (e.g. fastest of N data sources, primary-with-fallback timeouts, fetching from mirrors)."}}},"updatedAt":"2026-04-28T16:07:23.006Z","createdAt":"2026-04-28T16:01:52.509Z"},{"_id":"69fa7f4e995fe360575ea473","component":"data2-core-types@Component","params":{"component":"Schema","package":"data2-core-types","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"fields":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Field"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"description":{"component":"data2-core-primitives@String","params":{"content":"Fields of the Schema"}}},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"private","interactions":{"params":{"fields":{"validate":{"params":{"component":"data2-core-functions@Function","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"input"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Record to validate"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"options"}},"flat":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"parameters":{"mode":{"params":{"component":"data2-core-primitives@String","oneOf":[{"component":"data2-core-primitives@String","params":{"content":"strict"}},{"component":"data2-core-primitives@String","params":{"content":"strip"}},{"component":"data2-core-primitives@String","params":{"content":"coerce"}},{"component":"data2-core-primitives@String","params":{"content":"partial"}},{"component":"data2-core-primitives@String","params":{"content":"passtrough"}}],"index":{"component":"data2-core-primitives@Number","params":{"content":0}},"icon":{"params":{"iconSet":"remix","icon":"ri-focus-mode"},"component":"data2-core-web@Icon"},"defaultValue":{"params":{"content":"strip"},"component":"data2-core-primitives@String"}},"component":"data2-core-types@ComponentParameter"},"extras":{"params":{"component":"data2-core-primitives@String","oneOf":[{"component":"data2-core-primitives@String","params":{"content":"strict"}},{"component":"data2-core-primitives@String","params":{"content":"strip"}},{"component":"data2-core-primitives@String","params":{"content":"passtrough"}}],"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"icon":{"params":{"iconSet":"remix","icon":"ri-focus-mode"},"component":"data2-core-web@Icon"},"defaultValue":{"params":{"content":"strip"},"component":"data2-core-primitives@String"}},"component":"data2-core-types@ComponentParameter"},"required":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":2}},"defaultValue":{"params":{"content":"all"},"component":"data2-core-primitives@String"},"oneOf":[{"component":"data2-core-primitives@String","params":{"content":"all"}},{"component":"data2-core-primitives@String","params":{"content":"partial"}}]},"component":"data2-core-types@ComponentParameter"},"coerce":{"params":{"component":"data2-core-primitives@Boolean","index":{"component":"data2-core-primitives@Number","params":{"content":0}},"icon":{"params":{"iconSet":"remix","icon":"ri-focus-mode"},"component":"data2-core-web@Icon"},"defaultValue":{"params":{},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-types@ComponentParameter"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Mode preset + flag overrides"}}}}],"title":{"component":"data2-core-primitives@String","params":{"content":"Validate"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Validate input against the schema. Returns { valid, errors[], data } — never throws."}},"icon":{"params":{"iconSet":"remix","icon":"ri-shield-check-line"},"component":"data2-core-web@Icon"}},"component":"data2-core-types@ComponentParameter"},"parse":{"params":{"component":"data2-core-functions@Function","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"input"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Record to validate"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"options"}},"flat":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"parameters":{"mode":{"params":{"component":"data2-core-primitives@String","oneOf":[{"component":"data2-core-primitives@String","params":{"content":"strict"}},{"component":"data2-core-primitives@String","params":{"content":"strip"}},{"component":"data2-core-primitives@String","params":{"content":"coerce"}},{"component":"data2-core-primitives@String","params":{"content":"partial"}},{"component":"data2-core-primitives@String","params":{"content":"passtrough"}}],"index":{"component":"data2-core-primitives@Number","params":{"content":0}},"icon":{"params":{"iconSet":"remix","icon":"ri-focus-mode"},"component":"data2-core-web@Icon"},"defaultValue":{"params":{"content":"strip"},"component":"data2-core-primitives@String"}},"component":"data2-core-types@ComponentParameter"},"extras":{"params":{"component":"data2-core-primitives@String","oneOf":[{"component":"data2-core-primitives@String","params":{"content":"strict"}},{"component":"data2-core-primitives@String","params":{"content":"strip"}},{"component":"data2-core-primitives@String","params":{"content":"passtrough"}}],"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"icon":{"params":{"iconSet":"remix","icon":"ri-focus-mode"},"component":"data2-core-web@Icon"},"defaultValue":{"params":{"content":"strip"},"component":"data2-core-primitives@String"}},"component":"data2-core-types@ComponentParameter"},"required":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":2}},"defaultValue":{"params":{"content":"all"},"component":"data2-core-primitives@String"},"oneOf":[{"component":"data2-core-primitives@String","params":{"content":"all"}},{"component":"data2-core-primitives@String","params":{"content":"partial"}}]},"component":"data2-core-types@ComponentParameter"},"coerce":{"params":{"component":"data2-core-primitives@Boolean","index":{"component":"data2-core-primitives@Number","params":{"content":0}},"icon":{"params":{"iconSet":"remix","icon":"ri-focus-mode"},"component":"data2-core-web@Icon"},"defaultValue":{"params":{},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-types@ComponentParameter"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Mode preset + flag overrides"}}}}],"title":{"component":"data2-core-primitives@String","params":{"content":"Parse"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Same as Validate but throws."}},"icon":{"params":{"iconSet":"remix","icon":"ri-shield-check-line"},"component":"data2-core-web@Icon"}},"component":"data2-core-types@ComponentParameter"},"mask":{"params":{"component":"data2-core-functions@Function","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"input"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Record to validate"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}}}],"title":{"component":"data2-core-primitives@String","params":{"content":"Mask"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Validate input against the schema. Returns { valid, errors[], data } — never throws."}},"icon":{"params":{"iconSet":"fontawesome4","icon":"fa fa-eye-slash"},"component":"data2-core-web@Icon"}},"component":"data2-core-types@ComponentParameter"},"generate":{"params":{"component":"data2-core-functions@Function","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"overrides"}},"description":{"component":"data2-core-primitives@String","params":{"content":""}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}}}],"title":{"component":"data2-core-primitives@String","params":{"content":"Generate"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Returns a record filled with per-field defaults ('', 0, false, [], {}, null)"}},"icon":{"params":{"iconSet":"fontawesome4","icon":"fa fa-newspaper-o"},"component":"data2-core-web@Icon"}},"component":"data2-core-types@ComponentParameter"},"patch":{"params":{"component":"data2-core-functions@Function","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"base"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Record to validate"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"partial"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Record to validate"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"options"}},"flat":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"parameters":{"mode":{"params":{"component":"data2-core-primitives@String","oneOf":[{"component":"data2-core-primitives@String","params":{"content":"strict"}},{"component":"data2-core-primitives@String","params":{"content":"strip"}},{"component":"data2-core-primitives@String","params":{"content":"coerce"}},{"component":"data2-core-primitives@String","params":{"content":"partial"}},{"component":"data2-core-primitives@String","params":{"content":"passtrough"}}],"index":{"component":"data2-core-primitives@Number","params":{"content":0}},"icon":{"params":{"iconSet":"remix","icon":"ri-focus-mode"},"component":"data2-core-web@Icon"},"defaultValue":{"params":{"content":"strip"},"component":"data2-core-primitives@String"}},"component":"data2-core-types@ComponentParameter"},"extras":{"params":{"component":"data2-core-primitives@String","oneOf":[{"component":"data2-core-primitives@String","params":{"content":"strict"}},{"component":"data2-core-primitives@String","params":{"content":"strip"}},{"component":"data2-core-primitives@String","params":{"content":"passtrough"}}],"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"icon":{"params":{"iconSet":"remix","icon":"ri-focus-mode"},"component":"data2-core-web@Icon"},"defaultValue":{"params":{"content":"strip"},"component":"data2-core-primitives@String"}},"component":"data2-core-types@ComponentParameter"},"required":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":2}},"defaultValue":{"params":{"content":"all"},"component":"data2-core-primitives@String"},"oneOf":[{"component":"data2-core-primitives@String","params":{"content":"all"}},{"component":"data2-core-primitives@String","params":{"content":"partial"}}]},"component":"data2-core-types@ComponentParameter"},"coerce":{"params":{"component":"data2-core-primitives@Boolean","index":{"component":"data2-core-primitives@Number","params":{"content":0}},"icon":{"params":{"iconSet":"remix","icon":"ri-focus-mode"},"component":"data2-core-web@Icon"},"defaultValue":{"params":{},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-types@ComponentParameter"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Mode preset + flag overrides"}}}}],"title":{"component":"data2-core-primitives@String","params":{"content":"Patch"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Deep-merges then validates."}},"icon":{"params":{"iconSet":"remix","icon":"ri-shield-check-line"},"component":"data2-core-web@Icon"}},"component":"data2-core-types@ComponentParameter"},"diff":{"params":{"component":"data2-core-functions@Function","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"a"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Record to validate"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"b"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Record to validate"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}}}],"title":{"component":"data2-core-primitives@String","params":{"content":"Diff"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Diff schemas"}},"icon":{"params":{"iconSet":"fontawesome4","icon":"fa fa-exchange"},"component":"data2-core-web@Icon"}},"component":"data2-core-types@ComponentParameter"},"describe":{"params":{"component":"data2-core-functions@Function","title":{"component":"data2-core-primitives@String","params":{"content":""}},"icon":{"params":{"iconSet":"fontawesome4","icon":"fa fa-search"},"component":"data2-core-web@Icon"}},"component":"data2-core-types@ComponentParameter"},"mock":{"params":{"component":"data2-core-functions@Function","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"options"}},"flat":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"parameters":{"mode":{"params":{"component":"data2-core-primitives@String","oneOf":[{"component":"data2-core-primitives@String","params":{"content":"strict"}},{"component":"data2-core-primitives@String","params":{"content":"strip"}},{"component":"data2-core-primitives@String","params":{"content":"coerce"}},{"component":"data2-core-primitives@String","params":{"content":"partial"}},{"component":"data2-core-primitives@String","params":{"content":"passtrough"}}],"index":{"component":"data2-core-primitives@Number","params":{"content":0}},"icon":{"params":{"iconSet":"remix","icon":"ri-focus-mode"},"component":"data2-core-web@Icon"},"defaultValue":{"params":{"content":"strip"},"component":"data2-core-primitives@String"}},"component":"data2-core-types@ComponentParameter"},"extras":{"params":{"component":"data2-core-primitives@String","oneOf":[{"component":"data2-core-primitives@String","params":{"content":"strict"}},{"component":"data2-core-primitives@String","params":{"content":"strip"}},{"component":"data2-core-primitives@String","params":{"content":"passtrough"}}],"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"icon":{"params":{"iconSet":"remix","icon":"ri-focus-mode"},"component":"data2-core-web@Icon"},"defaultValue":{"params":{"content":"strip"},"component":"data2-core-primitives@String"}},"component":"data2-core-types@ComponentParameter"},"required":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":2}},"defaultValue":{"params":{"content":"all"},"component":"data2-core-primitives@String"},"oneOf":[{"component":"data2-core-primitives@String","params":{"content":"all"}},{"component":"data2-core-primitives@String","params":{"content":"partial"}}]},"component":"data2-core-types@ComponentParameter"},"coerce":{"params":{"component":"data2-core-primitives@Boolean","index":{"component":"data2-core-primitives@Number","params":{"content":0}},"icon":{"params":{"iconSet":"remix","icon":"ri-focus-mode"},"component":"data2-core-web@Icon"},"defaultValue":{"params":{},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-types@ComponentParameter"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Mode preset + flag overrides"}}}}],"title":{"component":"data2-core-primitives@String","params":{"content":"Mock"}},"description":{"component":"data2-core-primitives@String","params":{"content":""}},"icon":{"params":{"iconSet":"fontawesome4","icon":"fa fa-id-card"},"component":"data2-core-web@Icon"}},"component":"data2-core-types@ComponentParameter"},"derive":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Derive"}},"component":"data2-core-primitives@Object","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"op"}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"keys"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"asReference"}}}}]},"component":"data2-core-types@ComponentParameter"},"rederive":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Rederive"}}},"component":"data2-core-types@ComponentParameter"},"setFields":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Set Fields"}}},"component":"data2-core-types@ComponentParameter"},"addField":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Add field"}}},"component":"data2-core-types@ComponentParameter"},"removeField":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Remove Field"}}},"component":"data2-core-types@ComponentParameter"},"unlink":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Unlink"}}},"component":"data2-core-types@ComponentParameter"},"relink":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Relink"}}},"component":"data2-core-types@ComponentParameter"},"setDeriveKeys":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Set Derive Keys"}}},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@FieldSet"}},"updatedAt":"2026-05-07T14:23:04.221Z","createdAt":"2026-05-05T23:37:50.739Z"},{"_id":"69fca132e0c744d974640ae3","component":"data2-core-types@Component","params":{"component":"SchemaSet","package":"data2-core-types","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{}}},"icon":{"params":{"icon":"fa fa-th"},"component":"data2-core-web@Icon"},"interactions":{"params":{"fields":{"listSchemas":{"params":{},"component":"data2-core-types@ComponentParameter"},"listReferences":{"params":{},"component":"data2-core-types@ComponentParameter"},"getSchema":{"params":{},"component":"data2-core-types@ComponentParameter"},"getRegistry":{"params":{},"component":"data2-core-types@ComponentParameter"},"getMaster":{"params":{},"component":"data2-core-types@ComponentParameter"},"validate":{"params":{},"component":"data2-core-types@ComponentParameter"},"cascade":{"params":{},"component":"data2-core-types@ComponentParameter"},"updateMaster":{"params":{},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@FieldSet"}},"updatedAt":"2026-05-07T14:43:07.051Z","createdAt":"2026-05-07T14:26:58.632Z"},{"_id":"69fd4c4939064a789b95e2ec","component":"data2-core-types@Component","params":{"component":"SchemaReference","package":"data2-core-types","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"reference":{"params":{},"component":"data2-core-primitives@String"}}}},"visibility":"private"},"updatedAt":"2026-05-08T02:39:38.472Z","createdAt":"2026-05-08T02:36:57.065Z"},{"_id":"6a0db75c6e98ef6f7d27e60f","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"GlobalLight","icon":"lightbulb","title":{"component":"data2-core-primitives@String","params":{"content":"Global Light"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Directional light source defined at the Artboard. Blocks opt-in via LightInteraction to cast shadows or catch the light."}},"visibility":"private","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"x":{"component":"data2-core-primitives@Number"},"y":{"component":"data2-core-primitives@Number"},"z":{"component":"data2-core-primitives@Number"},"intensity":{"component":"data2-core-primitives@Number"},"color":{"component":"data2-core-primitives@String"},"fixed":{"component":"data2-core-primitives@Boolean"},"enabled":{"component":"data2-core-primitives@Boolean"}}}}},"updatedAt":"2026-05-20T13:30:04.142Z","createdAt":"2026-05-20T13:30:04.142Z"},{"_id":"6a0db775f792f1759f8fa223","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"GlobalLight","icon":"lightbulb","title":{"component":"data2-core-primitives@String","params":{"content":"Global Light"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Directional light source defined at the Artboard. Blocks opt-in via LightInteraction to cast shadows or catch the light."}},"visibility":"private","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"x":{"component":"data2-core-primitives@Number"},"y":{"component":"data2-core-primitives@Number"},"z":{"component":"data2-core-primitives@Number"},"intensity":{"component":"data2-core-primitives@Number"},"color":{"component":"data2-core-primitives@String"},"fixed":{"component":"data2-core-primitives@Boolean"},"enabled":{"component":"data2-core-primitives@Boolean"}}}}},"updatedAt":"2026-05-20T13:30:29.363Z","createdAt":"2026-05-20T13:30:29.363Z"},{"_id":"6a0db7a7aaba61ff463d9b00","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"Transform","icon":"drag-move-2-line","title":{"component":"data2-core-primitives@String","params":{"content":"Transform"}},"description":{"component":"data2-core-primitives@String","params":{"content":"One composable CSS transform step (translate, scale, rotate, skew, perspective; 2D and 3D variants)."}},"visibility":"private","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"kind":{"component":"data2-core-primitives@String","oneOf":["translate","translate3d","scale","scale3d","rotate","rotateX","rotateY","rotateZ","skew","perspective"]},"x":{"component":"data2-core-primitives@Number"},"y":{"component":"data2-core-primitives@Number"},"z":{"component":"data2-core-primitives@Number"},"angle":{"component":"data2-core-primitives@Number"},"distance":{"component":"data2-core-primitives@Number"},"unit":{"component":"data2-core-primitives@String","oneOf":["px","%","em","rem","vw","vh"]}}}}},"updatedAt":"2026-05-20T13:31:19.397Z","createdAt":"2026-05-20T13:31:19.397Z"},{"_id":"6a0db7a7369c6dd49125c1e9","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"LightInteraction","icon":"flashlight-line","title":{"component":"data2-core-primitives@String","params":{"content":"Light Interaction"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Per-Block opt-in for the Artboard's global lights. Controls cast-shadow (outer) and catch-light (inner highlight)."}},"visibility":"private","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"castShadow":{"component":"data2-core-primitives@Boolean"},"catchLight":{"component":"data2-core-primitives@Boolean"},"reflectance":{"component":"data2-core-primitives@Number"},"shadowStrength":{"component":"data2-core-primitives@Number"}}}}},"updatedAt":"2026-05-20T13:31:19.603Z","createdAt":"2026-05-20T13:31:19.603Z"},{"_id":"6a0dbfa4eb9b489e4a79aefc","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"GlobalLights","icon":"lightbulb","title":{"component":"data2-core-primitives@String","params":{"content":"Global Lights"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Wrapper holding the array of GlobalLight sources for an Artboard. Keeps all lights in a single Type so the inspector can render them on a shared 2D pad."}},"visibility":"private","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"lights":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@GlobalLight"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"visibility":"private"}}}}}},"updatedAt":"2026-05-20T14:05:24.297Z","createdAt":"2026-05-20T14:05:24.297Z"},{"_id":"6a46c97314c51b168503d8a5","component":"data2-core-types@Component","params":{"component":"SvgIcon","package":"data2-blocks","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"color":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-types@Color"}},"src":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"},"StrokeDashArray":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Number"}},"StrokeDashOffset":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Number"}},"strokeColor":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-types@Color"}},"strokeWidth":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Number"}},"corners":{"params":{"component":"data2-core-primitives@String","oneOf":[{"component":"data2-core-primitives@String","params":{"content":"round"}},{"component":"data2-core-primitives@String","params":{"content":"sharp"}}]},"component":"data2-core-types@ComponentParameter"}}}},"icon":{"component":"data2-core-primitives@String","params":{"content":"star-o"}},"definition":{"component":"data2-blocks@SvgImageBlockControl","params":{"src":{"component":"data2-core-types@Reference","params":{"reference":"src"}},"color":{"component":"data2-core-types@Reference","params":{"reference":"color"}},"strokeColor":{"component":"data2-core-types@Reference","params":{"reference":"strokeColor"}},"strokeWidth":{"component":"data2-core-types@Reference","params":{"reference":"strokeWidth"}},"StrokeDashArray":{"component":"data2-core-types@Reference","params":{"reference":"StrokeDashArray"}},"StrokeDashOffset":{"component":"data2-core-types@Reference","params":{"reference":"StrokeDashOffset"}},"corners":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"corners"}}}}},"preventEvaluation":true},"visibility":"private","extends":"data2-core-primitives@Block"},"updatedAt":"2026-07-03T00:15:52.406Z","createdAt":"2026-07-02T20:26:27.257Z"},{"_id":"6a5a71df2fc01b051d3fdd5b","component":"data2-core-types@Component","params":{"product":"connect","package":"data2-core-auth","component":"InvokedByRush","visibility":"private","icon":{"component":"data2-core-types@FontAwesomeIcon","params":{"icon":"fa-robot"}},"title":{"component":"data2-core-primitives@String","params":{"content":"InvokedByRush"}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{}}}},"updatedAt":"2026-07-18T00:00:00.000Z"},{"_id":"6a5a71ed2fc01b051d3fe153","component":"data2-core-types@Component","params":{"product":"connect","package":"data2-core-auth","component":"InvokedByBuilder","visibility":"private","icon":{"component":"data2-core-types@FontAwesomeIcon","params":{"icon":"fa-user-shield"}},"title":{"component":"data2-core-primitives@String","params":{"content":"InvokedByBuilder"}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{}}}},"updatedAt":"2026-07-18T00:00:00.000Z"},{"_id":"6a633062a7d619aaf6336b47","component":"data2-core-types@Component","params":{"package":"data2-core-auth","component":"RushPolicy","visibility":"private","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"rushes":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"title":{"component":"data2-core-primitives@String","params":{"content":"Rushes"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Refina por rush: allow vazio = qualquer rush de um sistema permitido; caso contrário só os listados. Entries batem no rush.reference. deny sempre vence."}},"visibility":"beta","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"allow":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"deny":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}}}}},"component":"data2-core-types@ComponentParameter"},"systems":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}},"title":{"component":"data2-core-primitives@String","params":{"content":"Systems"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Gate por sistema: o sistema do caller precisa ser permitido. O próprio sistema sempre passa, então allow só nomeia OUTROS sistemas; allow vazio = só o próprio sistema. Entries são DOMÍNIOS. deny sempre vence."}},"visibility":"beta","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"allow":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"deny":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}}}}},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2026-07-24T00:00:00.000Z"},{"_id":"6a65ed32a7d619aaf615483c","component":"data2-core-types@Component","params":{"package":"data2-core-auth","component":"ConnectPolicy","visibility":"private","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"httpClients":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"title":{"component":"data2-core-primitives@String","params":{"content":"HTTP Clients"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Refina por HttpClient: allow vazio = qualquer client de um sistema permitido; caso contrário só os listados. Entries batem no httpClient.reference. deny sempre vence."}},"visibility":"beta","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"allow":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"deny":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}}}}},"component":"data2-core-types@ComponentParameter"},"systems":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}},"title":{"component":"data2-core-primitives@String","params":{"content":"Systems"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Gate por sistema: o sistema DONO do client precisa ser permitido (httpClient.system, não o sistema do rush de origem). O próprio sistema sempre passa, então allow só nomeia OUTROS sistemas; allow vazio = só o próprio sistema. Entries são DOMÍNIOS. deny sempre vence."}},"visibility":"beta","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"allow":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"deny":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}}}}},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2026-07-26T00:00:00.000Z"},{"_id":"6a676c89c4067eb777b44f71","component":"data2-core-types@Component","params":{"package":"data2-core-auth","component":"BuilderPolicy","visibility":"private","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{}}}},"updatedAt":"2026-07-27T00:00:00.000Z"},{"_id":"6a676c9ac4067eb777b45a58","component":"data2-core-types@Component","params":{"package":"data2-core-auth","component":"PublicPolicy","visibility":"private","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"reason":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"title":{"component":"data2-core-primitives@String","params":{"content":"Reason"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Justificativa de por que este recurso é público. Não afeta a decisão (PublicPolicy sempre libera) — serve para auditoria: fica registrado no core_logs junto com quem alterou."}}},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2026-07-27T00:00:00.000Z"},{"_id":"6a6a2c49dc1fded10b0636f0","component":"data2-core-types@Component","params":{"component":"IpAllowlistPolicy","package":"data2-core-auth","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"allowedIps":{"params":{"component":"data2-core-primitives@String","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"clientIp":{"params":{"component":"data2-core-primitives@String","list":{"component":"data2-core-primitives@Boolean","params":{"content":false}}},"component":"data2-core-types@ComponentParameter"}}}},"definition":{"params":{"allow":{"params":{"compare":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"allowedIps"}}}},"pattern":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"clientIp"}}}}},"component":"data2-core-functions@Includes"},"then":{"params":{"content":true},"component":"data2-core-primitives@Boolean"},"else":{"params":{"content":false},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-flow@If"}},"component":"data2-core-auth@Policy"}},"updatedAt":"2026-07-30T14:09:54.955Z","createdAt":"2026-07-29T16:37:29.750Z"},{"_id":"6a6b6e96c4067eb77748a9e7","component":"data2-core-types@Component","params":{"package":"data2-core-auth","component":"IpPolicy","visibility":"private","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"ips":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"title":{"component":"data2-core-primitives@String","params":{"content":"IPs"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Gate por IP do chamador. Entradas são endereços (200.182.103.70) ou faixas CIDR (200.182.103.64/28), IPv4 ou IPv6. deny sempre vence. allow não-vazio = allowlist estrita. allow vazio + deny preenchido = modo blocklist. Os dois vazios NEGA (config inútil falha fechado). Sem IP confiável (execuções internas, realtime) também NEGA. Atenção: o array de policies é um OR — para 'IP permitido E autenticado' use PolicyAnd."}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"allow":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"deny":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}}}}},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2026-07-29T00:00:00.000Z"},{"_id":"6a6b6eaec4067eb77748b7f6","component":"data2-core-types@Component","params":{"package":"data2-core-auth","component":"PolicyAnd","visibility":"private","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"policies":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-auth@Policy"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"title":{"component":"data2-core-primitives@String","params":{"content":"Policies"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Só libera se TODAS as policies aninhadas liberarem (AND). O array de policies do recurso é um OR, então use este componente como UMA das entradas para expressar conjunção: [PolicyAnd([IpPolicy, Policy(auth)]), BuilderPolicy] = (IP permitido E autenticado) OU builder. Array vazio NEGA, assim como filho que lança erro ou retorna Data2Error."}}},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2026-07-29T00:00:00.000Z"},{"_id":"6a6b6f3ac4067eb777491003","component":"data2-core-types@Component","params":{"package":"data2-core-auth","component":"InvokedByClientIp","visibility":"private","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"ips":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"title":{"component":"data2-core-primitives@String","params":{"content":"IPs"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Endereços ou faixas CIDR (IPv4/IPv6). Retorna true se o IP confiável do chamador estiver em alguma delas. Predicado só do lado allow — a negação fica na expressão em volta (deny, ou um NOT). Use dentro do allow/deny de um Policy para compor com And/Or; sem IP confiável retorna false."}}},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2026-07-29T00:00:00.000Z"},{"_id":"6a7a012ee459187550e1f464","component":"data2-core-types@Component","params":{"public":true,"package":"data2-core-connect","component":"MailInviteTemplate","icon":"calendar","visibility":"public","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"parent":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@InstanceReference"}},"visibility":"private","index":{"component":"data2-core-primitives@Number","params":{"content":1}},"controlSettings":{"componentFilter":[{"component":"data2-core-primitives@String","params":{"content":"data2-core-connect@Mailer"}}]}},"component":"data2-core-types@ComponentParameter"},"from":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"parameters":{"name":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}},"component":"data2-core-types@ComponentParameter"}},"index":{"component":"data2-core-primitives@Number","params":{"content":5}}},"component":"data2-core-types@ComponentParameter"},"subject":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}}},"component":"data2-core-types@ComponentParameter"},"message":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2.1}}},"component":"data2-core-types@ComponentParameter"},"to":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":6}}},"component":"data2-core-types@ComponentParameter"},"replyTo":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":9}}},"component":"data2-core-types@ComponentParameter"},"templateParameters":{"params":{"component":"data2-core-types@PrimitiveParameter","index":{"component":"data2-core-primitives@Number","params":{"content":10}},"title":{"component":"data2-core-primitives@String","params":{"content":"Template Parameters"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"policies":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-auth@Policy"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"description":{"component":"data2-core-primitives@String","params":{"content":"Controls for allowing or denying access to the data"}}}},"title":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":20}},"description":{"component":"data2-core-primitives@String","params":{"content":"Calendar event title"}}}},"description":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":21}},"description":{"component":"data2-core-primitives@String","params":{"content":"Calendar event description"}}}},"location":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":22}},"description":{"component":"data2-core-primitives@String","params":{"content":"Calendar event location"}}}},"date":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":23}},"description":{"component":"data2-core-primitives@String","params":{"content":"Event start date, YYYY-MM-DD"}}}},"hour":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"index":{"component":"data2-core-primitives@Number","params":{"content":24}},"description":{"component":"data2-core-primitives@String","params":{"content":"Event start hour, UTC (0-23)"}}}},"minutes":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"index":{"component":"data2-core-primitives@Number","params":{"content":25}},"description":{"component":"data2-core-primitives@String","params":{"content":"Event start minutes (0-59)"}}}},"durationHour":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"index":{"component":"data2-core-primitives@Number","params":{"content":26}},"description":{"component":"data2-core-primitives@String","params":{"content":"Duration in hours"}}}},"durationMinute":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"index":{"component":"data2-core-primitives@Number","params":{"content":27}},"description":{"component":"data2-core-primitives@String","params":{"content":"Duration in minutes"}}}},"uid":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":28}},"description":{"component":"data2-core-primitives@String","params":{"content":"Stable event id — reuse it with a higher sequence to update an invite"}}}},"sequence":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"index":{"component":"data2-core-primitives@Number","params":{"content":29}},"description":{"component":"data2-core-primitives@String","params":{"content":"Revision number; increment when re-sending an updated invite"}}}},"categories":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":30}},"description":{"component":"data2-core-primitives@String","params":{"content":"Calendar categories"}}}}}}},"componentOptions":{"contextPopulatedParams":{"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"p"}}],"body":{"params":{"fieldsList":{"params":{"mapper":{"params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"v"}}],"body":{"key":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"v.key"}}}},"value":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"v.mock"}}}}}},"component":"data2-core-functions@Function","break":true},"array":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"p.executedInstanceParams.templateParameters"}}}}},"component":"data2-core-functions@ArrayMap"}},"component":"data2-core-types@FieldSet"}},"break":true}}},"updatedAt":"2026-08-10T16:49:50.780Z"},{"_id":"6a7cdc995f201cb1ceffe622","component":"data2-core-types@Component","params":{"package":"data2-core-web","component":"Reload","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{}}}},"updatedAt":"2026-08-12T00:00:00.000Z"},{"_id":"622fa212c7f8a80b302ee742","component":"data2-core-types@Component","system":"5e3b796d6228227ca637d0f4","params":{"extends":"data2-core-primitives@Block","package":"data2","component":"BuilderSystemCard","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-core-types@ComponentInstanceReference","params":{"component":"data2-core-primitives@Artboard","reference":"BuilderSystemCard"}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"componentState":{"component":"data2-core-primitives@String","oneOf":{"component":"data2-core-functions@ArrayMap","params":{"array":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@ArtboardReference","params":{"reference":"BuilderSystemCard","preventEvaluation":true}},"prop":"params.componentStates"}},"mapper":"params.state"}}}}}}},"updatedAt":"2022-03-14T20:14:10.516Z","createdAt":"2022-03-14T20:14:10.516Z"},{"_id":"6230f7cae926bd0b2baefb3d","component":"data2-core-types@Component","system":"5e3b796d6228227ca637d0f4","params":{"extends":"data2-core-primitives@Block","package":"data2","component":"BuilderWorkspaceCard","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-core-types@ComponentInstanceReference","params":{"component":"data2-core-primitives@Artboard","reference":"BuilderWorkspaceCard"}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"componentState":{"component":"data2-core-primitives@String","oneOf":{"component":"data2-core-functions@ArrayMap","params":{"array":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@ArtboardReference","params":{"reference":"BuilderWorkspaceCard","preventEvaluation":true}},"prop":"params.componentStates"}},"mapper":"params.state"}}},"workspace":{"component":"data2-core-types@Reference"}}}}},"updatedAt":"2022-03-15T20:33:34.065Z","createdAt":"2022-03-15T20:32:10.405Z"},{"_id":"64d684a738e58e06468cbae9","component":"data2-core-types@Component","system":"5e3b796d6228227ca637d0f4","params":{"component":"8UcAMImtYnx_n3P6RC023","package":"data2","title":"hasAccessToSystemResource","parameters":{"params":{"fields":{"setup":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-flow@Series","index":{"component":"data2-core-primitives@Number","params":{"content":2}}}},"validations":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-flow@Series","index":{"component":"data2-core-primitives@Number","params":{"content":1}}}}}},"component":"data2-core-types@FieldSet"},"definition":{"params":{"actions":[{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"validations"}}},"component":"data2-core-types@Reference"},{"params":{"actions":[{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Data2BuilderAuthentication"}}},"component":"data2-core-flow@AwaitReady"},{"params":{"compare":[{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Data2BuilderAuthentication"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"session._id"}},"x":{"component":"data2-core-primitives@String","params":{"content":"1"}}}}},"component":"data2-core-logical-operators@Not"}],"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Missing authentication"}},"code":{"component":"data2-core-primitives@String","params":{"content":"401"}}},"component":"data2-core-types@Error"}},"component":"data2-core-flow@If"},{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"UsersDataSet"}}},"component":"data2-core-flow@AwaitReady"},{"params":{"actions":[{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"DhPJ44W3fVq4ylQlnQJ6M"}}},"component":"data2-core-flow@AwaitReady"},{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"TCMEQkmcrf52bJ7va8AD2"}}},"component":"data2-core-flow@AwaitReady"}]},"component":"data2-core-flow@Parallel"}]},"component":"data2-core-flow@Series","displayName":"common setup"},{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"setup"}}},"component":"data2-core-types@Reference"},{"params":{"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Validations after Setup not passed."}},"code":{"component":"data2-core-primitives@String","params":{"content":"400"}}},"component":"data2-core-types@Error"},"compare":[{"params":{"subject":{"params":{},"component":"data2@3UDe5xvHPRuve6PvboXJG"}},"component":"data2-core-logical-operators@Not","displayName":"is not @data2.app"},{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"RdETEpX-dr2XT93VoG8st"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records.length"}}}}},"component":"data2-core-logical-operators@Not","displayName":"systems not found"}]},"component":"data2-core-logical-operators@Or"}]},"component":"data2-core-flow@If","displayName":"common validations after setup"},{"params":{"then":{"params":{"content":true},"component":"data2-core-primitives@Boolean"},"else":{"params":{"content":false},"component":"data2-core-primitives@Boolean"},"compare":[{"params":{"components":[{"params":{"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"active"}},"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Data2BuilderAuthentication"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"session.status"}}}}},"component":"data2-core-comparison-operators@Equal","displayName":"is active user"},{"params":{"components":[{"params":{},"component":"data2@3UDe5xvHPRuve6PvboXJG"},{"params":{"components":{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"RdETEpX-dr2XT93VoG8st"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"mapper":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"system"}}],"body":{"params":{"expression":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"system.visibility"}}}},"defaultCase":{"params":{"content":false},"component":"data2-core-primitives@Boolean"},"cases":[{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"public"}},"value":{"params":{"components":[{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"DhPJ44W3fVq4ylQlnQJ6M"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"member"}}],"body":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"member.organization._id"}}}},"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"system.organization._id"}}}}},"component":"data2-core-comparison-operators@Equal","displayName":"is org member"},{"params":{"pattern":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"member.role"}}}},"subject":[{"component":"data2-core-primitives@String","params":{"content":"owner"}},{"component":"data2-core-primitives@String","params":{"content":"billing-owner"}},{"component":"data2-core-primitives@String","params":{"content":"admin"}},{"component":"data2-core-primitives@String","params":{"content":"member"}}]},"component":"data2-core-functions@Includes","displayName":"has role with access"}]},"component":"data2-core-logical-operators@And","displayName":"has org member role with access"}}}},"component":"data2-core-functions@ArrayFind","displayName":"is org member"},{"params":{"components":[{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"DhPJ44W3fVq4ylQlnQJ6M"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"member"}}],"body":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"member.organization._id"}}}},"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"system.organization._id"}}}}},"component":"data2-core-comparison-operators@Equal","displayName":"is org member"},{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"member.role"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"collaborator"}}},"component":"data2-core-comparison-operators@Equal","displayName":"is collaborator"}]},"component":"data2-core-logical-operators@And","displayName":"is org member and collaborator"}}}},"component":"data2-core-functions@ArrayFind","displayName":"is collaborator"},{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"TCMEQkmcrf52bJ7va8AD2"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"access"}}],"body":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"access.system._id"}}}},"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"system._id"}}}}},"component":"data2-core-comparison-operators@Equal"}}}},"component":"data2-core-functions@ArrayFind","displayName":"has system access"}]},"component":"data2-core-logical-operators@And","displayName":"is collaborator and has system access"}]},"component":"data2-core-logical-operators@Or"}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"private"}},"value":{"params":{"components":[{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"DhPJ44W3fVq4ylQlnQJ6M"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"member"}}],"body":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"member.organization._id"}}}},"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"system.organization._id"}}}}},"component":"data2-core-comparison-operators@Equal","displayName":"is org member"},{"params":{"pattern":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"member.role"}}}},"subject":[{"component":"data2-core-primitives@String","params":{"content":"owner"}},{"component":"data2-core-primitives@String","params":{"content":"admin"}}]},"component":"data2-core-functions@Includes","displayName":"is owner/admin"}]},"component":"data2-core-logical-operators@And","displayName":"has org member role with access"}}}},"component":"data2-core-functions@ArrayFind","displayName":"is owner/admin"},{"params":{"components":[{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"DhPJ44W3fVq4ylQlnQJ6M"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"member"}}],"body":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"member.organization._id"}}}},"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"system.organization._id"}}}}},"component":"data2-core-comparison-operators@Equal"}}}},"component":"data2-core-functions@ArrayFind","displayName":"is org member"},{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"TCMEQkmcrf52bJ7va8AD2"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"access"}}],"body":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"access.system._id"}}}},"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"system._id"}}}}},"component":"data2-core-comparison-operators@Equal"}}}},"component":"data2-core-functions@ArrayFind","displayName":"has system access"}]},"component":"data2-core-logical-operators@And","displayName":"is member and has system access"}]},"component":"data2-core-logical-operators@Or","displayName":"is owner/admin or has system access"}}}]},"component":"data2-core-flow@Switch"}}}},"component":"data2-core-functions@ArrayMap"}},"component":"data2-core-logical-operators@And","displayName":"has org member for all systems in request"}]},"component":"data2-core-logical-operators@Or","displayName":"is active user and has access"}]},"component":"data2-core-logical-operators@And"}]},"component":"data2-core-flow@If"}]},"component":"data2-core-flow@Series"}},"updatedAt":"2023-09-01T19:23:17.573Z","createdAt":"2023-08-11T18:57:43.029Z"},{"_id":"64d68b3d38e58e06468ccbdb","component":"data2-core-types@Component","system":"5e3b796d6228227ca637d0f4","params":{"component":"HYJyJUpllo08j6aYr15sY","package":"data2","title":"PolicySystemResource","definition":[{"component":"data2-core-auth@Policy","params":{"allow":{"params":{"expression":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"defaultCase":{"params":{},"component":"data2-core-primitives@Boolean"},"cases":[{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"find"}},"value":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"get"}},"value":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"create"}},"value":{"params":{"setup":{"params":{"actions":[{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"RdETEpX-dr2XT93VoG8st"}},"prop":"filter","args":[{"_id":{"params":{"compare":[{"params":{"value":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$record"}}}}},"component":"data2-core-functions@IsArray"}],"else":{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$record.system"}}}},{"component":"data2-core-primitives@String","params":{"content":"000000000000000000000000"}}]},"component":"data2-core-logical-operators@Or"},"then":{"in":{"params":{"array":{"component":"data2-core-functions@ArrayMap","params":{"array":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$record"}}}},"mapper":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"record"}}],"body":{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"record.system"}}}},{"component":"data2-core-primitives@String","params":{"content":"000000000000000000000000"}}]},"component":"data2-core-logical-operators@Or"}}}}}},"component":"data2-core-functions@Uniq"}}},"component":"data2-core-flow@If"}}]}},{"params":{"compare":[{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"RdETEpX-dr2XT93VoG8st"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records.length"}}}}},"component":"data2-core-logical-operators@Not"},{"params":{"subject":{"params":{},"component":"data2@3UDe5xvHPRuve6PvboXJG"}},"component":"data2-core-logical-operators@Not"}],"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"No systems found"}},"code":{"component":"data2-core-primitives@String","params":{"content":"404"}}},"component":"data2-core-types@Error"}},"component":"data2-core-flow@If"}]},"component":"data2-core-flow@Series","displayName":"Fetch systems of request"},"validations":{"params":{"actions":[{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Data2BuilderAuthentication"}}},"component":"data2-core-flow@AwaitReady"},{"params":{"compare":[{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$record.system"}}}}},"component":"data2-core-logical-operators@Not","displayName":"No system: single $record case"},{"params":{"components":{"params":{"array":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$record"}}}},"mapper":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"record"}}],"body":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"record.system"}}}}},"component":"data2-core-logical-operators@Not"}}}},"component":"data2-core-functions@ArrayMap"}},"component":"data2-core-logical-operators@Or","displayName":"No system: multi $record case"},{"params":{"subject":{"params":{},"component":"data2@3UDe5xvHPRuve6PvboXJG"}},"component":"data2-core-logical-operators@Not"}]},"component":"data2-core-logical-operators@And"}],"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Param \"system\" is required."}},"code":{"component":"data2-core-primitives@String","params":{"content":"400"}}},"component":"data2-core-types@Error"}},"component":"data2-core-flow@If","displayName":"system is required"}]},"component":"data2-core-flow@Series","displayName":"validations"}},"component":"data2@8UcAMImtYnx_n3P6RC023"}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"patch"}},"value":{"params":{"setup":{"params":{"actions":[{"params":{"module":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$datasource"}}}},"prop":{"component":"data2-core-primitives@String","params":{"content":"find"}},"args":[{"params":{"text":{"params":{"haystack":{"component":"data2-core-primitives@String","params":{"content":"{ \"query\": { \"$and\": [{ \"_id\": \"__ID__\" }], \"$limit\": 1, \"$skip\": 0 } }\n"}},"needle":{"component":"data2-core-primitives@String","params":{"content":"__ID__"}},"patch":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$id"}}}}},"component":"data2-core-functions@Replace"}},"component":"data2-core-functions@JSONParse"},{"params":{"disableSoftDelete":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}}}]},"component":"data2-core-types@Interaction","break":true},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"RdETEpX-dr2XT93VoG8st"}},"prop":"filter","args":[{"_id":{"params":{"components":[{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"prevResult.data.0.system._id"}}},"component":"data2-core-types@Reference"},{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"prevResult.data.0.system"}}},"component":"data2-core-types@Reference"},{"component":"data2-core-primitives@String","params":{"content":"000000000000000000000000"}}]},"component":"data2-core-logical-operators@Or"}}]}},{"params":{"compare":[{"params":{"subject":{"params":{},"component":"data2@3UDe5xvHPRuve6PvboXJG"}},"component":"data2-core-logical-operators@Not"},{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"RdETEpX-dr2XT93VoG8st"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"cursor.current._id"}}}},"comparisonSubject":{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$record.system._id"}}}},{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$record.system"}}}}]},"component":"data2-core-logical-operators@Or"}},"component":"data2-core-comparison-operators@Different"}],"then":{"params":{"code":{"component":"data2-core-primitives@String","params":{"content":"400"}},"message":{"component":"data2-core-primitives@String","params":{"content":"Cannot change \"system\" param."}}},"component":"data2-core-types@Error"}},"component":"data2-core-flow@If"}]},"component":"data2-core-flow@Series","displayName":"Fetch systems of request"},"validations":{"params":{"actions":[{"params":{"compare":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$id"}}}}},"component":"data2-core-logical-operators@Not","displayName":"No id"}],"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Param \"id\" is required."}},"code":{"component":"data2-core-primitives@String","params":{"content":"400"}}},"component":"data2-core-types@Error"}},"component":"data2-core-flow@If","displayName":"id is required"}]},"component":"data2-core-flow@Series","displayName":"validations"}},"component":"data2@8UcAMImtYnx_n3P6RC023"}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"remove"}},"value":{"params":{"setup":{"params":{"actions":[{"params":{"module":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$datasource"}}}},"prop":{"component":"data2-core-primitives@String","params":{"content":"find"}},"args":[{"params":{"text":{"params":{"haystack":{"component":"data2-core-primitives@String","params":{"content":"{ \"query\": { \"$and\": [{ \"_id\": \"__ID__\" }], \"$limit\": 1, \"$skip\": 0 } }\n"}},"needle":{"component":"data2-core-primitives@String","params":{"content":"__ID__"}},"patch":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$id"}}}}},"component":"data2-core-functions@Replace"}},"component":"data2-core-functions@JSONParse"}]},"component":"data2-core-types@Interaction","break":true},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"RdETEpX-dr2XT93VoG8st"}},"prop":"filter","args":[{"_id":{"params":{"components":[{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"prevResult.data.0.system._id"}}},"component":"data2-core-types@Reference"},{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"prevResult.data.0.system"}}},"component":"data2-core-types@Reference"},{"component":"data2-core-primitives@String","params":{"content":"000000000000000000000000"}}]},"component":"data2-core-logical-operators@Or"}}]}}]},"component":"data2-core-flow@Series","displayName":"Fetch systems of request"},"validations":{"params":{"actions":[{"params":{"compare":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$id"}}}}},"component":"data2-core-logical-operators@Not","displayName":"No id"}],"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Param \"id\" is required."}},"code":{"component":"data2-core-primitives@String","params":{"content":"400"}}},"component":"data2-core-types@Error"}},"component":"data2-core-flow@If","displayName":"id is required"}]},"component":"data2-core-flow@Series","displayName":"validations"}},"component":"data2@8UcAMImtYnx_n3P6RC023"}}}]},"component":"data2-core-flow@Switch"}}},{"component":"data2-core-auth@Policy","params":{"authenticationStrategy":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"InternalApplicationsAuthenticationStrategy"}}}}]},"updatedAt":"2025-11-06T20:04:29.967Z","createdAt":"2023-08-11T19:25:49.409Z"},{"_id":"64da942d93f0c506432e3ede","component":"data2-core-types@Component","system":"5e3b796d6228227ca637d0f4","params":{"component":"4dLBBZPQbUSzLKzUEPRQG","package":"data2","title":"UseCasesAuthenticate","definition":{"params":{"actions":[{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Data2BuilderAuthentication"}}},"component":"data2-core-flow@AwaitReady"},{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Data2BuilderAuthentication"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"credentials.email"}},"value":{"component":"data2-core-primitives@String","params":{"content":"use.cases@data2.app"}}}},{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Data2BuilderAuthentication"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"credentials.password"}},"value":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"HgkYY_mEdKHJWaRuaiOP6"}},"prop":"getValue","args":[{"component":"data2-core-primitives@String","params":{"content":"use_cases_password"}}],"x":{"component":"data2-core-primitives@String","params":{"content":"1"}}},"displayName":"Key use_cases_password","preventEvaluation":false}}},{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Data2BuilderAuthentication"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"credentials.status"}},"value":{"component":"data2-core-primitives@String","params":{"content":"active"}}}},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Data2BuilderAuthentication"}},"prop":"login","args":[{}]},"disabled":false},{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Data2BuilderAuthentication"}}},"component":"data2-core-flow@AwaitReady","disabled":false},{"params":{"compare":[{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Data2BuilderAuthentication"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"session._id"}}}}},"component":"data2-core-logical-operators@Not"}],"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Authentication failed"}},"code":{"component":"data2-core-primitives@String","params":{"content":"401"}}},"component":"data2-core-types@Error"}},"component":"data2-core-flow@If","disabled":false}]},"component":"data2-core-flow@Series","displayName":"auth","disabled":false}},"updatedAt":"2025-10-27T23:45:42.354Z","createdAt":"2023-08-14T20:53:01.457Z"},{"_id":"64dccad0f539d733f9fc5f48","component":"data2-core-types@Component","system":"5e3b796d6228227ca637d0f4","params":{"component":"8W_h3QmrkN99GB16WXmyb","package":"data2","title":"hasAccessToOrganizationResource","parameters":{"params":{"fields":{"setup":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-flow@Series","index":{"component":"data2-core-primitives@Number","params":{"content":2}}}},"validations":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-flow@Series","index":{"component":"data2-core-primitives@Number","params":{"content":1}}}}}},"component":"data2-core-types@FieldSet"},"definition":{"params":{"actions":[{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"validations"}}},"component":"data2-core-types@Reference"},{"params":{"actions":[{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Data2BuilderAuthentication"}}},"component":"data2-core-flow@AwaitReady"},{"params":{"compare":[{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Data2BuilderAuthentication"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"session._id"}},"x":{"component":"data2-core-primitives@String","params":{"content":"1"}}}}},"component":"data2-core-logical-operators@Not"}],"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Missing authentication"}},"code":{"component":"data2-core-primitives@String","params":{"content":"401"}}},"component":"data2-core-types@Error"}},"component":"data2-core-flow@If"},{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"UsersDataSet"}}},"component":"data2-core-flow@AwaitReady"},{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"DhPJ44W3fVq4ylQlnQJ6M"}}},"component":"data2-core-flow@AwaitReady"}]},"component":"data2-core-flow@Series","displayName":"common setup"},{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"setup"}}},"component":"data2-core-types@Reference"},{"params":{"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Validations after Setup not passed."}},"code":{"component":"data2-core-primitives@String","params":{"content":"400"}}},"component":"data2-core-types@Error"},"compare":[{"params":{"subject":{"params":{},"component":"data2@3UDe5xvHPRuve6PvboXJG"}},"component":"data2-core-logical-operators@Not","displayName":"is not @data2.app"},{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"8RATUCjKQCm9C66SA4llO"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records.length"}}}}},"component":"data2-core-logical-operators@Not","displayName":"organizations not found"}]},"component":"data2-core-logical-operators@Or"}]},"component":"data2-core-flow@If","displayName":"common validations after setup"},{"params":{"then":{"params":{"content":true},"component":"data2-core-primitives@Boolean"},"else":{"params":{"content":false},"component":"data2-core-primitives@Boolean"},"compare":[{"params":{"components":[{"params":{"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"active"}},"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Data2BuilderAuthentication"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"session.status"}}}}},"component":"data2-core-comparison-operators@Equal","displayName":"is active user"},{"params":{"components":[{"params":{},"component":"data2@3UDe5xvHPRuve6PvboXJG"},{"params":{"components":{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"8RATUCjKQCm9C66SA4llO"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"mapper":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"organization"}}],"body":{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"DhPJ44W3fVq4ylQlnQJ6M"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"member"}}],"body":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"member.organization._id"}}}},"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"organization._id"}}}}},"component":"data2-core-comparison-operators@Equal","displayName":"is org member"},{"params":{"pattern":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"member.role"}}}},"subject":[{"component":"data2-core-primitives@String","params":{"content":"owner"}},{"component":"data2-core-primitives@String","params":{"content":"admin"}}]},"component":"data2-core-functions@Includes","displayName":"has role with access"}]},"component":"data2-core-logical-operators@And","displayName":"has org member role with access"}}}},"component":"data2-core-functions@ArrayFind","displayName":"is org member: admin/owner"}}}},"component":"data2-core-functions@ArrayMap"}},"component":"data2-core-logical-operators@And","displayName":"has org member for all organizations in request"}]},"component":"data2-core-logical-operators@Or","displayName":"is active user and has access"}]},"component":"data2-core-logical-operators@And"}]},"component":"data2-core-flow@If"}]},"component":"data2-core-flow@Series"}},"updatedAt":"2023-08-17T21:14:30.325Z","createdAt":"2023-08-16T13:10:51.272Z"},{"_id":"64dccae4f539d733f9fc5f49","component":"data2-core-types@Component","system":"5e3b796d6228227ca637d0f4","params":{"component":"tp7v0wIGGE8oF-PKBreuZ","package":"data2","title":"PolicyOrganizationResource","definition":[{"component":"data2-core-auth@Policy","params":{"allow":{"params":{"expression":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"defaultCase":{"params":{},"component":"data2-core-primitives@Boolean"},"cases":[{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"find"}},"value":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"get"}},"value":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"create"}},"value":{"params":{"validations":{"params":{"actions":[{"params":{"compare":[{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$record.organization"}}}}},"component":"data2-core-logical-operators@Not","displayName":"No organization: single $record case"},{"params":{"components":{"params":{"array":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$record"}}}},"mapper":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"record"}}],"body":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"record.organization"}}}}},"component":"data2-core-logical-operators@Not"}}}},"component":"data2-core-functions@ArrayMap"}},"component":"data2-core-logical-operators@Or","displayName":"No organization: multi $record case"}]},"component":"data2-core-logical-operators@And"}],"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Param \"organization\" is required."}},"code":{"component":"data2-core-primitives@String","params":{"content":"400"}}},"component":"data2-core-types@Error"}},"component":"data2-core-flow@If","displayName":"organization is required"}]},"component":"data2-core-flow@Series","displayName":"validations"},"setup":{"params":{"actions":[{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"8RATUCjKQCm9C66SA4llO"}},"prop":"filter","args":[{"_id":{"params":{"compare":[{"params":{"value":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$record"}}}}},"component":"data2-core-functions@IsArray"}],"else":{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$record.organization"}}}},{"component":"data2-core-primitives@String","params":{"content":"000000000000000000000000"}}]},"component":"data2-core-logical-operators@Or"},"then":{"in":{"params":{"array":{"component":"data2-core-functions@ArrayMap","params":{"array":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$record"}}}},"mapper":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"record"}}],"body":{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"record.organization"}}}},{"component":"data2-core-primitives@String","params":{"content":"000000000000000000000000"}}]},"component":"data2-core-logical-operators@Or"}}}}}},"component":"data2-core-functions@Uniq"}}},"component":"data2-core-flow@If"}}]}},{"params":{"compare":[{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"8RATUCjKQCm9C66SA4llO"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records.length"}}}}},"component":"data2-core-logical-operators@Not"}],"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"No organizations found"}},"code":{"component":"data2-core-primitives@String","params":{"content":"404"}}},"component":"data2-core-types@Error"}},"component":"data2-core-flow@If"}]},"component":"data2-core-flow@Series","displayName":"Fetch organizations of request"}},"component":"data2@8W_h3QmrkN99GB16WXmyb"}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"patch"}},"value":{"params":{"setup":{"params":{"actions":[{"params":{"module":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$datasource"}}}},"prop":{"component":"data2-core-primitives@String","params":{"content":"find"}},"args":[{"params":{"text":{"params":{"haystack":{"component":"data2-core-primitives@String","params":{"content":"{ \"query\": { \"$and\": [{ \"_id\": \"__ID__\" }], \"$limit\": 1, \"$skip\": 0 } }\n"}},"needle":{"component":"data2-core-primitives@String","params":{"content":"__ID__"}},"patch":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$id"}}}}},"component":"data2-core-functions@Replace"}},"component":"data2-core-functions@JSONParse"}]},"component":"data2-core-types@Interaction","break":true},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"8RATUCjKQCm9C66SA4llO"}},"prop":"filter","args":[{"_id":{"params":{"components":[{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"prevResult.data.0.organization._id"}}},"component":"data2-core-types@Reference"},{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"prevResult.data.0.organization"}}},"component":"data2-core-types@Reference"},{"component":"data2-core-primitives@String","params":{"content":"000000000000000000000000"}}]},"component":"data2-core-logical-operators@Or"}}]}},{"params":{"compare":[{"params":{"subject":{"params":{},"component":"data2@3UDe5xvHPRuve6PvboXJG"}},"component":"data2-core-logical-operators@Not"},{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"8RATUCjKQCm9C66SA4llO"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"cursor.current._id"}}}},"comparisonSubject":{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$record.organization._id"}}}},{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$record.organization"}}}}]},"component":"data2-core-logical-operators@Or"}},"component":"data2-core-comparison-operators@Different"}],"then":{"params":{"code":{"component":"data2-core-primitives@String","params":{"content":"400"}},"message":{"component":"data2-core-primitives@String","params":{"content":"Cannot change \"organization\" param."}}},"component":"data2-core-types@Error"}},"component":"data2-core-flow@If"}]},"component":"data2-core-flow@Series","displayName":"Fetch organizations of request"},"validations":{"params":{"actions":[{"params":{"compare":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$id"}}}}},"component":"data2-core-logical-operators@Not","displayName":"No id"}],"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Param \"id\" is required."}},"code":{"component":"data2-core-primitives@String","params":{"content":"400"}}},"component":"data2-core-types@Error"}},"component":"data2-core-flow@If","displayName":"id is required"}]},"component":"data2-core-flow@Series","displayName":"validations"}},"component":"data2@8W_h3QmrkN99GB16WXmyb"}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"remove"}},"value":{"params":{"setup":{"params":{"actions":[{"params":{"module":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$datasource"}}}},"prop":{"component":"data2-core-primitives@String","params":{"content":"find"}},"args":[{"params":{"text":{"params":{"haystack":{"component":"data2-core-primitives@String","params":{"content":"{ \"query\": { \"$and\": [{ \"_id\": \"__ID__\" }], \"$limit\": 1, \"$skip\": 0 } }\n"}},"needle":{"component":"data2-core-primitives@String","params":{"content":"__ID__"}},"patch":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$id"}}}}},"component":"data2-core-functions@Replace"}},"component":"data2-core-functions@JSONParse"}]},"component":"data2-core-types@Interaction","break":true},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"8RATUCjKQCm9C66SA4llO"}},"prop":"filter","args":[{"_id":{"params":{"components":[{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"prevResult.data.0.organization._id"}}},"component":"data2-core-types@Reference"},{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"prevResult.data.0.organization"}}},"component":"data2-core-types@Reference"},{"component":"data2-core-primitives@String","params":{"content":"000000000000000000000000"}}]},"component":"data2-core-logical-operators@Or"}}]}}]},"component":"data2-core-flow@Series","displayName":"Fetch organizations of request"},"validations":{"params":{"actions":[{"params":{"compare":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$id"}}}}},"component":"data2-core-logical-operators@Not","displayName":"No id"}],"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Param \"id\" is required."}},"code":{"component":"data2-core-primitives@String","params":{"content":"400"}}},"component":"data2-core-types@Error"}},"component":"data2-core-flow@If","displayName":"id is required"}]},"component":"data2-core-flow@Series","displayName":"validations"}},"component":"data2@8W_h3QmrkN99GB16WXmyb"}}}]},"component":"data2-core-flow@Switch"}}},{"component":"data2-core-auth@Policy","params":{"authenticationStrategy":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"InternalApplicationsAuthenticationStrategy"}}}}]},"updatedAt":"2025-10-22T20:22:12.346Z","createdAt":"2023-08-16T13:11:07.222Z"},{"_id":"64de6e442ceda0be9d4a4a8d","component":"data2-core-types@Component","system":"5e3b796d6228227ca637d0f4","params":{"component":"O3a-RkuhZAyAyFYg0kKYh","package":"data2","title":"hasAccessToUserResource","parameters":{"params":{"fields":{"setup":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-flow@Series","index":{"component":"data2-core-primitives@Number","params":{"content":2}}}},"validations":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-flow@Series","index":{"component":"data2-core-primitives@Number","params":{"content":1}}}}}},"component":"data2-core-types@FieldSet"},"definition":{"params":{"actions":[{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"validations"}}},"component":"data2-core-types@Reference"},{"params":{"actions":[{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Data2BuilderAuthentication"}}},"component":"data2-core-flow@AwaitReady"},{"params":{"compare":[{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Data2BuilderAuthentication"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"session._id"}},"x":{"component":"data2-core-primitives@String","params":{"content":"1"}}}}},"component":"data2-core-logical-operators@Not"}],"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Missing authentication"}},"code":{"component":"data2-core-primitives@String","params":{"content":"401"}}},"component":"data2-core-types@Error"}},"component":"data2-core-flow@If"},{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"UsersDataSet"}}},"component":"data2-core-flow@AwaitReady"}]},"component":"data2-core-flow@Series","displayName":"common setup"},{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"setup"}}},"component":"data2-core-types@Reference"},{"params":{"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Validations after Setup not passed."}},"code":{"component":"data2-core-primitives@String","params":{"content":"400"}}},"component":"data2-core-types@Error"},"compare":[{"params":{"subject":{"params":{},"component":"data2@3UDe5xvHPRuve6PvboXJG"}},"component":"data2-core-logical-operators@Not","displayName":"is not @data2.app"},{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"uWJ56eAjtxAUHTwOm6DfK"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records.length"}}}}},"component":"data2-core-logical-operators@Not","displayName":"user not found"}]},"component":"data2-core-logical-operators@Or"}]},"component":"data2-core-flow@If","displayName":"common validations after setup"},{"params":{"then":{"params":{"content":true},"component":"data2-core-primitives@Boolean"},"else":{"params":{"content":false},"component":"data2-core-primitives@Boolean"},"compare":[{"params":{"components":[{"params":{"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"active"}},"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Data2BuilderAuthentication"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"session.status"}}}}},"component":"data2-core-comparison-operators@Equal","displayName":"is active user"},{"params":{"components":[{"params":{},"component":"data2@3UDe5xvHPRuve6PvboXJG"},{"params":{"components":{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"uWJ56eAjtxAUHTwOm6DfK"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"mapper":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"user"}}],"body":{"params":{"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"user._id"}}}},"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Data2BuilderAuthentication"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"session._id"}}}}},"component":"data2-core-comparison-operators@Equal"}}}},"component":"data2-core-functions@ArrayMap","displayName":"is user resource"}},"component":"data2-core-logical-operators@And"}]},"component":"data2-core-logical-operators@Or","displayName":"is active user and has access"}]},"component":"data2-core-logical-operators@And"}]},"component":"data2-core-flow@If"}]},"component":"data2-core-flow@Series"}},"updatedAt":"2023-08-17T21:14:50.005Z","createdAt":"2023-08-17T19:00:21.185Z"},{"_id":"64de706f2ceda0be9d4a4a90","component":"data2-core-types@Component","system":"5e3b796d6228227ca637d0f4","params":{"component":"OdXqkniRwozlztGpfeuZ3","package":"data2","title":"PolicyUserResource","definition":[{"component":"data2-core-auth@Policy","params":{"allow":{"params":{"expression":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"defaultCase":{"params":{},"component":"data2-core-primitives@Boolean"},"cases":[{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"find"}},"value":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"get"}},"value":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"create"}},"value":{"params":{"validations":{"params":{"actions":[{"params":{"compare":[{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$record.user"}}}}},"component":"data2-core-logical-operators@Not","displayName":"No user: single $record case"},{"params":{"components":{"params":{"array":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$record"}}}},"mapper":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"record"}}],"body":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"record.user"}}}}},"component":"data2-core-logical-operators@Not"}}}},"component":"data2-core-functions@ArrayMap"}},"component":"data2-core-logical-operators@Or","displayName":"No user: multi $record case"}]},"component":"data2-core-logical-operators@And"}],"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Param \"user\" is required."}},"code":{"component":"data2-core-primitives@String","params":{"content":"400"}}},"component":"data2-core-types@Error"}},"component":"data2-core-flow@If","displayName":"user is required"}]},"component":"data2-core-flow@Series","displayName":"validations"},"setup":{"params":{"actions":[{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"uWJ56eAjtxAUHTwOm6DfK"}},"prop":"filter","args":[{"_id":{"params":{"compare":[{"params":{"value":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$record"}}}}},"component":"data2-core-functions@IsArray"}],"else":{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$record.user"}}}},{"component":"data2-core-primitives@String","params":{"content":"000000000000000000000000"}}]},"component":"data2-core-logical-operators@Or"},"then":{"in":{"params":{"array":{"component":"data2-core-functions@ArrayMap","params":{"array":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$record"}}}},"mapper":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"record"}}],"body":{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"record.user"}}}},{"component":"data2-core-primitives@String","params":{"content":"000000000000000000000000"}}]},"component":"data2-core-logical-operators@Or"}}}}}},"component":"data2-core-functions@Uniq"}}},"component":"data2-core-flow@If"}}]}},{"params":{"compare":[{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"uWJ56eAjtxAUHTwOm6DfK"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records.length"}}}}},"component":"data2-core-logical-operators@Not"}],"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"No users found"}},"code":{"component":"data2-core-primitives@String","params":{"content":"404"}}},"component":"data2-core-types@Error"}},"component":"data2-core-flow@If"}]},"component":"data2-core-flow@Series","displayName":"Fetch users of request"}},"component":"data2@O3a-RkuhZAyAyFYg0kKYh"}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"patch"}},"value":{"params":{"setup":{"params":{"actions":[{"params":{"module":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$datasource"}}}},"prop":{"component":"data2-core-primitives@String","params":{"content":"find"}},"args":[{"params":{"text":{"params":{"haystack":{"component":"data2-core-primitives@String","params":{"content":"{ \"query\": { \"$and\": [{ \"_id\": \"__ID__\" }], \"$limit\": 1, \"$skip\": 0 } }\n"}},"needle":{"component":"data2-core-primitives@String","params":{"content":"__ID__"}},"patch":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$id"}}}}},"component":"data2-core-functions@Replace"}},"component":"data2-core-functions@JSONParse"}]},"component":"data2-core-types@Interaction","break":true},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"uWJ56eAjtxAUHTwOm6DfK"}},"prop":"filter","args":[{"_id":{"params":{"components":[{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"prevResult.data.0.user._id"}}},"component":"data2-core-types@Reference"},{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"prevResult.data.0.user"}}},"component":"data2-core-types@Reference"},{"component":"data2-core-primitives@String","params":{"content":"000000000000000000000000"}}]},"component":"data2-core-logical-operators@Or"}}]}},{"params":{"compare":[{"params":{"subject":{"params":{},"component":"data2@3UDe5xvHPRuve6PvboXJG"}},"component":"data2-core-logical-operators@Not"},{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"uWJ56eAjtxAUHTwOm6DfK"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"cursor.current._id"}}}},"comparisonSubject":{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$record.user._id"}}}},{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$record.user"}}}}]},"component":"data2-core-logical-operators@Or"}},"component":"data2-core-comparison-operators@Different"}],"then":{"params":{"code":{"component":"data2-core-primitives@String","params":{"content":"400"}},"message":{"component":"data2-core-primitives@String","params":{"content":"Cannot change \"user\" param."}}},"component":"data2-core-types@Error"}},"component":"data2-core-flow@If"}]},"component":"data2-core-flow@Series","displayName":"Fetch users of request"},"validations":{"params":{"actions":[{"params":{"compare":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$id"}}}}},"component":"data2-core-logical-operators@Not","displayName":"No id"}],"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Param \"id\" is required."}},"code":{"component":"data2-core-primitives@String","params":{"content":"400"}}},"component":"data2-core-types@Error"}},"component":"data2-core-flow@If","displayName":"id is required"}]},"component":"data2-core-flow@Series","displayName":"validations"}},"component":"data2@O3a-RkuhZAyAyFYg0kKYh"}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"remove"}},"value":{"params":{"setup":{"params":{"actions":[{"params":{"module":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$datasource"}}}},"prop":{"component":"data2-core-primitives@String","params":{"content":"find"}},"args":[{"params":{"text":{"params":{"haystack":{"component":"data2-core-primitives@String","params":{"content":"{ \"query\": { \"$and\": [{ \"_id\": \"__ID__\" }], \"$limit\": 1, \"$skip\": 0 } }\n"}},"needle":{"component":"data2-core-primitives@String","params":{"content":"__ID__"}},"patch":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$id"}}}}},"component":"data2-core-functions@Replace"}},"component":"data2-core-functions@JSONParse"}]},"component":"data2-core-types@Interaction","break":true},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"uWJ56eAjtxAUHTwOm6DfK"}},"prop":"filter","args":[{"_id":{"params":{"components":[{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"prevResult.data.0.user._id"}}},"component":"data2-core-types@Reference"},{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"prevResult.data.0.user"}}},"component":"data2-core-types@Reference"},{"component":"data2-core-primitives@String","params":{"content":"000000000000000000000000"}}]},"component":"data2-core-logical-operators@Or"}}]}}]},"component":"data2-core-flow@Series","displayName":"Fetch users of request"},"validations":{"params":{"actions":[{"params":{"compare":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$id"}}}}},"component":"data2-core-logical-operators@Not","displayName":"No id"}],"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Param \"id\" is required."}},"code":{"component":"data2-core-primitives@String","params":{"content":"400"}}},"component":"data2-core-types@Error"}},"component":"data2-core-flow@If","displayName":"id is required"}]},"component":"data2-core-flow@Series","displayName":"validations"}},"component":"data2@O3a-RkuhZAyAyFYg0kKYh"}}}]},"component":"data2-core-flow@Switch"}}},{"component":"data2-core-auth@Policy","params":{"authenticationStrategy":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"InternalApplicationsAuthenticationStrategy"}}}}]},"updatedAt":"2025-10-22T20:22:15.058Z","createdAt":"2023-08-17T19:13:07.185Z"},{"_id":"64de8d45269fe70647df5022","component":"data2-core-types@Component","system":"5e3b796d6228227ca637d0f4","params":{"component":"3UDe5xvHPRuve6PvboXJG","package":"data2","title":"isData2User","definition":{"component":"data2-core-types@Getter","params":{"module":{"params":{"pattern":{"component":"data2-core-types@Regex","params":{"pattern":"@data2\\.app$"}},"text":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Data2BuilderAuthentication"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"session.email"}}}}},"component":"data2-core-functions@Match"},"prop":{"component":"data2-core-primitives@String","params":{"content":"0"}}}}},"updatedAt":"2023-08-17T21:13:37.611Z","createdAt":"2023-08-17T21:12:37.595Z"},{"_id":"64e65f2a4a3f150647054130","component":"data2-core-types@Component","system":"5e3b796d6228227ca637d0f4","params":{"component":"WgBQaro9jf-b5RAFcDPru","package":"data2","title":"DataSetInfoForLog","parameters":{"params":{"fields":{"dataset":{"params":{"component":"data2-core-types@DataSetReference"},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@FieldSet"},"definition":{"records":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"dataset"}}}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}}},"cursor":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"dataset"}}}},"prop":{"component":"data2-core-primitives@String","params":{"content":"cursor.index"}}}},"state":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"dataset"}}}},"prop":{"component":"data2-core-primitives@String","params":{"content":"state"}}}}}},"updatedAt":"2023-08-23T19:35:34.129Z","createdAt":"2023-08-23T19:34:02.191Z"},{"_id":"690514690d0a7b4de2fe4c4c","component":"data2-core-types@Component","system":"5e3b796d6228227ca637d0f4","params":{"component":"7KkQq0vK4a7D2gg6IVJT7","package":"data2","title":"hasRequiredField","definition":{"params":{"content":{"params":{"components":{"params":{"array":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"query.$and"}}}},"mapper":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"filterPart"}}],"body":{"params":{"defaultCase":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"filterPart"}}}},"prop":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"field"}}}}},"displayName":"get field value"},"expression":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"fieldType"}}}},"cases":[{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"string"}},"value":{"params":{"components":[{"params":{"value":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"filterPart"}}}},"prop":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"field"}}}}},"displayName":"get field value"}},"component":"data2-core-functions@IsString"},{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"filterPart"}}}},"prop":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"field"}}}}},"displayName":"get field value"}]},"component":"data2-core-logical-operators@And"}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"number"}},"value":{"params":{"value":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"filterPart"}}}},"prop":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"field"}}}}},"displayName":"get field value"}},"component":"data2-core-functions@IsNumber"}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"boolean"}},"value":{"params":{"value":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"filterPart"}}}},"prop":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"field"}}}}},"displayName":"get field value"}},"component":"data2-core-functions@IsBoolean"}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"null"}},"value":{"params":{"value":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"filterPart"}}}},"prop":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"field"}}}}},"displayName":"get field value"}},"component":"data2-core-functions@IsNil"}}}]},"component":"data2-core-flow@Switch"}}}},"component":"data2-core-functions@ArrayMap"}},"component":"data2-core-logical-operators@Or"}},"component":"data2-core-primitives@Boolean","break":true},"parameters":{"params":{"fields":{"query":{"component":"data2-core-types@ComponentParameter","params":{"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"component":"data2-core-types@Reference"}},"field":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":2}}},"component":"data2-core-types@ComponentParameter"},"fieldType":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":2}},"oneOf":[{"params":{"content":"string"},"component":"data2-core-primitives@String"},{"params":{"content":"number"},"component":"data2-core-primitives@String"},{"params":{"content":"boolean"},"component":"data2-core-primitives@String"},{"params":{"content":"null"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@FieldSet"}},"updatedAt":"2025-11-05T19:11:23.953Z","createdAt":"2025-10-31T19:56:25.803Z"},{"_id":"690bc7907eadfcdf9417dad8","component":"data2-core-types@Component","system":"5e3b796d6228227ca637d0f4","params":{"component":"LeyCKgHIIXJTBYxtCJcYF","package":"data2","title":"hasAccessToSystemResourceViaToken","definition":{"params":{"actions":[{"params":{"actions":[{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Data2BuilderAuthentication"}}},"component":"data2-core-flow@AwaitReady"},{"params":{"compare":[{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Data2BuilderAuthentication"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"session._id"}},"x":{"component":"data2-core-primitives@String","params":{"content":"1"}}}}},"component":"data2-core-logical-operators@Not"}],"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Missing authentication"}},"code":{"component":"data2-core-primitives@String","params":{"content":"401"}}},"component":"data2-core-types@Error"}},"component":"data2-core-flow@If"}]},"component":"data2-core-flow@Series","displayName":"common setup"},{"params":{"then":{"params":{"content":true},"component":"data2-core-primitives@Boolean"},"else":{"params":{"content":false},"component":"data2-core-primitives@Boolean"},"compare":{"params":{"components":[{"params":{"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"active"}},"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Data2BuilderAuthentication"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"session.status"}}}}},"component":"data2-core-comparison-operators@Equal","displayName":"is active user"},{"params":{"components":[{"params":{},"component":"data2@3UDe5xvHPRuve6PvboXJG"},{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"system"}}}},{"params":{"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"system"}}}},"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Data2BuilderAuthentication"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"sessionsDataSet.instance.cursor.current.metadata.system"}}}}},"component":"data2-core-comparison-operators@Equal"}]},"component":"data2-core-logical-operators@And","displayName":"has access to system"},{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"find"}}},"component":"data2-core-comparison-operators@Equal","displayName":""},{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"system"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"5e3b796d6228227ca637d0f4"}}},"component":"data2-core-comparison-operators@Equal","displayName":""}]},"component":"data2-core-logical-operators@And","displayName":"is reading data2 system for player preview (loads data2 data2)"}]},"component":"data2-core-logical-operators@Or","displayName":"has access"}]},"component":"data2-core-logical-operators@And"}},"component":"data2-core-flow@If"}]},"component":"data2-core-flow@Series"},"parameters":{"params":{"fields":{"system":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":1}}}},"method":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":2}},"oneOf":[{"params":{"content":"find"},"component":"data2-core-primitives@String"},{"params":{"content":"get"},"component":"data2-core-primitives@String"},{"params":{"content":"create"},"component":"data2-core-primitives@String"},{"params":{"content":"patch"},"component":"data2-core-primitives@String"},{"params":{"content":"delete"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@FieldSet"}},"updatedAt":"2025-11-06T20:03:16.745Z","createdAt":"2025-11-05T21:56:22.741Z"},{"_id":"690bcf91e5a34a88371b516c","component":"data2-core-types@Component","system":"5e3b796d6228227ca637d0f4","params":{"component":"hkXy-UhMjhyfptdE6_fpW","package":"data2","title":"PolicySystemResourceNew","definition":[{"component":"data2-core-auth@Policy","params":{"allow":{"params":{"expression":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"defaultCase":{"params":{},"component":"data2-core-primitives@Boolean"},"cases":[{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"find"}},"value":{"params":{"system":{"params":{"components":{"params":{"array":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$params.query.$and"}}}},"mapper":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"filterPart"}}],"body":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"filterPart.system"}}}}}}},"component":"data2-core-functions@ArrayMap"}},"component":"data2-core-logical-operators@Or"},"method":"find"},"component":"data2@LeyCKgHIIXJTBYxtCJcYF"}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"get"}},"value":{"params":{"actions":[{"params":{"actions":[{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Data2BuilderAuthentication"}}},"component":"data2-core-flow@AwaitReady"},{"params":{"compare":[{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Data2BuilderAuthentication"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"session._id"}},"x":{"component":"data2-core-primitives@String","params":{"content":"1"}}}}},"component":"data2-core-logical-operators@Not"}],"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Missing authentication"}},"code":{"component":"data2-core-primitives@String","params":{"content":"401"}}},"component":"data2-core-types@Error"}},"component":"data2-core-flow@If"}]},"component":"data2-core-flow@Series","displayName":"common setup"},{"params":{"compare":{"params":{"subject":[{"component":"data2-core-primitives@String","params":{"content":"UserComponentsDataSet"}},{"component":"data2-core-primitives@String","params":{"content":"ComponentInstancesDataSet"}},{"component":"data2-core-primitives@String","params":{"content":"DataComponentInstancesDataSet"}},{"component":"data2-core-primitives@String","params":{"content":"ServiceComponentInstancesDataSet"}},{"component":"data2-core-primitives@String","params":{"content":"DriveFileComponentInstancesDataSet"}},{"component":"data2-core-primitives@String","params":{"content":"ExternalComponentInstancesDataSet"}},{"component":"data2-core-primitives@String","params":{"content":"BundlesDataSet"}}],"pattern":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$dataset.reference"}}}}},"component":"data2-core-functions@Includes"},"else":{"params":{"content":false},"component":"data2-core-primitives@Boolean"},"then":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-flow@If"}]},"component":"data2-core-flow@Series"}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"create"}},"value":{"params":{"setup":{"params":{"actions":[{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"RdETEpX-dr2XT93VoG8st"}},"prop":"filter","args":[{"_id":{"params":{"compare":[{"params":{"value":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$record"}}}}},"component":"data2-core-functions@IsArray"}],"else":{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$record.system"}}}},{"component":"data2-core-primitives@String","params":{"content":"000000000000000000000000"}}]},"component":"data2-core-logical-operators@Or"},"then":{"in":{"params":{"array":{"component":"data2-core-functions@ArrayMap","params":{"array":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$record"}}}},"mapper":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"record"}}],"body":{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"record.system"}}}},{"component":"data2-core-primitives@String","params":{"content":"000000000000000000000000"}}]},"component":"data2-core-logical-operators@Or"}}}}}},"component":"data2-core-functions@Uniq"}}},"component":"data2-core-flow@If"}}]}},{"params":{"compare":[{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"RdETEpX-dr2XT93VoG8st"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records.length"}}}}},"component":"data2-core-logical-operators@Not"},{"params":{"subject":{"params":{},"component":"data2@3UDe5xvHPRuve6PvboXJG"}},"component":"data2-core-logical-operators@Not"}],"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"No systems found"}},"code":{"component":"data2-core-primitives@String","params":{"content":"404"}}},"component":"data2-core-types@Error"}},"component":"data2-core-flow@If"}]},"component":"data2-core-flow@Series","displayName":"Fetch systems of request"},"validations":{"params":{"actions":[{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Data2BuilderAuthentication"}}},"component":"data2-core-flow@AwaitReady"},{"params":{"compare":[{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$record.system"}}}}},"component":"data2-core-logical-operators@Not","displayName":"No system: single $record case"},{"params":{"components":{"params":{"array":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$record"}}}},"mapper":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"record"}}],"body":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"record.system"}}}}},"component":"data2-core-logical-operators@Not"}}}},"component":"data2-core-functions@ArrayMap"}},"component":"data2-core-logical-operators@Or","displayName":"No system: multi $record case"},{"params":{"subject":{"params":{},"component":"data2@3UDe5xvHPRuve6PvboXJG"}},"component":"data2-core-logical-operators@Not"}]},"component":"data2-core-logical-operators@And"}],"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Param \"system\" is required."}},"code":{"component":"data2-core-primitives@String","params":{"content":"400"}}},"component":"data2-core-types@Error"}},"component":"data2-core-flow@If","displayName":"system is required"}]},"component":"data2-core-flow@Series","displayName":"validations"}},"component":"data2@8UcAMImtYnx_n3P6RC023"}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"patch"}},"value":{"params":{"setup":{"params":{"actions":[{"params":{"module":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$datasource"}}}},"prop":{"component":"data2-core-primitives@String","params":{"content":"find"}},"args":[{"params":{"text":{"params":{"haystack":{"component":"data2-core-primitives@String","params":{"content":"{ \"query\": { \"$and\": [{ \"_id\": \"__ID__\" }], \"$limit\": 1, \"$skip\": 0 } }\n"}},"needle":{"component":"data2-core-primitives@String","params":{"content":"__ID__"}},"patch":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$id"}}}}},"component":"data2-core-functions@Replace"}},"component":"data2-core-functions@JSONParse"},{"params":{"disableSoftDelete":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}}}]},"component":"data2-core-types@Interaction","break":true},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"RdETEpX-dr2XT93VoG8st"}},"prop":"filter","args":[{"_id":{"params":{"components":[{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"prevResult.data.0.system._id"}}},"component":"data2-core-types@Reference"},{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"prevResult.data.0.system"}}},"component":"data2-core-types@Reference"},{"component":"data2-core-primitives@String","params":{"content":"000000000000000000000000"}}]},"component":"data2-core-logical-operators@Or"}}]}},{"params":{"compare":[{"params":{"subject":{"params":{},"component":"data2@3UDe5xvHPRuve6PvboXJG"}},"component":"data2-core-logical-operators@Not"},{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"RdETEpX-dr2XT93VoG8st"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"cursor.current._id"}}}},"comparisonSubject":{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$record.system._id"}}}},{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$record.system"}}}}]},"component":"data2-core-logical-operators@Or"}},"component":"data2-core-comparison-operators@Different"}],"then":{"params":{"code":{"component":"data2-core-primitives@String","params":{"content":"400"}},"message":{"component":"data2-core-primitives@String","params":{"content":"Cannot change \"system\" param."}}},"component":"data2-core-types@Error"}},"component":"data2-core-flow@If"}]},"component":"data2-core-flow@Series","displayName":"Fetch systems of request"},"validations":{"params":{"actions":[{"params":{"compare":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$id"}}}}},"component":"data2-core-logical-operators@Not","displayName":"No id"}],"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Param \"id\" is required."}},"code":{"component":"data2-core-primitives@String","params":{"content":"400"}}},"component":"data2-core-types@Error"}},"component":"data2-core-flow@If","displayName":"id is required"}]},"component":"data2-core-flow@Series","displayName":"validations"}},"component":"data2@8UcAMImtYnx_n3P6RC023"}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"remove"}},"value":{"params":{"setup":{"params":{"actions":[{"params":{"module":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$datasource"}}}},"prop":{"component":"data2-core-primitives@String","params":{"content":"find"}},"args":[{"params":{"text":{"params":{"haystack":{"component":"data2-core-primitives@String","params":{"content":"{ \"query\": { \"$and\": [{ \"_id\": \"__ID__\" }], \"$limit\": 1, \"$skip\": 0 } }\n"}},"needle":{"component":"data2-core-primitives@String","params":{"content":"__ID__"}},"patch":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$id"}}}}},"component":"data2-core-functions@Replace"}},"component":"data2-core-functions@JSONParse"}]},"component":"data2-core-types@Interaction","break":true},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"RdETEpX-dr2XT93VoG8st"}},"prop":"filter","args":[{"_id":{"params":{"components":[{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"prevResult.data.0.system._id"}}},"component":"data2-core-types@Reference"},{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"prevResult.data.0.system"}}},"component":"data2-core-types@Reference"},{"component":"data2-core-primitives@String","params":{"content":"000000000000000000000000"}}]},"component":"data2-core-logical-operators@Or"}}]}}]},"component":"data2-core-flow@Series","displayName":"Fetch systems of request"},"validations":{"params":{"actions":[{"params":{"compare":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$id"}}}}},"component":"data2-core-logical-operators@Not","displayName":"No id"}],"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Param \"id\" is required."}},"code":{"component":"data2-core-primitives@String","params":{"content":"400"}}},"component":"data2-core-types@Error"}},"component":"data2-core-flow@If","displayName":"id is required"}]},"component":"data2-core-flow@Series","displayName":"validations"}},"component":"data2@8UcAMImtYnx_n3P6RC023"}}}]},"component":"data2-core-flow@Switch"}}},{"component":"data2-core-auth@Policy","params":{"authenticationStrategy":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"InternalApplicationsAuthenticationStrategy"}}}}]},"updatedAt":"2026-07-25T02:34:12.105Z","createdAt":"2025-11-05T22:29:11.314Z"},{"_id":"6a75bd40f183062aef276602","component":"data2-core-types@Component","system":"5e3b796d6228227ca637d0f4","params":{"extends":"data2-core-primitives@Block","component":"GoogleLoginButton","package":"data2","title":"Google Login Button","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"// Google login button (soft-launch gated by ?g=1). Opens the fixed-origin GIS broker popup,\n// receives the Google ID token via postMessage, and emits 'onCredential' with the token.\n// Wire onCredential -> @SessionsDataSet.create({authStrategy:'Data2BuilderAuthentication',\n//   identityProvider:'GOOGLE', thirdPartyToken:$event, metadata:{system:...}}) + reload.\nfunction resolveBroker(d2) {\n  const override = d2.param('brokerOrigin', '')\n  if (override) return String(override).replace(/\\/$/, '')\n  const h = location.hostname\n  if (h === 'data2.builders' || h.endsWith('.data2.builders')) return 'https://data2.builders'\n  if (h === 'data2.qa' || h.endsWith('.data2.qa')) return 'https://data2.qa'\n  return location.origin\n}\nfunction gateOn() {\n  // SSR/vm-safe: no window/localStorage -> gated off, never throws (a throw here black-screens render).\n  try {\n    if (typeof window === 'undefined' || typeof localStorage === 'undefined') return false\n    if (new URLSearchParams(location.search).get('g') === '1') localStorage.setItem('d2_google', '1')\n    return localStorage.getItem('d2_google') === '1'\n  } catch (e) {\n    return false\n  }\n}\nexport default {\n  css: `.g{display:flex;justify-content:center;padding:8px 0}\n        .b{display:inline-flex;align-items:center;gap:10px;height:40px;padding:0 22px;border:1px solid #dadce0;border-radius:9999px;background:#fff;color:#3c4043;font:600 14px/1 sans-serif;cursor:pointer}\n        .b[disabled]{opacity:.6;cursor:default}\n        .b:hover:not([disabled]){background:#f8faff}`,\n  render(d2) {\n    if (!gateOn()) return ''\n    const busy = d2.state.busy\n    return `<div class=\"g\"><button class=\"b\" ${busy ? 'disabled' : ''}>\n      <svg width=\"18\" height=\"18\" viewBox=\"0 0 48 48\"><path fill=\"#4285F4\" d=\"M45 24c0-1.6-.1-3.1-.4-4.6H24v9.1h11.8c-.5 2.7-2 5-4.4 6.6v5.5h7.1C42.7 36.9 45 31 45 24z\"/><path fill=\"#34A853\" d=\"M24 46c5.9 0 10.9-2 14.5-5.4l-7.1-5.5c-2 1.3-4.5 2.1-7.4 2.1-5.7 0-10.5-3.8-12.2-9H4.5v5.7C8.1 41.1 15.4 46 24 46z\"/><path fill=\"#FBBC05\" d=\"M11.8 28.2c-.5-1.3-.7-2.7-.7-4.2s.3-2.9.7-4.2v-5.7H4.5C3 17 2 20.4 2 24s1 7 2.5 9.9l7.3-5.7z\"/><path fill=\"#EA4335\" d=\"M24 11.5c3.2 0 6.1 1.1 8.4 3.3l6.3-6.3C34.9 4.9 29.9 3 24 3 15.4 3 8.1 7.9 4.5 15.1l7.3 5.7c1.7-5.2 6.5-9.3 12.2-9.3z\"/></svg>\n      ${busy ? 'Signing in…' : 'Sign in with Google'}\n    </button></div>`\n  },\n  mounted(d2) {\n    if (!gateOn()) return\n    const broker = resolveBroker(d2)\n    d2.on('.b', 'click', () => {\n      if (d2.state.busy) return\n      const nonce = String(Date.now()) + '.' + Math.random().toString(36).slice(2)\n      const url = `${broker}/google-login?origin=${encodeURIComponent(location.origin)}&nonce=${encodeURIComponent(nonce)}`\n      const popup = window.open(url, 'd2-google-login', 'width=460,height=620')\n      d2.state.busy = true\n      const cleanup = () => {\n        window.removeEventListener('message', onMsg)\n        try { popup && popup.close() } catch (e) {}\n        d2.state.busy = false\n      }\n      const onMsg = (e) => {\n        if (e.origin !== broker) return\n        const data = e.data || {}\n        if (data.type !== 'D2_GOOGLE_CREDENTIAL' || data.nonce !== nonce) return\n        cleanup()\n        d2.emit('onCredential', data.token)\n      }\n      window.addEventListener('message', onMsg)\n      d2.onUnmount(cleanup)\n    })\n  },\n}\n"}},"brokerOrigin":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"brokerOrigin"}}}}}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"brokerOrigin":{"component":"data2-core-primitives@String"}}}},"__d2PrevCode":{"code":"// Google login button (soft-launch gated by ?g=1). Opens the fixed-origin GIS broker popup,\n// receives the Google ID token via postMessage, and emits 'onCredential' with the token.\n// Wire onCredential -> @SessionsDataSet.create({authStrategy:'Data2BuilderAuthentication',\n//   identityProvider:'GOOGLE', thirdPartyToken:$event, metadata:{system:...}}) + reload.\nfunction resolveBroker(d2) {\n  const override = d2.param('brokerOrigin', '')\n  if (override) return String(override).replace(/\\/$/, '')\n  const h = location.hostname\n  if (h === 'data2.builders' || h.endsWith('.data2.builders')) return 'https://data2.builders'\n  if (h === 'data2.qa' || h.endsWith('.data2.qa')) return 'https://data2.qa'\n  return location.origin\n}\nfunction gateOn() {\n  try {\n    if (new URLSearchParams(location.search).get('g') === '1') localStorage.setItem('d2_google', '1')\n    return localStorage.getItem('d2_google') === '1'\n  } catch (e) {\n    return new URLSearchParams(location.search).get('g') === '1'\n  }\n}\nexport default {\n  css: `.g{display:flex;justify-content:center;padding:8px 0}\n        .b{display:inline-flex;align-items:center;gap:10px;height:40px;padding:0 22px;border:1px solid #dadce0;border-radius:9999px;background:#fff;color:#3c4043;font:600 14px/1 sans-serif;cursor:pointer}\n        .b[disabled]{opacity:.6;cursor:default}\n        .b:hover:not([disabled]){background:#f8faff}`,\n  render(d2) {\n    if (!gateOn()) return ''\n    const busy = d2.state.busy\n    return `<div class=\"g\"><button class=\"b\" ${busy ? 'disabled' : ''}>\n      <svg width=\"18\" height=\"18\" viewBox=\"0 0 48 48\"><path fill=\"#4285F4\" d=\"M45 24c0-1.6-.1-3.1-.4-4.6H24v9.1h11.8c-.5 2.7-2 5-4.4 6.6v5.5h7.1C42.7 36.9 45 31 45 24z\"/><path fill=\"#34A853\" d=\"M24 46c5.9 0 10.9-2 14.5-5.4l-7.1-5.5c-2 1.3-4.5 2.1-7.4 2.1-5.7 0-10.5-3.8-12.2-9H4.5v5.7C8.1 41.1 15.4 46 24 46z\"/><path fill=\"#FBBC05\" d=\"M11.8 28.2c-.5-1.3-.7-2.7-.7-4.2s.3-2.9.7-4.2v-5.7H4.5C3 17 2 20.4 2 24s1 7 2.5 9.9l7.3-5.7z\"/><path fill=\"#EA4335\" d=\"M24 11.5c3.2 0 6.1 1.1 8.4 3.3l6.3-6.3C34.9 4.9 29.9 3 24 3 15.4 3 8.1 7.9 4.5 15.1l7.3 5.7c1.7-5.2 6.5-9.3 12.2-9.3z\"/></svg>\n      ${busy ? 'Signing in…' : 'Sign in with Google'}\n    </button></div>`\n  },\n  mounted(d2) {\n    if (!gateOn()) return\n    const broker = resolveBroker(d2)\n    d2.on('.b', 'click', () => {\n      if (d2.state.busy) return\n      const nonce = String(Date.now()) + '.' + Math.random().toString(36).slice(2)\n      const url = `${broker}/google-login?origin=${encodeURIComponent(location.origin)}&nonce=${encodeURIComponent(nonce)}`\n      const popup = window.open(url, 'd2-google-login', 'width=460,height=620')\n      d2.state.busy = true\n      const cleanup = () => {\n        window.removeEventListener('message', onMsg)\n        try { popup && popup.close() } catch (e) {}\n        d2.state.busy = false\n      }\n      const onMsg = (e) => {\n        if (e.origin !== broker) return\n        const data = e.data || {}\n        if (data.type !== 'D2_GOOGLE_CREDENTIAL' || data.nonce !== nonce) return\n        cleanup()\n        d2.emit('onCredential', data.token)\n      }\n      window.addEventListener('message', onMsg)\n      d2.onUnmount(cleanup)\n    })\n  },\n}\n","at":"2026-08-07T11:14:27.128Z"}},"updatedAt":"2026-08-07T11:14:27.372Z","createdAt":"2026-08-07T11:10:56.904Z"}]}},{"component":"data2-core@DataSet","reference":"SystemsDataSet","params":{"filter":{"domain":"data2"},"pagination":{"size":1},"datasource":{"component":"data2-core-types@ProcessReference","params":{"reference":"SystemsDataSource"}}}},{"reference":"ExternalComponentInstancesDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[{"_id":"5ef663c981a6537f79316ad5","component":"data2-core@Api","displayName":"ComponentInstances","system":"5e3b796d6228227ca637d0f4","params":{"paginate":{"default":1000},"url":"/componentInstances","databaseId":"5ee247cee57c0d130f660e7b","collection":"componentInstances","schema":{"name":"string","parent":"objectId","component":"string","system":"objectId","displayName":"string","params":"object","index":"number","treeIndex":"number","expanded":"boolean","reference":"string","free-roam":"object"},"hooks":{"before":{"all":[{"hook":"softDelete"}],"create":[{"hook":"timestamp","options":{"fields":["createdAt","updatedAt"]}}],"find":[{"hook":"useCache","options":{"additionalGroupKeys":["$and.0.system","$and.1.system"]}}],"update":[{"hook":"timestamp","options":{"fields":["updatedAt"]}}],"patch":[{"hook":"timestamp","options":{"fields":["updatedAt"]}}]},"after":{"create":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["system"]}},{"hook":"invalidateEnvCache"}],"update":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["system"]}},{"hook":"invalidateEnvCache"}],"patch":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["system"]}},{"hook":"invalidateEnvCache"}],"remove":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["system"]}},{"hook":"invalidateEnvCache"}]}},"multi":["create"],"position":{"component":"data2-core-types@Position","params":{"x":-652.96,"y":-906.53}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":300,"height":300}},"database":{"component":"data2-core-types@ServiceDatabaseReference","params":{"reference":"BootstrapDB"}}},"updatedAt":"2021-08-13T19:44:44.085Z","createdAt":"2020-06-26T21:08:08.993Z"},{"_id":"5f6b448fa575399a451b656a","component":"data2-core@Api","displayName":"Packages","system":"5e3b796d6228227ca637d0f4","params":{"paginate":{"default":1000},"url":"/packages","collection":"packages","schema":{"reference":"string","params":{"component":"string","parameters":{"component":"string","params":"object"}}},"hooks":{"before":{"all":[{"hook":"softDelete"}],"create":[{"hook":"timestamp","options":{"fields":["createdAt","updatedAt"]}}],"update":[{"hook":"timestamp","options":{"fields":["updatedAt"]}}],"patch":[{"hook":"timestamp","options":{"fields":["updatedAt"]}}]}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":300,"height":300}},"position":{"component":"data2-core-types@Position","params":{"x":62.42,"y":-1240.07}},"database":{"component":"data2-core-types@ServiceDatabaseReference","params":{"reference":"BootstrapDB"}}},"updatedAt":"2021-06-29T18:43:21.270Z","createdAt":"2020-09-23T12:46:59.069Z"},{"_id":"602c4178c2dd12f059169556","component":"data2-core@Api","displayName":"CertificatesChallenges","system":"5e3b796d6228227ca637d0f4","params":{"paginate":{"default":1000},"url":"/certificatesChallenges","collection":"certificatesChallenges","schema":{"domain":"string","type":"string","token":"string","authorization":"string","accountUrl":"string"},"hooks":{"before":{"all":[{"hook":"softDelete"}],"create":[{"hook":"timestamp","options":{"fields":["createdAt","updatedAt"]}}],"update":[{"hook":"timestamp","options":{"fields":["updatedAt"]}}],"patch":[{"hook":"timestamp","options":{"fields":["updatedAt"]}}]},"after":{"all":[]}},"multi":["create"],"position":{"component":"data2-core-types@Position","params":{"x":2203.64,"y":-1198.13}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":300,"height":300}},"database":{"component":"data2-core-types@ServiceDatabaseReference","params":{"reference":"BootstrapDB"}}},"updatedAt":"2021-08-13T19:44:58.585Z","createdAt":"2021-02-16T21:08:08.995Z"},{"_id":"602ea603c2dd12f05982bfb5","component":"data2-core@Api","displayName":"CertificatesAccounts","system":"5e3b796d6228227ca637d0f4","params":{"paginate":{"default":1000},"url":"/certificatesAccounts","collection":"certificatesAccounts","schema":{"domain":"string","email":"string","url":"string","keyPem":"string"},"hooks":{"before":{"all":[{"hook":"softDelete"}],"create":[{"hook":"timestamp","options":{"fields":["createdAt","updatedAt"]}}],"update":[{"hook":"timestamp","options":{"fields":["updatedAt"]}}],"patch":[{"hook":"timestamp","options":{"fields":["updatedAt"]}}]},"after":{"all":[]}},"multi":["create"],"position":{"component":"data2-core-types@Position","params":{"x":935.3,"y":-861.21}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":300,"height":300}},"database":{"component":"data2-core-types@ServiceDatabaseReference","params":{"reference":"BootstrapDB"}}},"updatedAt":"2021-08-13T19:44:55.486Z","createdAt":"2021-02-16T21:08:08.997Z"},{"_id":"5efcffbe76b2b8399e1f864c","component":"data2-core@Api","displayName":"Systems","system":"5e3b796d6228227ca637d0f4","params":{"paginate":{"default":1000},"url":"/systems","databaseId":"5ee247cee57c0d130f660e7b","collection":"systems","schema":{"name":"string","domain":"string"},"hooks":{"before":{"all":[{"hook":"softDelete"}],"create":[{"hook":"timestamp","options":{"fields":["createdAt","updatedAt"]}}],"update":[{"hook":"timestamp","options":{"fields":["updatedAt"]}}],"patch":[{"hook":"timestamp","options":{"fields":["updatedAt"]}}]},"after":{"update":[{"hook":"invalidateEnvCache","options":{"alwaysInvalidate":true}}],"patch":[{"hook":"invalidateEnvCache","options":{"alwaysInvalidate":true}}],"remove":[{"hook":"invalidateEnvCache","options":{"alwaysInvalidate":true}}]}},"multi":["create"],"position":{"component":"data2-core-types@Position","params":{"x":"-400","y":"-500"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":"300","height":"300"}},"database":{"component":"data2-core-types@ServiceDatabaseReference","params":{"reference":"BootstrapDB"}}},"updatedAt":"2020-08-18T01:52:43.620Z","createdAt":"2020-06-26T21:08:08.993Z"},{"_id":"5f0247061ca96def425472c0","component":"data2-core@Api","displayName":"FileComponentInstances","system":"5e3b796d6228227ca637d0f4","params":{"paginate":{"default":1000},"url":"/fileComponentInstances","collection":"fileComponentInstances","schema":{"component":"string","system":"objectId","displayName":"string","params":"object","index":"number","treeIndex":"number","expanded":"boolean","reference":"string"},"hooks":{"before":{"all":[{"hook":"softDelete"}],"find":[{"hook":"useCache","options":{"additionalGroupKeys":["$and.0.reference"]}}],"create":[{"hook":"timestamp","options":{"fields":["createdAt","updatedAt"]}}],"update":[{"hook":"timestamp","options":{"fields":["updatedAt"]}}],"patch":[{"hook":"timestamp","options":{"fields":["updatedAt"]}}]},"after":{"all":[{"hook":"fileUrl","options":{"downloadField":"params.fileUrl","uploadField":"params.uploadFileUrl","enhanceSchema":false}}],"create":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["reference"]}},{"hook":"invalidateEnvCache"}],"update":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["reference"]}},{"hook":"invalidateEnvCache"}],"patch":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["reference"]}},{"hook":"invalidateEnvCache"}],"remove":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["reference"]}},{"hook":"invalidateEnvCache"}]}},"multi":["create"],"position":{"component":"data2-core-types@Position","params":{"x":1204,"y":-502}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":"300","height":"300"}},"database":{"component":"data2-core-types@ServiceDatabaseReference","params":{"reference":"BootstrapDB"}}},"updatedAt":"2020-08-18T01:52:36.787Z","createdAt":"2020-07-05T21:08:08.993Z"},{"_id":"6232c3a4f8e383b3a1f8d12c","component":"data2-interface-services@DialogsService","displayName":"Builder DialogsService","reference":"2yeI8je0SiYyw3bcAiySR","system":"5e3b796d6228227ca637d0f4","params":{"confirmArtboard":{"params":{"preventEvaluation":true,"reference":"QzMFDNQbnWUZp9bNSCRdL"},"component":"data2-core-types@ArtboardReference"},"alertArtboard":{"params":{"preventEvaluation":true},"component":"data2-core-types@ArtboardReference"},"promptArtboard":{"params":{"preventEvaluation":true},"component":"data2-core-types@ArtboardReference"}},"updatedAt":"2022-03-17T05:14:28.907Z","createdAt":"2022-03-17T05:14:12.617Z"},{"_id":"5ef663c981a6537f79316add","component":"data2-core@Api","displayName":"Components","system":"5e3b796d6228227ca637d0f4","params":{"paginate":{"default":1000},"url":"/components","databaseId":"5ee247cee57c0d130f660e7b","collection":"components","schema":{"component":"string","system":"ObjectId","params":{"component":"string","package":"string","definition":{"preventEvaluation":"boolean","component":"string","params":{"def":{"component":"string","params":"object"}}},"parameters":{"component":"string","params":"object"}}},"hooks":{"before":{"all":[{"hook":"softDelete"}],"find":[{"hook":"useCache","options":{"additionalGroupKeys":["$and.0.system"]}}],"create":[{"hook":"timestamp","options":{"fields":["createdAt","updatedAt"]}}],"update":[{"hook":"timestamp","options":{"fields":["updatedAt"]}}],"patch":[{"hook":"timestamp","options":{"fields":["updatedAt"]}}]},"after":{"create":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["system"]}},{"hook":"invalidateEnvCache"}],"update":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["system"]}},{"hook":"invalidateEnvCache"}],"patch":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["system"]}},{"hook":"invalidateEnvCache"}],"remove":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["system"]}},{"hook":"invalidateEnvCache"}]}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":300,"height":300}},"position":{"component":"data2-core-types@Position","params":{"x":479.64,"y":-912.25}},"database":{"component":"data2-core-types@ServiceDatabaseReference","params":{"reference":"BootstrapDB"}}},"updatedAt":"2021-06-29T18:43:30.515Z","createdAt":"2020-06-26T21:08:08.993Z"},{"_id":"5ef663c981a6537f79316ade","component":"data2-core@Api","displayName":"Behaviours","system":"5e3b796d6228227ca637d0f4","params":{"paginate":{"default":1000},"url":"/behaviours","databaseId":"5ee247cee57c0d130f660e7b","collection":"behaviours","schema":{"component":"string","package":"string","params":"object"},"hooks":{"before":{"all":[{"hook":"softDelete"}],"create":[{"hook":"timestamp","options":{"fields":["createdAt","updatedAt"]}}],"update":[{"hook":"timestamp","options":{"fields":["updatedAt"]}}],"patch":[{"hook":"timestamp","options":{"fields":["updatedAt"]}}]}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":300,"height":300}},"position":{"component":"data2-core-types@Position","params":{"x":1832.73,"y":-1110.92}},"database":{"component":"data2-core-types@ServiceDatabaseReference","params":{"reference":"BootstrapDB"}}},"updatedAt":"2021-06-29T18:43:17.317Z","createdAt":"2020-06-26T21:08:08.993Z"},{"_id":"602c4142c2dd12f059168c9b","component":"data2-core@Api","displayName":"Certificates","system":"5e3b796d6228227ca637d0f4","params":{"paginate":{"default":1000},"url":"/certificates","collection":"certificates","schema":{"domain":"string","issuedAt":"date","expiresAt":"date","keyPem":"string","certPem":"string","accountUrl":"string"},"hooks":{"before":{"all":[{"hook":"softDelete"}],"create":[{"hook":"timestamp","options":{"fields":["createdAt","updatedAt"]}}],"update":[{"hook":"timestamp","options":{"fields":["updatedAt"]}}],"patch":[{"hook":"timestamp","options":{"fields":["updatedAt"]}}]},"after":{"all":[]}},"multi":["create"],"position":{"component":"data2-core-types@Position","params":{"x":2248.19,"y":-784.62}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":300,"height":300}},"database":{"component":"data2-core-types@ServiceDatabaseReference","params":{"reference":"BootstrapDB"}}},"updatedAt":"2021-08-13T19:45:00.817Z","createdAt":"2021-02-16T21:08:08.993Z"},{"_id":"5ef663c981a6537f79316ae2","component":"data2-core@Api","displayName":"Applications","system":"5e3b796d6228227ca637d0f4","params":{"paginate":{"default":1000},"url":"/applications","databaseId":"5ee247cee57c0d130f660e7b","collection":"applications","schema":{"name":"string","reference":"string","params":"object","system":"objectId","domain":"string"},"hooks":{"before":{"all":[{"hook":"softDelete"}],"find":[{"hook":"useCache","options":{"additionalGroupKeys":["$and.0.system"]}}],"create":[{"hook":"timestamp","options":{"fields":["createdAt","updatedAt"]}}],"update":[{"hook":"timestamp","options":{"fields":["updatedAt"]}}],"patch":[{"hook":"timestamp","options":{"fields":["updatedAt"]}}]},"after":{"create":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["system"]}},{"hook":"invalidateEnvCache"}],"update":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["system"]}},{"hook":"invalidateEnvCache"}],"patch":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["system"]}},{"hook":"invalidateEnvCache"}],"remove":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["system"]}},{"hook":"invalidateEnvCache"}]}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":"300","height":"300"}},"position":{"component":"data2-core-types@Position","params":{"x":1948,"y":-500}},"database":{"component":"data2-core-types@ServiceDatabaseReference","params":{"reference":"BootstrapDB"}}},"updatedAt":"2020-08-18T01:52:36.744Z","createdAt":"2020-06-26T21:08:08.993Z"},{"_id":"5efc3a9081a6537f79316af6","component":"data2-core@Database","displayName":"BootstrapDB","reference":"BootstrapDB","system":"5e3b796d6228227ca637d0f4","params":{"stack":"mongo","mongo":{"host":"data2-core.3gkoc.mongodb.net","database":"data2","options":{"retryWrites":true,"w":"majority","useNewUrlParser":true,"useUnifiedTopology":true,"bufferCommands":false,"serverSelectionTimeoutMS":20000}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":300,"height":300}},"position":{"component":"data2-core-types@Position","params":{"x":786.76,"y":-1373.91}}},"updatedAt":"2021-08-13T19:44:53.218Z","createdAt":"2020-07-01T07:25:06.587Z"},{"_id":"5f060f781ca96def42f4144b","component":"data2-core@Api","displayName":"Users","system":"5e3b796d6228227ca637d0f4","params":{"paginate":{"default":1000},"url":"/users","databaseId":"5ee247cee57c0d130f660e7b","collection":"users","schema":{"email":"string","name":"string","password":"string"},"hooks":{"before":{"all":[{"hook":"softDelete"}],"create":[{"hook":"timestamp","options":{"fields":["createdAt","updatedAt"]}}],"update":[{"hook":"timestamp","options":{"fields":["updatedAt"]}}],"patch":[{"hook":"timestamp","options":{"fields":["updatedAt"]}}]}},"multi":["create"],"position":{"component":"data2-core-types@Position","params":{"x":-840,"y":-502}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":"300","height":"300"}},"database":{"component":"data2-core-types@ServiceDatabaseReference","params":{"reference":"BootstrapDB"}}},"updatedAt":"2020-08-18T01:52:36.788Z","createdAt":"2020-07-06T15:25:20.558Z"},{"_id":"60348bacc2dd12f0593ddb61","component":"data2-core@Api","displayName":"Bundles","system":"5e3b796d6228227ca637d0f4","params":{"paginate":{"default":1000},"url":"/bundles","collection":"bundles","schema":{"system":"ObjectId","publishedAt":"date","version":"string","reference":"string","description":"string"},"hooks":{"before":{"all":[{"hook":"softDelete"}],"create":[{"hook":"timestamp","options":{"fields":["createdAt","updatedAt"]}}],"update":[{"hook":"timestamp","options":{"fields":["updatedAt"]}}],"patch":[{"hook":"timestamp","options":{"fields":["updatedAt"]}}]},"after":{"all":[]}},"multi":["create"],"position":{"component":"data2-core-types@Position","params":{"x":1375.36,"y":-1093.06}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":300,"height":300}},"database":{"component":"data2-core-types@ServiceDatabaseReference","params":{"reference":"BootstrapDB"}}},"updatedAt":"2021-06-29T18:43:19.197Z","createdAt":"2021-02-23T21:08:08.993Z"},{"_id":"64ca7311f3b5736000502899","component":"data2-rush@HTTPListener","displayName":"UC CheckIfUserExistsByEmail","reference":"AMnCaoUBc_e3MoP4Sl0Bs","system":"5e3b796d6228227ca637d0f4","params":{"omitHeaders":["authorization"],"handler":{"params":{"actions":[{"params":{"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Missing required parameters"}},"code":{"component":"data2-core-primitives@String","params":{"content":"400"}}},"component":"data2-core-types@Error"},"compare":[{"params":{"subject":{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"body.email"}}}}]},"component":"data2-core-logical-operators@And"}},"component":"data2-core-logical-operators@Not"}]},"component":"data2-core-flow@If"},{"params":{},"component":"data2@4dLBBZPQbUSzLKzUEPRQG"},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"q-u7iBUQvGVs7fbOh4ZHy"}},"prop":"filter","args":[{"params":{"fields":{"email":{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"body.email"}}}},{"component":"data2-core-primitives@String","params":{"content":"000000000000000000000000"}}]},"component":"data2-core-logical-operators@Or"},"status":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"body.status"}}}}}},"component":"data2-core-types@FieldSet"}]}},{"params":{"compare":[{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"q-u7iBUQvGVs7fbOh4ZHy"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"cursor.current._id"}}}}],"then":{"params":{"content":true},"component":"data2-core-primitives@Boolean"},"else":{"params":{"content":false},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-flow@If"}]},"component":"data2-core-flow@Series"},"insertLogsDataSet":{"params":{"reference":"AMnCaoUBc_e3MoP4Sl0BsLogInsertDataSet"},"component":"data2-core-types@DataSetReference"},"readLogsDataSet":{"params":{"reference":"AMnCaoUBc_e3MoP4Sl0BsLogReadDataSet"},"component":"data2-core-types@DataSetReference"}},"updatedAt":"2023-08-14T20:56:06.849Z","createdAt":"2023-08-02T15:15:30.345Z"},{"_id":"64ca75e268b64cca7a71b988","component":"data2-rush@HTTPListener","displayName":"UC ActivateAccountWithActivationToken","reference":"vKj4W1ls21kfEIqJ4HG5g","system":"5e3b796d6228227ca637d0f4","params":{"omitHeaders":["authorization"],"handler":{"params":{"actions":[{"params":{"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Missing required parameters"}},"code":{"component":"data2-core-primitives@String","params":{"content":"400"}}},"component":"data2-core-types@Error"},"compare":[{"params":{"subject":{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"body.activationToken"}}}},{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"body.name"}}}},{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"body.password"}}}}]},"component":"data2-core-logical-operators@And"}},"component":"data2-core-logical-operators@Not"}]},"component":"data2-core-flow@If"},{"params":{},"component":"data2@4dLBBZPQbUSzLKzUEPRQG"},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"q-u7iBUQvGVs7fbOh4ZHy"}},"prop":"filter","args":[{"params":{"fields":{"status":{"params":{"content":"pending"},"component":"data2-core-primitives@String"},"activationToken":{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"body.activationToken"}}}},{"component":"data2-core-primitives@String","params":{"content":"000000000000000000000000"}}]},"component":"data2-core-logical-operators@Or"}}},"component":"data2-core-types@FieldSet"}]}},{"params":{"then":{"params":{"actions":[{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"q-u7iBUQvGVs7fbOh4ZHy"}},"prop":"edit"}},{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"q-u7iBUQvGVs7fbOh4ZHy"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"name"}},"value":{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"body.name"}}}},{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"q-u7iBUQvGVs7fbOh4ZHy"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"cursor.current.name"}}}}]},"component":"data2-core-logical-operators@Or"}}},{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"q-u7iBUQvGVs7fbOh4ZHy"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"password"}},"value":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"body.password"}}}}}},{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"q-u7iBUQvGVs7fbOh4ZHy"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"status"}},"value":{"component":"data2-core-primitives@String","params":{"content":"active"}}}},{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"q-u7iBUQvGVs7fbOh4ZHy"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"activationToken"}},"value":{"params":{},"component":"data2-core-primitives@Null"}}},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"q-u7iBUQvGVs7fbOh4ZHy"}},"prop":"save"}},{"email":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"q-u7iBUQvGVs7fbOh4ZHy"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"cursor.current.email"}}}}}]},"component":"data2-core-flow@Series"},"compare":[{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"q-u7iBUQvGVs7fbOh4ZHy"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"cursor.current._id"}}}}],"else":{}},"component":"data2-core-flow@If"}]},"component":"data2-core-flow@Series"},"insertLogsDataSet":{"params":{"reference":"vKj4W1ls21kfEIqJ4HG5gLogInsertDataSet"},"component":"data2-core-types@DataSetReference"},"readLogsDataSet":{"params":{"reference":"vKj4W1ls21kfEIqJ4HG5gLogReadDataSet"},"component":"data2-core-types@DataSetReference"}},"updatedAt":"2023-10-06T19:24:19.641Z","createdAt":"2023-08-02T15:27:39.383Z"},{"_id":"64ca8d5868b64cca7a71b989","component":"data2-rush@HTTPListener","displayName":"UC SendActivateAccountEmail","reference":"okVIOlW3ONE9AWvDy7GGr","system":"5e3b796d6228227ca637d0f4","params":{"omitHeaders":["authorization"],"handler":{"params":{"actions":[{"params":{"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Missing required parameters"}},"code":{"component":"data2-core-primitives@String","params":{"content":"400"}}},"component":"data2-core-types@Error"},"compare":[{"params":{"subject":{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"body.email"}}}},{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"body.origin"}}}}]},"component":"data2-core-logical-operators@And"}},"component":"data2-core-logical-operators@Not"}]},"component":"data2-core-flow@If"},{"params":{},"component":"data2@4dLBBZPQbUSzLKzUEPRQG"},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"q-u7iBUQvGVs7fbOh4ZHy"}},"prop":"filter","args":[{"params":{"fields":{"status":{"params":{"content":"pending"},"component":"data2-core-primitives@String"},"email":{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"body.email"}}}},{"component":"data2-core-primitives@String","params":{"content":"000000000000000000000000"}}]},"component":"data2-core-logical-operators@Or"},"activationToken":{"exists":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}}}},"component":"data2-core-types@FieldSet"}]}},{"params":{"then":{"params":{"actions":[{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Th38YuC3YwEm7tMdNvUtT"}},"prop":"sendEmail","args":[{"mailTemplate":{"disabled":false,"component":"data2-core-types@InstanceReference","params":{"component":"data2-core-connect@MailTemplate","reference":"z7xy9CHP_nQaAfQ83M9mv"}},"templateParameters":{"to":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"q-u7iBUQvGVs7fbOh4ZHy"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"cursor.current.email"}}}},"link":{"params":{"portions":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"body.origin"}}}},{"component":"data2-core-primitives@String","params":{"content":"/activation/"}},{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"q-u7iBUQvGVs7fbOh4ZHy"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"cursor.current.activationToken"}}}}]},"component":"data2-core-functions@StringConcat"}}}]}},{}]},"component":"data2-core-flow@Series"},"compare":[{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"q-u7iBUQvGVs7fbOh4ZHy"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"cursor.current._id"}}}}],"else":{}},"component":"data2-core-flow@If"}]},"component":"data2-core-flow@Series"},"insertLogsDataSet":{"params":{"reference":"okVIOlW3ONE9AWvDy7GGrLogInsertDataSet"},"component":"data2-core-types@DataSetReference"},"readLogsDataSet":{"params":{"reference":"okVIOlW3ONE9AWvDy7GGrLogReadDataSet"},"component":"data2-core-types@DataSetReference"}},"updatedAt":"2023-08-14T20:55:42.159Z","createdAt":"2023-08-02T17:07:41.812Z"},{"_id":"64ca8dbf68b64cca7a71b9a4","component":"data2-core-connect@Mailer","displayName":"Data2 Mailer","reference":"Th38YuC3YwEm7tMdNvUtT","system":"5e3b796d6228227ca637d0f4","params":{},"updatedAt":"2023-08-02T17:11:12.093Z","createdAt":"2023-08-02T17:09:19.595Z"},{"_id":"64ca8e3168b64cca7a71b9a5","component":"data2-core-connect@MailTemplate","displayName":"ActivateAccountMailTemplate","reference":"z7xy9CHP_nQaAfQ83M9mv","system":"5e3b796d6228227ca637d0f4","params":{"parent":{"component":"data2-core-types@InstanceReference","params":{"reference":"Th38YuC3YwEm7tMdNvUtT","component":"data2-core-connect@Mailer"}},"subject":{"component":"data2-core-primitives@String","params":{"content":"Data² - Activate your account"}},"artboard":{"disabled":false,"component":"data2-core-types@ArtboardReference","params":{"reference":"2QUdbRBEybA9ajVHfxnpG"}},"from":{"name":{"component":"data2-core-primitives@String","params":{"content":"Data² NoReply"}}},"templateParameters":[{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"to"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"link"}},"component":"data2-core-primitives@String"}}],"to":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"to"}}}}],"bcc":[{"component":"data2-core-primitives@String","params":{"content":"tech@data2.app"}}]},"updatedAt":"2023-08-04T15:35:37.880Z","createdAt":"2023-08-02T17:11:13.603Z"},{"_id":"64cab982de563cdbdb272095","component":"data2-rush@HTTPListener","displayName":"UC SendInvitation","reference":"VeGjIG87gX3f03SFBndtc","system":"5e3b796d6228227ca637d0f4","params":{"omitHeaders":["authorization"],"handler":{"params":{"actions":[{"params":{},"component":"data2@4dLBBZPQbUSzLKzUEPRQG"},{"params":{"actions":[{"params":{"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Missing required parameters"}},"code":{"component":"data2-core-primitives@String","params":{"content":"400"}}},"component":"data2-core-types@Error"},"compare":[{"params":{"subject":{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"body.invitation"}}}},{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"body.email"}}}}]},"component":"data2-core-logical-operators@And"}},"component":"data2-core-logical-operators@Not"}]},"component":"data2-core-flow@If"},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"qMhoJ-yM2JFnHYJZK2vE1"}},"prop":"filter","args":[{"params":{"fields":{"code":{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"body.invitation"}}}},{"component":"data2-core-primitives@String","params":{"content":"000000000000000000000000"}}]},"component":"data2-core-logical-operators@Or"}}},"component":"data2-core-types@FieldSet"}]}},{"params":{"compare":[{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"qMhoJ-yM2JFnHYJZK2vE1"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"cursor.current._id"}}}}},"component":"data2-core-logical-operators@Not"}],"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Invitation not found"}},"code":{"component":"data2-core-primitives@String","params":{"content":"404"}}},"component":"data2-core-types@Error"}},"component":"data2-core-flow@If"},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"q-u7iBUQvGVs7fbOh4ZHy"}},"prop":"filter","args":[{"email":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"body.email"}}}}}]}},{"params":{"compare":[{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"q-u7iBUQvGVs7fbOh4ZHy"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"cursor.current._id"}}}}],"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"User email conflict"}},"code":{"component":"data2-core-primitives@String","params":{"content":"409"}}},"component":"data2-core-types@Error"}},"component":"data2-core-flow@If","displayName":""}]},"component":"data2-core-flow@Series","displayName":"Validations"},{"params":{"actions":[{"params":{"actions":[{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"zmV7JfNmv2oDUtGKfSzNm"}},"prop":"insert"}},{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"zmV7JfNmv2oDUtGKfSzNm"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"email"}},"value":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"body.email"}}},"component":"data2-core-types@Reference"}}},{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"zmV7JfNmv2oDUtGKfSzNm"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"status"}},"value":{"component":"data2-core-primitives@String","params":{"content":"pending"}}}},{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"zmV7JfNmv2oDUtGKfSzNm"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"invitation"}},"value":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"body.invitation"}}}}}},{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"zmV7JfNmv2oDUtGKfSzNm"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"activationToken"}},"value":{"params":{},"component":"data2-core-id@NanoId"}}},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"zmV7JfNmv2oDUtGKfSzNm"}},"prop":"save"}}]},"component":"data2-core-flow@Series","displayName":"create user"},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Th38YuC3YwEm7tMdNvUtT"}},"prop":"sendEmail","args":[{"mailTemplate":{"disabled":false,"component":"data2-core-types@InstanceReference","params":{"component":"data2-core-connect@MailTemplate","reference":"owcqnjvy90WUQGmKeuSBo"}},"templateParameters":{"link":{"params":{"portions":[{"component":"data2-core-primitives@String","params":{"content":"https://data2.builders"}},{"component":"data2-core-primitives@String","params":{"content":"/invitation/"}},{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"qMhoJ-yM2JFnHYJZK2vE1"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"cursor.current.code"}}}},{"component":"data2-core-primitives@String","params":{"content":"/activation/"}},{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"zmV7JfNmv2oDUtGKfSzNm"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"cursor.current.activationToken"}}}}]},"component":"data2-core-functions@StringConcat"},"to":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"zmV7JfNmv2oDUtGKfSzNm"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"cursor.current.email"}}}}}}]}}]},"component":"data2-core-flow@Series","displayName":"Create user and Send invitation","disabled":false},{}]},"component":"data2-core-flow@Series","displayName":"create user and send email"},"insertLogsDataSet":{"params":{"reference":"VeGjIG87gX3f03SFBndtcLogInsertDataSet"},"component":"data2-core-types@DataSetReference"},"readLogsDataSet":{"params":{"reference":"VeGjIG87gX3f03SFBndtcLogReadDataSet"},"component":"data2-core-types@DataSetReference"}},"updatedAt":"2023-08-14T20:55:24.584Z","createdAt":"2023-08-02T20:16:03.370Z"},{"_id":"64cabb6cde563cdbdb272096","component":"data2-core-connect@MailTemplate","displayName":"InvitationMailTemplate","reference":"owcqnjvy90WUQGmKeuSBo","system":"5e3b796d6228227ca637d0f4","params":{"parent":{"component":"data2-core-types@InstanceReference","params":{"reference":"Th38YuC3YwEm7tMdNvUtT","component":"data2-core-connect@Mailer"}},"artboard":{"disabled":false,"component":"data2-core-types@ArtboardReference","params":{"reference":"jgq_OUNYqgFSEFoW0BZSk"}},"from":{"name":{"component":"data2-core-primitives@String","params":{"content":"Data² NoReply"}}},"templateParameters":[{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"to"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"link"}},"component":"data2-core-primitives@String"}}],"to":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"to"}}}}],"subject":{"component":"data2-core-primitives@String","params":{"content":"Welcome to Data²"}}},"updatedAt":"2023-08-02T20:35:34.773Z","createdAt":"2023-08-02T20:24:12.617Z"},{"_id":"64cabfa3de563cdbdb272097","component":"data2-rush@HTTPListener","displayName":"UC SetupAccountFromInvitation","reference":"Y1cJQ_L95g4VhUTzrKvj8","system":"5e3b796d6228227ca637d0f4","params":{"omitHeaders":["authorization"],"handler":{"params":{"actions":[{"params":{},"component":"data2@4dLBBZPQbUSzLKzUEPRQG"},{"params":{"actions":[{"params":{"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Missing required parameters"}},"code":{"component":"data2-core-primitives@String","params":{"content":"400"}}},"component":"data2-core-types@Error"},"compare":[{"params":{"subject":{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"body.invitation"}}}},{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"body.activationToken"}}}},{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"body.organization"}}}},{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"body.name"}}}},{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"body.password"}}}}]},"component":"data2-core-logical-operators@And"}},"component":"data2-core-logical-operators@Not"}]},"component":"data2-core-flow@If"},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"qMhoJ-yM2JFnHYJZK2vE1"}},"prop":"filter","args":[{"params":{"fields":{"code":{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"body.invitation"}}}},{"component":"data2-core-primitives@String","params":{"content":"000000000000000000000000"}}]},"component":"data2-core-logical-operators@Or"}}},"component":"data2-core-types@FieldSet"}]}},{"params":{"compare":[{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"qMhoJ-yM2JFnHYJZK2vE1"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"cursor.current._id"}}}}},"component":"data2-core-logical-operators@Not"}],"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Invitation not found"}},"code":{"component":"data2-core-primitives@String","params":{"content":"404"}}},"component":"data2-core-types@Error"}},"component":"data2-core-flow@If"},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"zmV7JfNmv2oDUtGKfSzNm"}},"prop":"filter","args":[{"activationToken":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"body.activationToken"}}}},"invitation":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"body.invitation"}}}},"status":{"component":"data2-core-primitives@String","params":{"content":"pending"}}}]}},{"params":{"compare":[{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"zmV7JfNmv2oDUtGKfSzNm"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"cursor.current._id"}}}}},"component":"data2-core-logical-operators@Not"}],"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"User not found"}},"code":{"component":"data2-core-primitives@String","params":{"content":"404"}}},"component":"data2-core-types@Error"}},"component":"data2-core-flow@If","displayName":""}]},"component":"data2-core-flow@Series","displayName":"Validations"},{"params":{"actions":[{"params":{"actions":[{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"zmV7JfNmv2oDUtGKfSzNm"}},"prop":"edit"}},{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"zmV7JfNmv2oDUtGKfSzNm"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"name"}},"value":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"body.name"}}}}}},{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"zmV7JfNmv2oDUtGKfSzNm"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"status"}},"value":{"component":"data2-core-primitives@String","params":{"content":"active"}}}},{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"zmV7JfNmv2oDUtGKfSzNm"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"password"}},"value":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"body.password"}}}}}},{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"zmV7JfNmv2oDUtGKfSzNm"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"activationToken"}},"value":{"params":{},"component":"data2-core-primitives@Null"}}},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"zmV7JfNmv2oDUtGKfSzNm"}},"prop":"save"}}]},"component":"data2-core-flow@Series","displayName":"patch user"},{"params":{"actions":[{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"tXNGSE-imL6vW6JzWjaUz"}},"prop":"insert"}},{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"tXNGSE-imL6vW6JzWjaUz"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"name"}},"value":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"body.organization"}}}}}},{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"tXNGSE-imL6vW6JzWjaUz"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"domain"}},"value":{"params":{"string":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"body.organization"}}}}},"component":"data2-core-functions@Slugify"}}},{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"tXNGSE-imL6vW6JzWjaUz"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"billingStatus"}},"value":{"params":{"content":"trial"},"component":"data2-core-primitives@String"}}},{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"tXNGSE-imL6vW6JzWjaUz"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"invitation"}},"value":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"qMhoJ-yM2JFnHYJZK2vE1"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"cursor.current.code"}}}}}},{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"tXNGSE-imL6vW6JzWjaUz"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"currency"}},"value":{"component":"data2-core-primitives@String","params":{"content":"BRL"}}}},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"tXNGSE-imL6vW6JzWjaUz"}},"prop":"save"}}]},"component":"data2-core-flow@Series","displayName":"create organization"},{"params":{"actions":[{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"rAiZhTj-HTUbW4nXvmQ7M"}},"prop":"insert"}},{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"rAiZhTj-HTUbW4nXvmQ7M"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"user"}},"value":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"zmV7JfNmv2oDUtGKfSzNm"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"cursor.current._id"}}}}}},{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"rAiZhTj-HTUbW4nXvmQ7M"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"organization"}},"value":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"tXNGSE-imL6vW6JzWjaUz"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"cursor.current._id"}}}}}},{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"rAiZhTj-HTUbW4nXvmQ7M"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"role"}},"value":{"params":{"content":"owner"},"component":"data2-core-primitives@String"}}},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"rAiZhTj-HTUbW4nXvmQ7M"}},"prop":"save"}}]},"component":"data2-core-flow@Series","displayName":"create organization member"},{"params":{"actions":[{"params":{"method":"POST","url":{"component":"data2-core-primitives@String","params":{"content":"https://management.data2.link/dataset/BdJ32LhYI1BYlSt_I0_dD"}},"useProxy":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"data":{"$method":{"component":"data2-core-primitives@String","params":{"content":"create"}},"data":{"version":{"component":"data2-core-primitives@String","params":{"content":"TC - Data2 - v.08.04.2022"}},"user":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"zmV7JfNmv2oDUtGKfSzNm"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"cursor.current._id"}}}},"member":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"rAiZhTj-HTUbW4nXvmQ7M"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"cursor.current._id"}}}},"organization":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"tXNGSE-imL6vW6JzWjaUz"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"cursor.current._id"}}}},"term":{"component":"data2-core-primitives@String","params":{"content":"63fe5ad5fec79e0634b05e92"}}}}},"component":"http@Request"}]},"component":"data2-core-flow@Series","displayName":"create term accept"},{"params":{"actions":[{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"0TySsxIHfD3304K2SnpgJ"}},"prop":"insert"}},{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"0TySsxIHfD3304K2SnpgJ"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"name"}},"value":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"tXNGSE-imL6vW6JzWjaUz"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"cursor.current.name"}}}}}},{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"0TySsxIHfD3304K2SnpgJ"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"domain"}},"value":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"tXNGSE-imL6vW6JzWjaUz"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"cursor.current.domain"}}}}}},{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"0TySsxIHfD3304K2SnpgJ"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"visibility"}},"value":{"params":{"content":"public"},"component":"data2-core-primitives@String"}}},{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"0TySsxIHfD3304K2SnpgJ"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"organization"}},"value":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"tXNGSE-imL6vW6JzWjaUz"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"cursor.current._id"}}}}}},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"0TySsxIHfD3304K2SnpgJ"}},"prop":"save"}}]},"component":"data2-core-flow@Series","displayName":"create system"}]},"component":"data2-core-flow@Series","displayName":"Setup user"},{}]},"component":"data2-core-flow@Series","displayName":""},"insertLogsDataSet":{"params":{"reference":"Y1cJQ_L95g4VhUTzrKvj8LogInsertDataSet"},"component":"data2-core-types@DataSetReference"},"readLogsDataSet":{"params":{"reference":"Y1cJQ_L95g4VhUTzrKvj8LogReadDataSet"},"component":"data2-core-types@DataSetReference"}},"updatedAt":"2023-09-29T17:47:48.869Z","createdAt":"2023-08-02T20:42:29.058Z"},{"_id":"64cad05337d8eec3f02d03b8","component":"data2-rush@HTTPListener","displayName":"UC SendInterviewTechTest","reference":"zjxD_i76OfLH5vKsQ_QtE","system":"5e3b796d6228227ca637d0f4","params":{"omitHeaders":["authorization"],"handler":{"params":{"actions":[{"params":{},"component":"data2@4dLBBZPQbUSzLKzUEPRQG"},{"params":{"actions":[{"params":{"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Missing required parameters"}},"code":{"component":"data2-core-primitives@String","params":{"content":"400"}}},"component":"data2-core-types@Error"},"compare":[{"params":{"subject":{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"body.name"}}}},{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"body.email"}}}},{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"body.domain"}}}}]},"component":"data2-core-logical-operators@And"}},"component":"data2-core-logical-operators@Not"}]},"component":"data2-core-flow@If"},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"zmV7JfNmv2oDUtGKfSzNm"}},"prop":"filter","args":[{"email":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"body.email"}}}}}]}},{"params":{"compare":[{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"zmV7JfNmv2oDUtGKfSzNm"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"cursor.current._id"}}}}],"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"User email conflict"}},"code":{"component":"data2-core-primitives@String","params":{"content":"409"}}},"component":"data2-core-types@Error"}},"component":"data2-core-flow@If","displayName":""}]},"component":"data2-core-flow@Series","displayName":"Validations"},{"params":{"actions":[{"params":{"actions":[{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"zmV7JfNmv2oDUtGKfSzNm"}},"prop":"insert"},"break":false},{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"zmV7JfNmv2oDUtGKfSzNm"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"name"}},"value":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"body.name"}}},"component":"data2-core-types@Reference"}},"displayName":"name"},{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"zmV7JfNmv2oDUtGKfSzNm"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"email"}},"value":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"body.email"}}},"component":"data2-core-types@Reference"}},"displayName":"email"},{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"zmV7JfNmv2oDUtGKfSzNm"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"status"}},"value":{"params":{"content":"pending"},"component":"data2-core-primitives@String"}}},{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"zmV7JfNmv2oDUtGKfSzNm"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"password"}},"value":{"params":{"portions":[{"params":{},"component":"data2-core-id@NanoId"},{"component":"data2-core-primitives@String","params":{"content":"$#@!"}}]},"component":"data2-core-functions@StringConcat"}}},{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"zmV7JfNmv2oDUtGKfSzNm"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"activationToken"}},"value":{"params":{},"component":"data2-core-id@NanoId"}}},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"zmV7JfNmv2oDUtGKfSzNm"}},"prop":"save"}}]},"component":"data2-core-flow@Series","displayName":"createUser"},{"params":{"actions":[{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"rAiZhTj-HTUbW4nXvmQ7M"}},"prop":"insert"}},{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"rAiZhTj-HTUbW4nXvmQ7M"},"break":false},"prop":{"component":"data2-core-primitives@String","params":{"content":"user"}},"value":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"zmV7JfNmv2oDUtGKfSzNm"},"break":false},"prop":{"component":"data2-core-primitives@String","params":{"content":"cursor.current._id"}}},"component":"data2-core-types@Getter"}}},{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"rAiZhTj-HTUbW4nXvmQ7M"},"break":false},"prop":{"component":"data2-core-primitives@String","params":{"content":"role"}},"value":{"component":"data2-core-primitives@String","params":{"content":"collaborator"}}}},{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"rAiZhTj-HTUbW4nXvmQ7M"},"break":false},"prop":{"component":"data2-core-primitives@String","params":{"content":"organization"}},"value":{"component":"data2-core-primitives@String","params":{"content":"64186566ea855106377b8af5"}}}},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"rAiZhTj-HTUbW4nXvmQ7M"}},"prop":"save"}}]},"component":"data2-core-flow@Series","displayName":"createOrgMembers"},{"params":{"actions":[{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"0TySsxIHfD3304K2SnpgJ"}},"prop":"insert"}},{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"0TySsxIHfD3304K2SnpgJ"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"organization"}},"value":{"params":{"content":"64186566ea855106377b8af5"},"component":"data2-core-primitives@String"}}},{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"0TySsxIHfD3304K2SnpgJ"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"name"}},"value":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"body.name"}}},"component":"data2-core-types@Reference"}}},{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"0TySsxIHfD3304K2SnpgJ"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"domain"}},"value":{"params":{"portions":[{"component":"data2-core-primitives@String","params":{"content":"people-"}},{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"body.domain"}}},"component":"data2-core-types@Reference"}]},"component":"data2-core-functions@StringConcat"}}},{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"0TySsxIHfD3304K2SnpgJ"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"visibility"}},"value":{"params":{"content":"private"},"component":"data2-core-primitives@String"}}},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"0TySsxIHfD3304K2SnpgJ"}},"prop":"save"}}]},"component":"data2-core-flow@Series","displayName":"createSystem"},{"params":{"actions":[{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Nd8VeTny2c0bm0lAaQejg"}},"prop":"insert"}},{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Nd8VeTny2c0bm0lAaQejg"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"role"}},"value":{"component":"data2-core-primitives@String","params":{"content":"editor"}}},"component":"data2-core-types@Setter"},{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Nd8VeTny2c0bm0lAaQejg"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"system"}},"value":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"0TySsxIHfD3304K2SnpgJ"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"cursor.current._id"}}},"component":"data2-core-types@Getter"}},"component":"data2-core-types@Setter"},{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Nd8VeTny2c0bm0lAaQejg"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"organizationMember"}},"value":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"rAiZhTj-HTUbW4nXvmQ7M"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"cursor.current._id"}}},"component":"data2-core-types@Getter"}},"component":"data2-core-types@Setter"},{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Nd8VeTny2c0bm0lAaQejg"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"user"}},"value":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"zmV7JfNmv2oDUtGKfSzNm"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"cursor.current._id"}}},"component":"data2-core-types@Getter"}},"component":"data2-core-types@Setter"},{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Nd8VeTny2c0bm0lAaQejg"},"break":false},"prop":{"component":"data2-core-primitives@String","params":{"content":"organization"}},"value":{"component":"data2-core-primitives@String","params":{"content":"64186566ea855106377b8af5"}}}},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Nd8VeTny2c0bm0lAaQejg"}},"prop":"save"}}]},"component":"data2-core-flow@Series","displayName":"createSystemAccess"}]},"component":"data2-core-flow@Series","displayName":"Create user and Send interview","disabled":false},{}]},"component":"data2-core-flow@Series","displayName":""},"insertLogsDataSet":{"params":{"reference":"zjxD_i76OfLH5vKsQ_QtELogInsertDataSet"},"component":"data2-core-types@DataSetReference"},"readLogsDataSet":{"params":{"reference":"zjxD_i76OfLH5vKsQ_QtELogReadDataSet"},"component":"data2-core-types@DataSetReference"}},"updatedAt":"2025-12-19T18:46:09.754Z","createdAt":"2023-08-02T21:58:44.523Z"},{"_id":"64cc17a2c7aefed844ba05cb","component":"data2-rush@HTTPListener","displayName":"DeleteMe Listener","reference":"JM5W6P_l2MLGwMD4BwgEm","system":"5e3b796d6228227ca637d0f4","params":{"omitHeaders":["authorization"],"handler":{"params":{"actions":[{"params":{},"component":"data2@4dLBBZPQbUSzLKzUEPRQG"},{"params":{"actions":[{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"DeleteMeDataSet"}},"prop":"insert"}},{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"DeleteMeDataSet"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"title"}},"value":{"component":"data2-core-primitives@String","params":{"content":"melona"}}}},{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"DeleteMeDataSet"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"system"}},"value":{"component":"data2-core-primitives@String","params":{"content":"5e72ab6c7ff98e774545a642"}}}},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"DeleteMeDataSet"}},"prop":"save"}},{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"DeleteMeDataSet"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"cursor.current"}}}}]},"component":"data2-core-flow@Series","displayName":"patch melona","disabled":false}]},"component":"data2-core-flow@Series"},"insertLogsDataSet":{"params":{"reference":"JM5W6P_l2MLGwMD4BwgEmLogInsertDataSet"},"component":"data2-core-types@DataSetReference"},"readLogsDataSet":{"params":{"reference":"JM5W6P_l2MLGwMD4BwgEmLogReadDataSet"},"component":"data2-core-types@DataSetReference"}},"updatedAt":"2023-08-14T20:54:54.626Z","createdAt":"2023-08-03T21:09:54.430Z"},{"_id":"64dfbf659146ca8aeb87d16c","component":"data2-rush@HTTPListener","displayName":"UC CreateUserFromEmail","reference":"MV4BqLPhuq012lWlBUMQ3","system":"5e3b796d6228227ca637d0f4","params":{"insertLogsDataSet":{"component":"data2-core-types@DataSetReference","params":{"reference":"MV4BqLPhuq012lWlBUMQ3LogInsertDataSet"}},"readLogsDataSet":{"component":"data2-core-types@DataSetReference","params":{"reference":"MV4BqLPhuq012lWlBUMQ3LogReadDataSet"}},"omitHeaders":["authorization"],"handler":{"params":{"actions":[{"params":{"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Missing required parameters"}},"code":{"component":"data2-core-primitives@String","params":{"content":"400"}}},"component":"data2-core-types@Error"},"compare":[{"params":{"subject":{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"body.email"}}}}]},"component":"data2-core-logical-operators@And"}},"component":"data2-core-logical-operators@Not"}]},"component":"data2-core-flow@If","displayName":"pre validations"},{"params":{},"component":"data2@4dLBBZPQbUSzLKzUEPRQG"},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"q-u7iBUQvGVs7fbOh4ZHy"}},"prop":"filter","args":[{"params":{"fields":{"email":{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"body.email"}}}},{"component":"data2-core-primitives@String","params":{"content":"000000000000000000000000"}}]},"component":"data2-core-logical-operators@Or"}}},"component":"data2-core-types@FieldSet"}]}},{"params":{"compare":[{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"q-u7iBUQvGVs7fbOh4ZHy"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"cursor.current._id"}}}}],"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"User already exists."}},"code":{"component":"data2-core-primitives@String","params":{"content":"409"}}},"component":"data2-core-types@Error"}},"component":"data2-core-flow@If","displayName":"validations"},{"params":{"actions":[{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"q-u7iBUQvGVs7fbOh4ZHy"}},"prop":"insert"}},{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"q-u7iBUQvGVs7fbOh4ZHy"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"email"}},"value":{"params":{"string":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"body.email"}}}}},"component":"data2-core-functions@toLowerCase"}},"displayName":""},{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"q-u7iBUQvGVs7fbOh4ZHy"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"status"}},"value":{"params":{"content":"pending"},"component":"data2-core-primitives@String"}}},{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"q-u7iBUQvGVs7fbOh4ZHy"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"password"}},"value":{"params":{"portions":[{"params":{},"component":"data2-core-id@NanoId"},{"component":"data2-core-primitives@String","params":{"content":"$#@!"}}]},"component":"data2-core-functions@StringConcat","displayName":"Concat pra passar na validação"}}},{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"q-u7iBUQvGVs7fbOh4ZHy"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"activationToken"}},"value":{"params":{},"component":"data2-core-id@NanoId"}}},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"q-u7iBUQvGVs7fbOh4ZHy"}},"prop":"save"}}]},"component":"data2-core-flow@Series","displayName":"create user"},{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"q-u7iBUQvGVs7fbOh4ZHy"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"cursor.current"}}},"component":"data2-core-types@Getter"}]},"component":"data2-core-flow@Series"}},"updatedAt":"2025-11-12T15:22:52.205Z","createdAt":"2023-08-18T18:58:46.086Z"},{"_id":"64e37dc5d79d8874a6856a9d","component":"data2-rush@HTTPListener","displayName":"UC TransferSystem","reference":"POb92uMEMxNNKYDq5aCkj","system":"5e3b796d6228227ca637d0f4","params":{"insertLogsDataSet":{"component":"data2-core-types@DataSetReference","params":{"reference":"POb92uMEMxNNKYDq5aCkjLogInsertDataSet"}},"readLogsDataSet":{"component":"data2-core-types@DataSetReference","params":{"reference":"POb92uMEMxNNKYDq5aCkjLogReadDataSet"}},"omitHeaders":["authorization"],"handler":{"params":{"actions":[{"params":{"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Missing required parameters"}},"code":{"component":"data2-core-primitives@String","params":{"content":"400"}}},"component":"data2-core-types@Error"},"compare":[{"params":{"subject":{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"body.system"}}}},{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"body.organization"}}}},{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"body.action"}}}}]},"component":"data2-core-logical-operators@And"}},"component":"data2-core-logical-operators@Not"}]},"component":"data2-core-flow@If","displayName":"Validations","disabled":false},{"params":{"actions":[{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Data2BuilderAuthentication"}}},"component":"data2-core-flow@AwaitReady"},{"params":{"compare":[{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Data2BuilderAuthentication"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"session._id"}}}}},"component":"data2-core-logical-operators@Not"}],"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"No session"}},"code":{"component":"data2-core-primitives@String","params":{"content":"401"}}},"component":"data2-core-types@Error"}},"component":"data2-core-flow@If","displayName":"Validate session"},{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"UsersDataSet"}}},"component":"data2-core-flow@AwaitReady"},{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"DhPJ44W3fVq4ylQlnQJ6M"}}},"component":"data2-core-flow@AwaitReady"},{"params":{"compare":[{"params":{"subject":{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"DhPJ44W3fVq4ylQlnQJ6M"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"member"}}],"body":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"body.organization"}}}},"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"member.organization._id"}}}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"member.role"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"owner"}}},"component":"data2-core-comparison-operators@Equal"}]},"component":"data2-core-logical-operators@And"}}}},"component":"data2-core-functions@ArrayFind"}},"component":"data2-core-logical-operators@Not"},{"params":{"subject":{"params":{},"component":"data2@3UDe5xvHPRuve6PvboXJG"}},"component":"data2-core-logical-operators@Not"}],"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"No permissions"}},"code":{"component":"data2-core-primitives@String","params":{"content":"401"}}},"component":"data2-core-types@Error"}},"component":"data2-core-flow@If","displayName":"Validate organization owner"},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Data2BuilderAuthentication"}},"prop":"logout"}},{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Data2BuilderAuthentication"}}},"component":"data2-core-flow@AwaitReady"}]},"component":"data2-core-flow@Series","displayName":"User Permissions","disabled":false},{"params":{},"component":"data2@4dLBBZPQbUSzLKzUEPRQG"},{"params":{"actions":[{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"0TySsxIHfD3304K2SnpgJ"}},"prop":"filter","args":[{"_id":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"body.system"}}}}}]}},{"params":{"compare":[{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"0TySsxIHfD3304K2SnpgJ"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"cursor.current._id"}}}}},"component":"data2-core-logical-operators@Not"}],"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"System not found."}},"code":{"component":"data2-core-primitives@String","params":{"content":"404"}}},"component":"data2-core-types@Error"}},"component":"data2-core-flow@If","displayName":""},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"tXNGSE-imL6vW6JzWjaUz"}},"prop":"filter","args":[{"_id":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"body.organization"}}}}}]}},{"params":{"compare":[{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"tXNGSE-imL6vW6JzWjaUz"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"cursor.current._id"}}}}},"component":"data2-core-logical-operators@Not"}],"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Organization not found."}},"code":{"component":"data2-core-primitives@String","params":{"content":"404"}}},"component":"data2-core-types@Error"}},"component":"data2-core-flow@If","displayName":""}]},"component":"data2-core-flow@Series","displayName":"Setup"},{"params":{"actions":[{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"0TySsxIHfD3304K2SnpgJ"}},"prop":"edit"}},{"params":{"then":{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"0TySsxIHfD3304K2SnpgJ"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"organization"}},"value":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"body.organization"}}}}}},"compare":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"body.action"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"transfer"}}},"component":"data2-core-comparison-operators@Equal"}]},"component":"data2-core-flow@If"},{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"0TySsxIHfD3304K2SnpgJ"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"organizationToTransfer"}},"value":{"params":{},"component":"data2-core-primitives@Null"}}},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"0TySsxIHfD3304K2SnpgJ"}},"prop":"save"}}]},"component":"data2-core-flow@Series","displayName":"Transfer organization","disabled":false},{}]},"component":"data2-core-flow@Series","displayName":""},"enableExecutionLogs":{"component":"data2-core-primitives@Boolean","params":{"content":false}}},"updatedAt":"2023-10-16T17:52:31.815Z","createdAt":"2023-08-21T15:07:50.544Z"},{"_id":"65171d3c9850b5070efa8bf9","component":"data2-rush@HTTPListener","displayName":"UC PublicTrialSignUp","reference":"U4H0V3WBK1OszEqGI_oLL","system":"5e3b796d6228227ca637d0f4","params":{"insertLogsDataSet":{"component":"data2-core-types@DataSetReference","params":{"reference":"U4H0V3WBK1OszEqGI_oLLLogInsertDataSet"}},"readLogsDataSet":{"component":"data2-core-types@DataSetReference","params":{"reference":"U4H0V3WBK1OszEqGI_oLLLogReadDataSet"}},"omitHeaders":["authorization"],"handler":{"params":{"actions":[{"params":{},"component":"data2@4dLBBZPQbUSzLKzUEPRQG"},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__LoggerService"}},"prop":"log","args":[{"component":"data2-core-primitives@String","params":{"content":"Before validations"}}]}},{"params":{"actions":[{"params":{"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Missing required parameters"}},"code":{"component":"data2-core-primitives@String","params":{"content":"400"}}},"component":"data2-core-types@Error"},"compare":[{"params":{"subject":{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"body.organization"}}}},{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"body.email"}}}}]},"component":"data2-core-logical-operators@And"}},"component":"data2-core-logical-operators@Not"}]},"component":"data2-core-flow@If"},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"zmV7JfNmv2oDUtGKfSzNm"}},"prop":"filter","args":[{"email":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"body.email"}}}}}]}},{"params":{"compare":[{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"zmV7JfNmv2oDUtGKfSzNm"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"cursor.current._id"}}}}],"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"User with this email already exists"}},"code":{"component":"data2-core-primitives@String","params":{"content":"409"}}},"component":"data2-core-types@Error"}},"component":"data2-core-flow@If","displayName":""},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__LoggerService"}},"prop":"log","args":[{"component":"data2-core-primitives@String","params":{"content":"Before filter"}},{"domain":{"params":{"string":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"body.organization"}}}}},"component":"data2-core-functions@Slugify"}}]}},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"tXNGSE-imL6vW6JzWjaUz"}},"prop":"filter","args":[{"domain":{"params":{"string":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"body.organization"}}}}},"component":"data2-core-functions@Slugify"}}]}},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__LoggerService"}},"prop":"log","args":[{"component":"data2-core-primitives@String","params":{"content":"After filter"}},{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"tXNGSE-imL6vW6JzWjaUz"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"cursor.current"}}}}]}},{"params":{"compare":[{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"tXNGSE-imL6vW6JzWjaUz"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"cursor.current._id"}}}}],"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Company already exists"}},"code":{"component":"data2-core-primitives@String","params":{"content":"409"}}},"component":"data2-core-types@Error"}},"component":"data2-core-flow@If","displayName":""}]},"component":"data2-core-flow@Series","displayName":"Validations"},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__LoggerService"}},"prop":"log","args":[{"component":"data2-core-primitives@String","params":{"content":"After validations"}}]}},{"params":{"actions":[{"params":{"actions":[{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"zmV7JfNmv2oDUtGKfSzNm"}},"prop":"insert"}},{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"zmV7JfNmv2oDUtGKfSzNm"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"email"}},"value":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"body.email"}}}}}},{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"zmV7JfNmv2oDUtGKfSzNm"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"status"}},"value":{"component":"data2-core-primitives@String","params":{"content":"pending"}}}},{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"zmV7JfNmv2oDUtGKfSzNm"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"password"}},"value":{"params":{},"component":"data2-core-id@NanoId"}}},{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"zmV7JfNmv2oDUtGKfSzNm"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"activationToken"}},"value":{"params":{},"component":"data2-core-id@NanoId"}}},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"zmV7JfNmv2oDUtGKfSzNm"}},"prop":"save"}}]},"component":"data2-core-flow@Series","displayName":"create user"},{"params":{"actions":[{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"tXNGSE-imL6vW6JzWjaUz"}},"prop":"insert"}},{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"tXNGSE-imL6vW6JzWjaUz"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"name"}},"value":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"body.organization"}}}}}},{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"tXNGSE-imL6vW6JzWjaUz"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"domain"}},"value":{"params":{"string":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"body.organization"}}}}},"component":"data2-core-functions@Slugify"}}},{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"tXNGSE-imL6vW6JzWjaUz"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"currency"}},"value":{"component":"data2-core-primitives@String","params":{"content":"BRL"}}}},{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"tXNGSE-imL6vW6JzWjaUz"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"billingStatus"}},"value":{"params":{"content":"public-trial"},"component":"data2-core-primitives@String"}}},{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"tXNGSE-imL6vW6JzWjaUz"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"publicTrial"}},"value":{"limitSpend":{"params":{"content":10},"component":"data2-core-primitives@Number"},"startedAt":{"params":{},"component":"data2-core-functions@DateNow"},"active":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}}}},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"tXNGSE-imL6vW6JzWjaUz"}},"prop":"save"}}]},"component":"data2-core-flow@Series","displayName":"create organization"},{"params":{"actions":[{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"rAiZhTj-HTUbW4nXvmQ7M"}},"prop":"insert"}},{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"rAiZhTj-HTUbW4nXvmQ7M"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"user"}},"value":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"zmV7JfNmv2oDUtGKfSzNm"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"cursor.current._id"}}}}}},{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"rAiZhTj-HTUbW4nXvmQ7M"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"organization"}},"value":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"tXNGSE-imL6vW6JzWjaUz"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"cursor.current._id"}}}}}},{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"rAiZhTj-HTUbW4nXvmQ7M"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"role"}},"value":{"params":{"content":"owner"},"component":"data2-core-primitives@String"}}},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"rAiZhTj-HTUbW4nXvmQ7M"}},"prop":"save"}}]},"component":"data2-core-flow@Series","displayName":"create organization member"},{"params":{"actions":[{"params":{"method":"POST","url":{"component":"data2-core-primitives@String","params":{"content":"https://management.data2.link/dataset/BdJ32LhYI1BYlSt_I0_dD"}},"useProxy":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"data":{"$method":{"component":"data2-core-primitives@String","params":{"content":"create"}},"data":{"version":{"component":"data2-core-primitives@String","params":{"content":"TC - Data2 - v.08.04.2022"}},"user":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"zmV7JfNmv2oDUtGKfSzNm"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"cursor.current._id"}}}},"member":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"rAiZhTj-HTUbW4nXvmQ7M"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"cursor.current._id"}}}},"organization":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"tXNGSE-imL6vW6JzWjaUz"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"cursor.current._id"}}}},"term":{"component":"data2-core-primitives@String","params":{"content":"63fe5ad5fec79e0634b05e92"}}}}},"component":"http@Request"}]},"component":"data2-core-flow@Series","displayName":"create term accept"},{"params":{"actions":[{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"0TySsxIHfD3304K2SnpgJ"}},"prop":"insert"}},{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"0TySsxIHfD3304K2SnpgJ"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"name"}},"value":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"tXNGSE-imL6vW6JzWjaUz"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"cursor.current.name"}}}}}},{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"0TySsxIHfD3304K2SnpgJ"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"domain"}},"value":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"tXNGSE-imL6vW6JzWjaUz"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"cursor.current.domain"}}}}}},{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"0TySsxIHfD3304K2SnpgJ"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"visibility"}},"value":{"params":{"content":"public"},"component":"data2-core-primitives@String"}}},{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"0TySsxIHfD3304K2SnpgJ"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"organization"}},"value":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"tXNGSE-imL6vW6JzWjaUz"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"cursor.current._id"}}}}}},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"0TySsxIHfD3304K2SnpgJ"}},"prop":"save"}}]},"component":"data2-core-flow@Series","displayName":"create system"}]},"component":"data2-core-flow@Series","displayName":"Setup user"},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Th38YuC3YwEm7tMdNvUtT"}},"prop":"sendEmail","args":[{"mailTemplate":{"disabled":false,"component":"data2-core-types@InstanceReference","params":{"component":"data2-core-connect@MailTemplate","reference":"z7xy9CHP_nQaAfQ83M9mx"}},"templateParameters":{"link":{"params":{"portions":[{"component":"data2-core-primitives@String","params":{"content":"https://"}},{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"0TySsxIHfD3304K2SnpgJ"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"cursor.current.domain"}}}},{"component":"data2-core-primitives@String","params":{"content":".data2.builders/activation/"}},{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"zmV7JfNmv2oDUtGKfSzNm"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"cursor.current.activationToken"}}}}]},"component":"data2-core-functions@StringConcat"},"to":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"zmV7JfNmv2oDUtGKfSzNm"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"cursor.current.email"}}}}}}]}},{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"zmV7JfNmv2oDUtGKfSzNm"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"cursor.current"}}},"component":"data2-core-types@Getter"}]},"component":"data2-core-flow@Series","displayName":""},"enableExecutionLogs":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"shouldLogRequestBody":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"updatedAt":"2023-10-06T21:20:54.701Z","createdAt":"2023-09-29T18:53:48.341Z"},{"_id":"6520651f1033856560cab181","component":"data2-core-connect@MailTemplate","displayName":"NewActivateAccountMailTemplate","reference":"z7xy9CHP_nQaAfQ83M9mx","system":"5e3b796d6228227ca637d0f4","params":{"parent":{"component":"data2-core-types@InstanceReference","params":{"component":"data2-core-connect@Mailer","reference":"Th38YuC3YwEm7tMdNvUtT"}},"subject":{"component":"data2-core-primitives@String","params":{"content":"Data² - Welcome to the next generation Software Development platform"}},"artboard":{"disabled":false,"component":"data2-core-types@ArtboardReference","params":{"reference":"YniTwCdR0AO86w_noFQ2_"}},"from":{"name":{"component":"data2-core-primitives@String","params":{"content":"Data² Team"}}},"templateParameters":[{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"to"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"link"}},"component":"data2-core-primitives@String"}}],"to":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"to"}}}}],"bcc":[{"component":"data2-core-primitives@String","params":{"content":"tech@data2.app"}}]},"updatedAt":"2023-10-06T19:55:07.445Z","createdAt":"2023-10-06T19:51:55.668Z"},{"_id":"69b8e2a41c911a617fb27a71","component":"data2-core-connect@HttpClient","displayName":"New HttpClient","reference":"dSc6jaBbp8BZB96xPCcs9","system":"5e3b796d6228227ca637d0f4","params":{},"updatedAt":"2026-03-17T05:12:05.061Z","createdAt":"2026-03-17T05:12:05.061Z"},{"_id":"69b8e2a81c911a617fb27a72","component":"data2-core-connect@HttpRequest","displayName":"New HttpRequest","reference":"QNXgxX7UvTFL_j1zKN7DS","system":"5e3b796d6228227ca637d0f4","params":{"useProxy":true,"parent":{"component":"data2-core-types@InstanceReference","params":{"reference":"dSc6jaBbp8BZB96xPCcs9","component":"data2-core-connect@HttpClient"}}},"updatedAt":"2026-03-17T05:12:08.933Z","createdAt":"2026-03-17T05:12:08.933Z"},{"_id":"6a7393fd12b4135152ce76a5","component":"data2-rush@HTTPListener","displayName":"Builder Users CRUD (management)","reference":"d2builder_users_crud","system":"5e3b796d6228227ca637d0f4","params":{"enableExecutionLogs":true,"shouldLogRequestBody":true,"insertLogsDataSet":{"component":"data2-core-types@DataSetReference","params":{"reference":"d2builder_users_crudLogInsertDataSet"}},"readLogsDataSet":{"component":"data2-core-types@DataSetReference","params":{"reference":"d2builder_users_crudLogReadDataSet"}},"rawResponse":false,"handler":{"component":"data2-core-flow@Series","params":{"actions":[{"component":"data2-core-flow@Step","params":{"action":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@Reference","params":{"reference":"body"}},"prop":"$method"}},"resultName":"op"}},{"component":"data2-core-flow@If","params":{"compare":{"component":"data2-core-comparison-operators@Equal","params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":"op"}},"comparisonSubject":"find"}},"then":{"component":"data2-core-flow@Series","params":{"actions":[{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"AllUsersDataSet"}},"prop":"filter","args":[{"component":"data2-core-types@Reference","params":{"reference":"body.params.query"}}]}},{"component":"data2-core-flow@Step","params":{"action":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"AllUsersDataSet"}},"prop":"data.records"}},"resultName":"raw"}},{"component":"data2-core-flow@Step","params":{"action":{"component":"data2-core-functions@ArrayMap","params":{"array":{"component":"data2-core-types@Reference","params":{"reference":"raw"}},"mapper":{"component":"data2-core-functions@Function","params":{"parameters":["r"],"body":{"component":"data2-core-functions@ObjectOmit","params":{"object":{"component":"data2-core-types@Reference","params":{"reference":"r"}},"omitter":"password"}}}}}},"resultName":"recs"}},{"component":"data2-core-flow@Step","params":{"action":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"AllUsersDataSet"}},"prop":"pagination.total"}},"resultName":"tot"}},{"component":"data2-core-flow@Step","params":{"action":{"total":{"component":"data2-core-types@Reference","params":{"reference":"tot"}},"data":{"component":"data2-core-types@Reference","params":{"reference":"recs"}}},"resultName":"out"}}]}},"else":{"component":"data2-core-flow@If","params":{"compare":{"component":"data2-core-comparison-operators@Equal","params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":"op"}},"comparisonSubject":"create"}},"then":{"component":"data2-core-flow@Series","params":{"actions":[{"component":"data2-core-flow@Step","params":{"action":{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"AllUsersDataSet"}},"prop":"saveRecord","args":[{"component":"data2-core-types@Reference","params":{"reference":"body.data"}}]}},"resultName":"created"}},{"component":"data2-core-flow@Step","params":{"action":{"component":"data2-core-functions@ObjectOmit","params":{"object":{"component":"data2-core-types@Reference","params":{"reference":"created"}},"omitter":"password"}},"resultName":"safeCreated"}}]}},"else":{"component":"data2-core-flow@If","params":{"compare":{"component":"data2-core-comparison-operators@Equal","params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":"op"}},"comparisonSubject":"patch"}},"then":{"component":"data2-core-flow@Series","params":{"actions":[{"component":"data2-core-flow@Step","params":{"action":{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"AllUsersDataSet"}},"prop":"saveRecord","args":[{"component":"data2-core-types@Reference","params":{"reference":"body.data"}}]}},"resultName":"patched"}},{"component":"data2-core-flow@Step","params":{"action":{"component":"data2-core-functions@ObjectOmit","params":{"object":{"component":"data2-core-types@Reference","params":{"reference":"patched"}},"omitter":"password"}},"resultName":"safePatched"}}]}},"else":{"component":"data2-core-flow@If","params":{"compare":{"component":"data2-core-comparison-operators@Equal","params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":"op"}},"comparisonSubject":"remove"}},"then":{"component":"data2-core-flow@Series","params":{"actions":[{"component":"data2-core-flow@Step","params":{"action":{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"AllUsersDataSet"}},"prop":"deleteRecord","args":[{"component":"data2-core-types@Reference","params":{"reference":"body.id"}}]}},"resultName":"removed"}}]}},"else":{"component":"data2-core-flow@Series","params":{"actions":[{"component":"data2-core-flow@Step","params":{"action":{"error":"unknown op","op":{"component":"data2-core-types@Reference","params":{"reference":"op"}}},"resultName":"err"}}]}}}}}}}}}}]}},"policies":[{"component":"data2-core-auth@RushPolicy","params":{"rushes":{"allow":[],"deny":[]},"systems":{"allow":["management"],"deny":[]}}},{"component":"data2-core-auth@BuilderPolicy","params":{}}]},"updatedAt":"2026-08-06T16:37:17.290Z","createdAt":"2026-08-05T19:50:21.979Z"}]}},{"reference":"SystemsDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[{"_id":"5e3b796d6228227ca637d0f4","name":"data2","domain":"data2","organization":"62292184611f480b3191c37c","visibility":"public","updatedAt":"2026-07-27T14:19:36.810Z"}]}},{"reference":"OrganizationsDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"component":"data2-core@DataSet","reference":"DataComponentInstancesDataSet","params":{"pagination":{"size":1000},"master":{"dataset":{"component":"data2-core-types@ProcessReference","params":{"reference":"SystemsDataSet"}},"localField":"system","masterField":"_id"},"datasource":{"component":"data2-core-types@ProcessReference","params":{"reference":"DataComponentInstancesDataSource"}}}},{"reference":"DataComponentInstancesDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[{"_id":"5f060d9b1ca96def42f3c40a","displayName":"Builder AuthStrategy","component":"data2-core@AuthenticationStrategy","system":"5e3b796d6228227ca637d0f4","params":{"credentials":[{"component":"data2-core-types@DataSetColumnReference","params":{"column":"email"}},{"component":"data2-core-types@DataSetColumnReference","params":{"column":"password"}},{"component":"data2-core-types@DataSetColumnReference","params":{"column":"status"}}],"verifier":{"component":"data2-core-types@DataSetReference","params":{"reference":"UsersDataSet"}},"sessionShared":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"password":{"disabled":false,"component":"data2-core-types@DataSetColumnReference","params":{"column":"password"}},"email":{"disabled":false,"component":"data2-core-types@DataSetColumnReference","params":{"column":"email"}},"resetPassword":{"resetEmail":{"artboard":{"params":{"preventEvaluation":true,"reference":"nR6Q9d7qdaPtZhJ28Q8Dy"},"component":"data2-core-types@ArtboardReference"}},"resetSuccessEmail":{"artboard":{"params":{"preventEvaluation":true,"reference":"yPCJBTKo8q1Mw0B_3Kpwl"},"component":"data2-core-types@ArtboardReference"}}},"session":[{"component":"data2-core-types@DataSetColumnReference","params":{"column":"name"}},{"component":"data2-core-types@DataSetColumnReference","params":{"column":"email"}},{"component":"data2-core-types@DataSetColumnReference","params":{"column":"password"}},{"component":"data2-core-types@DataSetColumnReference","params":{"column":"status"}}],"sessionMetadata":{"params":{"actions":[{"params":{"compare":{"params":{"subject":{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$user._id"}}}},{"params":{"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"active"}},"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$user.status"}}}}},"component":"data2-core-comparison-operators@Equal","displayName":"is active user"}]},"component":"data2-core-logical-operators@And","displayName":"is active and has _id"}},"component":"data2-core-logical-operators@Not"},"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Invalid Credentials"}},"code":{"component":"data2-core-primitives@String","params":{"content":"401"}}},"component":"data2-core-types@Error"}},"component":"data2-core-flow@If","displayName":"check $user"},{"params":{"action":{"params":{"pattern":{"component":"data2-core-primitives@String","params":{"content":"@data2.app"}},"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$user.email"}}}}},"component":"data2-core-functions@Includes","displayName":"isData2User"},"resultName":{"component":"data2-core-primitives@String","params":{"content":"is_data2_user"}}},"component":"data2-core-flow@Step"},{"params":{"action":{"params":{"pattern":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$metadata.d2_app"}}}},"subject":[{"component":"data2-core-primitives@String","params":{"content":"management"}}]},"component":"data2-core-functions@Includes","displayName":"isData2App Exception"},"resultName":{"component":"data2-core-primitives@String","params":{"content":"is_data2_app_exception"}}},"component":"data2-core-flow@Step"},{"params":{"resultName":{"component":"data2-core-primitives@String","params":{"content":"has_access"}},"action":{"params":{"compare":{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"is_data2_user"}}}},{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"is_data2_app_exception"}}}}]},"component":"data2-core-logical-operators@Or"},"else":{"params":{"actions":[{"params":{"actions":[{"params":{"compare":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$metadata.system"}}}}},"component":"data2-core-logical-operators@Not"},"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Invalid Credentials"}},"code":{"component":"data2-core-primitives@String","params":{"content":"401"}}},"component":"data2-core-types@Error"}},"component":"data2-core-flow@If","displayName":"check $metadata.system"},{"params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"WuUa-VKHhW9uYU0E3-mJ8"}},"prop":"filter","args":[{"_id":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$metadata.system"}}}}}]},"component":"data2-core-types@Interaction"},{"params":{"compare":{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"WuUa-VKHhW9uYU0E3-mJ8"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records.length"}}}}},"component":"data2-core-logical-operators@Not","displayName":"systems not found"},"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Invalid Credentials"}},"code":{"component":"data2-core-primitives@String","params":{"content":"401"}}},"component":"data2-core-types@Error"}},"component":"data2-core-flow@If","displayName":"check system found"},{"params":{"actions":[{"params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Ok6Tsu5XkS7r8PyW_7TyW"}},"prop":"filter","args":[{"user":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$user._id"}}}},"organization":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"WuUa-VKHhW9uYU0E3-mJ8"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"cursor.current.organization._id"}}}}}]},"component":"data2-core-types@Interaction"},{"params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"NqKAY34n2ffFL64zamp7t"}},"prop":"filter","args":[{"user":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$user._id"}}}},"system":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$metadata.system"}}}}}]},"component":"data2-core-types@Interaction"}]},"component":"data2-core-flow@Parallel"}]},"component":"data2-core-flow@Series","displayName":"common setup"},{"params":{"then":{"params":{"content":true},"component":"data2-core-primitives@Boolean"},"else":{"params":{"content":false},"component":"data2-core-primitives@Boolean"},"compare":{"params":{"components":{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"WuUa-VKHhW9uYU0E3-mJ8"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"mapper":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"system"}}],"body":{"params":{"expression":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"system.visibility"}}}},"defaultCase":{"params":{"content":false},"component":"data2-core-primitives@Boolean"},"cases":[{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"public"}},"value":{"params":{"components":[{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Ok6Tsu5XkS7r8PyW_7TyW"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"member"}}],"body":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"member.organization._id"}}}},"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"system.organization._id"}}}}},"component":"data2-core-comparison-operators@Equal","displayName":"is org member"},{"params":{"pattern":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"member.role"}}}},"subject":[{"component":"data2-core-primitives@String","params":{"content":"owner"}},{"component":"data2-core-primitives@String","params":{"content":"billing-owner"}},{"component":"data2-core-primitives@String","params":{"content":"admin"}},{"component":"data2-core-primitives@String","params":{"content":"member"}}]},"component":"data2-core-functions@Includes","displayName":"has role with access"}]},"component":"data2-core-logical-operators@And","displayName":"has org member role with access"}}}},"component":"data2-core-functions@ArrayFind","displayName":"is org member"},{"params":{"components":[{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Ok6Tsu5XkS7r8PyW_7TyW"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"member"}}],"body":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"member.organization._id"}}}},"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"system.organization._id"}}}}},"component":"data2-core-comparison-operators@Equal","displayName":"is org member"},{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"member.role"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"collaborator"}}},"component":"data2-core-comparison-operators@Equal","displayName":"is collaborator"}]},"component":"data2-core-logical-operators@And","displayName":"is org member and collaborator"}}}},"component":"data2-core-functions@ArrayFind","displayName":"is collaborator"},{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"NqKAY34n2ffFL64zamp7t"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"access"}}],"body":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"access.system._id"}}}},"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"system._id"}}}}},"component":"data2-core-comparison-operators@Equal"}}}},"component":"data2-core-functions@ArrayFind","displayName":"has system access"}]},"component":"data2-core-logical-operators@And","displayName":"is collaborator and has system access"}]},"component":"data2-core-logical-operators@Or"}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"private"}},"value":{"params":{"components":[{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Ok6Tsu5XkS7r8PyW_7TyW"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"member"}}],"body":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"member.organization._id"}}}},"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"system.organization._id"}}}}},"component":"data2-core-comparison-operators@Equal","displayName":"is org member"},{"params":{"pattern":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"member.role"}}}},"subject":[{"component":"data2-core-primitives@String","params":{"content":"owner"}},{"component":"data2-core-primitives@String","params":{"content":"admin"}}]},"component":"data2-core-functions@Includes","displayName":"is owner/admin"}]},"component":"data2-core-logical-operators@And","displayName":"has org member role with access"}}}},"component":"data2-core-functions@ArrayFind","displayName":"is owner/admin"},{"params":{"components":[{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Ok6Tsu5XkS7r8PyW_7TyW"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"member"}}],"body":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"member.organization._id"}}}},"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"system.organization._id"}}}}},"component":"data2-core-comparison-operators@Equal"}}}},"component":"data2-core-functions@ArrayFind","displayName":"is org member"},{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"NqKAY34n2ffFL64zamp7t"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"access"}}],"body":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"access.system._id"}}}},"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"system._id"}}}}},"component":"data2-core-comparison-operators@Equal"}}}},"component":"data2-core-functions@ArrayFind","displayName":"has system access"}]},"component":"data2-core-logical-operators@And","displayName":"is member and has system access"}]},"component":"data2-core-logical-operators@Or","displayName":"is owner/admin or has system access"}}}]},"component":"data2-core-flow@Switch"}}}},"component":"data2-core-functions@ArrayMap"}},"component":"data2-core-logical-operators@And","displayName":"has org member for all systems in request"}},"component":"data2-core-flow@If"}]},"component":"data2-core-flow@Series"},"then":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-flow@If"}},"component":"data2-core-flow@Step"},{"params":{"then":{"system":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$metadata.system"}}}}},"else":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Invalid Credentials"}},"code":{"component":"data2-core-primitives@String","params":{"content":"401"}}},"component":"data2-core-types@Error"},"compare":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"has_access"}}}}},"component":"data2-core-flow@If"}]},"component":"data2-core-flow@Series"},"sessionExpiresIn":{"component":"data2-core-primitives@Number","params":{"content":604800}},"sessionRenewal":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"identityProviders":[{"provider":{"component":"data2-core-primitives@String","params":{"content":"GOOGLE"}},"clientId":{"component":"data2-core-primitives@String","params":{"content":"55470861603-22pvfc1t49lp8cjnbfk71s5ct9hp1q1v.apps.googleusercontent.com"}}}]},"reference":"Data2BuilderAuthentication","updatedAt":"2026-08-06T19:31:23.557Z"},{"_id":"5f15fee60528b92601890f70","component":"data2-core@FeathersDataSource","system":"5e3b796d6228227ca637d0f4","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1920,"height":1080}},"service":"systems","baseUrl":"https://data2.data2.dev"},"reference":"SystemsDataSource","updatedAt":"2022-11-09T18:47:00.815Z","createdAt":"2020-07-20T20:30:30.182Z"},{"_id":"5f1600b70528b92601890f75","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ServiceComponentInstancesTableDataSource"}},"pk":"_id","autoEdit":true,"master":{"params":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"component":"data2-core-types@DataSetMaster"},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"policies":{"params":{"allowGet":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"ServiceComponentInstancesDataSet","updatedAt":"2025-11-06T21:07:20.208Z","createdAt":"2020-07-20T20:38:15.436Z"},{"_id":"5f1602190528b92601890f7d","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"pagination":{"size":40000},"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ComponentInstancesTableDataSource"}},"sort":{"_id":1},"pk":"_id","autoEdit":true,"master":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"policies":{"params":{"allowGet":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"ComponentInstancesDataSet","updatedAt":"2025-11-06T21:07:07.089Z","createdAt":"2020-07-20T20:44:09.350Z"},{"_id":"5f1601240528b92601890f76","component":"data2-core@FeathersDataSource","system":"5e3b796d6228227ca637d0f4","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1920,"height":1080}},"service":"componentInstances","baseUrl":"https://data2.data2.dev"},"reference":"ComponentInstancesDataSource","updatedAt":"2022-11-09T18:47:00.907Z","createdAt":"2020-07-20T20:40:04.736Z"},{"_id":"5f1601310528b92601890f77","component":"data2-core@FeathersDataSource","system":"5e3b796d6228227ca637d0f4","params":{"service":"fileComponentInstances","baseUrl":"https://data2.data2.dev","super":{}},"reference":"FileComponentInstancesDataSource","updatedAt":"2022-11-09T18:47:11.395Z","createdAt":"2020-07-20T20:40:17.634Z"},{"_id":"5f16017f0528b92601890f7a","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"FileComponentInstancesTableDataSource"}},"pk":"_id","autoEdit":true,"filter":{"domain":{"component":"data2-core-types@Reference","params":{"reference":"clientApplicationDomain"}}},"master":{"params":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"component":"data2-core-types@DataSetMaster"},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}}},"reference":"FileComponentInstancesDataSet","updatedAt":"2023-08-03T16:08:18.193Z","createdAt":"2020-07-20T20:41:35.797Z"},{"_id":"5f1616d00528b92601890f83","component":"data2-core@FeathersDataSource","system":"5e3b796d6228227ca637d0f4","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1920,"height":1080}},"service":"applications","baseUrl":"https://data2.data2.dev"},"reference":"ApplicationsDataSource","updatedAt":"2022-11-09T18:47:01.142Z","createdAt":"2020-07-20T22:12:32.356Z"},{"_id":"5f9041dbc8da12be8b94aea4","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"pagination":{"size":2000},"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ComponentsTableDataSource"}},"pk":"_id","autoEdit":true,"master":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"policies":{"params":{"allowGet":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"UserComponentsDataSet","updatedAt":"2025-11-06T21:06:58.095Z","createdAt":"2020-07-20T20:44:09.350Z"},{"_id":"5f9abd04c8da12be8bcfa3a0","component":"data2-core@Data2TableDataSource","system":"5e3b796d6228227ca637d0f4","params":{"super":{},"table":"usersSystems","schema":[{"component":"data2-core-types@Field","params":{"key":"user","title":"User","component":"data2-core-types@Lookup","table":"UsersTableDataSource"}},{"component":"data2-core-types@Field","params":{"key":"system","title":"System","component":"data2-core-types@Lookup","table":"SystemsTableDataSource"}},{"component":"data2-core-types@Field","params":{"title":"Virtual Renderables","key":"virtual_renderables","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"Settings","key":"settings","component":"data2-core-primitives@Object"}}],"policies":{"params":{},"component":"data2@OdXqkniRwozlztGpfeuZ3"}},"reference":"UsersSystemsDataSource","updatedAt":"2026-05-13T23:25:14.877Z","createdAt":"2020-10-29T13:00:05.344Z"},{"_id":"5fc4f630c8da12be8bf1e878","component":"data2-core@Data2TableDataSource","system":"5e3b796d6228227ca637d0f4","params":{"super":{},"table":"dataComponentInstances","schema":[{"component":"data2-core-types@Field","params":{"key":"displayName","title":"Display Name","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"component","title":"Component","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"system","title":"System","component":"data2-core-primitives@ObjectId"}},{"component":"data2-core-types@Field","params":{"key":"params","title":"Params","component":"data2-core-primitives@Object"}},{"component":"data2-core-types@Field","params":{"key":"reference","title":"Reference","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"Locked","key":"locked","component":"data2-core-primitives@Boolean"}},{"component":"data2-core-types@Field","params":{"title":"type","key":"type","component":"data2-core-primitives@String"}}],"hooks":{"before":{"find":[{"hook":"useCache","options":{"additionalGroupKeys":["$and.0.system"]}}]},"after":{"create":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["system"]}},{"hook":"invalidateEnvCache"}],"update":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["system"]}},{"hook":"invalidateEnvCache"}],"patch":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["system"]}},{"hook":"invalidateEnvCache"}],"remove":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["system"]}},{"hook":"invalidateEnvCache"}]}},"multi":["create"],"policies":{"params":{},"component":"data2@HYJyJUpllo08j6aYr15sY"}},"reference":"DataComponentInstancesTableDataSource","updatedAt":"2023-10-04T16:18:31.775Z","createdAt":"2020-11-30T13:39:00.409Z"},{"_id":"5fc58138c8da12be8b24f345","component":"data2-core@Data2TableDataSource","system":"5e3b796d6228227ca637d0f4","params":{"paginate":{"default":1000},"super":{},"table":"applications","schema":[{"component":"data2-core-types@Field","params":{"key":"displayName","title":"Display Name","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"reference","title":"Reference","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"params","title":"Params","component":"data2-core-primitives@Object"}},{"component":"data2-core-types@Field","params":{"key":"system","title":"System","component":"data2-core-primitives@ObjectId"}},{"component":"data2-core-types@Field","params":{"key":"component","title":"Component","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"Locked","key":"locked","component":"data2-core-primitives@Boolean"}}],"hooks":{"before":{"all":[{"hook":"softDelete"}],"find":[{"hook":"useCache","options":{"additionalGroupKeys":["$and.0.system"]}}],"create":[{"hook":"timestamp","options":{"fields":["createdAt","updatedAt"]}}],"update":[{"hook":"timestamp","options":{"fields":["updatedAt"]}}],"patch":[{"hook":"timestamp","options":{"fields":["updatedAt"]}}]},"after":{"create":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["system"]}},{"hook":"invalidateEnvCache"}],"update":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["system"]}},{"hook":"invalidateEnvCache"}],"patch":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["system"]}},{"hook":"invalidateEnvCache"}],"remove":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["system"]}},{"hook":"invalidateEnvCache"}]}},"policies":{"params":{},"component":"data2@HYJyJUpllo08j6aYr15sY"}},"reference":"ApplicationsTableDataSource","updatedAt":"2023-08-16T15:47:31.909Z","createdAt":"2020-11-30T23:29:27.106Z"},{"_id":"5fc154d7c8da12be8ba7b57d","component":"data2-core@Data2TableDataSource","system":"5e3b796d6228227ca637d0f4","params":{"super":{},"table":"users","schema":[{"component":"data2-core-types@Field","params":{"key":"email","title":"E-mail","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"name","title":"Name","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"password","title":"Password","component":"data2-core-types@Password","validation":{"regex":{"pattern":{"component":"data2-core-primitives@String","params":{"content":"^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{10,}$"}}}}}},{"component":"data2-core-types@Field","params":{"title":"status","key":"status","component":"data2-core-primitives@String","validation":{"oneOf":{"component":"data2-core-primitives@String","params":{"content":"pending,active,inactive"}}}}},{"component":"data2-core-types@Field","params":{"title":"invitation","key":"invitation","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"discordId","key":{"component":"data2-core-primitives@String","params":{"content":"discordId"}},"component":"data2-core-primitives@String"},"break":false},{"component":"data2-core-types@Field","params":{"title":"activationToken","key":{"component":"data2-core-primitives@String","params":{"content":"activationToken"}},"component":"data2-core-primitives@String"},"break":false},{"component":"data2-core-types@Field","params":{"title":"visibilityLevel","key":"visibility_level","component":"data2-core-primitives@String"}}],"hooks":{"before":{"all":[{"hook":"softDelete"}],"create":[{"hook":"timestamp","options":{"fields":["createdAt","updatedAt"]}}],"update":[{"hook":"timestamp","options":{"fields":["updatedAt"]}}],"patch":[{"hook":"timestamp","options":{"fields":["updatedAt"]}}]}},"multi":["create"],"policies":[{"component":"data2-core-auth@Policy","params":{"allow":{"params":{"expression":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"defaultCase":{"params":{},"component":"data2-core-primitives@Boolean"},"cases":[{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"find"}},"value":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"get"}},"value":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"create"}},"value":{"params":{"actions":[{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Data2BuilderAuthentication"}}},"component":"data2-core-flow@AwaitReady"},{"params":{},"component":"data2@3UDe5xvHPRuve6PvboXJG"}]},"component":"data2-core-flow@Series"}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"patch"}},"value":{"params":{"actions":[{"params":{"compare":{"params":{"components":[{"params":{"content":{"params":{"module":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$record"}}}},"prop":{"component":"data2-core-primitives@String","params":{"content":"password.resetToken"}}},"component":"data2-core-types@Getter"}},"component":"data2-core-primitives@Boolean","break":true,"displayName":"has password.resetToken on payload"},{"params":{"content":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$dataset"}}}},"prop":{"component":"data2-core-primitives@String","params":{"content":"filterSettings"}}}},"prop":{"component":"data2-core-primitives@String","params":{"content":"password.resetToken"}}}}},"component":"data2-core-primitives@Boolean","break":true,"displayName":"is resetting password"}]},"component":"data2-core-logical-operators@Or","displayName":"is reset password email or is resetting password"},"then":{"params":{"result":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-flow@Return"}},"component":"data2-core-flow@If","displayName":"Early return if changing password.resetToken or has resetToken as filter"},{"params":{"actions":[{"params":{"compare":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$id"}}}}},"component":"data2-core-logical-operators@Not","displayName":"No id"}],"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Param \"id\" is required."}},"code":{"component":"data2-core-primitives@String","params":{"content":"400"}}},"component":"data2-core-types@Error"}},"component":"data2-core-flow@If","displayName":"id is required"}]},"component":"data2-core-flow@Series","displayName":"validations"},{"params":{"actions":[{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Data2BuilderAuthentication"}}},"component":"data2-core-flow@AwaitReady"},{"params":{"compare":[{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Data2BuilderAuthentication"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"session._id"}},"x":{"component":"data2-core-primitives@String","params":{"content":"1"}}}}},"component":"data2-core-logical-operators@Not"}],"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Missing authentication"}},"code":{"component":"data2-core-primitives@String","params":{"content":"401"}}},"component":"data2-core-types@Error"}},"component":"data2-core-flow@If"}]},"component":"data2-core-flow@Series","displayName":"common setup"},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"uWJ56eAjtxAUHTwOm6DfK"}},"prop":"filter","args":[{"_id":{"params":{"components":[{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$id"}}},"component":"data2-core-types@Reference"},{"component":"data2-core-primitives@String","params":{"content":"000000000000000000000000"}}]},"component":"data2-core-logical-operators@Or"}}]}},{"params":{"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Validations after Setup not passed."}},"code":{"component":"data2-core-primitives@String","params":{"content":"400"}}},"component":"data2-core-types@Error"},"compare":[{"params":{"subject":{"params":{},"component":"data2@3UDe5xvHPRuve6PvboXJG"}},"component":"data2-core-logical-operators@Not","displayName":"is not @data2.app"},{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"uWJ56eAjtxAUHTwOm6DfK"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records.length"}}}}},"component":"data2-core-logical-operators@Not","displayName":"user not found"}]},"component":"data2-core-logical-operators@Or"}]},"component":"data2-core-flow@If","displayName":"common validations after setup"},{"params":{"then":{"params":{"content":true},"component":"data2-core-primitives@Boolean"},"else":{"params":{"content":false},"component":"data2-core-primitives@Boolean"},"compare":[{"params":{"components":[{"params":{"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"active"}},"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Data2BuilderAuthentication"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"session.status"}}}}},"component":"data2-core-comparison-operators@Equal","displayName":"is active user"},{"params":{"components":[{"params":{},"component":"data2@3UDe5xvHPRuve6PvboXJG"},{"params":{"components":{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"uWJ56eAjtxAUHTwOm6DfK"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"mapper":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"user"}}],"body":{"params":{"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"user._id"}}}},"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Data2BuilderAuthentication"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"session._id"}}}}},"component":"data2-core-comparison-operators@Equal"}}}},"component":"data2-core-functions@ArrayMap","displayName":"is user resource"}},"component":"data2-core-logical-operators@And"}]},"component":"data2-core-logical-operators@Or","displayName":"is active user and has access"}]},"component":"data2-core-logical-operators@And"}]},"component":"data2-core-flow@If"}]},"component":"data2-core-flow@Series"}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"remove"}},"value":{"params":{"actions":[{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Data2BuilderAuthentication"}}},"component":"data2-core-flow@AwaitReady"},{"params":{},"component":"data2@3UDe5xvHPRuve6PvboXJG"}]},"component":"data2-core-flow@Series"}}}]},"component":"data2-core-flow@Switch"}}},{"component":"data2-core-auth@Policy","params":{"authenticationStrategy":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"InternalApplicationsAuthenticationStrategy"}}}},{"params":{},"component":"data2-core-auth@RushPolicy"}],"shouldValidate":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"reference":"UsersTableDataSource","updatedAt":"2026-08-05T20:52:42.929Z","createdAt":"2020-11-27T19:34:20.252Z"},{"_id":"5fc4f09ec8da12be8befcdcc","component":"data2-core@Data2TableDataSource","system":"5e3b796d6228227ca637d0f4","params":{"super":{},"table":"systems","schema":[{"component":"data2-core-types@Field","params":{"key":"name","title":"Name","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"domain","title":"Domain","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"organization","key":"organization","component":"data2-core-types@Lookup","table":{"component":"data2-core-primitives@String","params":{"content":"OrganizationsDataSource"}}}},{"component":"data2-core-types@Field","params":{"title":"visibility","key":"visibility","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"Organization to Transfer","key":{"component":"data2-core-primitives@String","params":{"content":"organizationToTransfer"}},"component":"data2-core-types@Lookup","table":{"component":"data2-core-primitives@String","params":{"content":"OrganizationsDataSource"}}},"break":true}],"hooks":{"before":{"all":[{"hook":"softDelete"}],"create":[{"hook":"timestamp","options":{"fields":["createdAt","updatedAt"]}}],"update":[{"hook":"timestamp","options":{"fields":["updatedAt"]}}],"patch":[{"hook":"timestamp","options":{"fields":["updatedAt"]}}]},"after":{"update":[{"hook":"invalidateEnvCache","options":{"alwaysInvalidate":true}}],"patch":[{"hook":"invalidateEnvCache","options":{"alwaysInvalidate":true}}],"remove":[{"hook":"invalidateEnvCache","options":{"alwaysInvalidate":true}}]}},"multi":["create"],"paginate":{"default":1000},"policies":{"params":{},"component":"data2@tp7v0wIGGE8oF-PKBreuZ"}},"reference":"SystemsTableDataSource","updatedAt":"2023-08-16T21:39:20.542Z","createdAt":"2020-11-30T13:09:53.916Z"},{"_id":"5fc57fdec8da12be8b2474be","component":"data2-core@Data2TableDataSource","system":"5e3b796d6228227ca637d0f4","params":{"paginate":{"default":1000},"super":{},"schema":[{"component":"data2-core-types@Field","params":{"key":"component","title":"Component","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"displayName","title":"Display Name","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"reference","title":"Reference","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"system","title":"System","component":"data2-core-primitives@ObjectId"}},{"component":"data2-core-types@Field","params":{"key":"params","title":"params","component":"data2-core-primitives@Object"}},{"component":"data2-core-types@Field","params":{"title":"Locked","key":"locked","component":"data2-core-primitives@Boolean"}},{"component":"data2-core-types@Field","params":{"title":"versioning","key":"versioning","component":"data2-core-primitives@String","validation":{"oneOf":{"component":"data2-core-primitives@String","params":{"content":"enabled,disabled"}}}}},{"component":"data2-core-types@Field","params":{"title":"bundleId","key":{"component":"data2-core-primitives@String","params":{"content":"bundleId"}},"component":"data2-core-primitives@String"},"break":false}],"hooks":{"before":{"find":[{"hook":"useCache","options":{"additionalGroupKeys":["$and.0.system"]}}]},"after":{"create":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["system"]}},{"hook":"invalidateEnvCache"}],"update":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["system"]}},{"hook":"invalidateEnvCache"}],"patch":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["system"]}},{"hook":"invalidateEnvCache"}],"remove":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["system"]}},{"hook":"invalidateEnvCache"}]}},"table":"serviceComponentInstances","policies":{"params":{},"component":"data2@HYJyJUpllo08j6aYr15sY"}},"reference":"ServiceComponentInstancesTableDataSource","updatedAt":"2023-11-06T19:41:18.702Z","createdAt":"2020-11-30T18:07:18.960Z"},{"_id":"5f060ee51ca96def42f3fbd1","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"UsersTableDataSource"}},"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":1}}}},"reference":"UsersDataSet","updatedAt":"2026-03-04T21:16:40.291Z"},{"_id":"5f16009a0528b92601890f74","component":"data2-core@FeathersDataSource","system":"5e3b796d6228227ca637d0f4","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1920,"height":1080}},"service":"dataComponentInstances","baseUrl":"https://data2.data2.dev"},"reference":"DataComponentInstancesDataSource","updatedAt":"2022-11-09T18:47:01.247Z","createdAt":"2020-07-20T20:37:46.933Z"},{"_id":"5f1601990528b92601890f7b","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ApplicationsTableDataSource"}},"pk":"_id","autoEdit":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"master":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"params":{"column":"_id"},"component":"data2-core-types@DataSetColumnReference"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}}},"reference":"ApplicationsDataSet","updatedAt":"2022-12-13T21:51:13.995Z","createdAt":"2020-07-20T20:42:01.657Z"},{"_id":"5f1601ce0528b92601890f7c","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"pagination":{"size":1000},"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ComponentsTableDataSource"}},"sort":{"params.package":1,"params.component":1},"pk":"_id","autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"staticFilter":{"system":{"exists":{"params":{"content":false},"component":"data2-core-primitives@Boolean"}}},"filter":{"system":{"exists":{"params":{"content":false},"component":"data2-core-primitives@Boolean"}}}},"reference":"ComponentsDataSet","updatedAt":"2025-11-05T19:37:01.935Z","createdAt":"2020-07-20T20:42:54.898Z"},{"_id":"5f6b44fca575399a451b79f8","component":"data2-core@FeathersDataSource","system":"5e3b796d6228227ca637d0f4","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1920,"height":1080}},"service":"Packages","baseUrl":"https://data2.data2.dev","super":{}},"reference":"PackagesDataSource","updatedAt":"2022-11-09T18:47:17.076Z","createdAt":"2020-09-23T12:51:46.788Z"},{"_id":"5f06103e1ca96def42f43553","component":"data2-core@FeathersDataSource","system":"5e3b796d6228227ca637d0f4","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":869,"height":541}},"service":"Users","baseUrl":"https://data2.data2.dev"},"reference":"UsersDataSource","updatedAt":"2022-11-09T18:47:01.641Z","createdAt":"2020-07-08T17:23:00.808Z"},{"_id":"5f15ff190528b92601890f71","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"SystemsTableDataSource"}},"filter":{"domain":{"component":"data2-core-types@Reference","params":{"reference":"domain"}}},"pk":"_id","fields":[{"component":"data2-core-types@FieldReference","params":{"key":"_id"}},{"component":"data2-core-types@FieldReference","params":{"key":"name"}},{"component":"data2-core-types@FieldReference","params":{"key":"domain"}},{"component":"data2-core-types@FieldReference","params":{"key":"visibility"}},{"component":"data2-core-types@FieldReference","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"customDomains"}}},"break":true},{"component":"data2-core-types@FieldReference","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"organization._id"}}},"break":true},{"component":"data2-core-types@FieldReference","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"organization.name"}}},"break":true},{"component":"data2-core-types@FieldReference","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"organization.billingStatus"}}},"break":true},{"component":"data2-core-types@FieldReference","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"organization.publicTrial.active"}}},"break":true},{"component":"data2-core-types@FieldReference","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"settings.defaultAccessPolicy"}}},"break":true}],"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":1}}},"staticPagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":1}}},"policies":[{"component":"data2-core-auth@Policy","params":{"allow":{"params":{"actions":[{"params":{"components":[{"params":{"query":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$params.query"}}}},"field":{"component":"data2-core-primitives@String","params":{"content":"_id"}},"fieldType":"string"},"component":"data2@7KkQq0vK4a7D2gg6IVJT7"},{"params":{"query":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$params.query"}}}},"field":{"component":"data2-core-primitives@String","params":{"content":"domain"}},"fieldType":"string"},"component":"data2@7KkQq0vK4a7D2gg6IVJT7"},{"params":{"query":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$params.query"}}}},"field":{"component":"data2-core-primitives@String","params":{"content":"customDomains"}},"fieldType":"string"},"component":"data2@7KkQq0vK4a7D2gg6IVJT7"}]},"component":"data2-core-logical-operators@Or"}]},"component":"data2-core-flow@Series"}}}]},"reference":"SystemsDataSet","updatedAt":"2026-08-07T21:51:24.037Z","createdAt":"2020-07-20T20:31:21.838Z"},{"_id":"5f16014c0528b92601890f78","component":"data2-core@FeathersDataSource","system":"5e3b796d6228227ca637d0f4","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1920,"height":1080}},"service":"components","baseUrl":"https://data2.data2.dev"},"reference":"ComponentsDataSource","updatedAt":"2022-11-09T18:47:01.736Z","createdAt":"2020-07-20T20:40:44.427Z"},{"_id":"5f1601630528b92601890f79","component":"data2-core@FeathersDataSource","system":"5e3b796d6228227ca637d0f4","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1920,"height":1080}},"service":"serviceComponentInstances","baseUrl":"https://data2.data2.dev"},"reference":"ServiceComponentInstancesDataSource","updatedAt":"2022-11-09T18:47:01.836Z","createdAt":"2020-07-20T20:41:07.873Z"},{"_id":"5f16172a0528b92601890f85","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":10000}}},"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"DataComponentInstancesTableDataSource"}},"pk":"_id","autoEdit":true,"master":{"params":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"component":"data2-core-types@DataSetMaster"},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"policies":{"params":{"allowGet":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"DataComponentInstancesDataSet","updatedAt":"2025-11-06T21:07:12.831Z","createdAt":"2020-07-20T22:14:02.097Z"},{"_id":"5fc4f912c8da12be8bf3146a","component":"data2-core@Data2TableDataSource","system":"5e3b796d6228227ca637d0f4","params":{"paginate":{"default":1000},"super":{},"table":"componentInstances","schema":[{"component":"data2-core-types@Field","params":{"key":"parent","title":"Parent","component":"data2-core-primitives@ObjectId"}},{"component":"data2-core-types@Field","params":{"key":"component","title":"Component","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"system","title":"System","component":"data2-core-primitives@ObjectId"}},{"component":"data2-core-types@Field","params":{"key":"displayName","title":"Display Name","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"params","title":"Params","component":"data2-core-primitives@Object"}},{"component":"data2-core-types@Field","params":{"key":"index","title":"Index","component":"data2-core-primitives@Number"}},{"component":"data2-core-types@Field","params":{"key":"reference","title":"Reference","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"Locked","key":"locked","component":"data2-core-primitives@Boolean"}}],"hooks":{"before":{"all":[{"hook":"softDelete"}],"find":[{"hook":"useCache","options":{"additionalGroupKeys":["$and.0.system","$and.1.system"]}}],"create":[{"hook":"timestamp","options":{"fields":["createdAt","updatedAt"]}}],"update":[{"hook":"timestamp","options":{"fields":["updatedAt"]}}],"patch":[{"hook":"timestamp","options":{"fields":["updatedAt"]}}]},"after":{"create":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["system"]}},{"hook":"invalidateEnvCache"}],"update":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["system"]}},{"hook":"invalidateEnvCache"}],"patch":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["system"]}},{"hook":"invalidateEnvCache"}],"remove":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["system"]}},{"hook":"invalidateEnvCache"}]}},"multi":["create"],"policies":{"params":{},"component":"data2@HYJyJUpllo08j6aYr15sY"}},"reference":"ComponentInstancesTableDataSource","updatedAt":"2023-08-15T18:30:36.748Z","createdAt":"2020-11-30T13:39:00.409Z"},{"_id":"5fc58286c8da12be8b256f61","component":"data2-core@Data2TableDataSource","system":"5e3b796d6228227ca637d0f4","params":{"paginate":{"default":1000},"super":{},"table":"packages","schema":[{"component":"data2-core-types@Field","params":{"key":"reference","title":"Reference","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"params","title":"params","component":"data2-core-primitives@Object"}}],"hooks":{"before":{"all":[{"hook":"softDelete"}],"create":[{"hook":"timestamp","options":{"fields":["createdAt","updatedAt"]}}],"update":[{"hook":"timestamp","options":{"fields":["updatedAt"]}}],"patch":[{"hook":"timestamp","options":{"fields":["updatedAt"]}}]}}},"reference":"PackagesTableDataSource","updatedAt":"2022-07-18T16:09:16.657Z","createdAt":"2020-11-30T23:36:06.363Z"},{"_id":"5f9abd25c8da12be8bcfaa6a","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"UsersSystemsDataSource"}},"pagination":{"size":1000},"master":{"dataset":{"component":"data2-core-types@ProcessReference","params":{"reference":"SessionsDataSet"}},"localField":"user","masterField":"credentials._id"},"filter":{"params":{"system":"000000000000000000000000"},"component":"data2-core-types@DataSetFilter"}},"reference":"UsersSystemsDataSet","updatedAt":"2026-08-05T17:56:27.365Z","createdAt":"2020-10-29T13:00:05.344Z"},{"_id":"5fc4faeec8da12be8bf3d08a","component":"data2-core@Data2TableDataSource","system":"5e3b796d6228227ca637d0f4","params":{"paginate":{"default":1000},"super":{},"table":"fileComponentInstances","schema":[{"component":"data2-core-types@Field","params":{"key":"component","title":"Component","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"system","title":"System","component":"data2-core-primitives@ObjectId"}},{"component":"data2-core-types@Field","params":{"key":"displayName","title":"Display Name","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"params","title":"Params","component":"data2-core-primitives@Object"}},{"component":"data2-core-types@Field","params":{"key":"reference","title":"Reference","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"fileId"}},"title":"File ID","component":"data2-core-primitives@ObjectId"},"break":true}],"hooks":{"before":{"all":[{"hook":"softDelete"}],"find":[{"hook":"useCache","options":{"additionalGroupKeys":["$and.0.system","$and.1.system"],"skipCache":true}}],"create":[{"hook":"timestamp","options":{"fields":["createdAt","updatedAt"]}}],"update":[{"hook":"timestamp","options":{"fields":["updatedAt"]}}],"patch":[{"hook":"timestamp","options":{"fields":["updatedAt"]}}]},"after":{"all":[{"hook":"fileUrl","options":{"downloadField":"params.fileUrl","uploadField":"params.uploadFileUrl","enhanceSchema":false}}],"find":[{"hook":"useCache","options":{"additionalGroupKeys":["$and.0.system","$and.1.system"],"skipCache":true}}],"create":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["system"],"secondaryUniqueKeys":["reference"]}},{"hook":"invalidateEnvCache"}],"update":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["system"],"secondaryUniqueKeys":["reference"]}},{"hook":"invalidateEnvCache"}],"patch":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["system"],"secondaryUniqueKeys":["reference"]}},{"hook":"invalidateEnvCache"}],"remove":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["system"],"secondaryUniqueKeys":["reference"]}},{"hook":"invalidateEnvCache"}]}},"multi":["create"],"useEstimatedDocumentCount":true},"reference":"FileComponentInstancesTableDataSource","updatedAt":"2022-12-19T20:42:51.837Z","createdAt":"2020-11-30T13:59:52.294Z"},{"_id":"5fc534f5c8da12be8b08b7bc","component":"data2-core@Data2TableDataSource","system":"5e3b796d6228227ca637d0f4","params":{"paginate":{"default":1000},"super":{},"table":"components","schema":[{"component":"data2-core-types@Field","params":{"key":"component","title":"Component","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"system","title":"System","component":"data2-core-primitives@ObjectId"}},{"component":"data2-core-types@Field","params":{"key":"params","title":"params","component":"data2-core-primitives@Object"}}],"hooks":{"before":{"all":[{"hook":"softDelete"}],"find":[{"hook":"useCache","options":{"additionalGroupKeys":["$and.0.system"]}}],"create":[{"hook":"timestamp","options":{"fields":["createdAt","updatedAt"]}}],"update":[{"hook":"timestamp","options":{"fields":["updatedAt"]}}],"patch":[{"hook":"timestamp","options":{"fields":["updatedAt"]}}]},"after":{"create":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["system"]}},{"hook":"invalidateEnvCache"}],"update":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["system"]}},{"hook":"invalidateEnvCache"}],"patch":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["system"]}},{"hook":"invalidateEnvCache"}],"remove":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["system"]}},{"hook":"invalidateEnvCache"}]}},"multi":["create"],"policies":{"params":{},"component":"data2@HYJyJUpllo08j6aYr15sY"}},"reference":"ComponentsTableDataSource","updatedAt":"2023-08-16T15:47:28.941Z","createdAt":"2020-11-30T18:07:18.960Z"},{"_id":"6040f382c2dd12f05963f1a7","component":"data2-core@Data2TableDataSource","system":"5e3b796d6228227ca637d0f4","params":{"paginate":{"default":1000},"super":{},"table":"bundles","schema":[{"component":"data2-core-types@Field","params":{"key":"system","title":"System","component":"data2-core-types@Lookup","table":"SystemsTableDataSource"}},{"component":"data2-core-types@Field","params":{"key":"publishedAt","title":"Published At","component":"data2-core-primitives@Date"}},{"component":"data2-core-types@Field","params":{"key":"version","title":"Version","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"reference","title":"Reference","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"description","title":"Description","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"contentLength","title":"Content Length","component":"data2-core-primitives@Number"}},{"component":"data2-core-types@Field","params":{"title":"Applications","key":"applications","component":"data2-core-types@Lookup","table":"ApplicationsTableDataSource","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}},{"component":"data2-core-types@Field","params":{"title":"Last Processed At","key":"last_processed_at","component":"data2-core-primitives@Date"}},{"component":"data2-core-types@Field","params":{"title":"Minimal Bundle Generated At","key":"minimalBundleGeneratedAt","component":"data2-core-primitives@Date"}},{"component":"data2-core-types@Field","params":{"title":"defaultAccessPolicy","key":{"component":"data2-core-primitives@String","params":{"content":"defaultAccessPolicy"}},"component":"data2-core-primitives@String"},"break":true}],"hooks":{"before":{"all":[{"hook":"softDelete"}],"create":[{"hook":"timestamp","options":{"fields":["createdAt","updatedAt"]}}],"update":[{"hook":"timestamp","options":{"fields":["updatedAt"]}}],"patch":[{"hook":"timestamp","options":{"fields":["updatedAt"]}}]}},"policies":{"params":{},"component":"data2@HYJyJUpllo08j6aYr15sY"}},"reference":"BundlesTableDataSource","updatedAt":"2026-08-14T10:21:02.167Z","createdAt":"2021-03-04T14:19:49.945Z"},{"_id":"60ddc1bbda3861ca65407c5a","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"FileComponentInstancesTableDataSource"}},"pk":"_id","autoEdit":true,"filter":{"domain":{"component":"data2-core-types@Reference","params":{"reference":"clientApplicationDomain"}}},"pagination":{"size":1},"master":{"params":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"component":"data2-core-types@DataSetMaster"}},"reference":"OneFileComponentInstancesDataSet","updatedAt":"2022-02-09T19:44:38.036Z","createdAt":"2020-07-20T20:41:35.797Z"},{"_id":"61030b60f302195bad585a55","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"pagination":{"size":6000},"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ComponentInstancesTableDataSource"}},"pk":"_id","autoEdit":true,"visibilityMode":"only_show_deleted","sort":{"deletedAt":-1},"master":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"filter":{"params":{"deletedAt":{"$gte":{"params":{"count":{"component":"data2-core-primitives@Number","params":{"content":-30}},"date":{"params":{},"component":"data2-core-functions@DateNow"},"period":"days"},"component":"data2-core-functions@DateAdd"}}},"component":"data2-core-types@DataSetFilter"},"policies":{"params":{},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"DeletedComponentInstancesDataSet","updatedAt":"2025-11-05T22:41:18.708Z","createdAt":"2021-07-29T20:10:35.237Z"},{"_id":"6040f4cfc2dd12f059643a21","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"BundlesTableDataSource"}},"pagination":{"size":1000},"master":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"sort":{"publishedAt":-1},"versioning":"disabled","policies":{"params":{"allowGet":{"component":"data2-core-primitives@Boolean","params":{"content":false}}},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"BundlesDataSet","updatedAt":"2026-07-25T02:34:40.845Z","createdAt":"2021-01-22T18:45:05.779Z"},{"_id":"61b1220d8e7b0694616dcec2","component":"data2-core@Data2TableDataSource","system":"5e3b796d6228227ca637d0f4","params":{"super":{},"multi":["create"],"table":{"component":"data2-core-primitives@String","params":{"content":"customDomains"}},"schema":[{"component":"data2-core-types@Field","params":{"title":"domain","key":"domain","component":"data2-core-primitives@String","validation":{"required":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}}},{"component":"data2-core-types@Field","params":{"component":"data2-core-types@Lookup","title":"system","key":"system","table":{"component":"data2-core-primitives@String","params":{"content":"SystemsTableDataSource"}},"validation":{"required":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}}},{"component":"data2-core-types@Field","params":{"title":"validatedAt","key":"validated_at","component":"data2-core-primitives@Date"}},{"component":"data2-core-types@Field","params":{"title":"validationText","key":"validation_text","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"destination","key":"destination","component":"data2-core-primitives@String","table":{"component":"data2-core-primitives@String","params":{"content":""}},"validation":{"required":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}}}],"hooks":{"after":{"create":[{"hook":"invalidateEnvCache"}],"update":[{"hook":"invalidateEnvCache"}],"patch":[{"hook":"invalidateEnvCache"}],"remove":[{"hook":"invalidateEnvCache"}]}},"policies":{"params":{},"component":"data2@HYJyJUpllo08j6aYr15sY"}},"reference":"CustomDomainsTable","updatedAt":"2023-08-16T15:48:13.283Z","createdAt":"2021-12-08T21:22:21.604Z"},{"_id":"61b8f4a354ea187f1491d4fe","displayName":"AllOrganizationsDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"OrganizationsDataSource"}}},"reference":"AllOrganizationsDataSet","updatedAt":"2023-01-05T19:51:21.819Z","createdAt":"2021-12-14T19:46:44.021Z"},{"_id":"61b8f5f454ea187f1491d501","displayName":"SystemAccessDataSource","component":"data2-core@Data2TableDataSource","system":"5e3b796d6228227ca637d0f4","params":{"super":{},"table":{"component":"data2-core-primitives@String","params":{"content":"systemAccess"}},"multi":["create"],"schema":[{"component":"data2-core-types@Field","params":{"title":"organizationMember","key":{"component":"data2-core-primitives@String","params":{"content":"organizationMember"}},"component":"data2-core-types@Lookup","table":{"component":"data2-core-primitives@String","params":{"content":"OrganizationMemberDataSource"}}},"break":true},{"component":"data2-core-types@Field","params":{"title":"user","key":"user","component":"data2-core-types@Lookup","table":"UsersTableDataSource"}},{"component":"data2-core-types@Field","params":{"title":"system","key":"system","component":"data2-core-types@Lookup","table":"SystemsTableDataSource"}},{"component":"data2-core-types@Field","params":{"component":"data2-core-primitives@String","title":"role","key":"role"}},{"component":"data2-core-types@Field","params":{"title":"organization","key":"organization","component":"data2-core-types@Lookup","table":"OrganizationsDataSource"}}],"policies":{"params":{},"component":"data2@tp7v0wIGGE8oF-PKBreuZ"}},"reference":"SystemAccessDataSource","updatedAt":"2023-08-18T19:25:40.234Z","createdAt":"2021-12-14T19:52:20.343Z"},{"_id":"61b8f54c54ea187f1491d4ff","displayName":"OrganizationMemberDataSource","component":"data2-core@Data2TableDataSource","system":"5e3b796d6228227ca637d0f4","params":{"super":{},"table":{"component":"data2-core-primitives@String","params":{"content":"organizationMember"}},"multi":["create"],"schema":[{"component":"data2-core-types@Field","params":{"title":"user","key":"user","component":"data2-core-types@Lookup","table":{"component":"data2-core-primitives@String","params":{"content":"UsersTableDataSource"}}}},{"component":"data2-core-types@Field","params":{"title":"organization","key":"organization","component":"data2-core-types@Lookup","table":{"component":"data2-core-primitives@String","params":{"content":"OrganizationsDataSource"}}}},{"component":"data2-core-types@Field","params":{"title":"role","key":"role","component":"data2-core-primitives@String"}}],"policies":{"params":{},"component":"data2@tp7v0wIGGE8oF-PKBreuZ"}},"reference":"OrganizationMemberDataSource","updatedAt":"2023-08-16T21:41:52.986Z","createdAt":"2021-12-14T19:49:32.588Z"},{"_id":"61e1ca160cebace4806e5ead","displayName":"WorkspacesTableDataSource","component":"data2-core@Data2TableDataSource","system":"5e3b796d6228227ca637d0f4","params":{"super":{},"table":{"component":"data2-core-primitives@String","params":{"content":"workspaces"}},"multi":["create"],"schema":[{"component":"data2-core-types@Field","params":{"title":"system","key":"system","component":"data2-core-types@Lookup","table":"SystemsTableDataSource"}},{"component":"data2-core-types@Field","params":{"title":"name","key":"name","component":"data2-core-primitives@String"}}]},"reference":"WorkspacesTableDataSource","updatedAt":"2025-11-05T23:01:05.043Z","createdAt":"2022-01-14T19:08:06.422Z"},{"_id":"61e1cd39ad6edf91c884c27a","displayName":"WorkspaceInstancesDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"WorkspaceInstancesTableDataSource"}},"master":{"params":{"dataset":{"disabled":false,"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"params":{"content":"system"},"component":"data2-core-primitives@String"},"masterField":{"params":{"content":"_id"},"component":"data2-core-primitives@String"}},"component":"data2-core-types@DataSetMaster"},"policies":{"params":{},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"WorkspaceInstancesDataSet","updatedAt":"2025-11-05T23:15:17.288Z","createdAt":"2022-01-14T19:21:29.400Z"},{"_id":"6215420815971c2c7d213f54","displayName":"AllOrganizationMemberDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"OrganizationMemberDataSource"}}},"reference":"AllOrganizationMemberDataSet","updatedAt":"2022-02-22T20:05:42.092Z","createdAt":"2022-02-22T20:05:28.735Z"},{"_id":"6227cb0236c086020d51f5e7","displayName":"AllSystemsDataSetByOrganization","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"SystemsTableDataSource"}},"master":{"params":{"dataset":{"disabled":false,"component":"data2-core-types@DataSetReference","params":{"reference":"AllOrganizationsDataSet"}},"masterField":{"params":{"content":"_id"},"component":"data2-core-primitives@String"},"localField":{"params":{"content":"organization"},"component":"data2-core-primitives@String"}},"component":"data2-core-types@DataSetMaster"},"policies":[{"params":{},"component":"data2-core-auth@BuilderPolicy"}]},"reference":"AllSystemsDataSetByOrganization","updatedAt":"2026-08-13T19:31:50.811Z","createdAt":"2022-03-08T21:30:44.011Z"},{"_id":"61b1222d8e7b0694616dcec3","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"CustomDomainsTable"}},"versioning":"disabled"},"reference":"CustomDomainsDataSet","updatedAt":"2025-10-21T23:51:59.387Z","createdAt":"2021-12-08T21:23:01.616Z"},{"_id":"61b215f44952cc334d39071e","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"CustomDomainsTable"}},"master":{"component":"data2-core-types@DataSetMaster","dataset":{"disabled":false,"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"params":{"content":"system"},"component":"data2-core-primitives@String"},"masterField":{"disabled":false,"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"requiresConfirmation":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"validationStrict":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"versioning":"disabled"},"reference":"CustomDomainsBySystemDataSet","updatedAt":"2024-06-25T19:31:54.063Z","createdAt":"2021-12-09T14:44:09.944Z"},{"_id":"61b8f46e54ea187f1491d4fd","displayName":"OrganizationsDataSource","component":"data2-core@Data2TableDataSource","system":"5e3b796d6228227ca637d0f4","params":{"super":{},"table":{"component":"data2-core-primitives@String","params":{"content":"organizations"}},"multi":["create"],"schema":[{"component":"data2-core-types@Field","params":{"title":"name","key":"name","component":"data2-core-primitives@String","unique":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"validation":{"required":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}}},{"component":"data2-core-types@Field","params":{"title":"billingStatus","key":{"component":"data2-core-primitives@String","params":{"content":"billingStatus"}},"component":"data2-core-primitives@String","validation":{"required":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"oneOf":{"component":"data2-core-primitives@String","params":{"content":"public-trial,trial,billable,data2"}}}},"break":true},{"component":"data2-core-types@Field","params":{"title":"domain","key":"domain","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"cnpj","key":"cnpj","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"corporateName","key":{"component":"data2-core-primitives@String","params":{"content":"corporateName"}},"component":"data2-core-primitives@String"},"break":true},{"component":"data2-core-types@Field","params":{"title":"circle","key":"circle","component":"data2-core-primitives@Boolean"}},{"component":"data2-core-types@Field","params":{"title":"development","key":"development","component":"data2-core-primitives@Boolean"}},{"component":"data2-core-types@Field","params":{"title":"currency","key":"currency","component":"data2-core-primitives@String","validation":{"oneOf":{"component":"data2-core-primitives@String","params":{"content":"USD,BRL"}}}}},{"component":"data2-core-types@Field","params":{"title":"publicTrial","key":{"component":"data2-core-primitives@String","params":{"content":"publicTrial"}},"component":"data2-core-primitives@Object","schema":[{"params":{"title":"limitSpend","key":{"component":"data2-core-primitives@String","params":{"content":"limitSpend"}},"component":"data2-core-primitives@Number"},"component":"data2-core-types@Field","break":true},{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"limitDays"}},"key":{"component":"data2-core-primitives@String","params":{"content":"limitDays"}},"component":"data2-core-primitives@Number"},"component":"data2-core-types@Field","break":true},{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"startedAt"}},"key":{"component":"data2-core-primitives@String","params":{"content":"startedAt"}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Date"}}},"component":"data2-core-types@Field","break":true},{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"active"}},"key":{"component":"data2-core-primitives@String","params":{"content":"active"}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}}},"component":"data2-core-types@Field","break":true}]},"break":true},{"component":"data2-core-types@Field","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"stripe"}},"key":{"component":"data2-core-primitives@String","params":{"content":"stripe"}},"component":"data2-core-primitives@Object","schema":[{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"customer"}},"key":{"component":"data2-core-primitives@String","params":{"content":"customer"}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}},"component":"data2-core-types@Field","break":true},{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"subscription"}},"key":{"component":"data2-core-primitives@String","params":{"content":"subscription"}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}},"component":"data2-core-types@Field","break":true},{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"subscriptionItem"}},"key":{"component":"data2-core-primitives@String","params":{"content":"subscriptionItem"}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}},"component":"data2-core-types@Field","break":true},{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"subscriptionItemPaymentFee"}},"key":{"component":"data2-core-primitives@String","params":{"content":"subscriptionItemPaymentFee"}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}},"component":"data2-core-types@Field","break":true},{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"subscriptionCurrency"}},"key":{"component":"data2-core-primitives@String","params":{"content":"subscriptionCurrency"}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}},"component":"data2-core-types@Field","break":true}]},"break":true},{"component":"data2-core-types@Field","params":{"title":"paymentMethod","key":{"component":"data2-core-primitives@String","params":{"content":"paymentMethod"}},"component":"data2-core-primitives@String","validation":{"oneOf":{"component":"data2-core-primitives@String","params":{"content":"stripe,invoice"}}}},"break":true},{"component":"data2-core-types@Field","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"billingTags"}},"key":{"component":"data2-core-primitives@String","params":{"content":"billingTags"}},"component":"data2-core-primitives@Object","schema":[{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"active"}},"key":{"component":"data2-core-primitives@String","params":{"content":"active"}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}}},"component":"data2-core-types@Field","break":true}]},"break":true}],"policies":[{"component":"data2-core-auth@Policy","params":{"allow":{"params":{"expression":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"defaultCase":{"params":{},"component":"data2-core-primitives@Boolean"},"cases":[{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"find"}},"value":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"get"}},"value":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"create"}},"value":{"params":{"actions":[{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Data2BuilderAuthentication"}}},"component":"data2-core-flow@AwaitReady"},{"params":{},"component":"data2@3UDe5xvHPRuve6PvboXJG"}]},"component":"data2-core-flow@Series"}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"patch"}},"value":{"params":{"actions":[{"params":{"actions":[{"params":{"compare":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$id"}}}}},"component":"data2-core-logical-operators@Not","displayName":"No id"}],"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Param \"id\" is required."}},"code":{"component":"data2-core-primitives@String","params":{"content":"400"}}},"component":"data2-core-types@Error"}},"component":"data2-core-flow@If","displayName":"id is required"}]},"component":"data2-core-flow@Series","displayName":"validations"},{"params":{"actions":[{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Data2BuilderAuthentication"}}},"component":"data2-core-flow@AwaitReady"},{"params":{"compare":[{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Data2BuilderAuthentication"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"session._id"}},"x":{"component":"data2-core-primitives@String","params":{"content":"1"}}}}},"component":"data2-core-logical-operators@Not"}],"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Missing authentication"}},"code":{"component":"data2-core-primitives@String","params":{"content":"401"}}},"component":"data2-core-types@Error"}},"component":"data2-core-flow@If"},{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"UsersDataSet"}}},"component":"data2-core-flow@AwaitReady"},{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"DhPJ44W3fVq4ylQlnQJ6M"}}},"component":"data2-core-flow@AwaitReady"}]},"component":"data2-core-flow@Series","displayName":"common setup"},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"8RATUCjKQCm9C66SA4llO"}},"prop":"filter","args":[{"_id":{"params":{"components":[{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$id"}}},"component":"data2-core-types@Reference"},{"component":"data2-core-primitives@String","params":{"content":"000000000000000000000000"}}]},"component":"data2-core-logical-operators@Or"}}]}},{"params":{"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Validations after Setup not passed."}},"code":{"component":"data2-core-primitives@String","params":{"content":"400"}}},"component":"data2-core-types@Error"},"compare":[{"params":{"subject":{"params":{},"component":"data2@3UDe5xvHPRuve6PvboXJG"}},"component":"data2-core-logical-operators@Not","displayName":"is not @data2.app"},{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"8RATUCjKQCm9C66SA4llO"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records.length"}}}}},"component":"data2-core-logical-operators@Not","displayName":"organizations not found"}]},"component":"data2-core-logical-operators@Or"}]},"component":"data2-core-flow@If","displayName":"common validations after setup"},{"params":{"then":{"params":{"content":true},"component":"data2-core-primitives@Boolean"},"else":{"params":{"content":false},"component":"data2-core-primitives@Boolean"},"compare":[{"params":{"components":[{"params":{"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"active"}},"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Data2BuilderAuthentication"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"session.status"}}}}},"component":"data2-core-comparison-operators@Equal","displayName":"is active user"},{"params":{"components":[{"params":{},"component":"data2@3UDe5xvHPRuve6PvboXJG"},{"params":{"components":{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"8RATUCjKQCm9C66SA4llO"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"mapper":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"organization"}}],"body":{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"DhPJ44W3fVq4ylQlnQJ6M"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"member"}}],"body":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"member.organization._id"}}}},"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"organization._id"}}}}},"component":"data2-core-comparison-operators@Equal","displayName":"is org member"},{"params":{"pattern":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"member.role"}}}},"subject":[{"component":"data2-core-primitives@String","params":{"content":"owner"}}]},"component":"data2-core-functions@Includes","displayName":"has role with access"}]},"component":"data2-core-logical-operators@And","displayName":"has org member role with access"}}}},"component":"data2-core-functions@ArrayFind","displayName":"is org member: admin/owner"}}}},"component":"data2-core-functions@ArrayMap"}},"component":"data2-core-logical-operators@And","displayName":"has org member for all organizations in request"}]},"component":"data2-core-logical-operators@Or","displayName":"is active user and has access"}]},"component":"data2-core-logical-operators@And"}]},"component":"data2-core-flow@If"}]},"component":"data2-core-flow@Series"}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"remove"}},"value":{"params":{"actions":[{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Data2BuilderAuthentication"}}},"component":"data2-core-flow@AwaitReady"},{"params":{},"component":"data2@3UDe5xvHPRuve6PvboXJG"}]},"component":"data2-core-flow@Series"}}}]},"component":"data2-core-flow@Switch"}}},{"component":"data2-core-auth@Policy","params":{"authenticationStrategy":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"InternalApplicationsAuthenticationStrategy"}}}}]},"reference":"OrganizationsDataSource","updatedAt":"2026-01-27T18:28:44.071Z","createdAt":"2021-12-14T19:45:51.017Z"},{"_id":"61b8f5bc54ea187f1491d500","displayName":"OrganizationMemberDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"OrganizationMemberDataSource"}},"master":{"params":{"dataset":{"disabled":false,"component":"data2-core-types@DataSetReference","params":{"reference":"SessionsDataSet"}},"localField":{"params":{"content":"user"},"component":"data2-core-primitives@String"},"masterField":{"params":{"content":"credentials._id"},"component":"data2-core-primitives@String"}},"component":"data2-core-types@DataSetMaster"},"filter":{"params":{"organization":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"SystemsDataSet"}},"prop":"cursor.current.organization"}}},"component":"data2-core-types@DataSetFilter"}},"reference":"OrganizationMemberDataSet","updatedAt":"2021-12-15T15:32:33.626Z","createdAt":"2021-12-14T19:51:24.802Z"},{"_id":"61e1ccdead6edf91c884c278","displayName":"WorkspacesDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"WorkspacesTableDataSource"}},"master":{"params":{"dataset":{"disabled":false,"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"params":{"content":"system"},"component":"data2-core-primitives@String"},"masterField":{"params":{"content":"_id"},"component":"data2-core-primitives@String"}},"component":"data2-core-types@DataSetMaster"},"sort":{"updatedAt":{"component":"data2-core-primitives@Number","params":{"content":-1}}},"requiresConfirmation":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"policies":{"params":{},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"WorkspacesDataSet","updatedAt":"2025-11-05T23:16:39.534Z","createdAt":"2022-01-14T19:19:58.344Z"},{"_id":"61e1de4bded80840e7a7dbac","displayName":"WorkspacesCreateDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"WorkspacesTableDataSource"}},"filter":{"_id":{"component":"data2-core-primitives@String","params":{"content":"000000000000000000000000"}}},"refreshOnEdit":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"requiresConfirmation":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"policies":{"params":{},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"WorkspacesCreateDataSet","updatedAt":"2025-11-05T23:16:39.302Z","createdAt":"2022-01-14T20:34:20.203Z"},{"_id":"61b8f65a54ea187f1491d502","displayName":"SystemAccessDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"SystemAccessDataSource"}},"master":{"params":{"dataset":{"disabled":false,"component":"data2-core-types@DataSetReference","params":{"reference":"OrganizationMemberDataSet"}},"masterField":{"params":{"content":"_id"},"component":"data2-core-primitives@String"},"localField":{"disabled":false,"component":"data2-core-types@DataSetColumnReference","params":{"column":"organizationMember"}}},"component":"data2-core-types@DataSetMaster"},"filter":{"params":{"system":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"SystemsDataSet"}},"prop":"cursor.current._id"}}},"component":"data2-core-types@DataSetFilter"}},"reference":"SystemAccessDataSet","updatedAt":"2023-01-24T02:32:28.703Z","createdAt":"2021-12-14T19:54:02.320Z"},{"_id":"61e1cd1aad6edf91c884c279","displayName":"WorkspaceInstancesTableDataSource","component":"data2-core@Data2TableDataSource","system":"5e3b796d6228227ca637d0f4","params":{"super":{},"table":{"component":"data2-core-primitives@String","params":{"content":"workspaceInstances"}},"multi":["create"],"schema":[{"component":"data2-core-types@Field","params":{"title":"system","key":"system","component":"data2-core-types@Lookup","table":"SystemsTableDataSource"}},{"component":"data2-core-types@Field","params":{"title":"workspace","key":"workspace","component":"data2-core-types@Lookup","table":"WorkspacesTableDataSource"}},{"component":"data2-core-types@Field","params":{"title":"instance","key":"instance","component":"data2-core-primitives@Object","schema":[{"params":{"title":"ID","key":{"component":"data2-core-primitives@String","params":{"content":"_id"}},"component":{"params":{"content":"data2-core-types@ObjectId"},"component":"data2-core-primitives@String"}},"component":"data2-core-types@Field","break":false},{"params":{"title":"component","key":"component","component":"data2-core-primitives@String"},"component":"data2-core-types@Field"},{"params":{"title":"reference","key":"reference","component":"data2-core-primitives@String"},"component":"data2-core-types@Field"}]},"break":false},{"component":"data2-core-types@Field","params":{"title":"position","key":"position","component":"data2-core-primitives@Object","schema":[{"params":{"title":"x","key":"x","component":"data2-core-primitives@Number"},"component":"data2-core-types@Field"},{"params":{"title":"y","key":"y","component":"data2-core-primitives@Number"},"component":"data2-core-types@Field"}]},"break":false},{"component":"data2-core-types@Field","params":{"title":"dimensions","key":"dimensions","component":"data2-core-primitives@Object","schema":[{"params":{"title":"width","key":"width","component":"data2-core-primitives@Number"},"component":"data2-core-types@Field"},{"params":{"title":"height","key":"height","component":"data2-core-primitives@Number"},"component":"data2-core-types@Field"}]},"break":false}]},"reference":"WorkspaceInstancesTableDataSource","updatedAt":"2025-11-05T23:15:12.264Z","createdAt":"2022-01-14T19:20:58.633Z"},{"_id":"62154aff15971c2c7d213f55","displayName":"AllSystemsDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"SystemsTableDataSource"}}},"reference":"AllSystemsDataSet","updatedAt":"2022-02-22T20:43:51.956Z","createdAt":"2022-02-22T20:43:44.259Z"},{"_id":"621541ee15971c2c7d213f53","displayName":"AllSystemAccessDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"SystemAccessDataSource"}}},"reference":"AllSystemAccessDataSet","updatedAt":"2023-01-24T02:48:31.439Z","createdAt":"2022-02-22T20:05:03.056Z"},{"_id":"6227c3acd2fe08fca4db99b7","displayName":"AllOrganizationMemberDataSetByOrganization","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"OrganizationMemberDataSource"}},"master":{"params":{"dataset":{"disabled":false,"component":"data2-core-types@DataSetReference","params":{"reference":"AllOrganizationsDataSet"}},"masterField":{"params":{"content":"_id"},"component":"data2-core-primitives@String"},"localField":{"params":{"content":"organization"},"component":"data2-core-primitives@String"}},"component":"data2-core-types@DataSetMaster"},"policies":[{"params":{},"component":"data2-core-auth@BuilderPolicy"}]},"reference":"AllOrganizationMemberDataSetByOrganization","updatedAt":"2026-08-13T19:32:29.482Z","createdAt":"2022-03-08T20:59:26.246Z"},{"_id":"622fae319701bc2d9ddba8cc","displayName":"SystemsPickerDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"SystemsTableDataSource"}},"filter":{"_id":{"component":"data2-core-primitives@String","params":{"content":"000000000000000000000000"}}}},"reference":"5ZQ1On0e2CS29zL4KwR8O","updatedAt":"2022-03-15T05:02:01.398Z","createdAt":"2022-03-14T21:05:54.258Z"},{"_id":"623ba4f04500c24e07cff6b9","displayName":"AllUsersDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"UsersTableDataSource"}},"policies":[{"params":{},"component":"data2-core-auth@RushPolicy"},{"params":{},"component":"data2-core-auth@BuilderPolicy"}]},"reference":"AllUsersDataSet","updatedAt":"2026-08-05T20:38:04.535Z","createdAt":"2022-03-23T22:53:37.273Z"},{"_id":"623cabc755e95757b9ecff4b","displayName":"OrganizationMemberDataSetByUser","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"OrganizationMemberDataSource"}},"master":{"params":{"dataset":{"disabled":false,"component":"data2-core-types@DataSetReference","params":{"reference":"SessionsDataSet"}},"localField":{"params":{"content":"user"},"component":"data2-core-primitives@String"},"masterField":{"params":{"content":"credentials._id"},"component":"data2-core-primitives@String"}},"component":"data2-core-types@DataSetMaster"}},"reference":"l4ThorGtbezVCZaU2BEdv","updatedAt":"2022-03-24T17:35:32.740Z","createdAt":"2022-03-24T17:35:04.349Z"},{"_id":"62c58d5e3bbba3020206d9f3","displayName":"login_slides_table","component":"data2-core@Data2TableDataSource","system":"5e3b796d6228227ca637d0f4","params":{"table":"n5c1QXCr2tLnpGEOAAw8p","multi":["create"],"schema":[{"component":"data2-core-types@Field","params":{"title":"image","key":"image","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"mood","key":"mood","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"product","key":"product","component":"data2-core-primitives@String"}}]},"reference":"n5c1QXCr2tLnpGEOAAw8p","updatedAt":"2022-07-07T14:19:59.164Z","createdAt":"2022-07-06T13:25:51.528Z"},{"_id":"62c58d6f3bbba3020206d9f4","displayName":"all_login_slides","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"n5c1QXCr2tLnpGEOAAw8p"}},"versioning":"disabled","policies":[{"component":"data2-core-auth@PublicPolicy","params":{"reason":"Login page carousel content (all_login_slides) — must be readable anonymously pre-auth"}}]},"reference":"z4rwBvzXeLWiVdQsbcAt2","updatedAt":"2026-08-06T16:43:48.613Z","createdAt":"2022-07-06T13:26:08.504Z"},{"_id":"63b7236f60752d19fb0850e9","displayName":"AllDeletedSystemsDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"SystemsTableDataSource"}},"visibilityMode":"only_show_deleted"},"reference":"AllDeletedSystemsDataSet","updatedAt":"2023-01-05T19:47:43.928Z","createdAt":"2023-01-05T19:22:24.905Z"},{"_id":"63cf38e64dce774eead7c25c","displayName":"SystemAccessDataSetByUser","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"SystemAccessDataSource"}},"master":{"params":{"dataset":{"disabled":false,"component":"data2-core-types@DataSetReference","params":{"reference":"SessionsDataSet"}},"localField":{"params":{"content":"user"},"component":"data2-core-primitives@String"},"masterField":{"params":{"content":"credentials._id"},"component":"data2-core-primitives@String"}},"component":"data2-core-types@DataSetMaster"}},"reference":"Pbdn7ys5lXkZeEL1wXl0O","updatedAt":"2023-01-24T01:48:44.297Z","createdAt":"2023-01-24T01:48:25.424Z"},{"_id":"63cf4c8edc6d9c198fd16d9e","displayName":"FirstAccessUsersDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"UsersTableDataSource"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"filter":{"_id":{"component":"data2-core-primitives@String","params":{"content":"000000000000000000000000"}}},"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":1}}},"staticFilter":{"status":{"component":"data2-core-primitives@String","params":{"content":"pending"}}},"policies":[{"component":"data2-core-auth@Policy","params":{"allow":{"params":{"cases":[{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"find"}},"value":{"params":{"components":[{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$params.query.$and.0._id"}}},"component":"data2-core-types@Reference"},{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$params.query.$and.0.email"}}},"component":"data2-core-types@Reference"}]},"component":"data2-core-logical-operators@Or"}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"patch"}},"value":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}}}],"defaultCase":{"params":{},"component":"data2-core-primitives@Boolean"},"expression":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-flow@Switch"}}}]},"reference":"BhCMHF8FsJxFh9FLT_F4n","updatedAt":"2023-04-28T15:45:10.108Z","createdAt":"2023-01-24T03:12:18.593Z"},{"_id":"63ee3d38b8c9838c62fb05fb","displayName":"DriveFileComponentInstancesDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"FileComponentInstancesTableDataSource"}},"pk":"_id","autoEdit":true,"filter":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core@Drive"}}},"master":{"params":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"component":"data2-core-types@DataSetMaster"},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}}},"reference":"DriveFileComponentInstancesDataSet","updatedAt":"2025-12-04T21:58:32.367Z","createdAt":"2023-02-16T14:27:07.797Z"},{"_id":"64496149872eb1961d8a6993","displayName":"invitations","component":"data2-core@Data2TableDataSource","system":"5e3b796d6228227ca637d0f4","params":{"table":{"component":"data2-core-primitives@String","params":{"content":"invitations"}},"multi":["create"],"schema":[{"component":"data2-core-types@Field","params":{"title":"code","key":"code","component":"data2-core-primitives@String"}}]},"reference":"6cWacdzSi8_bvYvdaFjr8","updatedAt":"2023-04-26T17:37:52.889Z","createdAt":"2023-04-26T17:37:14.014Z"},{"_id":"64496171872eb1961d8a6994","displayName":"AllInvitationsDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"6cWacdzSi8_bvYvdaFjr8"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"versioning":"disabled","policies":[{"component":"data2-core-auth@BuilderPolicy","params":{}}]},"reference":"EV64XXrjMFtaiacT_T1fG","updatedAt":"2026-08-06T16:43:47.765Z","createdAt":"2023-04-26T17:37:54.432Z"},{"_id":"644983d94b9bcc50729af609","displayName":"SelfSignUpInvitationsDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"6cWacdzSi8_bvYvdaFjr8"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":1}}},"filter":{"_id":{"component":"data2-core-primitives@String","params":{"content":"000000000000000000000000"}}},"versioning":"disabled","policies":[{"component":"data2-core-auth@Policy","params":{"allow":{"component":"data2-core-flow@Switch","params":{"expression":{"component":"data2-core-types@Reference","params":{"reference":"$method"}},"cases":[{"component":"data2-core-flow@Case","params":{"expression":"find","value":{"component":"data2-core-logical-operators@Or","params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":"$params.query.$and.0.code"}}]}}}}],"defaultCase":{"component":"data2-core-primitives@Boolean","params":{}}}}}}]},"reference":"qMhoJ-yM2JFnHYJZK2vE1","updatedAt":"2026-08-06T16:43:47.186Z","createdAt":"2023-04-26T20:04:42.304Z"},{"_id":"644986ab4b9bcc50729af60b","displayName":"SelfSignUpUsersDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"UsersTableDataSource"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"filter":{"_id":{"component":"data2-core-primitives@String","params":{"content":"000000000000000000000000"}}},"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":1}}},"policies":[{"component":"data2-core-auth@Policy","params":{"allow":{"params":{"cases":[{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"find"}},"value":{"params":{"components":[{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$params.query.$and.0.email"}}},"component":"data2-core-types@Reference"},{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$params.query.$and.0._id"}}},"component":"data2-core-types@Reference"},{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$params.query.$and.0.activationToken"}}},"component":"data2-core-types@Reference"}]},"component":"data2-core-logical-operators@Or"}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"patch"}},"value":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"create"}},"value":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}}}],"defaultCase":{"component":"data2-core-primitives@Boolean"},"expression":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-flow@Switch"}}}]},"reference":"zmV7JfNmv2oDUtGKfSzNm","updatedAt":"2023-08-02T20:40:59.545Z","createdAt":"2023-04-26T20:16:44.411Z"},{"_id":"644bddc0a3c8c0f62d1df8fd","displayName":"SelfSignUpOrganizationsDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"OrganizationsDataSource"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"filter":{"_id":{"component":"data2-core-primitives@String","params":{"content":"000000000000000000000000"}}},"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":1}}},"policies":[{"component":"data2-core-auth@Policy","params":{"allow":{"params":{"cases":[{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"find"}},"value":{"params":{"components":[{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$params.query.$and.0.domain"}}},"component":"data2-core-types@Reference"},{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$params.query.$and.0._id"}}},"component":"data2-core-types@Reference"}]},"component":"data2-core-logical-operators@Or"}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"patch"}},"value":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"create"}},"value":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}}}],"defaultCase":{"component":"data2-core-primitives@Boolean"},"expression":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-flow@Switch"}}}]},"reference":"tXNGSE-imL6vW6JzWjaUz","updatedAt":"2023-10-02T22:24:43.668Z","createdAt":"2023-04-28T14:53:01.662Z"},{"_id":"644bde50a3c8c0f62d1df8fe","displayName":"SelfSignUpOrganizationMembersDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"OrganizationMemberDataSource"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"filter":{"_id":{"component":"data2-core-primitives@String","params":{"content":"000000000000000000000000"}}},"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":1}}},"policies":[{"component":"data2-core-auth@Policy","params":{"allow":{"params":{"cases":[{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"find"}},"value":{"params":{"components":[{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$params.query.$and.0.email"}}},"component":"data2-core-types@Reference"},{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$params.query.$and.0._id"}}},"component":"data2-core-types@Reference"}]},"component":"data2-core-logical-operators@Or"}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"patch"}},"value":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"create"}},"value":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}}}],"defaultCase":{"component":"data2-core-primitives@Boolean"},"expression":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-flow@Switch"}}}]},"reference":"rAiZhTj-HTUbW4nXvmQ7M","updatedAt":"2023-04-28T14:55:23.102Z","createdAt":"2023-04-28T14:55:23.102Z"},{"_id":"644bde68a3c8c0f62d1df900","displayName":"SelfSignUpSystemsDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"SystemsTableDataSource"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"filter":{"_id":{"component":"data2-core-primitives@String","params":{"content":"000000000000000000000000"}}},"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":1}}},"policies":[{"component":"data2-core-auth@Policy","params":{"allow":{"params":{"cases":[{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"find"}},"value":{"params":{"components":[{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$params.query.$and.0._id"}}},"component":"data2-core-types@Reference"}]},"component":"data2-core-logical-operators@Or"}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"patch"}},"value":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"create"}},"value":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}}}],"defaultCase":{"component":"data2-core-primitives@Boolean"},"expression":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-flow@Switch"}}}]},"reference":"0TySsxIHfD3304K2SnpgJ","updatedAt":"2023-08-02T20:41:18.206Z","createdAt":"2023-04-28T14:55:51.142Z"},{"_id":"645a8f67e8798685e8f4c7db","displayName":"Discord_Secrets","component":"data2-core-id@KeyVault","system":"5e3b796d6228227ca637d0f4","params":{"keyPair":{"privateKey":["ZtFDH0n+cIYF0gdLodSEg/0StuJWPezl6mPuKMln/914VHM23z1/3pqeXIKWAAtEjjVOIwit1J9JWF1lUEai/aOqFl0LYhESsgvtnc8vaLahcVh5UgOj75tb6c7qBUEnxG2L6GkyYe7kxsgw1eB5BVGn0BnUaRBujpBof3INjp1gDl9OZsqLdp+Y34Nx2SprFK2Z4d+TXP5rfaUgHYaNirMCxVy3GbmNfSZlKSMDrqdnAs3SzMXjA+c0JCBOkatshIdH4iHxDXyWbrylh0zIyvYn5trCP3e+N4YHAwXDUo/x1BIelx8IHpS9vC/w5rauP6j75ZmpygX6d/2cRfXl5m2drmD04FT+dkivRZXLUQA3zi73SiyCQN0PEiDVO4zwY8Jk9CvHNxcFH8nBiR0HvtDqMNpkg0n9JTNjrr4KWlcKTLgRXOgyKyBfsnSPPpByoLb+gdPramKvTmtCpXevlAl3kqcfBO5amotdIG8b92eDGRVK8QViR+sJ8kgqm71CCm8Svka9DducOyiClYW7LAvWGDsZ6rN0lhsQg5yw8ZZJfrTPwt41Zn9aA+Owi8nPpLNI8qAa01R11ExD1JAqTnHz9VvHYZ1+uoMEhXYB4j0xM6CpWITk7q/S1u/m29hW1SMdpfjEqgwQ2w6szn78pDmNZCdq2Cvp2PVd58X5eB8=","Zp6lRsIwmhrr8sQo0CpzoFtJfJQ5UeQ5bFIvEkneEjCuUuhxP0bEwznG0Kb0QSFUclYqggAKtT/DyP4xXqF+BLhiF2K7vPFTH8R2glEhSHbdYJK1daZ13si923k7SgzED0HGe8bwgAOspV5T2EMUOfSelpE2bshBW8/scneUhywXkcJUn94VcW1I7Mt4ruqQp6dqPqnVDqXowU+B896aoWXF41r0NGy1KG9MgFGlv12EIUaBAcgDd7LYyf1DuKrB9Q6mdlpNomw3NyoE0b3l4sG2FSm+qXKnXRjDF5XdjvVjMnKV+ZF/CA9YQJ9jS/nOllwtOiNwnaLc0sBB+LoPumfgo9wsA/ffzF3J9Crh4Fh6xTzS8g/jA2dfMyl5TdNfHEhmmYNOBNwKiC2WSJNJ7IsiC+Z/s3uljvCiuof2COYes+5DcwCVnDZX2IHVEXRIT9Mnhx4o3y9AknCM2Gl2+fSkfYe67l2KeVHPAkYcVhD/TpVBlUoysNVv4jc8REcQkxm1qC3OvLHlNLTqBFnr7AiJ2Z8kwRizkk3TNSOjCQy3Lwx2Kt0P7HhssWddwBfNWe/TKdAQ51SDiru2F35XiLiE1hQ9h7r7SAC3jUWelyXEeIAlPy+1EGmaRJ48YurVe/aVasDwtLQQWrDbw+uaZ7Nyxnk0nDnhqZXwMHtyMDA=","ZL4NFqOh8SFOMKWjNBsvAOwNUASPKSuJgXJq9c6Cp0WFqTyCWCmrVJtlLqm3rEaZ7mDU8fs8lj7RT/815vvzZZCP22pBAf+Vy9qZJlM2K+E9f5++iBPZA9zg0lSsslOhvU6GV9/fNNQxWn5wmzbqwMUx7gyjb3K0r6AXqG6XDNIqYP/Kb4Fun49FjQxA4ZfVeXP8ae2milpRpJwNg61oPm/eB1mVVSluirdFMFdcTb7OXRxLIZEi+QKeu03hystn5GC4A9FaU5CkJlu/OblIt6BstHRWdtMuxO2fxFxwOt4ArMnRCF7jPekCj3MwPBVmUtAFNpUhuChwTjF3sG7UuVN4nDMXQy5zJTgioZbkZ2JF9q6ClIcnOI/hcOTB2rkZ34IuIdKN/Lb3YQdHC0sKKZcoeEEheTK//4QpgyW0CJqeK817wzxNBW5LhkdfUgw8jdrNFaszervJDPAxMiK7xyTfpnWUSiHEVEKH5sc3Eya+vG3MTtyKrMExrOMG1RMWnfIx4qdsNi7fFFtDUD8GJmMfeKMkmSZ+jgA9qMoae9zRPSFCweIzIDLah91N2Txq4EN5Z18L5xnBSYawqvCIaRTG5Gvuau7vA1MvVW6WAA26q2jZoS/rXgVF3LDzkAX/PPdJWHCheZRML24dmzq6ji7dkEP6TqDC6/Nyuv2ITzk=","W7MNQu0poKDLg1ynL1fZLzEaViBJXX8RNvoGR7fwmpb2n+Sm8PYv//N9tUvN6wN/YDPI8vO81hn4Xd1l7AxwIr1cLYCWNn2IpUqeET7u6vifQKG+x2y3tDcu736b13v8DxNqT4icyBUDju9Zq64kDWTcfuzRlaGzDuEi9mQw7UIkVBigJFGxZqf5eOTGCdOstkcXPySRrwII5hvxqDeLcbRsEYag52q/IZJ4nP/ulPJBxfDqm5Am+Wzm58UyFtWOFF4Ycjke0VRkPKsD/e38c6MaqmAEGsHSQYMmMnqmAFYun+Ua9Z0AiP9zftola7C9oXCiE2+HPRZEjwLWxBqwlywVdkrMCbhFj0CbEWCjzKabib+SlQynZFUbpDpGgFH9lzm7yWkak2iyOjIZ2GJUH4O6g/BpfH0DsS68s8y61yozsW3xw/rEfAewBi64jreptQECdnISWFbq4EvYkjhYbcCCYOFTqjP7zxVFjF4HP1btIA34XvU4bsqxkV95wicwQNHHjXS6CVQNXCODk8eBNSsh0+ptUQnGhdPy5W1jPAyPZp1wQBxXXSF8okc5ZnPeaKaM0X6VwVNr5IxlkBHQNnwUx2tBvH6ZV4XnOq3CKde1Xy0EHFxQUh7+Q2AwR6DlrMDjowGrTI9q2EW7AVIuOkQL7ZRdBbJt4pvd5R1gBTE=","kJR7kiSHTUmgPgDEOtqhuqyMEH72nT8ZTKkTAHzct3wvi6Z9WU4R+OLcsF3O5F3u4geSyLLvYrFMmRVxmnONzyJvuCpmDsg+tFarZtoukCE372thtv5bUB8S8MOptzXLTrKYZqPAEAbsLwSZGxytkeUa/bM+aoWHTfGdgQc+8c3BJ4RVqrJeT+pu2evf6GJurCJEfOSYmkT+Sv8mb1vwaGMRN9YTeoKuocDypt4xZy/cVR82wMB7xzGrIMorjbJaulKLnpalfoqDHHISIWF4aXtlNeOp+jQaf3ZmgR2LB3bIYrwpjWTnFqs3HtoxIUotnVxPCQr5cWW7FQNkU0n90vwj7K4DW4ZBeARYtsk+qD6ZbPj358lGCJPm2YjPd3cxkvxW+A7zninmXZpipiDkMTtkEjxWWJA7Juzm0re3mmjJhInhaC+9+uTL9Jnkm/QLSmRaKmx66ZJKw78EbXZOZcwEiYOMbg9b8dwv3mB/xhi7q+Wk0aqOx8AZqNOzSukMv12lQsStoTXicY3qNhfrIIXuXPyb7saeOZLMveVR8sqtv2tMfI4PkbZGh0ig37YMZrfLbKXgw3ALSvWmRyIwD3Et1TZNk+Ru0qHT5GCRW01Z9qyoluRvH5pg6/jtiHntHbmLMN9wPkRwcuyE+/Mp16fA7DpaajsFIDul1/FntTc=","kCOQtD6enCWxUxsUuNRw8lX7OIPkxcAy+wGi9lrN0iAMMOqhDXz5rdZelI0GArMbi8tVrBbzRYcxPbSYfZ4JH5Ol7r8qB5MFFdLkaURhGWo8cjsAdYD6dSSQedOr0fJQBNvRrw1ws05oTY/lZ6HxKRW4Gr1D1F4xwuhQPlFb67R3Fxrw1f77tHJ2WcZGr9e4N947HhHoQ9PnpAWJEOyb/PxljCwRTzvja6Uo0Y6L59nic4pdFQJbvdY3dJ0qoRRIloEr3KA/n24/HM+0XBivdTgfQzqXRNcBX5WbZVkQzgJY+w4tv5pHC3y5+hcl9gRAI/y7e7yFKupmSk4cEDJS4G1QUpxOhuqDKLps82BGUvH3OSKRl1xYJnkGpiQRU/68fRD5CUOLsn8HeHpyHtpppWvE7WDKsfXlGLE2uF60I6UYqFozjRcEe7A2TK1Im8UA0XfP9PjUnAjyAACMSd1xGr+NB9O6z5w95ZAcCz5e19uLgOA52iruNnJ1hK5+eJNP2QxOezUTqZU9HiVmqsNoJeWMOHkZVrhbd4puIkdTjJohAtLImWK9CJbQon9cfDObzqTVXHog68Rr4QGVlpezbs+4ZWD2H2qT2S/U/tu1Vs3+k20VG483lRkptlMxLUrBMDPzLZ9D1eVwmt7cxPvvYoW6VOblNvjJ/mpZD2kZ2DQ=","CM8S2hwwjGeI5R0TQONX3hacw87GRDNB2w+D9d8hRzwca6lpah0Rb4TAnJycgNvhMcSnX8eG5kF6hU+A9+RgeRjnNNNcyKYIFiW0sYMieOnJ0wKVnLapqjxN73u7LxbifYxpGO9POqf2w+jzl0FJnLa4Qa2fyCXMI/qJG+kcb6lya+yZjZtaGzo06Bxjic+GlMT1bQns7GT+k5kzR+nFC8BSlAgvtc+g+MKe0zqih4H877JkSVDz7Z3b2XVKITnKtVcZbTCszJ9IfY9EWHLUZ5nVwNrm0YwD1b3bOaa/SvfrpuB9Su83ALMeQ6RfzZiIIW10O2877Ic1vZBnEEJxdw2P5KgH8lafJhItW0ON4pbZ/Qct+dnjqXWqSQTNszdxvK6LjDoiIn3/t3L78vC8AoB+mtxHXtacVWOKlrNRsVXwmnvyku14ozzyVBoahOzcQIVcxAglIQreajy7PHS24dDjXXL8A+fBvcDM0Rqfu/E41nAjUvidYhXTJx0AUgFZXdgqJsVpMDFdYEMnAAJ0BNkBsGxIe6Ffk5JmxHvYiNON/oi5a6UT3cqbRoAeGnRCYvJXz/2Emw7lHIHDNpNINFWUXMBk3G0NzvtPtpDnZIEgPINyDzptshsDeWgjkjHmgR1WTxfGuCFcL3GL1RMomuNt9+gpbCyMyAR8XvavF1s=","p++FTHYDCMYYu88H/KvW5hIvL3Gb65ARmkN8i5O01FqOqGfz9oLytvF12RqIr0DU9cgO2V9r1vYF8k/TtIfQg8qhqtkPFMDG7NecX29gnlvnui8ePnywCka/zcDwPOmtfuakR4seDl1zqfg312in5FotLbkQs8BkEMsyQ5mtZOebssow/GXKI70ldXH80BY1UQ5Lxv7dDtpTNUx/CnJCK5556Ud8wrzPuc3rFBnWLmFh+jGgHAsQV4y0XZfNjIWlQKnF9KcIIFNF31vb1jF5InCTketAoobM1h642e4BLeTOChCSg7FOsBmsjxPCrf9xlOhUXvUggi2pO1HccKMFk3Y92EZ3CkoabrOtVJvn1n52DS2i8IgLT2JOVodwoqz8CYlPN/W9mE53wb9+P5t3Yat0aC923tyMuc2XwqOKZu6TJLZ+xZZYWTHeKhuCqjHldBKNUZh3zd6K3DBOr4SfQE3MLqtaE5OzUCew58O78CN1q3jGPzDycYtkSdrhJjf1WsDJHKQkwC7h7L4kCfmbnQoZZnZ45hqpqils4zRQGeJt+teDGqrCB51wFtLl32MlbtPDp5Oge8HCEET4U9m0CgbAI1IvNGxvctnrg9haCKpNI8WpxtvkDP7cqefs6u53bEsAQpmwpyCSVfRZ8xqZLuSHFUAPtbU5jIxAlpcmqvo=","NH6aYJioK93Jr4GnjEkCQshvnyzApoTVoUgbvo950sZ+a7MEc+2HJmoa/ymTmjWhU+GE9Og6RubOm+ypWo6I8HW4TEzWDWHuBbGX6taTJKXnUDmkinSnIRKFTXMfwgNKoHK+EZE6oVtpPxA8+MsIrULoeX3X7cUOdyYeqios7ENq2wY4FPgf/zD0pLuooiLCBxAkYru2F9eaUFoF4yDvrqNh00ZrACqlzdcPKPvjy289wA6nAWOojRuDYdA2WG7xWPdNE1X8dZ19NNcDtmA/7NfBcSln0TgCCaGF3ct9nQWA5Ik9iIWOprtZNKpKj4XCSJRuiNBq76TICs3PvTYHaDlDkrTPMOSL8NCMIpucJdPLm2tMFcWSchwW4qcFsoO9yDAUpn9D53teU2YEde2rp6wlmO8hB/hr+ROYvr9RV6rhrYF/6I7z/ls1gbebYIlp6IbYpWRxDJZPXBJPqkNEGd1nlPLLiyQsRwjWJI/tasDYUgl0iIKYMvcFd9ePMA2Si5XGXrVoLBSFQ2hKMVhCojPgfXa8Dy/q9V0iDphUY3T+GofrCxV0O15SKzbtRM1Uaxec077huQHH3IOZx0vVNh86Ws3Hl9e1sMhcklmQHs+pfTCA0Ihd4pq3EijnTHhSGN5ziZd3zt9qBKouUpN1SfHHp4z3N8xE9pCGEUzOdtI="],"publicKey":"-----BEGIN PUBLIC KEY-----\r\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAkTCYMkW0xFSj3wNQP2mx\r\ndD3797G3ZT42g3p0MmcOQ1ZWvCJLlIzQrZcxdJlzwRtYf8N0gAOYkUaI47CETfCy\r\nPFpVRYfYn6NpUmdgGzuvtQk/+dvVlxbokT93yjeAzuFx4IpyMy/UVZ1JnmJX/Xrp\r\nRpeoPCPBNs/g79SWf8k9h/gtlmWVaolFN/Vcc99js82gv5wRBZ8QC2P2Fmy9ufYf\r\nWLHDPjFYI70NpHNgqYn3wgQvMogiL3WoVgDy9vHCzKSbjAY8pHXxiOD8qzsk44ML\r\nPhsDqhIAQZ68qmURooYXtfdLv7bp5oXJ/jCJSS20UZO8S0cAhVCQ62t9bcKi4VK2\r\n7VMtMU6dsyEJq4kj8M/6ltm6fpZwb0VdGveybbzzJ7UA5JGzMT+TodHlLmQnVmya\r\n0G1IAZlIMLLB2h5JoOmehBiIdxHn/3CGLp7FqbSj1JVQrc4/2BbPlB0jB2uu1ZID\r\nKoXa+KE7UHLjShdNAPy00sGyxUw4E6tPLezV0TOzsFZzvTf7buqI6Ifs44YXXkQ6\r\nHtJZQkPqTU2xG0HxOdDnsu/0zawPzDU2+12NFmZpldesTe+x7oOpsLJhpu1syS20\r\nWs2txRUC5M50Q1rGHc7i1A/Dvb/7zgmXonucWjGzof89bKgv2xvBSCDO9hgQw2zA\r\nt5fZXblRod3pael6BYoKxXECAwEAAQ==\r\n-----END PUBLIC KEY-----\r\n"},"keys":[{"value":"JfhinrGI/NqrmRY0Y1B0RWIA1phQBvMP1Gdga68chSE8eQiTNbEOqcF7EZklJfXMrivXcuOmCbvbZRD+egVpYhE16ftZDbsI/lePVtIYoxLDHg8XNKnxuTK1LJgiM7Y/QojbuyS3P4xAxPKnpK9v+fhkWO5BwTCkY4fvLN0r1PacOlsNQx33XiGn9XBoLwH1TiLcT2iqNwszR3Ae8AZ25miWbChtKzVhjX3y3cP7uNT6KG45hmkdxzyRz9fNOYLq5p7Z5u+YZq41ESBwCH6BDhAXwVDjCLtyy8rJ9F/Z7GGdUzsjMUuF/2eTN/vDbpaKMKaOEELp/W7AI+x5m888UfskI7hmUGivsgwWMrRqlG/4dmlnQCG+RDh3n6EQWXvs6hEc2jCDpoIC+W4te1fyR/ITDBOG2oRp2TsEdPXYDYGjrZZag9UoIDMYMHOCTptlikoNfkXZz7+g5Q9Xb1DBlprJAXf5wm8HHG5FNtBmF2ItWJJYqKQjycRuNzskov6b3fiH1kv4K5qmAYXQYxtrVTAoqUHLFGWXKpHPzzwO49/lkLNCG8XxroZ25RsgLbBqIPz68lXIPHO64H9tQT8delMFa3ZSEtziZPZqswe6uXC8WKFq7GsR/h8F9RPLB5aKNPCRN1d2Jc/yy5QNDPJpvfvkajwIYhdmwQ7ItoOpYX0=","name":"client_secret"}]},"reference":"ooeRuH2iDCKiXRgoiOZ9O","updatedAt":"2023-05-09T18:40:17.044Z","createdAt":"2023-05-09T18:22:53.156Z"},{"_id":"645d66fe9384b06beb6b43aa","displayName":"AllWorkspacesInstancesDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"WorkspaceInstancesTableDataSource"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"master":{"params":{"dataset":{"disabled":false,"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"params":{"content":"system"},"component":"data2-core-primitives@String"},"masterField":{"params":{"content":"_id"},"component":"data2-core-primitives@String"}},"component":"data2-core-types@DataSetMaster"},"versioning":"disabled","policies":{"params":{},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"AllWorkspacesInstancesDataSet","updatedAt":"2025-11-05T23:15:17.750Z","createdAt":"2023-05-11T22:06:54.212Z"},{"_id":"64ca7438f3b573600050289a","displayName":"OneUsersDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"UsersTableDataSource"}},"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":1}}},"policies":[{"params":{},"component":"data2-core-auth@RushPolicy"},{"params":{},"component":"data2-core-auth@BuilderPolicy"}]},"reference":"q-u7iBUQvGVs7fbOh4ZHy","updatedAt":"2026-08-13T22:07:35.296Z","createdAt":"2023-08-02T15:20:28.898Z"},{"_id":"64cad30437d8eec3f02d03b9","displayName":"SelfSignUpSystemAccessDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"SystemAccessDataSource"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"filter":{"_id":{"component":"data2-core-primitives@String","params":{"content":"000000000000000000000000"}}},"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":1}}},"policies":[{"component":"data2-core-auth@Policy","params":{"allow":{"params":{"cases":[{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"find"}},"value":{"params":{"components":[{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$params.query.$and.0._id"}}},"component":"data2-core-types@Reference"}]},"component":"data2-core-logical-operators@Or"}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"patch"}},"value":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"create"}},"value":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}}}],"defaultCase":{"component":"data2-core-primitives@Boolean"},"expression":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-flow@Switch"}}}]},"reference":"Nd8VeTny2c0bm0lAaQejg","updatedAt":"2023-08-02T22:05:39.514Z","createdAt":"2023-08-02T22:05:39.514Z"},{"_id":"64d12ad873f8e68b9783b2a6","displayName":"Data2 Key Vault","component":"data2-core-id@KeyVault","system":"5e3b796d6228227ca637d0f4","params":{"keyPair":{"privateKey":["iTlyjvODgXGRyUESnkBFFSJMrsfB2sMIjzB+vo6p9jv1hK5Vb2yHT/ZOM9kb4rXtVWQY45DpzidCf2/X3oTkca5NoTrMEQmemAqKGK1Xh2N+bDhAjbutV1xP77cwM4Vv91t0vnQz34u1H1bQZxbwgHuQyC/EuhAXS8s6pfhhwiigQbk0X96h6Sh5uqBuT6gFy7N2BrDe0bDDitaUqlKRB2a5FaHHlFScGGqQMpM8xbitZkzXL3sG3r6AC2NwOK1Wp4EWcRFCyE20hT2N8QmG07ztNeGp1Kn4MOFc2RgqIkEprP90qoY2CFM9GPIPt9jsvI8rqNHUzl7YTho6SgOtKdH0ckyJ68xxbEjh5ELU7cwqtcaTGdj+dcuU+gCg58Aqr6R5wFlqbgcRUKYVnjG8Y22eH+FNC/NAMpvK2/zX+Trkq0yq57J1MH4p1K+5ZJR0l1h92tZO5A4ogYpY6i3brMyiYGjfdnk3GAi2dzcQwXexcvwQ9QGb5X3qGCVmfObAjrcL7+FMaeh4lLaT8GZ5z0kWZS76ewUxRdzyNbxFQTfj7VfvV1qzprn128frwru1zMX7jglvZYGuYXjL76Slvof2X7GCVZqBIhGI6hmazwkppDeVebxsmgKag8jue8Ah18f65QSp9dGtg51fJyI/t6xWsm6iPuTDKdkybt2QUhg=","qjbPsoaA4wgkJixWjJZaXOk6uCRpbDIUCkcPBSGYWKlLB2kYIC7XvrBePNC+0vXrGMnE4Z1M2Whm4d4JDiM1K0m9XbRLoTAOL86/p/I3hasPZOOhqVuIvg4z8IjGs1fvc+w8xau2LPKCE811w0+SlJrHDtW0KLIFHfBvXADhhNDbM8s8NFPFSBUI6sUx4Kbt4AB+BIvMWrTp9J2W0Xc5HLjkclkNS42a1oSrHEcLSPIsCpxKmRpp3H1uBrSMdBIKtflO/ApBmr6ULiEhsxC8MKv4NRC/0Ml8jvv15RdtDVmmTdiofbLYkXXiwAGZLR48VsVuFRsde93mDtgYTBDxu7KwZHUI8pNx7E1XSoNl/iGPaN/WSy+nkms/0yAVF22WT94vPt7rL+qIqV6haFSzDn0K+dWKNWx3rbVwGVSranwKA5/Mm+jU6eTk8lm/vlBOeG75IwymGBtj0ZDvjcXziyJul8ExpQJ2aMvutXTrJq/Q/k6KuN2//KAePjV0N6rsqc1VpVvt+p9BiJtBT3jLe9NwndcpprVAA/9R6Q4+n2ZptQ3CKlkBXCmrV0BES8o1vJ/sQxCapDlnn5qX17jtoT32E48+iSspJCx+m8kHJ3dnKGVlEjXlBNAA7v/PSGNpwpqiZbxHvdsYQ1N9r1+OB/x++JOmLNkjoCxP2tzQkV0=","d17JbbfjabLCzn2Njd74FPcVvNDbQDWBoXUMb6m4+1jLn/a2zMz03/kV4AoJ8RXUdVxzVVTW++hjwXXUHVDw6IsLT0c/+EYqc0i4oVyFXMAjFoVHvy7mQrkNkW50yHtpZLDbmDAdf26/n3bmFr66Qo8fiAc3dis/Ho2L/jegoLQhx8MHOQ1cXlCTVaLAgovm4dOfY8/G/oQeqcOjQ/8u8S/REskE5atNTOEgb0PuJUNqRLMrbtSXryBtUsdTffowjFqTUhKtkXn/cN9yY0zz4R2623qJ+ANpBaUjnXF+FmVTj/a7+LRwYfKS9d94qFqAx/gXRU/WzdGgT8Eoy1J3NlQl9SqQpWKyZtrcH+Kw3TWSfRRkc5hfAb/wUYrZXJQY6ZNytDEaIlfoJpqf0h8m5mQsXb6khuTHGalrItPE5JGOyIPxVe7Y4MZ7PPSUDjLW8mqwy1efXorIRSbQOyNPMsZON6JA/s82L2zcvYau0xQebGBZmDTeHD9EP0k70avik1DXUY5ORwTPYKxRc2bmlcGrlhuqindoXWBDg7hOwv9QZ4ACjuTDlsScORTKd5TY6rp+/TLxPHx0ng+8HARxPgdYyqyFQOlkH4hncoogEcFyFgv2Fhyi1wiPLp80xePXq3rXccKumKuWq5fBIN9Q2GE5uvOur6dqCdhPraU99tU=","eMFVZI0zH7ApsLWbS2aj1W1MxXLHGvjOWMszoplTfX+mSVMjWhdFVqnDsyvv5cJziLMs8+6jjzMfhAq5E+2IuBPS2urQ2MBTBKV5t0/jvgAIkSbg45jCm7Eizr3JK8/TF1l9clMsa0vJ7pLwMw7jsmdf6IwM3Rgajk8p3lUyF4lwNaQws7pGGJH2fY75I6XvH0nZjNZn0GVH+yS2Z+CgwOYsrQW2wP/R5r+xAzUYPiKe+CbvUXACxNKmJdy9yN+/GdVHnY/ljy5Vuk9mykqBDYXYOtYLTdSx4otgviR5n1oK/zcU8mYYVda1K5Rmbt2pIuqjWma6y8Hs+TanAu0wysPT7EEOZS3BTeOQUjr9P1Jk4eWsHdrTij/Y4Z1My3KYP2jRv9tA6yEcrEOCcYtwGTP3L+6V2msTd+Q+w0lDTzAmAscPPM34nLs4jE85NzUk5Gc3fjwuzm8L4E18uEDj0F/kNGzHGwpknIQJhq529giErk92G1jTeOMRuHfkh1aByByrkPQOG2GncJHfMuGaJriPkQuhBOFnDTpaxGHIbLIMQbLgPLlDIZOwNLYCcKbEoBpSF82z0/EV+RbFTrzigpz90Ak0a7Iujz8Ss0hBYPGYTQ1g7v0dru2Sw8GdA0B9pzH+LV+m8jyaE5PfeK3XI4XbOgbsHJeDsr1XFtxA7Cs=","Rb8O8593a0431Dj/hA18ccrYtw3qod2Ylc9B2XWoy5eogepP+SKrWPrb851HkaYVIZKOHE+lmvW1qJl0fqDRtcp2FiMfZcjLw8Ud0GwridaUzs5MYNo6Tu5uu6nh2HVsMpkgIs5B+ZrfiIhGH+COTqKTJ/+zDd1lK612Tf1GeorpQV2QGtvF/mCNAJ/wamsXxQYTU6f704ER+I0MgXanm0R1fqd0FdB+hAgaCYCEc8E5yvJUjH9rBmlt+2qaZqEcFy/BryivwgcszTYgNP04ZbQJ7P6rjRPAOE4TAv40AMusRQAKP6phZvCg8steU13kHnvUq/4rXCroV8skp+LVGvAO3EtBtP+19ZsBr/TVGrn9GhQM/lvZlH4yNGpsmKwReYmEcgjDZ/J+jZrBb/y4K0RIw10JrvnC07qS8cNZY4RwAZk7gqReyTW9aEkQrSUaGXtRZsktXk4dlrO33f+GHl80CMcTnQWQsxCqcU8z+bG9AnN5Y624SVKuMLTxuKXC6S9/VeZBOuM32oWuIjwkSN8dX34oWcoLoCntyXmygMYaUX4+FERpXe442BBB6dUKSJu6R9+GNw+5pQEMreRTFDbwSVp3VjUczJ7nysrTIV+dA5cXHQ548oMqZkjjUCVsSU2K2WfGZIGwfx6beSbBo/1oD7Ik5Dfqfdbw/DlrF7I=","WW7NzIRJ3Ohx32VxVuTMQIeyu4Tg1a7ueEkjwj911ML/ttM46SyroqLMog2DA7XwswfEdppKQ8GZZ2M3/dw7NNsghxKEO2hjBfx14+AVV4pTQUokZH+YpExYfQMju0kZ1fmQZI021zL+XCU+k2cQIx9pZ5/n79bwfIgo59Q9FxNcovjaDXwl6z3F23F7AG+T168GuqT6djMWsi6jJpMFq/KFDrdFwSVIQuZ51juPMiWzdrga7CQU1V00ODtoH3uVczfs9F+LdJ/El80HmLbajkU2iHYp5gmms9tSPn/2Z4mRTq6iwXAEA54Dh3XAZOeB0RridGdd63fhPQhEGk52kdmQI4tWGyH0qT8rEhZ7Q/QFbtMDq40N0paalYBZkBkfRVmfsyqAQRd488NmN5s6lDWLnRAGnyVrNO5a45b+nxCpo2BUmgzEENTyLeDhkjNxPDuAB7Yw9+WAvK7vMZqKZggyzBhIofgAv+5UOsmJ39ZfAdWReEhOiKCrdK+i7+dWHfY3YEJdoVGXaaOrV7KU2NktYFs7r++LDJjjzZDzxiVytciK9rNyAVF4vVVTbbmoAC5tiSOVWubO8KdZQ3basEUyI361ylaNl1IXIgKeENxJXutWZ+DsIPBvWUVZK6ZnmzIBBd2n3PdCy0ICbEO4TU0qHOScDLXuoqGwJYby1mA=","HZC3Y7ADzDcu4Pt7phRpLYkXWag6H3XLXc+Gx+683+qQ0yUmxVcLWwQB65KvS+5zdsTK680KpPRkBumlt//7H57bSGfHTnk8+nKAE/IADt7H462hAU6yWEMJSbwNAQUaJh0WYEsNrS8/il1MTjZQAgAH5blo7eLGBSFSohL3Pw0B8KH8kxIUDzdHLchMVDOLOb/LT9X7Z56qSemuEQcQcoswdhBnugWDJhzQkAe7701N3B61tMWJIY5S7iGTepHJaoBDEm3eNA6J5ykURfb2btje7RciIrNorEyjSFhVbYlTPES8bnx0CqmNzAgjCEzf1zJS+hD1La2zqVDHaLeDwy4/aHUdRZJyVJe9UCim8L7/V623qxcHBXdTC4JDV6dpgbEgefjw0iE7VoL6hhwjB08O9YBFtS6haHTp9K4irjlPGjctOw8uigFdQbue/HKqC1wxjKiBrlg9pwrFXO2PHDu+kQd9Hh+yA7BTMH7V6SteyvjnjGN86uiSJ89kazo4Lw1OO/WiPYOt4UYRUEVk9jpUJpeS4uiUIGX0a6cCAuQcfVHYGFpOCbumPhpOwUANXsHfK5RHhAcirE9cUZtahL3haE7KwFmBxk8trTFKb/JSThQs+gzZfuKCp6U66Q4aX007Qj6Xg+OhtDPwBgKRkAXasaNPlNKtFOWbhERr+yI=","F/Fgxu9RwNJFREwrKhribW8/YgwSiRX3PDszrwX4ddRdJwR9OHaliHS+MYQRNfrPjHpRitmkA81LRdDKdzHMg/Y74aokZBaRDnEAI+zJNufFj9qDFR3ThUVZFx2M0KHPFJYCGKdgw+9pvcjBDkSMeAMmVidnkSVgPtt5o4hVGb5AHOCJ15JZqlzzwKb/avH4aWDyhF83MRIm5Xu6M4ntUuctb1wTT3b5JxqKr911ced5bb9uyc7/dfRsRZN2a9hWApaW+I6haYv6pR+HZ8PhrK02GTjwIrTDS9e/zQUtGQoDZkHe/cdjOXUxIetX8CKIsNCEeJVth7ni1V4vkdgr98P0eyvo6PDuof6jyJ0Vf0YeukTJlcysASVzwMnQGjREmsfd4R2lZSbI/lfaDNyMPKZ6Gf10sl2rY/A20PgREtiiNDaoNpYPHiEX0GDnJg/C9eFKHBJwSfntwsb814qk6F/zr59SFUKUsIzprlENMQRgEMv/PgCT8B49+RIRPCsxPJG+fUgiplzWLypbFLmuGNO6vaFp6tnegrJYSz2D1tNwh8vQpNS4UBsRqrCgHXpgmTQArMtNpHYTpCOUOZldjz8DIXiT5kQ4JsGphW7HEaIMGQAlh7Y2XmFY4De8QPUu8fswegdDNwRvAcxMoGWzga2kPOlk5kDUvfRaxVQ4euU=","NvtClsJ5Y9LCN8LzEEGA4pe4mj9MQNzJw/SYwjypAtIW5xsXLRwZSBR3nzAnPQY1Uy4CZzRdinG/MQCtnT+qZ75b0XSnl+nyd4gDXASVK+cMyP0T5B1yhlt47a5eknH6xXXttU6B4D3tnAiCVVyoPAmWc7kzUGTFSx6XgD1j2/0m8DzKU3l3GSE7bzwKQNCXxtxAc4SGO16CBO7qoUuoX/FNbI68ZKwbjueVR549KJVYXzlS23LnXtmJHBAIFNy5phjSginzCvUY7y4I6kAwiy37iM8+cWD4vAeCNags11X4nQ+Z3QHbzdu360Aq6iEt2CcBDdgP3bYFDKe3mUTLwsdNqsNS0ofX26u+pU3RqhPjzu72Twslj46GxxIpsC/0eSMqPsofGF+fgHvx157NC6YY2WHkixOcNXQswvGaKHLpKntG2j71MjG5kIo9xpP0UzsXj1LiB7eZwFsAoWPVTvr/xP+amq+m+tn8bk9KvuibD+sIXFl+EJj34jX4JpWx2S562EzX3OBeTt6BQh8IOB/h+i28JK6UJICOEstPjc7lLpg7X0lf40+QMH1J+XgHCARpyiJTgla2F8ERtuxYKOVwWyHeMr67faBMAHDWmgbyuqyFKJJT3yRGIDx0xfrLZTFBlgCtXDq34tapojTYqyBpcxbzHngKBTkAbAFs4fw="],"publicKey":"-----BEGIN PUBLIC KEY-----\r\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxGeXksSnY7Xnp70WZh3l\r\n8k1J4bS90aexswnIbiI5V4HsEbMpp6hUg1wFRr7QEUmvOVSdynIyNTnrxw3ZVQuq\r\nWFgm6D0QiSn0yj48kb3DZdwIqvtn+oCGnGEL8LFC0YGKV+xugF3qAe64acP/PTng\r\nCfRKFfoKGIk7BAQ+WnjmyPB820Bqc/tquRhVtLqlul1agk3fU4MBBhB+UxMrd29b\r\neCZ0fTdtTB3wnDlWfboHffQxQHeNfltUyYzrx8G2dw3zsdcMCyGusn3K2d8Qyqbz\r\nR5kksdnFr/VTCfOon5D7R+b/UJ0jLFOAcsRObTJDRDja/sVqinRSLo6HbNWXy+/R\r\nRqTdieLya9Ymr2kluix3IWNM7ju3dFdxWnevTXOX1z+s0yMI4Vg2ZAd0tWAqck2s\r\nCJ2XqidxRTf2kBCG8qEgeM0p8GnrQrJcpvJ/K7hjKiMMyzdL3kY3OWla58FIBlAA\r\n2rRvpIK/kgxU/ZNbrtifHgXtGo4i49QWdxYlRSZKhJf54k6xg2krpQ3tQtwlWldU\r\n4QDBwYgJMt0XU9UG0qFWKGAM3BZRZmLXJwkVR12midYcflkKurzTaChYCBE+Btd4\r\n3v3jlIxcDurWNdaearJenWrIZNEdpGAMALeTz+QYWLbm82vqpDi/kFAMWwFcC2S+\r\ntgvvadyZQgnYwAC4xdBG0bECAwEAAQ==\r\n-----END PUBLIC KEY-----\r\n"},"keys":[{"value":"chsm9MFiy4F08DME8UJ/L459wZWVfPuWagxvZ/CJr+Qsh399WvF/1NipNlrr7KI+rRFhE4r5MY330brjBagTyLKPuAS+sfw8DOU3aUtjLjss3gDREiuiksXr9DUzE68jwiqSIShXHFkQqfpVAv4pkLPWomfYNSK5zUpwmNtnqU2r6MC9klM8YQFc2dJFuYn1DH/FFOdZQFXVrgp8JiTmOGRCeS2M1ub+d9CVV6YPdYybAz9MizQ0ltjJDbWMl6i9L8V9sgO9FhBA2e9bCYuGNhu5Y8P8AEmUXT49xBPh2z4eKaohmrlZtW/ZCb7zp5jn/wla6Dv7X6Ng/wHBnK+dASXRSNMOBR1B5t0EffN/WhN6HHQHFzNHWwJYRQklnWLAR9zwwVRj7joao4Z5dbcyLyUxMyNX54mccv0/KpXntDhcq8m7E8/XszT/Smn9MDNoaRGJAL7siErAjv7fMnn4l+JOW2iLxDndHjA9oAuYVArRSXSTvzJuzylpcAqMVyJRzCoxRryOBKkoXmCC9HIMElZfhuyDc79Y5VbtN7ZE0VQ5rIOQLC67TbclfojeZlkrtg8ZMU+Ya9D2iawUL4aVao3dKFNtZnsaePm6eu3eArBfQRubC8X/ILu62HAspFo+whAcg4HwtVgew647JQ3XskDF/6Zq9OcgkQFITohW5sw=","name":"use_cases_password"}]},"reference":"HgkYY_mEdKHJWaRuaiOP6","updatedAt":"2023-08-07T18:33:42.803Z","createdAt":"2023-08-07T17:33:14.228Z"},{"_id":"64d15bc413c0d10caf6931ac","displayName":"AuthSystemsDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"SystemsTableDataSource"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"filter":{"params":{"_id":{"component":"data2-core-primitives@String","params":{"content":"000000000000000000000000"}}},"component":"data2-core-types@DataSetFilter"}},"reference":"RdETEpX-dr2XT93VoG8st","updatedAt":"2023-08-16T17:59:38.814Z","createdAt":"2023-08-07T21:01:56.866Z"},{"_id":"64d15c2113c0d10caf6931ae","displayName":"AuthOrganizationMemberDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"OrganizationMemberDataSource"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"master":{"params":{"dataset":{"disabled":false,"component":"data2-core-types@DataSetReference","params":{"reference":"UsersDataSet"}},"masterField":{"disabled":false,"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}},"localField":{"disabled":false,"component":"data2-core-types@DataSetColumnReference","params":{"column":"user"}}},"component":"data2-core-types@DataSetMaster"}},"reference":"DhPJ44W3fVq4ylQlnQJ6M","updatedAt":"2023-08-07T21:04:52.974Z","createdAt":"2023-08-07T21:03:30.298Z"},{"_id":"64d15c5713c0d10caf6931af","displayName":"AuthSystemAccessDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"SystemAccessDataSource"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"master":{"params":{"dataset":{"disabled":false,"component":"data2-core-types@DataSetReference","params":{"reference":"UsersDataSet"}},"masterField":{"disabled":false,"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}},"localField":{"disabled":false,"component":"data2-core-types@DataSetColumnReference","params":{"column":"user"}}},"component":"data2-core-types@DataSetMaster"}},"reference":"TCMEQkmcrf52bJ7va8AD2","updatedAt":"2023-08-07T21:16:36.543Z","createdAt":"2023-08-07T21:04:24.312Z"},{"_id":"64d234f71e615eb9aa23d91b","displayName":"Table created automatically for Rush HTTPListener AMnCaoUBc_e3MoP4Sl0Bs","component":"data2-core@Data2TableDataSource","system":"5e3b796d6228227ca637d0f4","params":{"table":{"component":"data2-core-primitives@String","params":{"content":"rush-http-logs--AMnCaoUBc_e3MoP4Sl0Bs"}},"multi":["create"],"super":{},"useEstimatedDocumentCount":true},"reference":"rush-http-logs--AMnCaoUBc_e3MoP4Sl0Bs","type":"logs","updatedAt":"2023-08-08T12:28:39.331Z","createdAt":"2023-08-08T12:28:39.331Z"},{"_id":"64d234f71e615eb9aa23d91c","displayName":"DataSet created automatically to read logs for Rush HTTPListener AMnCaoUBc_e3MoP4Sl0Bs","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"rush-http-logs--AMnCaoUBc_e3MoP4Sl0Bs"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"policies":[{"component":"data2-core-auth@Policy","params":{"deny":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"patch"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"remove"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"find"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"params":{"module":{"params":{"reference":"environment.layers.HostApplicationLayer"},"component":"data2-core-types@Reference"},"prop":{"component":"data2-core-primitives@String","params":{"content":"getProcess"}},"args":[{"component":"data2-core-primitives@String","params":{"content":"Data2BuilderAuthentication"}}]},"component":"data2-core-types@Getter"},"prop":{"component":"data2-core-primitives@String","params":{"content":"getSelectedSession"}}}}},"component":"data2-core-logical-operators@Not"}]},"component":"data2-core-logical-operators@And","displayName":"Read - Deny non builder user"}]},"component":"data2-core-logical-operators@Or"}}}],"sort":{"params":{"_id":{"component":"data2-core-primitives@Number","params":{"content":-1}}},"component":"data2-core-types@DataSetSort"},"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":20}}},"listFields":[{"component":"data2-core-types@FieldReference","params":{"key":"version"}},{"component":"data2-core-types@FieldReference","params":{"key":"result"}},{"component":"data2-core-types@FieldReference","params":{"key":"durationInMs"}},{"component":"data2-core-types@FieldReference","params":{"key":"eventTime"}},{"component":"data2-core-types@FieldReference","params":{"key":"invokedBy"}}]},"reference":"AMnCaoUBc_e3MoP4Sl0BsLogReadDataSet","type":"logs","updatedAt":"2023-08-08T12:28:39.331Z","createdAt":"2023-08-08T12:28:39.331Z"},{"_id":"64d234f71e615eb9aa23d91d","displayName":"DataSet created automatically to insert logs for Rush HTTPListener AMnCaoUBc_e3MoP4Sl0Bs","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"rush-http-logs--AMnCaoUBc_e3MoP4Sl0Bs"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":0}}},"policies":[{"component":"data2-core-auth@Policy","params":{"deny":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"patch"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"remove"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"find"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"params":{"module":{"params":{"reference":"environment.layers.HostApplicationLayer"},"component":"data2-core-types@Reference"},"prop":{"component":"data2-core-primitives@String","params":{"content":"getProcess"}},"args":[{"component":"data2-core-primitives@String","params":{"content":"Data2BuilderAuthentication"}}]},"component":"data2-core-types@Getter"},"prop":{"component":"data2-core-primitives@String","params":{"content":"getSelectedSession"}}}}},"component":"data2-core-logical-operators@Not"}]},"component":"data2-core-logical-operators@And","displayName":"Read - Deny non builder user"}]},"component":"data2-core-logical-operators@Or"}}}]},"reference":"AMnCaoUBc_e3MoP4Sl0BsLogInsertDataSet","type":"logs","updatedAt":"2023-08-08T12:28:39.331Z","createdAt":"2023-08-08T12:28:39.331Z"},{"_id":"64d234f71e615eb9aa23d91f","displayName":"DataSet created automatically to read logs for Rush HTTPListener vKj4W1ls21kfEIqJ4HG5g","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"rush-http-logs--vKj4W1ls21kfEIqJ4HG5g"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"policies":[{"component":"data2-core-auth@Policy","params":{"deny":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"patch"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"remove"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"find"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"params":{"module":{"params":{"reference":"environment.layers.HostApplicationLayer"},"component":"data2-core-types@Reference"},"prop":{"component":"data2-core-primitives@String","params":{"content":"getProcess"}},"args":[{"component":"data2-core-primitives@String","params":{"content":"Data2BuilderAuthentication"}}]},"component":"data2-core-types@Getter"},"prop":{"component":"data2-core-primitives@String","params":{"content":"getSelectedSession"}}}}},"component":"data2-core-logical-operators@Not"}]},"component":"data2-core-logical-operators@And","displayName":"Read - Deny non builder user"}]},"component":"data2-core-logical-operators@Or"}}}],"sort":{"params":{"_id":{"component":"data2-core-primitives@Number","params":{"content":-1}}},"component":"data2-core-types@DataSetSort"},"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":20}}},"listFields":[{"component":"data2-core-types@FieldReference","params":{"key":"version"}},{"component":"data2-core-types@FieldReference","params":{"key":"result"}},{"component":"data2-core-types@FieldReference","params":{"key":"durationInMs"}},{"component":"data2-core-types@FieldReference","params":{"key":"eventTime"}},{"component":"data2-core-types@FieldReference","params":{"key":"invokedBy"}}]},"reference":"vKj4W1ls21kfEIqJ4HG5gLogReadDataSet","type":"logs","updatedAt":"2023-08-08T12:28:39.331Z","createdAt":"2023-08-08T12:28:39.331Z"},{"_id":"64d234f71e615eb9aa23d921","displayName":"Table created automatically for Rush HTTPListener okVIOlW3ONE9AWvDy7GGr","component":"data2-core@Data2TableDataSource","system":"5e3b796d6228227ca637d0f4","params":{"table":{"component":"data2-core-primitives@String","params":{"content":"rush-http-logs--okVIOlW3ONE9AWvDy7GGr"}},"multi":["create"],"super":{},"useEstimatedDocumentCount":true},"reference":"rush-http-logs--okVIOlW3ONE9AWvDy7GGr","type":"logs","updatedAt":"2023-08-08T12:28:39.331Z","createdAt":"2023-08-08T12:28:39.331Z"},{"_id":"64d234f71e615eb9aa23d920","displayName":"DataSet created automatically to insert logs for Rush HTTPListener vKj4W1ls21kfEIqJ4HG5g","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"rush-http-logs--vKj4W1ls21kfEIqJ4HG5g"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":0}}},"policies":[{"component":"data2-core-auth@Policy","params":{"deny":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"patch"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"remove"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"find"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"params":{"module":{"params":{"reference":"environment.layers.HostApplicationLayer"},"component":"data2-core-types@Reference"},"prop":{"component":"data2-core-primitives@String","params":{"content":"getProcess"}},"args":[{"component":"data2-core-primitives@String","params":{"content":"Data2BuilderAuthentication"}}]},"component":"data2-core-types@Getter"},"prop":{"component":"data2-core-primitives@String","params":{"content":"getSelectedSession"}}}}},"component":"data2-core-logical-operators@Not"}]},"component":"data2-core-logical-operators@And","displayName":"Read - Deny non builder user"}]},"component":"data2-core-logical-operators@Or"}}}]},"reference":"vKj4W1ls21kfEIqJ4HG5gLogInsertDataSet","type":"logs","updatedAt":"2023-08-08T12:28:39.331Z","createdAt":"2023-08-08T12:28:39.331Z"},{"_id":"64d234f71e615eb9aa23d91e","displayName":"Table created automatically for Rush HTTPListener vKj4W1ls21kfEIqJ4HG5g","component":"data2-core@Data2TableDataSource","system":"5e3b796d6228227ca637d0f4","params":{"table":{"component":"data2-core-primitives@String","params":{"content":"rush-http-logs--vKj4W1ls21kfEIqJ4HG5g"}},"multi":["create"],"super":{},"useEstimatedDocumentCount":true},"reference":"rush-http-logs--vKj4W1ls21kfEIqJ4HG5g","type":"logs","updatedAt":"2023-08-08T12:28:39.331Z","createdAt":"2023-08-08T12:28:39.331Z"},{"_id":"64d234f71e615eb9aa23d922","displayName":"DataSet created automatically to read logs for Rush HTTPListener okVIOlW3ONE9AWvDy7GGr","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"rush-http-logs--okVIOlW3ONE9AWvDy7GGr"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"policies":[{"component":"data2-core-auth@Policy","params":{"deny":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"patch"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"remove"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"find"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"params":{"module":{"params":{"reference":"environment.layers.HostApplicationLayer"},"component":"data2-core-types@Reference"},"prop":{"component":"data2-core-primitives@String","params":{"content":"getProcess"}},"args":[{"component":"data2-core-primitives@String","params":{"content":"Data2BuilderAuthentication"}}]},"component":"data2-core-types@Getter"},"prop":{"component":"data2-core-primitives@String","params":{"content":"getSelectedSession"}}}}},"component":"data2-core-logical-operators@Not"}]},"component":"data2-core-logical-operators@And","displayName":"Read - Deny non builder user"}]},"component":"data2-core-logical-operators@Or"}}}],"sort":{"params":{"_id":{"component":"data2-core-primitives@Number","params":{"content":-1}}},"component":"data2-core-types@DataSetSort"},"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":20}}},"listFields":[{"component":"data2-core-types@FieldReference","params":{"key":"version"}},{"component":"data2-core-types@FieldReference","params":{"key":"result"}},{"component":"data2-core-types@FieldReference","params":{"key":"durationInMs"}},{"component":"data2-core-types@FieldReference","params":{"key":"eventTime"}},{"component":"data2-core-types@FieldReference","params":{"key":"invokedBy"}}]},"reference":"okVIOlW3ONE9AWvDy7GGrLogReadDataSet","type":"logs","updatedAt":"2023-08-08T12:28:39.331Z","createdAt":"2023-08-08T12:28:39.331Z"},{"_id":"64d234f71e615eb9aa23d923","displayName":"DataSet created automatically to insert logs for Rush HTTPListener okVIOlW3ONE9AWvDy7GGr","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"rush-http-logs--okVIOlW3ONE9AWvDy7GGr"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":0}}},"policies":[{"component":"data2-core-auth@Policy","params":{"deny":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"patch"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"remove"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"find"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"params":{"module":{"params":{"reference":"environment.layers.HostApplicationLayer"},"component":"data2-core-types@Reference"},"prop":{"component":"data2-core-primitives@String","params":{"content":"getProcess"}},"args":[{"component":"data2-core-primitives@String","params":{"content":"Data2BuilderAuthentication"}}]},"component":"data2-core-types@Getter"},"prop":{"component":"data2-core-primitives@String","params":{"content":"getSelectedSession"}}}}},"component":"data2-core-logical-operators@Not"}]},"component":"data2-core-logical-operators@And","displayName":"Read - Deny non builder user"}]},"component":"data2-core-logical-operators@Or"}}}]},"reference":"okVIOlW3ONE9AWvDy7GGrLogInsertDataSet","type":"logs","updatedAt":"2023-08-08T12:28:39.332Z","createdAt":"2023-08-08T12:28:39.332Z"},{"_id":"64d234f71e615eb9aa23d925","displayName":"DataSet created automatically to read logs for Rush HTTPListener VeGjIG87gX3f03SFBndtc","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"rush-http-logs--VeGjIG87gX3f03SFBndtc"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"policies":[{"component":"data2-core-auth@Policy","params":{"deny":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"patch"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"remove"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"find"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"params":{"module":{"params":{"reference":"environment.layers.HostApplicationLayer"},"component":"data2-core-types@Reference"},"prop":{"component":"data2-core-primitives@String","params":{"content":"getProcess"}},"args":[{"component":"data2-core-primitives@String","params":{"content":"Data2BuilderAuthentication"}}]},"component":"data2-core-types@Getter"},"prop":{"component":"data2-core-primitives@String","params":{"content":"getSelectedSession"}}}}},"component":"data2-core-logical-operators@Not"}]},"component":"data2-core-logical-operators@And","displayName":"Read - Deny non builder user"}]},"component":"data2-core-logical-operators@Or"}}}],"sort":{"params":{"_id":{"component":"data2-core-primitives@Number","params":{"content":-1}}},"component":"data2-core-types@DataSetSort"},"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":20}}},"listFields":[{"component":"data2-core-types@FieldReference","params":{"key":"version"}},{"component":"data2-core-types@FieldReference","params":{"key":"result"}},{"component":"data2-core-types@FieldReference","params":{"key":"durationInMs"}},{"component":"data2-core-types@FieldReference","params":{"key":"eventTime"}},{"component":"data2-core-types@FieldReference","params":{"key":"invokedBy"}}]},"reference":"VeGjIG87gX3f03SFBndtcLogReadDataSet","type":"logs","updatedAt":"2023-08-08T12:28:39.332Z","createdAt":"2023-08-08T12:28:39.332Z"},{"_id":"64d234f71e615eb9aa23d924","displayName":"Table created automatically for Rush HTTPListener VeGjIG87gX3f03SFBndtc","component":"data2-core@Data2TableDataSource","system":"5e3b796d6228227ca637d0f4","params":{"table":{"component":"data2-core-primitives@String","params":{"content":"rush-http-logs--VeGjIG87gX3f03SFBndtc"}},"multi":["create"],"super":{},"useEstimatedDocumentCount":true},"reference":"rush-http-logs--VeGjIG87gX3f03SFBndtc","type":"logs","updatedAt":"2023-08-08T12:28:39.332Z","createdAt":"2023-08-08T12:28:39.332Z"},{"_id":"64d234f71e615eb9aa23d926","displayName":"DataSet created automatically to insert logs for Rush HTTPListener VeGjIG87gX3f03SFBndtc","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"rush-http-logs--VeGjIG87gX3f03SFBndtc"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":0}}},"policies":[{"component":"data2-core-auth@Policy","params":{"deny":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"patch"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"remove"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"find"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"params":{"module":{"params":{"reference":"environment.layers.HostApplicationLayer"},"component":"data2-core-types@Reference"},"prop":{"component":"data2-core-primitives@String","params":{"content":"getProcess"}},"args":[{"component":"data2-core-primitives@String","params":{"content":"Data2BuilderAuthentication"}}]},"component":"data2-core-types@Getter"},"prop":{"component":"data2-core-primitives@String","params":{"content":"getSelectedSession"}}}}},"component":"data2-core-logical-operators@Not"}]},"component":"data2-core-logical-operators@And","displayName":"Read - Deny non builder user"}]},"component":"data2-core-logical-operators@Or"}}}]},"reference":"VeGjIG87gX3f03SFBndtcLogInsertDataSet","type":"logs","updatedAt":"2023-08-08T12:28:39.332Z","createdAt":"2023-08-08T12:28:39.332Z"},{"_id":"64d234f71e615eb9aa23d927","displayName":"Table created automatically for Rush HTTPListener Y1cJQ_L95g4VhUTzrKvj8","component":"data2-core@Data2TableDataSource","system":"5e3b796d6228227ca637d0f4","params":{"table":{"component":"data2-core-primitives@String","params":{"content":"rush-http-logs--Y1cJQ_L95g4VhUTzrKvj8"}},"multi":["create"],"super":{},"useEstimatedDocumentCount":true},"reference":"rush-http-logs--Y1cJQ_L95g4VhUTzrKvj8","type":"logs","updatedAt":"2023-08-08T12:28:39.332Z","createdAt":"2023-08-08T12:28:39.332Z"},{"_id":"64d234f71e615eb9aa23d928","displayName":"DataSet created automatically to read logs for Rush HTTPListener Y1cJQ_L95g4VhUTzrKvj8","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"rush-http-logs--Y1cJQ_L95g4VhUTzrKvj8"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"policies":[{"component":"data2-core-auth@Policy","params":{"deny":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"patch"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"remove"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"find"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"params":{"module":{"params":{"reference":"environment.layers.HostApplicationLayer"},"component":"data2-core-types@Reference"},"prop":{"component":"data2-core-primitives@String","params":{"content":"getProcess"}},"args":[{"component":"data2-core-primitives@String","params":{"content":"Data2BuilderAuthentication"}}]},"component":"data2-core-types@Getter"},"prop":{"component":"data2-core-primitives@String","params":{"content":"getSelectedSession"}}}}},"component":"data2-core-logical-operators@Not"}]},"component":"data2-core-logical-operators@And","displayName":"Read - Deny non builder user"}]},"component":"data2-core-logical-operators@Or"}}}],"sort":{"params":{"_id":{"component":"data2-core-primitives@Number","params":{"content":-1}}},"component":"data2-core-types@DataSetSort"},"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":20}}},"listFields":[{"component":"data2-core-types@FieldReference","params":{"key":"version"}},{"component":"data2-core-types@FieldReference","params":{"key":"result"}},{"component":"data2-core-types@FieldReference","params":{"key":"durationInMs"}},{"component":"data2-core-types@FieldReference","params":{"key":"eventTime"}},{"component":"data2-core-types@FieldReference","params":{"key":"invokedBy"}}]},"reference":"Y1cJQ_L95g4VhUTzrKvj8LogReadDataSet","type":"logs","updatedAt":"2023-08-08T12:28:39.332Z","createdAt":"2023-08-08T12:28:39.332Z"},{"_id":"64d234f71e615eb9aa23d929","displayName":"DataSet created automatically to insert logs for Rush HTTPListener Y1cJQ_L95g4VhUTzrKvj8","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"rush-http-logs--Y1cJQ_L95g4VhUTzrKvj8"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":0}}},"policies":[{"component":"data2-core-auth@Policy","params":{"deny":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"patch"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"remove"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"find"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"params":{"module":{"params":{"reference":"environment.layers.HostApplicationLayer"},"component":"data2-core-types@Reference"},"prop":{"component":"data2-core-primitives@String","params":{"content":"getProcess"}},"args":[{"component":"data2-core-primitives@String","params":{"content":"Data2BuilderAuthentication"}}]},"component":"data2-core-types@Getter"},"prop":{"component":"data2-core-primitives@String","params":{"content":"getSelectedSession"}}}}},"component":"data2-core-logical-operators@Not"}]},"component":"data2-core-logical-operators@And","displayName":"Read - Deny non builder user"}]},"component":"data2-core-logical-operators@Or"}}}]},"reference":"Y1cJQ_L95g4VhUTzrKvj8LogInsertDataSet","type":"logs","updatedAt":"2023-08-08T12:28:39.332Z","createdAt":"2023-08-08T12:28:39.332Z"},{"_id":"64d234f71e615eb9aa23d92a","displayName":"Table created automatically for Rush HTTPListener zjxD_i76OfLH5vKsQ_QtE","component":"data2-core@Data2TableDataSource","system":"5e3b796d6228227ca637d0f4","params":{"table":{"component":"data2-core-primitives@String","params":{"content":"rush-http-logs--zjxD_i76OfLH5vKsQ_QtE"}},"multi":["create"],"super":{},"useEstimatedDocumentCount":true},"reference":"rush-http-logs--zjxD_i76OfLH5vKsQ_QtE","type":"logs","updatedAt":"2023-08-08T12:28:39.332Z","createdAt":"2023-08-08T12:28:39.332Z"},{"_id":"64d234f71e615eb9aa23d92b","displayName":"DataSet created automatically to read logs for Rush HTTPListener zjxD_i76OfLH5vKsQ_QtE","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"rush-http-logs--zjxD_i76OfLH5vKsQ_QtE"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"policies":[{"component":"data2-core-auth@Policy","params":{"deny":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"patch"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"remove"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"find"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"params":{"module":{"params":{"reference":"environment.layers.HostApplicationLayer"},"component":"data2-core-types@Reference"},"prop":{"component":"data2-core-primitives@String","params":{"content":"getProcess"}},"args":[{"component":"data2-core-primitives@String","params":{"content":"Data2BuilderAuthentication"}}]},"component":"data2-core-types@Getter"},"prop":{"component":"data2-core-primitives@String","params":{"content":"getSelectedSession"}}}}},"component":"data2-core-logical-operators@Not"}]},"component":"data2-core-logical-operators@And","displayName":"Read - Deny non builder user"}]},"component":"data2-core-logical-operators@Or"}}}],"sort":{"params":{"_id":{"component":"data2-core-primitives@Number","params":{"content":-1}}},"component":"data2-core-types@DataSetSort"},"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":20}}},"listFields":[{"component":"data2-core-types@FieldReference","params":{"key":"version"}},{"component":"data2-core-types@FieldReference","params":{"key":"result"}},{"component":"data2-core-types@FieldReference","params":{"key":"durationInMs"}},{"component":"data2-core-types@FieldReference","params":{"key":"eventTime"}},{"component":"data2-core-types@FieldReference","params":{"key":"invokedBy"}}]},"reference":"zjxD_i76OfLH5vKsQ_QtELogReadDataSet","type":"logs","updatedAt":"2023-08-08T12:28:39.332Z","createdAt":"2023-08-08T12:28:39.332Z"},{"_id":"64d234f71e615eb9aa23d92c","displayName":"DataSet created automatically to insert logs for Rush HTTPListener zjxD_i76OfLH5vKsQ_QtE","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"rush-http-logs--zjxD_i76OfLH5vKsQ_QtE"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":0}}},"policies":[{"component":"data2-core-auth@Policy","params":{"deny":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"patch"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"remove"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"find"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"params":{"module":{"params":{"reference":"environment.layers.HostApplicationLayer"},"component":"data2-core-types@Reference"},"prop":{"component":"data2-core-primitives@String","params":{"content":"getProcess"}},"args":[{"component":"data2-core-primitives@String","params":{"content":"Data2BuilderAuthentication"}}]},"component":"data2-core-types@Getter"},"prop":{"component":"data2-core-primitives@String","params":{"content":"getSelectedSession"}}}}},"component":"data2-core-logical-operators@Not"}]},"component":"data2-core-logical-operators@And","displayName":"Read - Deny non builder user"}]},"component":"data2-core-logical-operators@Or"}}}]},"reference":"zjxD_i76OfLH5vKsQ_QtELogInsertDataSet","type":"logs","updatedAt":"2023-08-08T12:28:39.332Z","createdAt":"2023-08-08T12:28:39.332Z"},{"_id":"64d234f71e615eb9aa23d935","displayName":"DataSet created automatically to insert logs for Rush HTTPListener JM5W6P_l2MLGwMD4BwgEm","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"rush-http-logs--JM5W6P_l2MLGwMD4BwgEm"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":0}}},"policies":[{"component":"data2-core-auth@Policy","params":{"deny":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"patch"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"remove"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"find"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"params":{"module":{"params":{"reference":"environment.layers.HostApplicationLayer"},"component":"data2-core-types@Reference"},"prop":{"component":"data2-core-primitives@String","params":{"content":"getProcess"}},"args":[{"component":"data2-core-primitives@String","params":{"content":"Data2BuilderAuthentication"}}]},"component":"data2-core-types@Getter"},"prop":{"component":"data2-core-primitives@String","params":{"content":"getSelectedSession"}}}}},"component":"data2-core-logical-operators@Not"}]},"component":"data2-core-logical-operators@And","displayName":"Read - Deny non builder user"}]},"component":"data2-core-logical-operators@Or"}}}]},"reference":"JM5W6P_l2MLGwMD4BwgEmLogInsertDataSet","type":"logs","updatedAt":"2023-08-08T12:28:39.332Z","createdAt":"2023-08-08T12:28:39.332Z"},{"_id":"64d234f71e615eb9aa23d933","displayName":"Table created automatically for Rush HTTPListener JM5W6P_l2MLGwMD4BwgEm","component":"data2-core@Data2TableDataSource","system":"5e3b796d6228227ca637d0f4","params":{"table":{"component":"data2-core-primitives@String","params":{"content":"rush-http-logs--JM5W6P_l2MLGwMD4BwgEm"}},"multi":["create"],"super":{},"useEstimatedDocumentCount":true},"reference":"rush-http-logs--JM5W6P_l2MLGwMD4BwgEm","type":"logs","updatedAt":"2023-08-08T12:28:39.332Z","createdAt":"2023-08-08T12:28:39.332Z"},{"_id":"64d234f71e615eb9aa23d934","displayName":"DataSet created automatically to read logs for Rush HTTPListener JM5W6P_l2MLGwMD4BwgEm","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"rush-http-logs--JM5W6P_l2MLGwMD4BwgEm"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"policies":[{"component":"data2-core-auth@Policy","params":{"deny":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"patch"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"remove"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"find"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"params":{"module":{"params":{"reference":"environment.layers.HostApplicationLayer"},"component":"data2-core-types@Reference"},"prop":{"component":"data2-core-primitives@String","params":{"content":"getProcess"}},"args":[{"component":"data2-core-primitives@String","params":{"content":"Data2BuilderAuthentication"}}]},"component":"data2-core-types@Getter"},"prop":{"component":"data2-core-primitives@String","params":{"content":"getSelectedSession"}}}}},"component":"data2-core-logical-operators@Not"}]},"component":"data2-core-logical-operators@And","displayName":"Read - Deny non builder user"}]},"component":"data2-core-logical-operators@Or"}}}],"sort":{"params":{"_id":{"component":"data2-core-primitives@Number","params":{"content":-1}}},"component":"data2-core-types@DataSetSort"},"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":20}}},"listFields":[{"component":"data2-core-types@FieldReference","params":{"key":"version"}},{"component":"data2-core-types@FieldReference","params":{"key":"result"}},{"component":"data2-core-types@FieldReference","params":{"key":"durationInMs"}},{"component":"data2-core-types@FieldReference","params":{"key":"eventTime"}},{"component":"data2-core-types@FieldReference","params":{"key":"invokedBy"}}]},"reference":"JM5W6P_l2MLGwMD4BwgEmLogReadDataSet","type":"logs","updatedAt":"2023-08-08T12:28:39.332Z","createdAt":"2023-08-08T12:28:39.332Z"},{"_id":"64dd0ed019bc3a3249d4bdb6","displayName":"AuthOrganizationsDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"OrganizationsDataSource"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"filter":{"params":{"_id":{"component":"data2-core-primitives@String","params":{"content":"000000000000000000000000"}}},"component":"data2-core-types@DataSetFilter"}},"reference":"8RATUCjKQCm9C66SA4llO","updatedAt":"2023-08-16T18:01:09.405Z","createdAt":"2023-08-16T18:00:49.745Z"},{"_id":"64de6f3d2ceda0be9d4a4a8f","displayName":"AuthUsersDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"UsersTableDataSource"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"filter":{"params":{"_id":{"component":"data2-core-primitives@String","params":{"content":"000000000000000000000000"}}},"component":"data2-core-types@DataSetFilter"}},"reference":"uWJ56eAjtxAUHTwOm6DfK","updatedAt":"2023-08-17T19:04:43.992Z","createdAt":"2023-08-17T19:04:43.992Z"},{"_id":"64dfbf659146ca8aeb87d16e","displayName":"DataSet created automatically to read logs for Rush HTTPListener MV4BqLPhuq012lWlBUMQ3","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"rush-http-logs--MV4BqLPhuq012lWlBUMQ3"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"policies":[{"component":"data2-core-auth@Policy","params":{"deny":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"patch"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"remove"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"find"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"params":{"module":{"params":{"reference":"environment.layers.HostApplicationLayer"},"component":"data2-core-types@Reference"},"prop":{"component":"data2-core-primitives@String","params":{"content":"getProcess"}},"args":[{"component":"data2-core-primitives@String","params":{"content":"Data2BuilderAuthentication"}}]},"component":"data2-core-types@Getter"},"prop":{"component":"data2-core-primitives@String","params":{"content":"getSelectedSession"}}}}},"component":"data2-core-logical-operators@Not"}]},"component":"data2-core-logical-operators@And","displayName":"Read - Deny non builder user"}]},"component":"data2-core-logical-operators@Or"}}}],"sort":{"params":{"_id":{"component":"data2-core-primitives@Number","params":{"content":-1}}},"component":"data2-core-types@DataSetSort"},"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":20}}},"listFields":[{"component":"data2-core-types@FieldReference","params":{"key":"version"}},{"component":"data2-core-types@FieldReference","params":{"key":"result"}},{"component":"data2-core-types@FieldReference","params":{"key":"durationInMs"}},{"component":"data2-core-types@FieldReference","params":{"key":"eventTime"}},{"component":"data2-core-types@FieldReference","params":{"key":"invokedBy"}}]},"reference":"MV4BqLPhuq012lWlBUMQ3LogReadDataSet","type":"logs","updatedAt":"2023-08-18T18:58:47.040Z","createdAt":"2023-08-18T18:58:47.040Z"},{"_id":"64dfbf659146ca8aeb87d16d","displayName":"Table created automatically for Rush HTTPListener MV4BqLPhuq012lWlBUMQ3","component":"data2-core@Data2TableDataSource","system":"5e3b796d6228227ca637d0f4","params":{"table":{"component":"data2-core-primitives@String","params":{"content":"rush-http-logs--MV4BqLPhuq012lWlBUMQ3"}},"multi":["create"],"super":{},"useEstimatedDocumentCount":true},"reference":"rush-http-logs--MV4BqLPhuq012lWlBUMQ3","type":"logs","updatedAt":"2023-08-18T18:58:47.040Z","createdAt":"2023-08-18T18:58:47.040Z"},{"_id":"64dfbf659146ca8aeb87d16f","displayName":"DataSet created automatically to insert logs for Rush HTTPListener MV4BqLPhuq012lWlBUMQ3","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"rush-http-logs--MV4BqLPhuq012lWlBUMQ3"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":0}}},"policies":[{"component":"data2-core-auth@Policy","params":{"deny":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"patch"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"remove"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"find"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"params":{"module":{"params":{"reference":"environment.layers.HostApplicationLayer"},"component":"data2-core-types@Reference"},"prop":{"component":"data2-core-primitives@String","params":{"content":"getProcess"}},"args":[{"component":"data2-core-primitives@String","params":{"content":"Data2BuilderAuthentication"}}]},"component":"data2-core-types@Getter"},"prop":{"component":"data2-core-primitives@String","params":{"content":"getSelectedSession"}}}}},"component":"data2-core-logical-operators@Not"}]},"component":"data2-core-logical-operators@And","displayName":"Read - Deny non builder user"}]},"component":"data2-core-logical-operators@Or"}}}]},"reference":"MV4BqLPhuq012lWlBUMQ3LogInsertDataSet","type":"logs","updatedAt":"2023-08-18T18:58:47.041Z","createdAt":"2023-08-18T18:58:47.041Z"},{"_id":"64e37dc6d79d8874a6856a9f","displayName":"DataSet created automatically to read logs for Rush HTTPListener POb92uMEMxNNKYDq5aCkj","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"rush-http-logs--POb92uMEMxNNKYDq5aCkj"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"policies":[{"component":"data2-core-auth@Policy","params":{"deny":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"patch"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"remove"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"find"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"params":{"module":{"params":{"reference":"environment.layers.HostApplicationLayer"},"component":"data2-core-types@Reference"},"prop":{"component":"data2-core-primitives@String","params":{"content":"getProcess"}},"args":[{"component":"data2-core-primitives@String","params":{"content":"Data2BuilderAuthentication"}}]},"component":"data2-core-types@Getter"},"prop":{"component":"data2-core-primitives@String","params":{"content":"getSelectedSession"}}}}},"component":"data2-core-logical-operators@Not"}]},"component":"data2-core-logical-operators@And","displayName":"Read - Deny non builder user"}]},"component":"data2-core-logical-operators@Or"}}}],"sort":{"params":{"_id":{"component":"data2-core-primitives@Number","params":{"content":-1}}},"component":"data2-core-types@DataSetSort"},"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":20}}},"listFields":[{"component":"data2-core-types@FieldReference","params":{"key":"version"}},{"component":"data2-core-types@FieldReference","params":{"key":"result"}},{"component":"data2-core-types@FieldReference","params":{"key":"durationInMs"}},{"component":"data2-core-types@FieldReference","params":{"key":"eventTime"}},{"component":"data2-core-types@FieldReference","params":{"key":"invokedBy"}}]},"reference":"POb92uMEMxNNKYDq5aCkjLogReadDataSet","type":"logs","updatedAt":"2023-08-21T15:07:50.959Z","createdAt":"2023-08-21T15:07:50.959Z"},{"_id":"64e37dc6d79d8874a6856a9e","displayName":"Table created automatically for Rush HTTPListener POb92uMEMxNNKYDq5aCkj","component":"data2-core@Data2TableDataSource","system":"5e3b796d6228227ca637d0f4","params":{"table":{"component":"data2-core-primitives@String","params":{"content":"rush-http-logs--POb92uMEMxNNKYDq5aCkj"}},"multi":["create"],"super":{},"useEstimatedDocumentCount":true},"reference":"rush-http-logs--POb92uMEMxNNKYDq5aCkj","type":"logs","updatedAt":"2023-08-21T15:07:50.959Z","createdAt":"2023-08-21T15:07:50.959Z"},{"_id":"64e37dc6d79d8874a6856aa0","displayName":"DataSet created automatically to insert logs for Rush HTTPListener POb92uMEMxNNKYDq5aCkj","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"rush-http-logs--POb92uMEMxNNKYDq5aCkj"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":0}}},"policies":[{"component":"data2-core-auth@Policy","params":{"deny":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"patch"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"remove"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"find"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"params":{"module":{"params":{"reference":"environment.layers.HostApplicationLayer"},"component":"data2-core-types@Reference"},"prop":{"component":"data2-core-primitives@String","params":{"content":"getProcess"}},"args":[{"component":"data2-core-primitives@String","params":{"content":"Data2BuilderAuthentication"}}]},"component":"data2-core-types@Getter"},"prop":{"component":"data2-core-primitives@String","params":{"content":"getSelectedSession"}}}}},"component":"data2-core-logical-operators@Not"}]},"component":"data2-core-logical-operators@And","displayName":"Read - Deny non builder user"}]},"component":"data2-core-logical-operators@Or"}}}]},"reference":"POb92uMEMxNNKYDq5aCkjLogInsertDataSet","type":"logs","updatedAt":"2023-08-21T15:07:50.959Z","createdAt":"2023-08-21T15:07:50.959Z"},{"_id":"65171d3c9850b5070efa8bfa","displayName":"[Data2] Table for Rush HTTPListener U4H0V3WBK1OszEqGI_oLL","component":"data2-core@Data2TableDataSource","system":"5e3b796d6228227ca637d0f4","params":{"table":{"component":"data2-core-primitives@String","params":{"content":"d2-rush-http-logs--U4H0V3WBK1OszEqGI_oLL"}},"multi":["create"],"super":{},"useEstimatedDocumentCount":true},"reference":"d2-rush-http-logs--U4H0V3WBK1OszEqGI_oLL","type":"logs","updatedAt":"2023-09-29T18:53:48.656Z","createdAt":"2023-09-29T18:53:48.656Z"},{"_id":"65171d3c9850b5070efa8bfb","displayName":"[Data2] DataSet to read logs for Rush HTTPListener U4H0V3WBK1OszEqGI_oLL","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"d2-rush-http-logs--U4H0V3WBK1OszEqGI_oLL"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"policies":[{"component":"data2-core-auth@Policy","params":{"deny":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"patch"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"remove"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"find"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"params":{"module":{"params":{"reference":"environment.layers.HostApplicationLayer"},"component":"data2-core-types@Reference"},"prop":{"component":"data2-core-primitives@String","params":{"content":"getProcess"}},"args":[{"component":"data2-core-primitives@String","params":{"content":"Data2BuilderAuthentication"}}]},"component":"data2-core-types@Getter"},"prop":{"component":"data2-core-primitives@String","params":{"content":"getSelectedSession"}}}}},"component":"data2-core-logical-operators@Not"}]},"component":"data2-core-logical-operators@And","displayName":"Read - Deny non builder user"}]},"component":"data2-core-logical-operators@Or"}}}],"sort":{"params":{"_id":{"component":"data2-core-primitives@Number","params":{"content":-1}}},"component":"data2-core-types@DataSetSort"},"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":20}}},"listFields":[{"component":"data2-core-types@FieldReference","params":{"key":"version"}},{"component":"data2-core-types@FieldReference","params":{"key":"result"}},{"component":"data2-core-types@FieldReference","params":{"key":"durationInMs"}},{"component":"data2-core-types@FieldReference","params":{"key":"eventTime"}},{"component":"data2-core-types@FieldReference","params":{"key":"invokedBy"}}]},"reference":"U4H0V3WBK1OszEqGI_oLLLogReadDataSet","type":"logs","updatedAt":"2023-09-29T18:53:48.656Z","createdAt":"2023-09-29T18:53:48.656Z"},{"_id":"65171d3c9850b5070efa8bfc","displayName":"[Data2] DataSet to insert logs for Rush HTTPListener U4H0V3WBK1OszEqGI_oLL","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"d2-rush-http-logs--U4H0V3WBK1OszEqGI_oLL"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":0}}},"policies":[{"component":"data2-core-auth@Policy","params":{"deny":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"patch"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"remove"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"find"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"params":{"module":{"params":{"reference":"environment.layers.HostApplicationLayer"},"component":"data2-core-types@Reference"},"prop":{"component":"data2-core-primitives@String","params":{"content":"getProcess"}},"args":[{"component":"data2-core-primitives@String","params":{"content":"Data2BuilderAuthentication"}}]},"component":"data2-core-types@Getter"},"prop":{"component":"data2-core-primitives@String","params":{"content":"getSelectedSession"}}}}},"component":"data2-core-logical-operators@Not"}]},"component":"data2-core-logical-operators@And","displayName":"Read - Deny non builder user"}]},"component":"data2-core-logical-operators@Or"}}}]},"reference":"U4H0V3WBK1OszEqGI_oLLLogInsertDataSet","type":"logs","updatedAt":"2023-09-29T18:53:48.656Z","createdAt":"2023-09-29T18:53:48.656Z"},{"_id":"65d8c458bc9dbb8f94de8d4f","component":"data2-core@Data2TableDataSource","system":"5e3b796d6228227ca637d0f4","params":{"paginate":{"default":1000},"super":{},"schema":[{"component":"data2-core-types@Field","params":{"key":"component","title":"Component","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"displayName","title":"Display Name","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"reference","title":"Reference","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"system","title":"System","component":"data2-core-primitives@ObjectId"}},{"component":"data2-core-types@Field","params":{"key":"params","title":"params","component":"data2-core-primitives@Object"}},{"component":"data2-core-types@Field","params":{"title":"Locked","key":"locked","component":"data2-core-primitives@Boolean"}},{"component":"data2-core-types@Field","params":{"title":"versioning","key":"versioning","component":"data2-core-primitives@String","validation":{"oneOf":{"component":"data2-core-primitives@String","params":{"content":"enabled,disabled"}}}}},{"component":"data2-core-types@Field","params":{"title":"bundleId","key":{"component":"data2-core-primitives@String","params":{"content":"bundleId"}},"component":"data2-core-primitives@String"},"break":false}],"hooks":{"before":{"find":[{"hook":"useCache","options":{"additionalGroupKeys":["$and.0.system"]}}]},"after":{"create":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["system"]}},{"hook":"invalidateEnvCache"}],"update":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["system"]}},{"hook":"invalidateEnvCache"}],"patch":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["system"]}},{"hook":"invalidateEnvCache"}],"remove":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["system"]}},{"hook":"invalidateEnvCache"}]}},"table":{"component":"data2-core-primitives@String","params":{"content":"externalComponentInstances"}},"policies":{"params":{},"component":"data2@HYJyJUpllo08j6aYr15sY"}},"reference":"ExternalComponentInstancesTableDataSource","updatedAt":"2024-02-23T16:16:25.905Z","createdAt":"2024-02-23T16:14:44.957Z"},{"_id":"65d8c4fabc9dbb8f94de8d53","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ExternalComponentInstancesTableDataSource"}},"pk":"_id","autoEdit":true,"master":{"params":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"component":"data2-core-types@DataSetMaster"},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"policies":{"params":{"allowGet":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"ExternalComponentInstancesDataSet","updatedAt":"2025-11-06T21:07:23.742Z","createdAt":"2024-02-23T16:17:01.816Z"},{"_id":"6669ef394ca3a78da9aca2b7","displayName":"RushExecutionsTableDataSource","component":"data2-core@Data2TableDataSource","system":"5e3b796d6228227ca637d0f4","params":{"table":{"component":"data2-core-primitives@String","params":{"content":"rushExecutions"}},"multi":["create"],"super":{},"schema":[{"component":"data2-core-types@Field","params":{"title":"reference","key":"reference","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"component":"data2-core-primitives@String","key":{"component":"data2-core-primitives@String","params":{"content":"requestId"}},"title":{"component":"data2-core-primitives@String","params":{"content":"requestId"}}},"break":true},{"component":"data2-core-types@Field","params":{"title":"type","key":"type","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"system","key":"system","component":"data2-core-primitives@Object"}},{"component":"data2-core-types@Field","params":{"title":"rushLog","key":{"component":"data2-core-primitives@String","params":{"content":"rushLog"}},"component":"data2-core-primitives@Object","schema":{"id":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","key":{"component":"data2-core-primitives@String","params":{"content":"id"}}}},"table":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","key":{"component":"data2-core-primitives@String","params":{"content":"table"}}}}}}},{"component":"data2-core-types@Field","params":{"title":"eventTimestamp","key":{"component":"data2-core-primitives@String","params":{"content":"eventTimestamp"}},"component":"data2-core-primitives@Number"},"break":true}]},"reference":"cL7qguWkjjLwP2WvOgv-V","updatedAt":"2024-06-13T20:05:12.953Z","createdAt":"2024-06-12T18:55:53.819Z"},{"_id":"66a3d041f9ec92a3ff8a9bd8","displayName":"DeletedUserComponentsDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ComponentsTableDataSource"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":2000}}},"master":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"visibilityMode":"only_show_deleted","autoEdit":true,"filter":{"params":{"deletedAt":{"$gte":{"params":{"count":{"component":"data2-core-primitives@Number","params":{"content":-30}},"date":{"params":{},"component":"data2-core-functions@DateNow"},"period":"days"},"component":"data2-core-functions@DateAdd"}}},"component":"data2-core-types@DataSetFilter"},"policies":{"params":{},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"DeletedUserComponentsDataSet","updatedAt":"2025-11-05T22:40:42.230Z","createdAt":"2024-07-26T16:35:14.093Z"},{"_id":"66a3d085f9ec92a3ff8a9bd9","displayName":"DeletedDataComponentInstancesDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"DataComponentInstancesTableDataSource"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":10000}}},"master":{"params":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"component":"data2-core-types@DataSetMaster"},"autoEdit":true,"visibilityMode":"only_show_deleted","filter":{"params":{"deletedAt":{"$gte":{"params":{"count":{"component":"data2-core-primitives@Number","params":{"content":-30}},"date":{"params":{},"component":"data2-core-functions@DateNow"},"period":"days"},"component":"data2-core-functions@DateAdd"}}},"component":"data2-core-types@DataSetFilter"},"policies":{"params":{},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"DeletedDataComponentInstancesDataSet","updatedAt":"2025-11-05T22:41:21.030Z","createdAt":"2024-07-26T16:36:21.742Z"},{"_id":"66a3d0aef9ec92a3ff8a9bda","displayName":"DeletedServiceComponentInstancesDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ServiceComponentInstancesTableDataSource"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":2000}}},"master":{"params":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"component":"data2-core-types@DataSetMaster"},"visibilityMode":"only_show_deleted","filter":{"params":{"deletedAt":{"$gte":{"params":{"count":{"component":"data2-core-primitives@Number","params":{"content":-30}},"date":{"params":{},"component":"data2-core-functions@DateNow"},"period":"days"},"component":"data2-core-functions@DateAdd"}}},"component":"data2-core-types@DataSetFilter"},"policies":{"params":{},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"DeletedServiceComponentInstancesDataSet","updatedAt":"2025-11-05T22:41:29.920Z","createdAt":"2024-07-26T16:37:02.589Z"},{"_id":"66a3d120f9ec92a3ff8a9bdb","displayName":"DeletedFileComponentInstancesDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"FileComponentInstancesTableDataSource"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":2000}}},"visibilityMode":"only_show_deleted","master":{"params":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"component":"data2-core-types@DataSetMaster"},"filter":{"params":{"deletedAt":{"$gte":{"params":{"count":{"component":"data2-core-primitives@Number","params":{"content":-30}},"date":{"params":{},"component":"data2-core-functions@DateNow"},"period":"days"},"component":"data2-core-functions@DateAdd"}}},"component":"data2-core-types@DataSetFilter"},"policies":{"params":{},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"DeletedFileComponentInstancesDataSet","updatedAt":"2025-11-05T22:41:39.353Z","createdAt":"2024-07-26T16:38:56.521Z"},{"_id":"66a3d14ff9ec92a3ff8a9bdc","displayName":"DeletedApplicationsDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ApplicationsTableDataSource"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"master":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"params":{"column":"_id"},"component":"data2-core-types@DataSetColumnReference"}},"visibilityMode":"only_show_deleted","filter":{"params":{"deletedAt":{"$gte":{"params":{"count":{"component":"data2-core-primitives@Number","params":{"content":-30}},"date":{"params":{},"component":"data2-core-functions@DateNow"},"period":"days"},"component":"data2-core-functions@DateAdd"}}},"component":"data2-core-types@DataSetFilter"},"policies":{"params":{},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"DeletedApplicationsDataSet","updatedAt":"2025-11-05T22:42:34.171Z","createdAt":"2024-07-26T16:39:43.809Z"},{"_id":"66a3d2a8f9ec92a3ff8a9bdd","displayName":"DeletedExternalComponentInstancesDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ExternalComponentInstancesTableDataSource"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"pagination":{"size":1000},"master":{"params":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"component":"data2-core-types@DataSetMaster"},"visibilityMode":"only_show_deleted","filter":{"params":{"deletedAt":{"$gte":{"params":{"count":{"component":"data2-core-primitives@Number","params":{"content":-30}},"date":{"params":{},"component":"data2-core-functions@DateNow"},"period":"days"},"component":"data2-core-functions@DateAdd"}}},"component":"data2-core-types@DataSetFilter"},"policies":{"params":{},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"DeletedExternalComponentInstancesDataSet","updatedAt":"2025-11-05T22:41:50.074Z","createdAt":"2024-07-26T16:45:29.511Z"},{"_id":"66b11b643e27f1c5b5e32260","displayName":"FileMigrationTableDataSource","component":"data2-core@Data2TableDataSource","system":"5e3b796d6228227ca637d0f4","params":{"table":{"component":"data2-core-primitives@String","params":{"content":"fileReferenceMigration"}},"multi":["patch","create"],"super":{},"schema":[{"component":"data2-core-types@Field","params":{"title":"fileReference","key":"fileReference","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"host","key":"host","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"referer","key":"referer","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"count","key":"count","component":"data2-core-primitives@Number"}}]},"reference":"FileMigrationTableDataSource","updatedAt":"2024-08-05T15:04:37.356Z","createdAt":"2024-08-05T15:04:37.356Z"},{"_id":"66b536c2e6b62bffc4405713","displayName":"DeletedWorkspaceInstancesDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"WorkspaceInstancesTableDataSource"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"master":{"params":{"dataset":{"disabled":false,"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"params":{"content":"system"},"component":"data2-core-primitives@String"},"masterField":{"params":{"content":"_id"},"component":"data2-core-primitives@String"}},"component":"data2-core-types@DataSetMaster"},"visibilityMode":"only_show_deleted","pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":20}}},"versioning":"disabled","policies":{"params":{},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"DeletedWorkspaceInstancesDataSet","updatedAt":"2025-11-05T23:15:18.624Z","createdAt":"2024-08-08T21:21:07.172Z"},{"_id":"68471c1c817ed6d0befa759d","displayName":"DeprecatedMongoQueryDataSource","component":"data2-core@Data2TableDataSource","system":"5e3b796d6228227ca637d0f4","params":{"table":{"component":"data2-core-primitives@String","params":{"content":"deprecatedMongoQuery"}},"multi":["patch","create"],"super":{},"schema":[{"component":"data2-core-types@Field","params":{"title":"system","key":"system","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"dataSetReference","key":"data_set_reference","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"table","key":"table","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"count","key":"count","component":"data2-core-primitives@Number"}},{"component":"data2-core-types@Field","params":{"component":"data2-core-primitives@String","title":"stringifiedQuery","key":"stringified_query"}}]},"reference":"DeprecatedMongoQueryDataSource","updatedAt":"2025-06-09T17:48:20.992Z","createdAt":"2025-06-09T17:38:37.065Z"},{"_id":"6877ef035d4fc6e3f0128734","displayName":"[Data2] DataSet to insert logs for Rush EmailListener oIKZqtrtDFq4P9kavndU0","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"d2-rush-email-logs--oIKZqtrtDFq4P9kavndU0"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":0}}},"policies":[{"component":"data2-core-auth@Policy","params":{"deny":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"patch"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"remove"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"find"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"params":{"module":{"params":{"reference":"environment.layers.HostApplicationLayer"},"component":"data2-core-types@Reference"},"prop":{"component":"data2-core-primitives@String","params":{"content":"getProcess"}},"args":[{"component":"data2-core-primitives@String","params":{"content":"Data2BuilderAuthentication"}}]},"component":"data2-core-types@Getter"},"prop":{"component":"data2-core-primitives@String","params":{"content":"getSelectedSession"}}}}},"component":"data2-core-logical-operators@Not"}]},"component":"data2-core-logical-operators@And","displayName":"Read - Deny non builder user"}]},"component":"data2-core-logical-operators@Or"}}}]},"reference":"oIKZqtrtDFq4P9kavndU0LogInsertDataSet","type":"logs","updatedAt":"2025-07-16T18:27:15.572Z","createdAt":"2025-07-16T18:27:15.572Z"},{"_id":"6877ef035d4fc6e3f0128732","displayName":"[Data2] Table for Rush EmailListener oIKZqtrtDFq4P9kavndU0","component":"data2-core@Data2TableDataSource","system":"5e3b796d6228227ca637d0f4","params":{"table":{"component":"data2-core-primitives@String","params":{"content":"d2-rush-email-logs--oIKZqtrtDFq4P9kavndU0"}},"multi":["create"],"super":{},"useEstimatedDocumentCount":true},"reference":"d2-rush-email-logs--oIKZqtrtDFq4P9kavndU0","type":"logs","updatedAt":"2025-07-16T18:27:15.572Z","createdAt":"2025-07-16T18:27:15.572Z"},{"_id":"6877ef035d4fc6e3f0128733","displayName":"[Data2] DataSet to read logs for Rush EmailListener oIKZqtrtDFq4P9kavndU0","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"d2-rush-email-logs--oIKZqtrtDFq4P9kavndU0"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":20}}},"policies":[{"component":"data2-core-auth@Policy","params":{"deny":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"patch"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"remove"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"find"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"params":{"module":{"params":{"reference":"environment.layers.HostApplicationLayer"},"component":"data2-core-types@Reference"},"prop":{"component":"data2-core-primitives@String","params":{"content":"getProcess"}},"args":[{"component":"data2-core-primitives@String","params":{"content":"Data2BuilderAuthentication"}}]},"component":"data2-core-types@Getter"},"prop":{"component":"data2-core-primitives@String","params":{"content":"getSelectedSession"}}}}},"component":"data2-core-logical-operators@Not"}]},"component":"data2-core-logical-operators@And","displayName":"Read - Deny non builder user"}]},"component":"data2-core-logical-operators@Or"}}}],"sort":{"params":{"_id":{"component":"data2-core-primitives@Number","params":{"content":-1}}},"component":"data2-core-types@DataSetSort"},"listFields":[{"component":"data2-core-types@FieldReference","params":{"key":"version"}},{"component":"data2-core-types@FieldReference","params":{"key":"result"}},{"component":"data2-core-types@FieldReference","params":{"key":"durationInMs"}},{"component":"data2-core-types@FieldReference","params":{"key":"eventTime"}},{"component":"data2-core-types@FieldReference","params":{"key":"invokedBy"}}]},"reference":"oIKZqtrtDFq4P9kavndU0LogReadDataSet","type":"logs","updatedAt":"2025-07-16T18:27:15.572Z","createdAt":"2025-07-16T18:27:15.572Z"},{"_id":"68f937025fb002e33752a43b","displayName":"InternalApplicationsTableDataSource","component":"data2-core@Data2TableDataSource","system":"5e3b796d6228227ca637d0f4","params":{"table":{"component":"data2-core-primitives@String","params":{"content":"internalApplications"}},"multi":["create"],"super":{},"schema":[{"component":"data2-core-types@Field","params":{"title":"application","key":"application","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"secret","key":"secret","component":"data2-core-types@Password"}},{"component":"data2-core-types@Field","params":{"title":"status","key":"status","component":"data2-core-primitives@String","validation":{"oneOf":{"component":"data2-core-primitives@String","params":{"content":"active,inactive"}}}}}]},"reference":"InternalApplicationsTableDataSource","updatedAt":"2025-10-22T20:01:07.897Z","createdAt":"2025-10-22T19:56:50.650Z"},{"_id":"68f9380b5fb002e33752a43c","displayName":"InternalApplicationsDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"InternalApplicationsTableDataSource"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"pagination":{"size":20}},"reference":"InternalApplicationsDataSet","updatedAt":"2025-10-22T20:05:29.352Z","createdAt":"2025-10-22T20:01:15.614Z"},{"_id":"68f938cf5fb002e33752a43d","displayName":"InternalApplicationsAuthenticationStrategy","component":"data2-core@AuthenticationStrategy","system":"5e3b796d6228227ca637d0f4","params":{"resetPassword":{"resetEmail":{"artboard":{"params":{"preventEvaluation":true},"component":"data2-core-types@ArtboardReference"}},"resetSuccessEmail":{"artboard":{"params":{"preventEvaluation":true},"component":"data2-core-types@ArtboardReference"}}},"verifier":{"disabled":false,"component":"data2-core-types@DataSetReference","params":{"reference":"InternalApplicationsVerifierDataSet"}},"password":{"disabled":false,"component":"data2-core-types@DataSetColumnReference","params":{"column":"secret"}},"credentials":[{"component":"data2-core-types@FieldReference","params":{"key":"application"}},{"component":"data2-core-types@FieldReference","params":{"key":"secret"}},{"component":"data2-core-types@FieldReference","params":{"key":"status"}}],"session":[{"component":"data2-core-types@FieldReference","params":{"key":"application"}},{"component":"data2-core-types@FieldReference","params":{"key":"secret"}},{"component":"data2-core-types@FieldReference","params":{"key":"status"}}]},"reference":"InternalApplicationsAuthenticationStrategy","updatedAt":"2025-10-22T20:08:54.442Z","createdAt":"2025-10-22T20:04:31.198Z"},{"_id":"68f938ee5fb002e33752a43e","displayName":"InternalApplicationsVerifierDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"InternalApplicationsTableDataSource"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":1}}}},"reference":"InternalApplicationsVerifierDataSet","updatedAt":"2025-10-22T20:05:40.424Z","createdAt":"2025-10-22T20:05:03.038Z"},{"_id":"68fa8c93955ba909c7a8f90b","displayName":"ForbiddenSystemsDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"SystemsTableDataSource"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"pagination":{"size":20},"policies":[{"component":"data2-core-auth@Policy","params":{"deny":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}}}]},"reference":"OcrE3Kw32Bxa6eFUddRVF","updatedAt":"2025-10-23T20:16:47.582Z","createdAt":"2025-10-23T20:14:11.720Z"},{"_id":"68ffe7c529094998d1e02a67","displayName":"ServerOrganizationMemberDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"OrganizationMemberDataSource"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"filter":{"params":{"_id":{"component":"data2-core-primitives@String","params":{"content":"000000000000000000000000"}}},"component":"data2-core-types@DataSetFilter"},"policies":[{"component":"data2-core-auth@Policy","params":{"allow":{"component":"data2-core-flow@Switch","params":{"expression":{"component":"data2-core-types@Reference","params":{"reference":"$method"}},"cases":[{"component":"data2-core-flow@Case","params":{"expression":"find","value":{"component":"data2-core-logical-operators@Or","params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":"$params.query.$and.0.user"}},{"component":"data2-core-types@Reference","params":{"reference":"$params.query.$and.0.organization"}}]}}}}],"defaultCase":{"component":"data2-core-primitives@Boolean","params":{}}}}}}]},"reference":"Ok6Tsu5XkS7r8PyW_7TyW","updatedAt":"2026-08-06T16:31:28.187Z","createdAt":"2025-10-27T21:45:29.721Z"},{"_id":"68ffe7fc29094998d1e02a69","displayName":"ServerSystemAccessDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"SystemAccessDataSource"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"filter":{"params":{"_id":{"component":"data2-core-primitives@String","params":{"content":"000000000000000000000000"}}},"component":"data2-core-types@DataSetFilter"},"policies":[{"component":"data2-core-auth@Policy","params":{"allow":{"component":"data2-core-flow@Switch","params":{"expression":{"component":"data2-core-types@Reference","params":{"reference":"$method"}},"cases":[{"component":"data2-core-flow@Case","params":{"expression":"find","value":{"component":"data2-core-logical-operators@Or","params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":"$params.query.$and.0.user"}},{"component":"data2-core-types@Reference","params":{"reference":"$params.query.$and.0.system"}}]}}}}],"defaultCase":{"component":"data2-core-primitives@Boolean","params":{}}}}}}]},"reference":"NqKAY34n2ffFL64zamp7t","updatedAt":"2026-08-06T16:31:31.213Z","createdAt":"2025-10-27T21:46:18.432Z"},{"_id":"68ffe94429094998d1e02a6b","displayName":"ServerSystemsDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"SystemsTableDataSource"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"filter":{"params":{"_id":{"component":"data2-core-primitives@String","params":{"content":"000000000000000000000000"}}},"component":"data2-core-types@DataSetFilter"},"policies":[{"component":"data2-core-auth@Policy","params":{"allow":{"component":"data2-core-flow@Switch","params":{"expression":{"component":"data2-core-types@Reference","params":{"reference":"$method"}},"cases":[{"component":"data2-core-flow@Case","params":{"expression":"find","value":{"component":"data2-core-logical-operators@Or","params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":"$params.query.$and.0._id"}}]}}}}],"defaultCase":{"component":"data2-core-primitives@Boolean","params":{}}}}}}]},"reference":"WuUa-VKHhW9uYU0E3-mJ8","updatedAt":"2026-08-06T16:31:25.528Z","createdAt":"2025-10-27T21:51:10.967Z"},{"_id":"690929670a52e3626623ddea","displayName":"ScriptsDataComponentInstancesDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"DataComponentInstancesTableDataSource"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":100}}},"filter":{"params":{"_id":{"component":"data2-core-primitives@String","params":{"content":"000000000000000000000000"}}},"component":"data2-core-types@DataSetFilter"},"policies":[{"component":"data2-core-auth@Policy","params":{"authenticationStrategy":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"InternalApplicationsAuthenticationStrategy"}}}}]},"reference":"L-EXs9glijE7K2YgujIlS","updatedAt":"2025-11-03T22:15:53.099Z","createdAt":"2025-11-03T22:15:03.714Z"},{"_id":"6909299d0a52e3626623ddec","displayName":"ScriptsServiceComponentInstancesDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ServiceComponentInstancesTableDataSource"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":100}}},"filter":{"params":{"_id":{"component":"data2-core-primitives@String","params":{"content":"000000000000000000000000"}}},"component":"data2-core-types@DataSetFilter"},"policies":[{"component":"data2-core-auth@Policy","params":{"authenticationStrategy":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"InternalApplicationsAuthenticationStrategy"}}}}]},"reference":"LKHfmyXPtNZcYN1uv6aDG","updatedAt":"2025-11-03T22:16:06.707Z","createdAt":"2025-11-03T22:16:06.707Z"},{"_id":"690a5881ebd6f337964e7327","displayName":"ScriptsFileComponentInstancesDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"FileComponentInstancesTableDataSource"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":100}}},"filter":{"params":{"_id":{"component":"data2-core-primitives@String","params":{"content":"000000000000000000000000"}}},"component":"data2-core-types@DataSetFilter"},"policies":[{"component":"data2-core-auth@Policy","params":{"authenticationStrategy":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"InternalApplicationsAuthenticationStrategy"}}}}]},"reference":"UTlWGA9nNlzd-N4y7ZQjI","updatedAt":"2025-11-04T19:48:26.302Z","createdAt":"2025-11-04T19:48:26.302Z"},{"_id":"6945938a812465d4e5f6b771","displayName":"[Data2] Table for Rush HTTPListener 3wUpHuTHjcAoXujvEOVA0","component":"data2-core@Data2TableDataSource","system":"5e3b796d6228227ca637d0f4","params":{"table":{"component":"data2-core-primitives@String","params":{"content":"d2-rush-http-logs--3wUpHuTHjcAoXujvEOVA0"}},"multi":["create"],"super":{},"useEstimatedDocumentCount":true},"reference":"d2-rush-http-logs--3wUpHuTHjcAoXujvEOVA0","type":"logs","updatedAt":"2025-12-19T18:03:55.009Z","createdAt":"2025-12-19T18:03:55.009Z"},{"_id":"6945938a812465d4e5f6b772","displayName":"[Data2] DataSet to read logs for Rush HTTPListener 3wUpHuTHjcAoXujvEOVA0","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"d2-rush-http-logs--3wUpHuTHjcAoXujvEOVA0"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":20}}},"listFields":[{"component":"data2-core-types@FieldReference","params":{"key":"version"}},{"component":"data2-core-types@FieldReference","params":{"key":"result"}},{"component":"data2-core-types@FieldReference","params":{"key":"durationInMs"}},{"component":"data2-core-types@FieldReference","params":{"key":"eventTime"}},{"component":"data2-core-types@FieldReference","params":{"key":"invokedBy"}}],"policies":[{"component":"data2-core-auth@Policy","params":{"deny":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"patch"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"remove"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"find"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"params":{"module":{"params":{"reference":"environment.layers.HostApplicationLayer"},"component":"data2-core-types@Reference"},"prop":{"component":"data2-core-primitives@String","params":{"content":"getProcess"}},"args":[{"component":"data2-core-primitives@String","params":{"content":"Data2BuilderAuthentication"}}]},"component":"data2-core-types@Getter"},"prop":{"component":"data2-core-primitives@String","params":{"content":"getSelectedSession"}}}}},"component":"data2-core-logical-operators@Not"}]},"component":"data2-core-logical-operators@And","displayName":"Read - Deny non builder user"}]},"component":"data2-core-logical-operators@Or"}}}],"sort":{"params":{"_id":{"component":"data2-core-primitives@Number","params":{"content":-1}}},"component":"data2-core-types@DataSetSort"}},"reference":"3wUpHuTHjcAoXujvEOVA0LogReadDataSet","type":"logs","updatedAt":"2025-12-19T18:03:55.009Z","createdAt":"2025-12-19T18:03:55.009Z"},{"_id":"6945938a812465d4e5f6b773","displayName":"[Data2] DataSet to insert logs for Rush HTTPListener 3wUpHuTHjcAoXujvEOVA0","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"d2-rush-http-logs--3wUpHuTHjcAoXujvEOVA0"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":0}}},"policies":[{"component":"data2-core-auth@Policy","params":{"deny":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"patch"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"remove"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"find"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"params":{"module":{"params":{"reference":"environment.layers.HostApplicationLayer"},"component":"data2-core-types@Reference"},"prop":{"component":"data2-core-primitives@String","params":{"content":"getProcess"}},"args":[{"component":"data2-core-primitives@String","params":{"content":"Data2BuilderAuthentication"}}]},"component":"data2-core-types@Getter"},"prop":{"component":"data2-core-primitives@String","params":{"content":"getSelectedSession"}}}}},"component":"data2-core-logical-operators@Not"}]},"component":"data2-core-logical-operators@And","displayName":"Read - Deny non builder user"}]},"component":"data2-core-logical-operators@Or"}}}]},"reference":"3wUpHuTHjcAoXujvEOVA0LogInsertDataSet","type":"logs","updatedAt":"2025-12-19T18:03:55.009Z","createdAt":"2025-12-19T18:03:55.009Z"},{"_id":"6a7393fa2e82ac2494a53f4e","displayName":"[Data2] Table for Rush HTTPListener d2builder_users_crud","component":"data2-core@Data2TableDataSource","system":"5e3b796d6228227ca637d0f4","params":{"table":{"component":"data2-core-primitives@String","params":{"content":"d2-rush-http-logs--d2builder_users_crud"}},"multi":["create"],"useEstimatedDocumentCount":true},"reference":"d2-rush-http-logs--d2builder_users_crud","type":"logs","updatedAt":"2026-08-05T19:50:18.706Z","createdAt":"2026-08-05T19:50:18.706Z"},{"_id":"6a7393fa9c4ebe28efc696d6","displayName":"[Data2] DataSet to read logs for Rush HTTPListener d2builder_users_crud","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"d2-rush-http-logs--d2builder_users_crud"}},"pagination":{"size":20},"sort":{"_id":-1},"policies":[{"component":"data2-core-auth@Policy","params":{"deny":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"patch"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"remove"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"find"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"params":{"module":{"params":{"reference":"environment.layers.HostApplicationLayer"},"component":"data2-core-types@Reference"},"prop":{"component":"data2-core-primitives@String","params":{"content":"getProcess"}},"args":[{"component":"data2-core-primitives@String","params":{"content":"Data2BuilderAuthentication"}}]},"component":"data2-core-types@Getter"},"prop":{"component":"data2-core-primitives@String","params":{"content":"getSelectedSession"}}}}},"component":"data2-core-logical-operators@Not"}]},"component":"data2-core-logical-operators@And","displayName":"Read - Deny non builder user"}]},"component":"data2-core-logical-operators@Or"}}}]},"reference":"d2builder_users_crudLogReadDataSet","type":"logs","updatedAt":"2026-08-05T19:50:18.869Z","createdAt":"2026-08-05T19:50:18.869Z"},{"_id":"6a7393fb9c4ebe28efc696db","displayName":"[Data2] DataSet to insert logs for Rush HTTPListener d2builder_users_crud","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"d2-rush-http-logs--d2builder_users_crud"}},"pagination":{"size":0},"policies":[{"component":"data2-core-auth@Policy","params":{"deny":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"patch"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"remove"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"find"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"params":{"module":{"params":{"reference":"environment.layers.HostApplicationLayer"},"component":"data2-core-types@Reference"},"prop":{"component":"data2-core-primitives@String","params":{"content":"getProcess"}},"args":[{"component":"data2-core-primitives@String","params":{"content":"Data2BuilderAuthentication"}}]},"component":"data2-core-types@Getter"},"prop":{"component":"data2-core-primitives@String","params":{"content":"getSelectedSession"}}}}},"component":"data2-core-logical-operators@Not"}]},"component":"data2-core-logical-operators@And","displayName":"Read - Deny non builder user"}]},"component":"data2-core-logical-operators@Or"}}}]},"reference":"d2builder_users_crudLogInsertDataSet","type":"logs","updatedAt":"2026-08-05T19:50:19.164Z","createdAt":"2026-08-05T19:50:19.164Z"}]}},{"component":"data2-core@DataSet","reference":"ApplicationsDataSet","params":{"pagination":{"size":1000},"master":{"dataset":{"component":"data2-core-types@ProcessReference","params":{"reference":"SystemsDataSet"}},"localField":"system","masterField":"_id"},"datasource":{"component":"data2-core-types@ProcessReference","params":{"reference":"ApplicationsDataSource"}}}},{"component":"data2-core@DataSet","reference":"ComponentInstancesDataSet","params":{"pagination":{"size":1000},"master":{"dataset":{"component":"data2-core-types@ProcessReference","params":{"reference":"SystemsDataSet"}},"localField":"system","masterField":"_id"},"sort":{"_id":1},"datasource":{"component":"data2-core-types@ProcessReference","params":{"reference":"ComponentInstancesDataSource"}}}},{"component":"data2-core@DataSet","reference":"ServiceComponentInstancesDataSet","params":{"pagination":{"size":1000},"master":{"dataset":{"component":"data2-core-types@ProcessReference","params":{"reference":"SystemsDataSet"}},"localField":"system","masterField":"_id"},"datasource":{"component":"data2-core-types@ProcessReference","params":{"reference":"ServiceComponentInstancesDataSource"}}}},{"component":"data2-core@DataSet","reference":"OneFileComponentInstancesDataSet","params":{"pagination":{"size":1},"master":{"dataset":{"component":"data2-core-types@ProcessReference","params":{"reference":"SystemsDataSet"}},"localField":"system","masterField":"_id"},"datasource":{"component":"data2-core-types@ProcessReference","params":{"reference":"FileComponentInstancesDataSource"}}}},{"reference":"ApplicationsDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"reference":"ComponentInstancesDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"reference":"ServiceComponentInstancesDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"component":"data2-core@Data2TableDataSource","reference":"FileComponentInstancesDataSource","params":{"table":"fileComponentInstances","schema":[{"component":"data2-core-types@Field","params":{"key":"component","title":"Component","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"system","title":"System","component":"data2-core-primitives@ObjectId"}},{"component":"data2-core-types@Field","params":{"key":"displayName","title":"Display Name","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"params","title":"Params","component":"data2-core-primitives@Object"}},{"component":"data2-core-types@Field","params":{"key":"reference","title":"Reference","component":"data2-core-primitives@String"}}]}}],"processesParams":{}},"HostApplicationLayer":{"reference":"HostApplicationLayer","availableInstances":[{"_id":"5f15ff190528b92601890f71","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"SystemsTableDataSource"}},"filter":{"domain":{"component":"data2-core-types@Reference","params":{"reference":"domain"}}},"pk":"_id","fields":[{"component":"data2-core-types@FieldReference","params":{"key":"_id"}},{"component":"data2-core-types@FieldReference","params":{"key":"name"}},{"component":"data2-core-types@FieldReference","params":{"key":"domain"}},{"component":"data2-core-types@FieldReference","params":{"key":"visibility"}},{"component":"data2-core-types@FieldReference","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"customDomains"}}},"break":true},{"component":"data2-core-types@FieldReference","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"organization._id"}}},"break":true},{"component":"data2-core-types@FieldReference","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"organization.name"}}},"break":true},{"component":"data2-core-types@FieldReference","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"organization.billingStatus"}}},"break":true},{"component":"data2-core-types@FieldReference","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"organization.publicTrial.active"}}},"break":true},{"component":"data2-core-types@FieldReference","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"settings.defaultAccessPolicy"}}},"break":true}],"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":1}}},"staticPagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":1}}},"policies":[{"component":"data2-core-auth@Policy","params":{"allow":{"params":{"actions":[{"params":{"components":[{"params":{"query":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$params.query"}}}},"field":{"component":"data2-core-primitives@String","params":{"content":"_id"}},"fieldType":"string"},"component":"data2@7KkQq0vK4a7D2gg6IVJT7"},{"params":{"query":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$params.query"}}}},"field":{"component":"data2-core-primitives@String","params":{"content":"domain"}},"fieldType":"string"},"component":"data2@7KkQq0vK4a7D2gg6IVJT7"},{"params":{"query":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$params.query"}}}},"field":{"component":"data2-core-primitives@String","params":{"content":"customDomains"}},"fieldType":"string"},"component":"data2@7KkQq0vK4a7D2gg6IVJT7"}]},"component":"data2-core-logical-operators@Or"}]},"component":"data2-core-flow@Series"}}}]},"reference":"SystemsDataSet","updatedAt":"2026-08-07T21:51:24.037Z","createdAt":"2020-07-20T20:31:21.838Z"},{"_id":"5f1601ce0528b92601890f7c","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"pagination":{"size":1000},"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ComponentsTableDataSource"}},"sort":{"params.package":1,"params.component":1},"pk":"_id","autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"staticFilter":{"system":{"exists":{"params":{"content":false},"component":"data2-core-primitives@Boolean"}}},"filter":{"system":{"exists":{"params":{"content":false},"component":"data2-core-primitives@Boolean"}}}},"reference":"ComponentsDataSet","updatedAt":"2025-11-05T19:37:01.935Z","createdAt":"2020-07-20T20:42:54.898Z"},{"_id":"5f9041dbc8da12be8b94aea4","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"pagination":{"size":2000},"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ComponentsTableDataSource"}},"pk":"_id","autoEdit":true,"master":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"policies":{"params":{"allowGet":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"UserComponentsDataSet","updatedAt":"2025-11-06T21:06:58.095Z","createdAt":"2020-07-20T20:44:09.350Z"},{"_id":"65d8c4fabc9dbb8f94de8d53","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ExternalComponentInstancesTableDataSource"}},"pk":"_id","autoEdit":true,"master":{"params":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"component":"data2-core-types@DataSetMaster"},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"policies":{"params":{"allowGet":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"ExternalComponentInstancesDataSet","updatedAt":"2025-11-06T21:07:23.742Z","createdAt":"2024-02-23T16:17:01.816Z"},{"reference":"SystemsTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[{"_id":"6a57cfe9673eb7e3c5e57784","name":"Geomarketing","domain":"natura-geomarketing","visibility":"public","settings":{"defaultAccessPolicy":"public"},"updatedAt":"2026-07-27T14:19:36.810Z","createdAt":"2026-07-15T18:22:33.158Z"}]}},{"reference":"ComponentsTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[{"_id":"5f6b45c4bddb16a2ccb60102","component":"data2-core-types@Package","params":{"reference":"data2-porcelain","defaultValues":{"colors":{"component":"data2-core-types@FieldSet","params":{"fields":{"error":{"component":"data2-core-types@Color","params":{"rgba":"#F83A3A","opacity":1}},"attention":{"component":"data2-core-types@Color","params":{"rgba":"#FFC007","opacity":1}},"success":{"component":"data2-core-types@Color","params":{"rgba":"#00C660","opacity":1}},"primary":{"component":"data2-core-types@Color","params":{"rgba":"#A351CF","opacity":1}},"primaryLighter":{"component":"data2-core-types@Color","params":{"rgba":"#ECDBF4","opacity":1}},"primaryDarker":{"component":"data2-core-types@Color","params":{"rgba":"#8948AD","opacity":1}},"adjacent1":{"component":"data2-core-types@Color","params":{"rgba":"#E251A3","opacity":1}},"adjacent2":{"component":"data2-core-types@Color","params":{"rgba":"#765AD2","opacity":1}},"complementary":{"component":"data2-core-types@Color","params":{"rgba":"#FFFF5B","opacity":1}},"black":{"component":"data2-core-types@Color","params":{"rgba":"#121212","opacity":1}},"black-80":{"component":"data2-core-types@Color","params":{"rgba":"#232323","opacity":1}},"black-60":{"component":"data2-core-types@Color","params":{"rgba":"#343434","opacity":1}},"black-40":{"component":"data2-core-types@Color","params":{"rgba":"#454545","opacity":1}},"black-20":{"component":"data2-core-types@Color","params":{"rgba":"#5e5e5e","opacity":1}},"white":{"component":"data2-core-types@Color","params":{"rgba":"#fefefe","opacity":1}},"white-80":{"component":"data2-core-types@Color","params":{"rgba":"#F9F9F9","opacity":1}},"white-60":{"component":"data2-core-types@Color","params":{"rgba":"#F3F3F3","opacity":1}},"white-40":{"component":"data2-core-types@Color","params":{"rgba":"#EBEBEB","opacity":1}},"white-20":{"component":"data2-core-types@Color","params":{"rgba":"#DFDFDF","opacity":1}},"background-1":{"component":"data2-core-types@Color","comment":"black","params":{"rgba":"#121212","opacity":1}},"background-2":{"component":"data2-core-types@Color","comment":"black-80","params":{"rgba":"#232323","opacity":1}},"background-3":{"component":"data2-core-types@Color","comment":"black-60","params":{"rgba":"#343434","opacity":1}},"background-4":{"component":"data2-core-types@Color","comment":"black-40","params":{"rgba":"#454545","opacity":1}},"background-5":{"component":"data2-core-types@Color","comment":"black-20","params":{"rgba":"#5e5e5e","opacity":1}},"color-1":{"component":"data2-core-types@Color","comment":"white","params":{"rgba":"#fefefe","opacity":1}},"color-2":{"component":"data2-core-types@Color","comment":"white-80","params":{"rgba":"#F9F9F9","opacity":1}},"color-3":{"component":"data2-core-types@Color","comment":"white-60","params":{"rgba":"#F3F3F3","opacity":1}}}}},"gums":{"big-dark":{"component":{"component":"data2-core-types@Shadow","params":{"shadow":[{"offsetX":10,"offsetY":10,"blur":20,"spread":0,"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0, 0, 0)","opacity":0.2}}},{"offsetX":-10,"offsetY":-10,"blur":20,"spread":0,"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(124, 124, 124)","opacity":0.08}}}]}}},"small-dark":{"component":{"component":"data2-core-types@Shadow","params":{"shadow":[{"offsetX":5,"offsetY":5,"blur":10,"spread":0,"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0, 0, 0)","opacity":0.2}}},{"offsetX":-5,"offsetY":-5,"blur":10,"spread":0,"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(124, 124, 124)","opacity":0.08}}}]}}},"small-light":{"component":{"component":"data2-core-types@Shadow","params":{"shadow":[{"offsetX":5,"offsetY":5,"blur":10,"spread":0,"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(28, 28, 28)","opacity":0.1}}},{"offsetX":-5,"offsetY":-5,"blur":10,"spread":0,"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255, 255, 255)","opacity":1}}}]}}},"big-light":{"component":{"component":"data2-core-types@Shadow","params":{"shadow":[{"offsetX":10,"offsetY":10,"blur":20,"spread":0,"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(28, 28, 28)","opacity":0.1}}},{"offsetX":-10,"offsetY":-10,"blur":20,"spread":0,"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255, 255, 255)","opacity":1}}}]}}}},"font":{"component":"data2-core-types@GoogleFont","params":{"fontFamily":"Work Sans"}},"mode":"dark"}},"updatedAt":"2020-09-23T12:55:42.426Z","createdAt":"2020-09-23T12:55:42.426Z"},{"_id":"5f639c5aa575399a45a84e03","component":"data2-core-types@Component","params":{"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-controls@AutoCompleteInput","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"filter":{"component":"data2-core-types@Reference","params":{"reference":"filter"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"tabIndex":{"component":"data2-core-types@Reference","params":{"reference":"tabIndex"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record"}},"optionsDataset":{"component":"data2-core-types@Reference","params":{"reference":"optionsDataset"}},"optionsField":{"component":"data2-core-types@Reference","params":{"reference":"optionsField"}},"optionsLabel":{"component":"data2-core-types@Reference","params":{"reference":"optionsLabel"}},"optionsValue":{"component":"data2-core-types@Reference","params":{"reference":"optionsValue"}},"numeric":{"component":"data2-core-types@Reference","params":{"reference":"numeric"}},"width":{"component":"data2-core-types@Reference","params":{"reference":"super.dimensions.width"}},"height":{"component":"data2-core-types@Reference","params":{"reference":"super.dimensions.height"}},"textSize":{"component":"data2-core-types@Reference","params":{"reference":"super.textSize"}},"textColor":{"component":"data2-core-types@Reference","params":{"reference":"super.textColor"}},"placeholder":{"component":"data2-core-types@Reference","params":{"reference":"placeholder"}},"font":{"component":"data2-core-types@Reference","params":{"reference":"super.font"}},"disabled":{"component":"data2-core-types@Reference","params":{"reference":"disabled"}},"valuesBackgroundColors":{"component":"data2-core-types@Reference","params":{"reference":"valuesBackgroundColors"}},"fieldDefinition":{"component":"data2-core-types@Reference","params":{"reference":"fieldDefinition"}},"minCharactersToAutoComplete":{"component":"data2-core-types@Reference","params":{"reference":"minCharactersToAutoComplete"}},"autoSelectIfMatchOption":{"component":"data2-core-types@Reference","params":{"reference":"autoSelectIfMatchOption"}},"shouldRenderOptions":{"component":"data2-core-types@Reference","params":{"reference":"shouldRenderOptions"}},"mask":{"component":"data2-core-types@Reference","params":{"reference":"mask"}},"options":{"component":"data2-core-types@Reference","params":{"reference":"options"}}}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"dataset":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@InteractiveModuleReference"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"},"field":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@FieldReference"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":2}}},"component":"data2-core-types@ComponentParameter"},"record":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Reference"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":6}}},"component":"data2-core-types@ComponentParameter"},"filter":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":9}}},"component":"data2-core-types@ComponentParameter"},"optionsDataset":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@InteractiveModuleReference"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":3}}},"component":"data2-core-types@ComponentParameter"},"optionsField":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@FieldReference"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":4}}},"component":"data2-core-types@ComponentParameter"},"optionsLabel":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@FieldReference"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":5}}},"component":"data2-core-types@ComponentParameter"},"optionsValue":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@FieldReference"}},"visibility":"private","index":{"component":"data2-core-primitives@Number","params":{"content":6}}},"component":"data2-core-types@ComponentParameter"},"placeholder":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":8}}},"component":"data2-core-types@ComponentParameter"},"valuesBackgroundColors":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataColor"}},"category":"appearance","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":12}}},"component":"data2-core-types@ComponentParameter"},"disabled":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":7}}},"component":"data2-core-types@ComponentParameter"},"numeric":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":10}}},"component":"data2-core-types@ComponentParameter"},"tabIndex":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":11}}},"component":"data2-core-types@ComponentParameter"},"mask":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":12}}},"component":"data2-core-types@ComponentParameter"}}}},"public":true,"extends":"data2-core-primitives@Block","component":"AutoCompleteInput","icon":"magic","package":"data2-blocks","visibility":"public"},"updatedAt":"2021-07-19T22:21:10.618Z"},{"_id":"5f48939ba575399a45e142cb","component":"data2-core-types@Component","params":{"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-controls@Chart","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"title":{"component":"data2-core-types@Reference","params":{"reference":"title"}},"aggregation":{"component":"data2-core-types@Reference","params":{"reference":"aggregation"}},"metric":{"component":"data2-core-types@Reference","params":{"reference":"metric"}},"dimension":{"component":"data2-core-types@Reference","params":{"reference":"dimension"}},"xAxis":{"component":"data2-core-types@Reference","params":{"reference":"xAxis"}},"statistic":{"component":"data2-core-types@Reference","params":{"reference":"statistic"}},"type":{"component":"data2-core-types@Reference","params":{"reference":"type"}},"timeUnit":{"component":"data2-core-types@Reference","params":{"reference":"timeUnit"}},"timeUnitStartOf":{"component":"data2-core-types@Reference","params":{"reference":"timeUnitStartOf"}},"timeUnitEndOf":{"component":"data2-core-types@Reference","params":{"reference":"timeUnitEndOf"}},"stacked":{"component":"data2-core-types@Reference","params":{"reference":"stacked"}},"fill":{"component":"data2-core-types@Reference","params":{"reference":"super.fill"}},"textSize":{"component":"data2-core-types@Reference","params":{"reference":"super.textSize"}},"textColor":{"component":"data2-core-types@Reference","params":{"reference":"super.textColor"}},"gridColor":{"component":"data2-core-types@Reference","params":{"reference":"gridColor"}},"style":{"width":"100%","height":"100%"},"dataColors":{"component":"data2-core-types@Reference","params":{"reference":"dataColors"}},"formatLabel":{"component":"data2-core-types@Reference","params":{"reference":"formatLabel"}},"hideLegend":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"hideLegend"}}}},"datalabelColor":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"datalabelColor"}}}},"legendPosition":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"legendPosition"}}}},"sort":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"sort"}}}},"sortValues":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"sortValues"}}}},"hideLabels":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"hideLabels"}}}},"hidePercent":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"hidePercent"}}}}}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"dataset":{"component":"data2-core-types@DataSetReference"},"title":{"component":"String"},"sort":{"params":{"component":"data2-core-primitives@Object","parameters":{"field":{"params":{"component":"data2-core-primitives@String","oneOf":[{"params":{"content":"dimension"},"component":"data2-core-primitives@String"},{"params":{"content":"metric"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"},"order":{"params":{"component":"data2-core-primitives@String","oneOf":[{"params":{"content":"asc"},"component":"data2-core-primitives@String"},{"params":{"content":"desc"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@ComponentParameter"},"type":{"component":"data2-core-primitives@String","oneOf":["Bar","Horizontal","Doughnut","Pie","Line","Radar","BigNumber"]},"metric":{"component":"data2-core-types@FieldReference"},"dimension":{"component":"data2-core-types@FieldReference"},"xAxis":{"component":"data2-core-types@FieldReference"},"statistic":{"component":"data2-core-primitives@String","oneOf":["count","count-unique","sum","average"]},"timeUnit":{"component":"data2-core-primitives@String","oneOf":["day","week","month","quarter","year"]},"timeUnitStartOf":{"component":"data2-core-primitives@String","oneOf":["day","week","month","quarter","year"]},"timeUnitEndOf":{"component":"data2-core-primitives@String","oneOf":["day","week","month","quarter","year"]},"stacked":{"component":"data2-core-primitives@Boolean"},"gridColor":{"component":"data2-core-types@Color"},"dataColors":{"component":"data2-core-types@DataColor","list":true},"hideLegend":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Boolean","visibility":"public"}},"datalabelColor":{"params":{"category":"appearance","visibility":"private","component":"data2-core-types@Color"},"component":"data2-core-types@ComponentParameter"},"legendPosition":{"params":{"component":"data2-core-primitives@String","oneOf":[{"params":{"content":"top"},"component":"data2-core-primitives@String"},{"params":{"content":"bottom"},"component":"data2-core-primitives@String"},{"params":{"content":"left"},"component":"data2-core-primitives@String"},{"params":{"content":"right"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"},"hideLabels":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Boolean","visibility":"public"}},"hidePercent":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Boolean","visibility":"public"}}}}},"public":true,"component":"BlockChart","package":"data2-blocks","icon":"line-chart","extends":"data2-core-primitives@Block","visibility":"public"},"updatedAt":"2025-03-07T00:31:31.346Z"},{"_id":"67ca36a1a93fb9cbb7c9009a","component":"data2-core-types@Component","params":{"component":"BlockDataViz","package":"data2-blocks","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"dataset":{"params":{"component":"data2-core-types@InteractiveModuleReference"},"component":"data2-core-types@ComponentParameter"},"idField":{"params":{"component":"data2-core-types@DataSetColumnReference"},"component":"data2-core-types@ComponentParameter"},"parentField":{"params":{"component":"data2-core-types@DataSetColumnReference"},"component":"data2-core-types@ComponentParameter"}}}},"icon":"line-chart","visibility":"public","extends":"data2-core-primitives@Block","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-controls@DataViz","params":{"parentField":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"parentField"}}}},"idField":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"idField"}}}},"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}}}}}},"public":true},"updatedAt":"2025-03-07T00:34:19.780Z","createdAt":"2025-03-06T23:58:25.536Z"},{"_id":"5ed4bda7a99e7f2f648cc2aa","component":"data2-core-types@Component","params":{"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-core-primitives@Block","params":{"children":{"component":"data2-core-types@Reference","params":{"reference":"label"}},"dimensions":{"params":{"reference":"dimensions"},"component":"data2-core-types@Reference"},"position":{"params":{"reference":"position"},"component":"data2-core-types@Reference"},"style":{"params":{"reference":"style"},"component":"data2-core-types@Reference"},"disable":{"params":{"reference":"disable"},"component":"data2-core-types@Reference"},"onClick":{"params":{"reference":"onClick"},"component":"data2-core-types@Reference"}}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"dimensions":{"component":"data2-core-types@Dimensions"},"position":{"component":"data2-core-types@Position"},"style":{"component":"data2-core-types@StyleSheet"},"onClick":{"component":"data2-core-types@Interaction"},"label":{"component":"String"},"disable":{"component":"Boolean"}}}},"public":false,"component":"Button","package":"data2-blocks","visibility":"deprecated"},"updatedAt":"2022-03-22T14:18:27.258Z"},{"_id":"5f49063ca575399a45f5410c","component":"data2-core-types@Component","params":{"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"html@button","params":{"children":{"component":"data2-core-types@Reference","params":{"reference":"label"}},"style":{"width":"100%","height":"100%","border":"none","cursor":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"disabled"},"component":"data2-core-types@Reference"},"comparisonSubject":true}}],"then":"not-allowed","else":"pointer"}},"background":{"params":{"reference":"super.fill"},"component":"data2-core-types@Reference"},"color":{"params":{"reference":"super.textColor"},"component":"data2-core-types@Reference"},"fontSize":{"params":{"reference":"super.textSize"},"component":"data2-core-types@Reference"},"opacity":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"disabled"},"component":"data2-core-types@Reference"},"comparisonSubject":true}}],"then":0.38,"else":1}}},"disabled":{"params":{"reference":"disabled"},"component":"data2-core-types@Reference"}}}}},"super":{"style":{":hover":{"filter":"brightness(115%)"}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"label":{"component":"data2-core-primitives@String"},"disabled":{"component":"data2-core-primitives@Boolean"}}}},"public":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"component":"ButtonDj","package":"data2-blocks","icon":"caret-square-o-right","extends":"data2-core-primitives@Block","visibility":"deprecated"},"updatedAt":"2022-04-06T14:01:09.286Z"},{"_id":"5fc6438bc8da12be8b6a047b","component":"data2-core-types@Component","params":{"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-controls@Carousel","params":{"interval":{"component":"data2-core-types@Reference","params":{"reference":"interval"}},"slides":{"component":"data2-core-types@Reference","params":{"reference":"slides"}}}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"slides":{"component":"data2-core-types@ComponentInstanceReference","list":true},"interval":"Number"}}},"public":true,"component":"CarouselBlock","package":"data2-blocks","extends":"data2-core-primitives@Block","icon":"file-image-o","visibility":"public"}},{"_id":"5ed53597a99e7f2f648cc2ac","component":"data2-core-types@Component","params":{"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"params":{"children":{"component":"data2-controls@Chart","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"title":{"component":"data2-core-types@Reference","params":{"reference":"title"}},"aggregation":{"component":"data2-core-types@Reference","params":{"reference":"aggregation"}},"type":{"component":"data2-core-types@Reference","params":{"reference":"type"}},"style":{"width":"100%","height":"100%"}}},"dimensions":{"params":{"reference":"dimensions"},"component":"data2-core-types@Reference"},"position":{"params":{"reference":"position"},"component":"data2-core-types@Reference"},"style":{"params":{"reference":"style"},"component":"data2-core-types@Reference"}},"component":"data2-core-primitives@Block"}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"dimensions":{"component":"data2-core-types@Dimensions"},"position":{"component":"data2-core-types@Position"},"style":{"component":"data2-core-types@StyleSheet"},"dataset":{"component":"data2-core-types@DataSetReference"},"title":{"component":"String"},"sort":{"component":"Boolean"},"aggregation":{"component":"data2-core-types@DataSetColumnReference"},"type":{"component":"String","oneOf":["Horizontal","Bar","Doughnut"]}}}},"public":false,"component":"Chart","package":"data2-blocks","visibility":"deprecated"},"updatedAt":"2022-03-22T14:27:46.381Z"},{"_id":"652037d0c10b43bc8fc51e44","component":"data2-core-types@Component","params":{"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-controls@CodeEditor","params":{"style":{"width":"100%","boxSizing":"border-box","background":{"params":{"components":[{"params":{"reference":"super.fill"},"component":"data2-core-types@Reference"},{"params":{"rgba":"rgba(20,20,20,1)"},"component":"data2-core-types@Color"}]},"component":"data2-core-logical-operators@Or"},"color":{"params":{"components":[{"params":{"reference":"super.textColor"},"component":"data2-core-types@Reference"},{"params":{"rgba":"rgba(255,255,255,1)"},"component":"data2-core-types@Color"}]},"component":"data2-core-logical-operators@Or"},"border":"none","outline":"none","appearance":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"orient"},"component":"data2-core-types@Reference"},"comparisonSubject":"vertical"}}],"then":"slider-vertical","else":"none"}},"cursor":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"disabled"},"component":"data2-core-types@Reference"},"comparisonSubject":true}}],"then":"not-allowed","else":"auto"}},"fontSize":{"params":{"components":[{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"super.textSize"}}},"component":"data2-core-types@Reference"},{"params":{"content":12},"component":"data2-core-primitives@Number"}]},"component":"data2-core-logical-operators@Or"},"minHeight":"100%"},"value":{"component":"data2-core-types@DataLinkGetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record"}},"mask":{"component":"data2-core-types@Reference","params":{"reference":"mask"}}}},"onChange":{"component":"data2-core-types@DataLinkSetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record"}},"recordUpsert":{"component":"data2-core-types@Reference","params":{"reference":"recordUpsert"}},"onChange":{"component":"data2-core-types@Reference","params":{"reference":"onChange"}},"mask":{"component":"data2-core-types@Reference","params":{"reference":"mask"}}}},"opacity":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"disabled"},"component":"data2-core-types@Reference"},"comparisonSubject":true}}],"then":0.38,"else":1}},"disabled":{"params":{"reference":"disabled"},"component":"data2-core-types@Reference"},"language":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"language"}}},"component":"data2-core-types@Reference"}}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"dataset":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@InteractiveModuleReference"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":91}}},"component":"data2-core-types@ComponentParameter"},"field":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetColumnReference"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":92}}},"component":"data2-core-types@ComponentParameter"},"record":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Reference"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":203}}},"component":"data2-core-types@ComponentParameter"},"recordUpsert":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":204}}},"component":"data2-core-types@ComponentParameter"},"disabled":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":205}}},"component":"data2-core-types@ComponentParameter"},"onChange":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":301}}},"component":"data2-core-types@ComponentParameter"},"language":{"params":{"component":"data2-core-primitives@String","oneOf":[{"params":{"content":"graphql"},"component":"data2-core-primitives@String"},{"params":{"content":"javascript"},"component":"data2-core-primitives@String"},{"params":{"content":"cshtml"},"component":"data2-core-primitives@String"},{"params":{"content":"markup"},"component":"data2-core-primitives@String"},{"params":{"content":"clike"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"},"tabSize":{"params":{"component":"data2-core-primitives@Number"},"component":"data2-core-types@ComponentParameter"}}}},"component":"CodeEditor","package":"data2-blocks","icon":"terminal","extends":"data2-core-primitives@Block","visibility":"public"},"updatedAt":"2024-07-30T14:12:56.704Z"},{"_id":"5ed503bfd68ce41360e5687d","component":"data2-core-types@Component","params":{"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"params":{"children":{"component":"data2-controls@Field","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}}}},"dimensions":{"params":{"reference":"dimensions"},"component":"data2-core-types@Reference"},"position":{"params":{"reference":"position"},"component":"data2-core-types@Reference"},"tabIndex":{"params":{"reference":"tabIndex"},"component":"data2-core-types@Reference"},"style":{"params":{"reference":"style"},"component":"data2-core-types@Reference"}},"component":"data2-core-primitives@Block"}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"dimensions":{"component":"data2-core-types@Dimensions"},"position":{"component":"data2-core-types@Position"},"style":{"component":"data2-core-types@StyleSheet"},"dataset":{"component":"data2-core-types@DataSetReference"},"field":{"component":"data2-core-types@DataSetColumnReference"},"tabIndex":"Number"}}},"public":false,"component":"DataField","package":"data2-blocks","visibility":"deprecated"},"updatedAt":"2022-03-22T14:26:01.789Z"},{"_id":"5ed52254d68ce41360e8edd7","component":"data2-core-types@Component","params":{"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"params":{"children":{"component":"html@input","params":{"style":{"width":"100%","height":"100%","boxSizing":"border-box"},"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"type":{"component":"data2-core-types@Reference","params":{"reference":"type"}},"placeholder":{"component":"data2-core-types@Reference","params":{"reference":"placeholder"}},"value":{"component":"data2-core-types@DataLinkGetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}}}},"onChange":{"component":"data2-core-types@DataLinkSetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}}}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}}}},"dimensions":{"params":{"reference":"dimensions"},"component":"data2-core-types@Reference"},"position":{"params":{"reference":"position"},"component":"data2-core-types@Reference"},"style":{"params":{"reference":"style"},"component":"data2-core-types@Reference"}},"component":"data2-core-primitives@Block"}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"dimensions":{"component":"data2-core-types@Dimensions"},"position":{"component":"data2-core-types@Position"},"style":{"component":"data2-core-types@StyleSheet"},"dataset":{"component":"data2-core-types@DataSetReference"},"field":{"component":"data2-core-types@DataSetColumnReference"},"placeholder":{"component":"String"},"type":{"component":"String","oneOf":["text","number","checkbox","email","password","date","color"]}}}},"public":false,"component":"DataField2","package":"data2-blocks","visibility":"deprecated"},"updatedAt":"2022-03-22T14:26:31.640Z"},{"_id":"5f494791a575399a45020f87","component":"data2-core-types@Component","params":{"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"html@input","params":{"style":{"width":"100%","height":"100%","boxSizing":"border-box","background":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"type","source":"VIRTUAL_COMPONENT_PARAMS"},"component":"data2-core-types@Reference"},"comparisonSubject":"checkbox"}}],"then":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"component":"data2-core-types@DataLinkGetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset","source":"VIRTUAL_COMPONENT_PARAMS"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field","source":"VIRTUAL_COMPONENT_PARAMS"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record","source":"VIRTUAL_COMPONENT_PARAMS"}}}},"comparisonSubject":true}}],"then":{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"checkboxFill"}}}},"rgba(0,118,255,1)"]},"component":"data2-core-logical-operators@Or"},"else":{"params":{"content":"none"},"component":"data2-core-primitives@String"}}},"else":{"params":{"content":"none"},"component":"data2-core-primitives@String"}}},"color":{"params":{"reference":"super.textColor"},"component":"data2-core-types@Reference"},"border":"none","outline":"none","appearance":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"orient","source":"VIRTUAL_COMPONENT_PARAMS"},"component":"data2-core-types@Reference"},"comparisonSubject":"vertical"}}],"then":"slider-vertical","else":"none"}},"cursor":{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"super.cursor"}}}},{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"disabled","source":"VIRTUAL_COMPONENT_PARAMS"},"component":"data2-core-types@Reference"},"comparisonSubject":true}}],"then":{"component":"data2-core-primitives@String","params":{"content":"not-allowed"}},"else":{"component":"data2-core-primitives@String","params":{"content":"auto"}}}}]},"component":"data2-core-logical-operators@Or"},"fontWeight":{"component":"data2-core-primitives@String","params":{"content":"inherit"}},"paddingLeft":{"component":"data2-core-flow@If","params":{"compare":[{"params":{"comparisonSubject":{"params":{},"component":"data2-core-primitives@Undefined"},"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"padding.left"}}}}},"component":"data2-core-comparison-operators@Different"}],"then":{"params":{"portions":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"padding.left"}}}},{"component":"data2-core-primitives@String","params":{"content":"px"}}]},"component":"data2-core-functions@StringConcat"}}},"paddingRight":{"component":"data2-core-flow@If","params":{"compare":[{"params":{"comparisonSubject":{"params":{},"component":"data2-core-primitives@Undefined"},"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"padding.right"}}}}},"component":"data2-core-comparison-operators@Different"}],"then":{"params":{"portions":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"padding.right"}}}},{"component":"data2-core-primitives@String","params":{"content":"px"}}]},"component":"data2-core-functions@StringConcat"}}},"caretColor":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"caretColor"}}}},"textAlign":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"super.textFormat.textAlign"}}},"component":"data2-core-types@Reference"}},"tabIndex":{"component":"data2-core-types@Reference","params":{"reference":"tabIndex","source":"VIRTUAL_COMPONENT_PARAMS"}},"step":{"component":"data2-core-types@Reference","params":{"reference":"step","source":"VIRTUAL_COMPONENT_PARAMS"}},"min":{"component":"data2-core-types@Reference","params":{"reference":"min","source":"VIRTUAL_COMPONENT_PARAMS"}},"max":{"component":"data2-core-types@Reference","params":{"reference":"max","source":"VIRTUAL_COMPONENT_PARAMS"}},"maxLength":{"params":{"then":{"params":{},"component":"data2-core-primitives@Undefined"},"compare":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":"maxLength","source":"VIRTUAL_COMPONENT_PARAMS"}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":""}}},"component":"data2-core-comparison-operators@Equal"}],"else":{"component":"data2-core-types@Reference","params":{"reference":"maxLength","source":"VIRTUAL_COMPONENT_PARAMS"}}},"component":"data2-core-flow@If"},"orient":{"component":"data2-core-types@Reference","params":{"reference":"orient","source":"VIRTUAL_COMPONENT_PARAMS"}},"type":{"component":"data2-core-types@Reference","params":{"reference":"type","source":"VIRTUAL_COMPONENT_PARAMS"}},"placeholder":{"component":"data2-core-logical-operators@Or","params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":"placeholder","source":"VIRTUAL_COMPONENT_PARAMS"}},{"component":"data2-core-types@Reference","params":{"reference":"field","source":"VIRTUAL_COMPONENT_PARAMS"}}]}},"value":{"params":{"expression":{"params":{"content":true},"component":"data2-core-primitives@Boolean"},"defaultCase":{"component":"data2-core-types@DataLinkGetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset","source":"VIRTUAL_COMPONENT_PARAMS"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field","source":"VIRTUAL_COMPONENT_PARAMS"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record","source":"VIRTUAL_COMPONENT_PARAMS"}},"mask":{"component":"data2-core-types@Reference","params":{"reference":"mask","source":"VIRTUAL_COMPONENT_PARAMS"}}}},"cases":[{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"type","source":"VIRTUAL_COMPONENT_PARAMS"},"component":"data2-core-types@Reference"},"comparisonSubject":"date"}},"value":{"component":"data2-core-functions@DateFormat","params":{"date":{"component":"data2-core-types@DataLinkGetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset","source":"VIRTUAL_COMPONENT_PARAMS"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field","source":"VIRTUAL_COMPONENT_PARAMS"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record","source":"VIRTUAL_COMPONENT_PARAMS"}}}},"format":"YYYY-MM-DD"}}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"type","source":"VIRTUAL_COMPONENT_PARAMS"},"component":"data2-core-types@Reference"},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"month"}}}},"value":{"component":"data2-core-functions@DateFormat","params":{"date":{"component":"data2-core-types@DataLinkGetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset","source":"VIRTUAL_COMPONENT_PARAMS"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field","source":"VIRTUAL_COMPONENT_PARAMS"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record","source":"VIRTUAL_COMPONENT_PARAMS"}}}},"format":{"component":"data2-core-primitives@String","params":{"content":"YYYY-MM"}}}}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"type","source":"VIRTUAL_COMPONENT_PARAMS"},"component":"data2-core-types@Reference"},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"datetime-local"}}}},"value":{"component":"data2-core-functions@DateFormat","params":{"date":{"component":"data2-core-types@DataLinkGetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset","source":"VIRTUAL_COMPONENT_PARAMS"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field","source":"VIRTUAL_COMPONENT_PARAMS"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record","source":"VIRTUAL_COMPONENT_PARAMS"}}}},"format":{"component":"data2-core-primitives@String","params":{"content":"YYYY-MM-DDTHH:mm"}}}}}}]},"component":"data2-core-flow@Switch"},"onChange":{"component":"data2-core-types@DataLinkSetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset","source":"VIRTUAL_COMPONENT_PARAMS"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field","source":"VIRTUAL_COMPONENT_PARAMS"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record","source":"VIRTUAL_COMPONENT_PARAMS"}},"recordUpsert":{"component":"data2-core-types@Reference","params":{"reference":"recordUpsert","source":"VIRTUAL_COMPONENT_PARAMS"}},"onChange":{"component":"data2-core-types@Reference","params":{"reference":"onChange","source":"VIRTUAL_COMPONENT_PARAMS"}},"mask":{"component":"data2-core-types@Reference","params":{"reference":"mask","source":"VIRTUAL_COMPONENT_PARAMS"}}}},"defaultChecked":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"type","source":"VIRTUAL_COMPONENT_PARAMS"},"component":"data2-core-types@Reference"},"comparisonSubject":"checkbox"}}],"then":{"component":"data2-core-types@DataLinkGetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset","source":"VIRTUAL_COMPONENT_PARAMS"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field","source":"VIRTUAL_COMPONENT_PARAMS"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record","source":"VIRTUAL_COMPONENT_PARAMS"}}}},"else":""}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"opacity":{"component":"data2-core-flow@If","params":{"compare":[{"params":{"reference":"disabled","source":"VIRTUAL_COMPONENT_PARAMS"},"component":"data2-core-types@Reference"}],"then":0.38,"else":1}},"disabled":{"params":{"reference":"disabled","source":"VIRTUAL_COMPONENT_PARAMS"},"component":"data2-core-types@Reference"},"autoComplete":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Equal","params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":"builder"}},"comparisonSubject":true}}],"then":"new-password","else":{"params":{"compare":{"params":{"comparisonSubject":{"params":{"content":true},"component":"data2-core-primitives@Boolean"},"subject":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"autoComplete"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-comparison-operators@Identical"},"else":{"params":{"components":[{"params":{"reference":"autoComplete","source":"VIRTUAL_COMPONENT_PARAMS"},"component":"data2-core-types@Reference"},{"component":"data2-core-primitives@String","params":{"content":"off"}}]},"component":"data2-core-logical-operators@Or"}},"component":"data2-core-flow@If"}}},"data-lpignore":{"component":"data2-core-flow@If","params":{"compare":[{"params":{"reference":"autoComplete","source":"VIRTUAL_COMPONENT_PARAMS"},"component":"data2-core-types@Reference"}],"then":"","else":"true"}},"onFocus":{"component":"data2-core-types@Reference","params":{"reference":"onFocus","source":"VIRTUAL_COMPONENT_PARAMS"}},"onBlur":{"component":"data2-core-types@Reference","params":{"reference":"onBlur","source":"VIRTUAL_COMPONENT_PARAMS"}},"onKeyPress":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"onKeyPress"}}}},"autoCapitalize":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"autoCapitalize"}}}},"spellCheck":{"params":{"expression":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"spellCheck"}}},"component":"data2-core-types@Reference"},"cases":[{"component":"data2-core-flow@Case","params":{"expression":{"params":{"content":true},"component":"data2-core-primitives@Boolean"},"value":{"component":"data2-core-primitives@String","params":{"content":"true"}}}},{"component":"data2-core-flow@Case","params":{"expression":{"params":{"content":false},"component":"data2-core-primitives@Boolean"},"value":{"component":"data2-core-primitives@String","params":{"content":"false"}}}}]},"component":"data2-core-flow@Switch"}}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"tabIndex":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":210}}},"component":"data2-core-types@ComponentParameter"},"dataset":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@InteractiveModuleReference"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":91}},"description":{"component":"data2-core-primitives@String","params":{"content":"The location of the Data you want to bind this field to."}}},"component":"data2-core-types@ComponentParameter"},"field":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetColumnReference"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":92}},"alternativeParameterDefaultType":[{"parameter":{"component":"data2-core-primitives@String","params":{"content":"dataset"}},"value":{"params":{"reference":"__UIState"},"component":"data2-core-types@InteractiveModuleReference"},"type":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-user-interface@StateProp"}}},"component":"data2-core-types@ComponentParameter"}}],"shouldShow":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"dependsOn":[{"component":"data2-core-primitives@String","params":{"content":"dataset"}}]},"component":"data2-core-types@ComponentParameter"},"record":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Reference"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":203}}},"component":"data2-core-types@ComponentParameter"},"recordUpsert":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":204}}},"component":"data2-core-types@ComponentParameter"},"type":{"params":{"oneOf":["text","number","time","password","checkbox","month","email","range","date",{"component":"data2-core-primitives@String","params":{"content":"datetime-local"}},"color","radio"],"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":101}}},"component":"data2-core-types@ComponentParameter"},"mask":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":103}},"description":{"component":"data2-core-primitives@String","params":{"content":"Applies a mask to the input, changing how the data is visualized, but not the data itself."}}},"component":"data2-core-types@ComponentParameter"},"placeholder":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":102}}},"component":"data2-core-types@ComponentParameter"},"disabled":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":205}},"description":{"component":"data2-core-primitives@String","params":{"content":"Disables user interaction with the field."}}},"component":"data2-core-types@ComponentParameter"},"autoComplete":{"params":{"component":"data2-core-primitives@String","category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":206}},"oneOf":[{"params":{"content":"off"},"component":"data2-core-primitives@String"},{"params":{"content":"on"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"},"step":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":207}}},"component":"data2-core-types@ComponentParameter"},"maxLength":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":208}},"description":{"component":"data2-core-primitives@String","params":{"content":"Maximum length of a text field."}}},"component":"data2-core-types@ComponentParameter"},"min":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":208}}},"component":"data2-core-types@ComponentParameter"},"max":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":209}},"description":{"component":"data2-core-primitives@String","params":{"content":"For numeric inputs, set the maximum allowed value."}}},"component":"data2-core-types@ComponentParameter"},"orient":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"oneOf":[{"params":{"content":"vertical"},"component":"data2-core-primitives@String"},{"params":{"content":"horizontal"},"component":"data2-core-primitives@String"}],"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":104}}},"component":"data2-core-types@ComponentParameter"},"onChange":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":301}}},"component":"data2-core-types@ComponentParameter"},"onFocus":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":302}}},"component":"data2-core-types@ComponentParameter"},"onBlur":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":303}}},"component":"data2-core-types@ComponentParameter"},"onKeyPress":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":304}}},"component":"data2-core-types@ComponentParameter"},"padding":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"parameters":{"left":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}}},"component":"data2-core-types@ComponentParameter"},"right":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}}},"component":"data2-core-types@ComponentParameter"}},"visibility":"public","index":{"component":"data2-core-primitives@Number","params":{"content":110}},"category":"appearance"}},"checkboxFill":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-types@Color","key":{"component":"data2-core-primitives@String","params":{"content":"checkboxFill"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Checkbox Fill"}},"shouldShow":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"type"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"checkbox"}}},"component":"data2-core-comparison-operators@Equal"}}},"autoCapitalize":{"params":{"component":"data2-core-primitives@String","category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":206.1}},"oneOf":[{"params":{"content":"off"},"component":"data2-core-primitives@String"},{"params":{"content":"on"},"component":"data2-core-primitives@String"},{"params":{"content":"words"},"component":"data2-core-primitives@String"},{"params":{"content":"characters"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"},"spellCheck":{"params":{"component":"data2-core-primitives@Boolean","category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":206.2}}},"component":"data2-core-types@ComponentParameter"},"onEnter":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":304}}},"component":"data2-core-types@ComponentParameter"},"caretColor":{"params":{"component":"data2-core-types@Color","category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":111}}},"component":"data2-core-types@ComponentParameter"}}}},"component":"DataFieldBlock","package":"data2-blocks","icon":"keyboard-o","extends":"data2-core-primitives@Block","visibility":"public"},"updatedAt":"2026-03-11T19:02:08.869Z"},{"_id":"5ed4a2aed68ce41360da86b2","component":"data2-core-types@Component","params":{"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"params":{"children":{"component":"data2-controls@DataGrid","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"fields":{"component":"data2-core-types@Reference","params":{"reference":"fields"}},"style":{"width":"100%","height":"100%"}}},"dimensions":{"params":{"reference":"dimensions"},"component":"data2-core-types@Reference"},"position":{"params":{"reference":"position"},"component":"data2-core-types@Reference"},"style":{"params":{"reference":"style"},"component":"data2-core-types@Reference"}},"component":"data2-core-primitives@Block"}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"dimensions":{"component":"data2-core-types@Dimensions"},"position":{"component":"data2-core-types@Position"},"style":{"component":"data2-core-types@StyleSheet"},"dataset":{"component":"data2-core-types@DataSetReference"},"fields":{"component":"data2-core-types@Background","list":true}}}},"public":false,"component":"DataGrid","package":"data2-blocks","visibility":"deprecated"},"updatedAt":"2022-03-22T14:25:04.919Z"},{"_id":"5ef24b8f76b2b8399ed3a9d3","component":"data2-core-types@Component","params":{"component":"DataGridBlock","package":"data2-blocks","icon":"table","public":true,"extends":"data2-core-primitives@Block","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"dataset":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetReference"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"},"fields":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@FieldReference"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":2}}},"component":"data2-core-types@ComponentParameter"},"sortable":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"index":{"component":"data2-core-primitives@Number","params":{"content":8}},"category":"behaviour"},"component":"data2-core-types@ComponentParameter"},"pagination":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"index":{"component":"data2-core-primitives@Number","params":{"content":7}},"category":"behaviour"},"component":"data2-core-types@ComponentParameter"},"onRowDoubleClick":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":6}}},"component":"data2-core-types@ComponentParameter"},"highlightColors":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Color"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":5}},"category":"appearance"},"component":"data2-core-types@ComponentParameter"},"headerColors":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Color"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":3}},"category":"appearance"},"component":"data2-core-types@ComponentParameter"},"rowColors":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Color"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":4}},"category":"appearance"},"component":"data2-core-types@ComponentParameter"},"rowActions":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"html@button"}},"visibility":"private","category":"content","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}}}},"definition":{"preventEvaluation":true,"component":"data2-controls@DataGrid","params":{"style":{"width":"100%","height":"100%"},"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"fields":{"component":"data2-core-types@Reference","params":{"reference":"fields"}},"sortable":{"component":"data2-core-types@Reference","params":{"reference":"sortable"}},"pagination":{"component":"data2-core-types@Reference","params":{"reference":"pagination"}},"onRowDoubleClick":{"component":"data2-core-types@Reference","params":{"reference":"onRowDoubleClick"}},"fill":{"component":"data2-core-types@Reference","params":{"reference":"super.fill"}},"textSize":{"component":"data2-core-types@Reference","params":{"reference":"super.textSize"}},"textColor":{"component":"data2-core-types@Reference","params":{"reference":"super.textColor"}},"rowColors":{"component":"data2-core-types@Reference","params":{"reference":"rowColors"}},"highlightColors":{"component":"data2-core-types@Reference","params":{"reference":"highlightColors"}},"headerColors":{"component":"data2-core-types@Reference","params":{"reference":"headerColors"}},"rowActions":{"component":"data2-core-types@Reference","params":{"reference":"rowActions"}}}},"visibility":"public"},"updatedAt":"2022-01-26T16:33:57.383Z"},{"_id":"5ed531fca99e7f2f648cc2ab","component":"data2-core-types@Component","params":{"public":true,"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"latField":{"component":"data2-core-types@Reference","params":{"reference":"latField"}},"lngField":{"component":"data2-core-types@Reference","params":{"reference":"lngField"}},"markerField":{"component":"data2-core-types@Reference","params":{"reference":"markerField"}},"initialCenterLat":{"component":"data2-core-types@Reference","params":{"reference":"initialCenterLat"}},"initialCenterLng":{"component":"data2-core-types@Reference","params":{"reference":"initialCenterLng"}},"initialZoom":{"component":"data2-core-types@Reference","params":{"reference":"initialZoom"}},"provider":{"component":"data2-core-types@Reference","params":{"reference":"provider"}},"style":{"width":"100%","height":"100%"},"polyLineField":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"polyLineField"}}}}},"component":"data2-controls@DataMap"}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"dataset":{"component":"data2-core-types@DataSetReference"},"latField":{"component":"data2-core-types@FieldReference"},"lngField":{"component":"data2-core-types@FieldReference"},"markerField":{"component":"data2-core-types@FieldReference"},"initialCenterLat":{"component":"data2-core-primitives@Number"},"initialCenterLng":{"component":"data2-core-primitives@Number"},"initialZoom":{"component":"data2-core-primitives@Number"},"provider":{"component":"data2-core-primitives@String","oneOf":["OpenStreetMap.Mapnik","OpenStreetMap.DE","OpenStreetMap.CH","OpenStreetMap.France","OpenStreetMap.HOT","OpenStreetMap.BZH","OpenSeaMap","OpenPtMap","OpenTopoMap","OpenRailwayMap","OpenFireMap","SafeCast","Stadia.AlidadeSmooth","Stadia.AlidadeSmoothDark","Stadia.OSMBright","Stadia.Outdoors","Thunderforest.OpenCycleMap","Thunderforest.Transport","Thunderforest.TransportDark","Thunderforest.SpinalMap","Thunderforest.Landscape","Thunderforest.Outdoors","Thunderforest.Pioneer","Thunderforest.MobileAtlas","Thunderforest.Neighbourhood","CyclOSM","Hydda.Full","Hydda.Base","Hydda.RoadsAndLabels","Jawg.Streets","Jawg.Terrain","Jawg.Sunny","Jawg.Dark","Jawg.Light","Jawg.Matrix","MapBox","MapTiler.Streets","MapTiler.Basic","MapTiler.Bright","MapTiler.Pastel","MapTiler.Positron","MapTiler.Hybrid","MapTiler.Toner","MapTiler.Topo","MapTiler.Voyager","Stamen.Toner","Stamen.TonerBackground","Stamen.TonerHybrid","Stamen.TonerLines","Stamen.TonerLabels","Stamen.TonerLite","Stamen.Watercolor","Stamen.Terrain","Stamen.TerrainBackground","Stamen.TerrainLabels","Stamen.TopOSMRelief","Stamen.TopOSMFeatures","TomTom.Basic","TomTom.Hybrid","TomTom.Labels","Esri.WorldStreetMap","Esri.DeLorme","Esri.WorldTopoMap","Esri.WorldImagery","Esri.WorldTerrain","Esri.WorldShadedRelief","Esri.WorldPhysical","Esri.OceanBasemap","Esri.NatGeoWorldMap","Esri.WorldGrayCanvas","OpenWeatherMap.Clouds","OpenWeatherMap.CloudsClassic","OpenWeatherMap.Precipitation","OpenWeatherMap.PrecipitationClassic","OpenWeatherMap.Rain","OpenWeatherMap.RainClassic","OpenWeatherMap.Pressure","OpenWeatherMap.PressureContour","OpenWeatherMap.Wind","OpenWeatherMap.Temperature","OpenWeatherMap.Snow","HERE.normalDay","HERE.normalDayCustom","HERE.normalDayGrey","HERE.normalDayMobile","HERE.normalDayGreyMobile","HERE.normalDayTransit","HERE.normalDayTransitMobile","HERE.normalDayTraffic","HERE.normalNight","HERE.normalNightMobile","HERE.normalNightGrey","HERE.normalNightGreyMobile","HERE.normalNightTransit","HERE.normalNightTransitMobile","HERE.reducedDay","HERE.reducedNight","HERE.basicMap","HERE.mapLabels","HERE.trafficFlow","HERE.carnavDayGrey","HERE.hybridDay","HERE.hybridDayMobile","HERE.hybridDayTransit","HERE.hybridDayGrey","HERE.hybridDayTraffic","HERE.pedestrianDay","HERE.pedestrianNight","HERE.satelliteDay","HERE.terrainDay","HERE.terrainDayMobile","HEREv3.normalDay","HEREv3.normalDayCustom","HEREv3.normalDayGrey","HEREv3.normalDayMobile","HEREv3.normalDayGreyMobile","HEREv3.normalDayTransit","HEREv3.normalDayTransitMobile","HEREv3.normalNight","HEREv3.normalNightMobile","HEREv3.normalNightGrey","HEREv3.normalNightGreyMobile","HEREv3.normalNightTransit","HEREv3.normalNightTransitMobile","HEREv3.reducedDay","HEREv3.reducedNight","HEREv3.basicMap","HEREv3.mapLabels","HEREv3.trafficFlow","HEREv3.carnavDayGrey","HEREv3.hybridDay","HEREv3.hybridDayMobile","HEREv3.hybridDayTransit","HEREv3.hybridDayGrey","HEREv3.pedestrianDay","HEREv3.pedestrianNight","HEREv3.satelliteDay","HEREv3.terrainDay","HEREv3.terrainDayMobile","FreeMapSK","MtbMap","CartoDB.Positron","CartoDB.PositronNoLabels","CartoDB.PositronOnlyLabels","CartoDB.DarkMatter","CartoDB.DarkMatterNoLabels","CartoDB.DarkMatterOnlyLabels","CartoDB.Voyager","CartoDB.VoyagerNoLabels","CartoDB.VoyagerOnlyLabels","CartoDB.VoyagerLabelsUnder","HikeBike.HikeBike","HikeBike.HillShading","BasemapAT.basemap","BasemapAT.grau","BasemapAT.overlay","BasemapAT.terrain","BasemapAT.surface","BasemapAT.highdpi","BasemapAT.orthofoto","nlmaps.standaard","nlmaps.pastel","nlmaps.grijs","nlmaps.luchtfoto","NASAGIBS.ModisTerraTrueColorCR","NASAGIBS.ModisTerraBands367CR","NASAGIBS.ViirsEarthAtNight2012","NASAGIBS.ModisTerraLSTDay","NASAGIBS.ModisTerraSnowCover","NASAGIBS.ModisTerraAOD","NASAGIBS.ModisTerraChlorophyll","NLS","JusticeMap.income","JusticeMap.americanIndian","JusticeMap.asian","JusticeMap.black","JusticeMap.hispanic","JusticeMap.multi","JusticeMap.nonWhite","JusticeMap.white","JusticeMap.plurality","Wikimedia","GeoportailFrance.parcels","GeoportailFrance.ignMaps","GeoportailFrance.maps","GeoportailFrance.orthos","OneMapSG.Default","OneMapSG.Night","OneMapSG.Original","OneMapSG.Grey","OneMapSG.LandLot","USGS.USTopo","USGS.USImagery","USGS.USImageryTopo","WaymarkedTrails.hiking","WaymarkedTrails.cycling","WaymarkedTrails.mtb","WaymarkedTrails.slopes","WaymarkedTrails.riding","WaymarkedTrails.skating"]},"polyLineField":{"component":"data2-core-types@FieldReference"}}}},"component":"DataMap","package":"data2-blocks","icon":"map","extends":"data2-core-primitives@Block","visibility":"public"},"updatedAt":"2022-12-30T18:30:13.513Z"},{"_id":"5faf1800c8da12be8bd4b8c6","component":"data2-core-types@Component","params":{"public":true,"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-controls@MoneyInput","params":{"style":{"width":"100%","height":"100%","boxSizing":"border-box","background":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"type"},"component":"data2-core-types@Reference"},"comparisonSubject":"checkbox"}}],"then":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"component":"data2-core-types@DataLinkGetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record"}}}},"comparisonSubject":true}}],"then":"rgba(0,118,255,1)","else":{"params":{"reference":"super.fill"},"component":"data2-core-types@Reference"}}},"else":{"component":"data2-core-primitives@String","params":{"content":"transparent"}}}},"color":{"params":{"reference":"super.textColor"},"component":"data2-core-types@Reference"},"border":"none","outline":"none","appearance":"none","cursor":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"disabled"},"component":"data2-core-types@Reference"},"comparisonSubject":true}}],"then":"not-allowed","else":"auto"}}},"dataGetter":{"component":"data2-core-types@DataLinkGetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record"}}}},"dataSetter":{"component":"data2-core-types@DataLinkSetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record"}},"recordUpsert":{"component":"data2-core-types@Reference","params":{"reference":"recordUpsert"}},"mask":{"component":"data2-core-types@Reference","params":{"reference":"mask"}}}},"tabIndex":{"component":"data2-core-types@Reference","params":{"reference":"tabIndex"}},"step":{"component":"data2-core-types@Reference","params":{"reference":"step"}},"type":{"component":"data2-core-types@Reference","params":{"reference":"type"}},"preffix":{"component":"data2-core-types@Reference","params":{"reference":"preffix"}},"fixedValue":{"component":"data2-core-types@Reference","params":{"reference":"fixedValue"}},"placeholder":{"component":"data2-core-logical-operators@Or","params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":"placeholder"}},{"component":"data2-core-types@Reference","params":{"reference":"field"}}]}},"defaultChecked":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"type"},"component":"data2-core-types@Reference"},"comparisonSubject":"checkbox"}}],"then":{"component":"data2-core-types@DataLinkGetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record"}}}},"else":""}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"opacity":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"disabled"},"component":"data2-core-types@Reference"},"comparisonSubject":true}}],"then":0.38,"else":1}},"disabled":{"params":{"reference":"disabled"},"component":"data2-core-types@Reference"},"onBlur":{"component":"data2-core-types@Reference","params":{"reference":"onBlur"}},"onFocus":{"component":"data2-core-types@Reference","params":{"reference":"onFocus"}},"onChange":{"component":"data2-core-types@Reference","params":{"reference":"onChange"}}}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"tabIndex":"data2-core-primitives@Number","dataset":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@InteractiveModuleReference"}}},"component":"data2-core-types@ComponentParameter"},"field":{"component":"data2-core-types@DataSetColumnReference"},"record":{"component":"data2-core-types@Reference"},"placeholder":{"component":"data2-core-primitives@String"},"disabled":{"component":"data2-core-primitives@Boolean"},"fixedValue":{"component":"data2-core-primitives@String"},"preffix":{"component":"data2-core-primitives@String"},"onBlur":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour"},"component":"data2-core-types@ComponentParameter"},"onFocus":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour"},"component":"data2-core-types@ComponentParameter"},"onChange":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour"},"component":"data2-core-types@ComponentParameter"}}}},"component":"DataMoneyFieldBlock","package":"data2-blocks","extends":"data2-core-primitives@Block","icon":"usd","visibility":"public"},"updatedAt":"2023-10-26T19:31:44.162Z"},{"_id":"5f804e93c8da12be8b498dfa","component":"data2-core-types@Component","params":{"public":true,"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"html@textarea","params":{"style":{"width":"100%","height":"100%","resize":"none","boxSizing":"border-box","background":{"params":{"content":"transparent"},"component":"data2-core-primitives@String"},"color":{"params":{"reference":"super.textColor"},"component":"data2-core-types@Reference"},"border":"none","appearance":"none","outline":"none","cursor":{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"super.cursor"}}}},{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"disabled","source":"VIRTUAL_COMPONENT_PARAMS"},"component":"data2-core-types@Reference"},"comparisonSubject":true}}],"then":{"component":"data2-core-primitives@String","params":{"content":"not-allowed"}},"else":{"component":"data2-core-primitives@String","params":{"content":"auto"}}}}]},"component":"data2-core-logical-operators@Or"},"fontWeight":{"component":"data2-core-primitives@String","params":{"content":"inherit"}},"paddingLeft":{"component":"data2-core-flow@If","params":{"compare":[{"params":{"comparisonSubject":{"params":{},"component":"data2-core-primitives@Undefined"},"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"padding.left"}}}}},"component":"data2-core-comparison-operators@Different"}],"then":{"params":{"portions":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"padding.left"}}}},{"component":"data2-core-primitives@String","params":{"content":"px"}}]},"component":"data2-core-functions@StringConcat"}}},"paddingRight":{"component":"data2-core-flow@If","params":{"compare":[{"params":{"comparisonSubject":{"params":{},"component":"data2-core-primitives@Undefined"},"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"padding.right"}}}}},"component":"data2-core-comparison-operators@Different"}],"then":{"params":{"portions":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"padding.right"}}}},{"component":"data2-core-primitives@String","params":{"content":"px"}}]},"component":"data2-core-functions@StringConcat"}}},"paddingTop":{"component":"data2-core-flow@If","params":{"compare":[{"params":{"comparisonSubject":{"params":{},"component":"data2-core-primitives@Undefined"},"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"padding.top"}}}}},"component":"data2-core-comparison-operators@Different"}],"then":{"params":{"portions":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"padding.top"}}}},{"component":"data2-core-primitives@String","params":{"content":"px"}}]},"component":"data2-core-functions@StringConcat"}}},"paddingBottom":{"component":"data2-core-flow@If","params":{"compare":[{"params":{"comparisonSubject":{"params":{},"component":"data2-core-primitives@Undefined"},"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"padding.bottom"}}}}},"component":"data2-core-comparison-operators@Different"}],"then":{"params":{"portions":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"padding.bottom"}}}},{"component":"data2-core-primitives@String","params":{"content":"px"}}]},"component":"data2-core-functions@StringConcat"}}},"caretColor":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"caretColor"}}},"component":"data2-core-types@Reference"},"--d2-placeholder-color":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"placeholderTextColor"}}},"component":"data2-core-types@Reference"},"textAlign":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"super.textFormat.textAlign"}}},"component":"data2-core-types@Reference"}},"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"placeholder":{"component":"data2-core-logical-operators@Or","params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":"placeholder"}},{"component":"data2-core-types@Reference","params":{"reference":"field"}}]}},"value":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"type"},"component":"data2-core-types@Reference"},"comparisonSubject":"date"}}],"then":{"component":"data2-core-functions@DateFormat","params":{"date":{"component":"data2-core-types@DataLinkGetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record"}}}},"format":"YYYY-MM-DD"}},"else":{"component":"data2-core-types@DataLinkGetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record"}}}}}},"onChange":{"component":"data2-core-types@DataLinkSetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset","source":"VIRTUAL_COMPONENT_PARAMS"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field","source":"VIRTUAL_COMPONENT_PARAMS"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record","source":"VIRTUAL_COMPONENT_PARAMS"}},"recordUpsert":{"component":"data2-core-types@Reference","params":{"reference":"recordUpsert","source":"VIRTUAL_COMPONENT_PARAMS"}},"onChange":{"component":"data2-core-types@Reference","params":{"reference":"onChange","source":"VIRTUAL_COMPONENT_PARAMS"}},"mask":{"component":"data2-core-types@Reference","params":{"reference":"mask","source":"VIRTUAL_COMPONENT_PARAMS"}}}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"tabIndex":{"component":"data2-core-types@Reference","params":{"reference":"tabIndex"}},"maxLength":{"component":"data2-core-types@Reference","params":{"reference":"maxLength"}},"opacity":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"disabled"},"component":"data2-core-types@Reference"},"comparisonSubject":true}}],"then":0.38,"else":1}},"disabled":{"params":{"reference":"disabled"},"component":"data2-core-types@Reference"},"onFocus":{"component":"data2-core-types@Reference","params":{"reference":"onFocus"}},"onBlur":{"component":"data2-core-types@Reference","params":{"reference":"onBlur"}},"onKeyPress":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"onKeyPress"}}}},"autoCapitalize":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"autoCapitalize"}}}},"autoComplete":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Equal","params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":"builder"}},"comparisonSubject":true}}],"then":"new-password","else":{"params":{"components":[{"params":{"reference":"autoComplete","source":"VIRTUAL_COMPONENT_PARAMS"},"component":"data2-core-types@Reference"},{"component":"data2-core-primitives@String","params":{"content":"off"}}]},"component":"data2-core-logical-operators@Or"}}},"spellCheck":{"params":{"expression":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"spellCheck"}}},"component":"data2-core-types@Reference"},"cases":[{"component":"data2-core-flow@Case","params":{"expression":{"params":{"content":true},"component":"data2-core-primitives@Boolean"},"value":{"component":"data2-core-primitives@String","params":{"content":"true"}}}},{"component":"data2-core-flow@Case","params":{"expression":{"params":{"content":false},"component":"data2-core-primitives@Boolean"},"value":{"component":"data2-core-primitives@String","params":{"content":"false"}}}}]},"component":"data2-core-flow@Switch"},"lang":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"lang"}}}}}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"dataset":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@InteractiveModuleReference"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":0}}},"component":"data2-core-types@ComponentParameter"},"field":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetColumnReference"}},"category":"behaviour","icon":{"component":"data2-core-primitives@String","params":{"content":""}},"index":{"component":"data2-core-primitives@Number","params":{"content":0.5}},"alternativeParameterDefaultType":[{"parameter":{"component":"data2-core-primitives@String","params":{"content":"dataset"}},"value":{"params":{"reference":"__UIState"},"component":"data2-core-types@InteractiveModuleReference"},"type":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-user-interface@StateProp"}}},"component":"data2-core-types@ComponentParameter"}}],"shouldShow":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"dependsOn":[{"component":"data2-core-primitives@String","params":{"content":"dataset"}}]},"component":"data2-core-types@ComponentParameter"},"record":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Reference"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":5}}},"component":"data2-core-types@ComponentParameter"},"recordUpsert":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":6}}},"component":"data2-core-types@ComponentParameter"},"placeholder":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"},"disabled":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":2}}},"component":"data2-core-types@ComponentParameter"},"tabIndex":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":8}}},"component":"data2-core-types@ComponentParameter"},"maxLength":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":7}}},"component":"data2-core-types@ComponentParameter"},"onFocus":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":302}}},"component":"data2-core-types@ComponentParameter"},"onBlur":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":303}}},"component":"data2-core-types@ComponentParameter"},"onKeyPress":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":304}}},"component":"data2-core-types@ComponentParameter"},"onChange":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","description":{"component":"data2-core-primitives@String","params":{"content":"Sets what should happen when the content is modified."}}}},"padding":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"parameters":{"left":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}}},"component":"data2-core-types@ComponentParameter"},"right":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}}},"component":"data2-core-types@ComponentParameter"},"top":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}}},"component":"data2-core-types@ComponentParameter"},"bottom":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}}},"component":"data2-core-types@ComponentParameter"}},"visibility":"public","index":{"component":"data2-core-primitives@Number","params":{"content":110}},"category":"appearance"}},"autoCapitalize":{"params":{"component":"data2-core-primitives@String","category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":206.1}},"oneOf":[{"params":{"content":"off"},"component":"data2-core-primitives@String"},{"params":{"content":"on"},"component":"data2-core-primitives@String"},{"params":{"content":"words"},"component":"data2-core-primitives@String"},{"params":{"content":"characters"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"},"autoComplete":{"params":{"component":"data2-core-primitives@String","category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":206}},"oneOf":[{"params":{"content":"off"},"component":"data2-core-primitives@String"},{"params":{"content":"on"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"},"spellCheck":{"params":{"component":"data2-core-primitives@Boolean","category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":206.2}}},"component":"data2-core-types@ComponentParameter"},"lang":{"params":{"component":"data2-core-primitives@String","category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":206.3}}},"component":"data2-core-types@ComponentParameter"},"onEnter":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":304}}},"component":"data2-core-types@ComponentParameter"},"caretColor":{"params":{"component":"data2-core-types@Color","category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":111}}},"component":"data2-core-types@ComponentParameter"},"placeholderTextColor":{"params":{"component":"data2-core-types@Color","category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":1.5}}},"component":"data2-core-types@ComponentParameter"}}}},"component":"DataTextBlock","package":"data2-blocks","icon":"file-text","extends":"data2-core-primitives@Block","visibility":"public"},"updatedAt":"2026-04-28T15:09:00.302Z"},{"_id":"624c4d74e0fc64b6bf41ac26","component":"data2-core-types@Component","params":{"package":"data2-blocks","component":"FileField","extends":"data2-core-primitives@Block","public":true,"icon":"files-o","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"uploadText":{"component":"data2-core-primitives@String"},"replaceText":{"component":"data2-core-primitives@String"},"dataset":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"DataSet"}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@InteractiveModuleReference"}}},"component":"data2-core-types@ComponentParameter"},"record":{"component":"data2-core-types@Reference"},"field":{"component":"data2-core-types@DataSetColumnReference"},"folder":{"component":"data2-core-types@FileComponentReference"},"folderName":{"component":"data2-core-types@FieldReference"},"fileName":{"component":"data2-core-types@FieldReference"},"preview":{"component":"data2-core-primitives@Boolean"},"previewDimensions":{"component":"data2-core-types@Dimensions"},"previewFileName":{"component":"data2-core-primitives@Boolean"},"disabled":{"component":"data2-core-primitives@Boolean"},"autoSave":{"component":"data2-core-primitives@Boolean"},"tabIndex":"Number","multiple":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}}}},"onFilesUploadStart":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","injectContext":[{"component":"data2-core-primitives@String","params":{"content":"mouseEvent"}}],"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"onFilesUploadSuccess":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","injectContext":[{"component":"data2-core-primitives@String","params":{"content":"mouseEvent"}}],"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"onFilesUploadError":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","injectContext":[{"component":"data2-core-primitives@String","params":{"content":"mouseEvent"}}],"visibility":"public"},"component":"data2-core-types@ComponentParameter"}}}},"definition":{"preventEvaluation":true,"component":"data2-blocks@FileFieldControl","params":{"super":{"component":"data2-core-types@Reference","params":{"reference":"super"}},"uploadText":{"component":"data2-core-types@Reference","params":{"reference":"uploadText"}},"replaceText":{"component":"data2-core-types@Reference","params":{"reference":"replaceText"}},"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"folder":{"component":"data2-core-types@Reference","params":{"reference":"folder"}},"folderName":{"component":"data2-core-types@Reference","params":{"reference":"folderName"}},"fileName":{"component":"data2-core-types@Reference","params":{"reference":"fileName"}},"preview":{"component":"data2-core-types@Reference","params":{"reference":"preview"}},"previewDimensions":{"component":"data2-core-types@Reference","params":{"reference":"previewDimensions"}},"previewFileName":{"component":"data2-core-types@Reference","params":{"reference":"previewFileName"}},"disabled":{"component":"data2-core-types@Reference","params":{"reference":"disabled"}},"autoSave":{"component":"data2-core-types@Reference","params":{"reference":"autoSave"}},"tabIndex":{"component":"data2-core-types@Reference","params":{"reference":"tabIndex"}},"multiple":{"component":"data2-core-types@Reference","params":{"reference":"multiple"}},"FileComponentInstancesDataSet":{"component":"data2-core-types@Reference","params":{"reference":"FileComponentInstancesDataSet"}},"onFilesUploadStart":{"component":"data2-core-types@Reference","params":{"reference":"onFilesUploadStart"}},"onFilesUploadSuccess":{"component":"data2-core-types@Reference","params":{"reference":"onFilesUploadSuccess"}},"onFilesUploadError":{"component":"data2-core-types@Reference","params":{"reference":"onFilesUploadError"}}}},"visibility":"public"},"updatedAt":"2023-04-29T18:49:18.129Z"},{"_id":"624c5233e0fc64b6bf425d93","component":"data2-core-types@Component","params":{"package":"data2-blocks","component":"FilePreview","icon":"file-video-o","extends":"data2-core-primitives@Block","public":true,"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"file":{"component":"data2-core-primitives@String"},"previewText":{"component":"data2-core-primitives@String"},"icon":{"component":"data2-core-primitives@String"}}}},"definition":{"preventEvaluation":true,"component":"data2-blocks@FilePreviewControl","params":{"file":{"component":"data2-core-types@Reference","params":{"reference":"file"}},"previewText":{"component":"data2-core-types@Reference","params":{"reference":"previewText"}},"icon":{"component":"data2-core-types@Reference","params":{"reference":"icon"}}}},"visibility":"public"}},{"_id":"612009a592425036c3f3e06e","component":"data2-core-types@Component","params":{"public":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"params":{"dangerouslySetInnerHTML":{"__html":{"component":"data2-core-types@Reference","params":{"reference":"text"}}}},"component":"html@div"}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"text":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":202}},"multiLine":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}}}},"component":"Html","package":"data2-blocks","icon":"file-text","extends":"data2-core-primitives@Block","visibility":"public"},"updatedAt":"2022-03-31T16:08:35.474Z"},{"_id":"5fd9e0614369e2af95a95e67","component":"data2-core-types@Component","params":{"extends":"data2-core-primitives@Block","public":true,"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"html@i","params":{"aria-hidden":"true","style":{"display":"flex","justifyContent":"center","alignItems":"center","width":"100%","height":"100%","fontSize":{"params":{"reference":"size"},"component":"data2-core-types@Reference"},"color":{"params":{"compare":[{"params":{"subject":{"params":{"reference":"color"},"component":"data2-core-types@Reference"},"pattern":{"component":"data2-core-primitives@String","params":{"content":"gradient"}}},"component":"data2-core-functions@Includes"}],"else":{"params":{"components":[{"params":{"reference":"color"},"component":"data2-core-types@Reference"},{"params":{"reference":"super.textColor"},"component":"data2-core-types@Reference"}]},"component":"data2-core-logical-operators@Or"},"then":{"component":"data2-core-primitives@String","params":{"content":"transparent"}}},"component":"data2-core-flow@If"},"backgroundClip":{"component":"data2-core-primitives@String","params":{"content":"text"}},"WebkitBackgroundClip":{"component":"data2-core-primitives@String","params":{"content":"text"}},"backgroundImage":{"params":{"compare":[{"params":{"subject":{"params":{"reference":"color"},"component":"data2-core-types@Reference"},"pattern":{"component":"data2-core-primitives@String","params":{"content":"gradient"}}},"component":"data2-core-functions@Includes"}],"then":{"params":{"portions":[{"params":{"reference":"color"},"component":"data2-core-types@Reference"}]},"component":"data2-core-functions@StringConcat"},"else":{"component":"data2-core-primitives@String","params":{"content":"linear-gradient(transparent,transparent)"}}},"component":"data2-core-flow@If"},"transition":{"component":"data2-core-primitives@String","params":{"content":"inherit"}}},"className":{"component":"data2-core-functions@StringConcat","params":{"portions":["fa fa-",{"component":"data2-core-types@Reference","params":{"reference":"icon"}}]}}}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"icon":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@FontAwesomeIcon"}},"category":"appearance","dependsOn":[{"component":"data2-core-primitives@String","params":{"content":"iconSet"}}],"parameters":{},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"},"color":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Color"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":3}}},"component":"data2-core-types@ComponentParameter"},"size":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":2}}},"component":"data2-core-types@ComponentParameter"}}}},"component":"Icon","package":"data2-blocks","icon":"star","visibility":"deprecated","title":"FontAwesomeIcon"},"updatedAt":"2023-04-15T00:24:21.103Z"},{"_id":"6436f04bac93122e72906101","component":"data2-core-types@Component","params":{"extends":"data2-core-primitives@Block","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"html@i","params":{"aria-hidden":"true","style":{"display":"flex","justifyContent":"center","alignItems":"center","width":"100%","height":"100%","fontSize":{"params":{"reference":"size"},"component":"data2-core-types@Reference"},"color":{"params":{"compare":[{"params":{"subject":{"params":{"reference":"color"},"component":"data2-core-types@Reference"},"pattern":{"component":"data2-core-primitives@String","params":{"content":"gradient"}}},"component":"data2-core-functions@Includes"}],"else":{"params":{"components":[{"params":{"reference":"color"},"component":"data2-core-types@Reference"},{"params":{"reference":"super.textColor"},"component":"data2-core-types@Reference"}]},"component":"data2-core-logical-operators@Or"},"then":{"component":"data2-core-primitives@String","params":{"content":"transparent"}}},"component":"data2-core-flow@If"},"backgroundClip":{"component":"data2-core-primitives@String","params":{"content":"text"}},"WebkitBackgroundClip":{"component":"data2-core-primitives@String","params":{"content":"text"}},"backgroundImage":{"params":{"compare":[{"params":{"subject":{"params":{"reference":"color"},"component":"data2-core-types@Reference"},"pattern":{"component":"data2-core-primitives@String","params":{"content":"gradient"}}},"component":"data2-core-functions@Includes"}],"then":{"params":{"portions":[{"params":{"reference":"color"},"component":"data2-core-types@Reference"}]},"component":"data2-core-functions@StringConcat"},"else":{"component":"data2-core-primitives@String","params":{"content":"linear-gradient(transparent,transparent)"}}},"component":"data2-core-flow@If"},"transition":{"component":"data2-core-primitives@String","params":{"content":"inherit"}}},"className":{"component":"data2-core-types@Reference","params":{"reference":"icon"}}}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"icon":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-web@Icon"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"},"color":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Color"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":3}}},"component":"data2-core-types@ComponentParameter"},"size":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":2}}},"component":"data2-core-types@ComponentParameter"}}}},"component":"IconBlock","title":"Icon","package":"data2-blocks","icon":"star","visibility":"public"},"updatedAt":"2023-04-17T13:12:55.171Z","createdAt":"2023-04-12T17:48:40.724Z"},{"_id":"60019e844369e2af95919c94","component":"data2-core-types@Component","params":{"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"html@iframe","params":{"frameBorder":"0","src":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-types@Reference","params":{"reference":"builder"}}],"then":"about:blank","else":{"component":"data2-core-types@Reference","params":{"reference":"url"}}}},"allow":"autoplay","allowFullScreen":{"component":"data2-core-types@Reference","params":{"reference":"allowFullScreen"}},"loading":"lazy","style":{"position":"absolute","width":"100%","height":"100%","border":"none","padding":"none","overflow":"auto"}}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"url":"String","allowFullScreen":{"component":"data2-core-primitives@Boolean"},"allowAutoPlay":{"component":"data2-core-primitives@Boolean"}}}},"public":true,"component":"IframeBlock","package":"data2-blocks","icon":"chrome","extends":"data2-core-primitives@Block","visibility":"public"}},{"_id":"5f51018da575399a457b2721","component":"data2-core-types@Component","params":{"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":"repeat"}},"comparisonSubject":"no-repeat"}}],"else":{"component":"html@div","params":{"style":{"backgroundImage":{"component":"data2-core-functions@StringConcat","params":{"portions":["url(",{"component":"data2-core-types@Reference","params":{"reference":"src"}},")"]}},"backgroundSize":{"component":"data2-core-types@Reference","params":{"reference":"size"}},"backgroundPositionX":{"component":"data2-core-types@Reference","params":{"reference":"positionX"}},"backgroundPositionY":{"component":"data2-core-types@Reference","params":{"reference":"positionY"}},"backgroundRepeat":{"component":"data2-core-types@Reference","params":{"reference":"repeat"}},"position":"relative","width":"100%","height":"100%","border":"none","padding":"none","overflow":"hidden"}}},"then":{"component":"html@img","params":{"src":{"component":"data2-core-types@Reference","params":{"reference":"src"}},"alt":{"component":"data2-core-types@Reference","params":{"reference":"src"}},"width":"100%","height":"100%","loading":"lazy","style":{"objectFit":{"params":{"defaultCase":"none","cases":[{"component":"data2-core-flow@Case","params":{"expression":"cover","value":{"component":"data2-core-types@Reference","params":{"reference":"size"}}}},{"component":"data2-core-flow@Case","params":{"expression":"contain","value":{"component":"data2-core-types@Reference","params":{"reference":"size"}}}},{"component":"data2-core-flow@Case","params":{"expression":"100%","value":"cover"}}],"expression":{"component":"data2-core-types@Reference","params":{"reference":"size"}}},"component":"data2-core-flow@Switch"},"objectPosition":{"component":"data2-core-functions@StringConcat","params":{"portions":[{"component":"data2-core-logical-operators@Or","params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":"positionX"}},"left"]}}," ",{"component":"data2-core-logical-operators@Or","params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":"positionY"}},"top"]}}]}},"display":{"component":"data2-core-primitives@String","params":{"content":"block"}}}}}}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"src":{"component":"data2-core-types@FileComponentUrlReference"},"size":{"component":"data2-core-primitives@String","oneOf":["cover","contain","100%","inherit"]},"positionX":{"component":"data2-core-primitives@String","oneOf":["left","center","right"]},"positionY":{"component":"data2-core-primitives@String","oneOf":["bottom","center","top"]},"repeat":{"component":"data2-core-primitives@String","oneOf":["repeatX","repeatY","repeat","no-repeat"]}}}},"public":true,"component":"ImageBlock","package":"data2-blocks","icon":"picture-o","extends":"data2-core-primitives@Block","visibility":"public"},"updatedAt":"2023-07-11T13:17:15.637Z"},{"_id":"60e6362dda3861ca6516d9b1","component":"data2-core-types@Component","params":{"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-controls@JsonViewer","params":{"json":{"params":{"reference":"json"},"component":"data2-core-types@Reference"},"theme":{"params":{"reference":"theme"},"component":"data2-core-types@Reference"},"collapsed":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"collapsed"}}},"component":"data2-core-types@Reference"}}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"json":{"params":{"component":"data2-core-types@Getter","visibility":"public","index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"},"theme":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"oneOf":["apathy","apathy:inverted","ashes","bespin","brewer","bright:inverted","bright","chalk","codeschool","colors","eighties","embers","flat","google","grayscale","grayscale:inverted","greenscreen","harmonic","hopscotch","isotope","marrakesh","mocha","monokai","ocean","paraiso","pop","railscasts","rjv-default","shapeshifter","shapeshifter:inverted","solarized","summerfruit","summerfruit:inverted","threezerotwofour","tomorrow","tube","twilight"],"visibility":"public","index":{"component":"data2-core-primitives@Number","params":{"content":2}}},"component":"data2-core-types@ComponentParameter"},"collapsed":{"params":{"component":"data2-core-primitives@Number","visibility":"public","index":{"component":"data2-core-primitives@Number","params":{"content":3}}},"component":"data2-core-types@ComponentParameter"}}}},"public":true,"component":"JsonViewer","package":"data2-blocks","icon":"code","extends":"data2-core-primitives@Block","visibility":"public"},"updatedAt":"2023-12-23T18:51:10.276Z"},{"_id":"5ed48494455d775111ed422a","component":"data2-core-types@Component","params":{"public":false,"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"params":{"children":{"component":"data2-core-types@Reference","params":{"reference":"text"}},"dimensions":{"params":{"reference":"dimensions"},"component":"data2-core-types@Reference"},"position":{"params":{"reference":"position"},"component":"data2-core-types@Reference"},"textColor":{"params":{"reference":"textColor"},"component":"data2-core-types@Reference"},"textSize":{"params":{"reference":"textSize"},"component":"data2-core-types@Reference"}},"component":"data2-core-primitives@Block"}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"dimensions":{"component":"data2-core-types@Dimensions"},"position":{"component":"data2-core-types@Position"},"text":"String","textSize":"Number"}}},"component":"Label","package":"data2-blocks","visibility":"public"}},{"_id":"5f52b1caa575399a45d58d13","component":"data2-core-types@Component","params":{"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"html@label","params":{"children":{"component":"data2-core-types@Reference","params":{"reference":"label"}},"style":{"width":"100%","height":"100%","border":"none","display":"inline-block","background":{"params":{"reference":"super.fill"},"component":"data2-core-types@Reference"},"color":{"params":{"reference":"super.textColor"},"component":"data2-core-types@Reference"},"fontSize":{"params":{"reference":"super.textSize"},"component":"data2-core-types@Reference"},"textShadow":{"params":{"reference":"textShadow"},"component":"data2-core-types@Reference"}}}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"label":{"component":"String"},"textShadow":{"component":"data2-core-types@SimpleShadow"}}}},"public":false,"component":"LabelDj","package":"data2-blocks","icon":"tag","extends":"data2-core-primitives@Block","visibility":"deprecated"}},{"_id":"62f2ba46527e414c4c90b0c9","component":"data2-core-types@Component","params":{"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"html@a","params":{"style":{"width":"100%","height":"100%","boxSizing":"border-box","border":"none","appearance":"none","outline":"none","cursor":"pointer","display":"flex","alignItems":"center","justifyContent":"center","position":"absolute","textDecoration":"none","top":0,"left":0,"zIndex":1},"rel":"noopener noreferrer","href":{"params":{"reference":"link"},"component":"data2-core-types@Reference"},"target":{"params":{"reference":"target"},"component":"data2-core-types@Reference"},"onClick":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-logical-operators@Not","params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-functions@Match","params":{"text":{"params":{"reference":"link"},"component":"data2-core-types@Reference"},"pattern":"^http"}},"prop":"length"}}}},{"params":{"reference":"super.onClick"},"component":"data2-core-types@Reference"},{"component":"data2-core-logical-operators@Not","params":{"subject":{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"target"},"component":"data2-core-types@Reference"},"comparisonSubject":"_blank"}}}}],"then":{"params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"event"}}],"body":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"module":{"params":{"reference":"event"},"component":"data2-core-types@Reference"},"prop":"button"},"component":"data2-core-types@Getter"},"comparisonSubject":0}},{"component":"data2-core-logical-operators@Not","params":{"subject":{"component":"data2-core-logical-operators@Or","params":{"components":[{"params":{"module":{"params":{"reference":"event"},"component":"data2-core-types@Reference"},"prop":"metaKey"},"component":"data2-core-types@Getter"},{"params":{"module":{"params":{"reference":"event"},"component":"data2-core-types@Reference"},"prop":"altKey"},"component":"data2-core-types@Getter"},{"params":{"module":{"params":{"reference":"event"},"component":"data2-core-types@Reference"},"prop":"ctrlKey"},"component":"data2-core-types@Getter"},{"params":{"module":{"params":{"reference":"event"},"component":"data2-core-types@Reference"},"prop":"shiftKey"},"component":"data2-core-types@Getter"}]}}}}],"then":{"params":{"module":{"params":{"reference":"event"},"component":"data2-core-types@Reference"},"prop":{"component":"data2-core-primitives@String","params":{"content":"preventDefault"}}},"component":"data2-core-types@Getter"}}}},"component":"data2-core-functions@Function"}}},"children":{"component":"html@span","params":{"style":{"width":"100%","display":"inline-block","position":"relative","whiteSpace":"pre-wrap","top":{"params":{"reference":"super.textFormat.top"},"component":"data2-core-types@Reference"},"left":{"params":{"reference":"super.textFormat.left"},"component":"data2-core-types@Reference"},"transform":{"params":{"reference":"super.textFormat.transform"},"component":"data2-core-types@Reference"},"lineHeight":{"params":{"reference":"super.textFormat.lineHeight"},"component":"data2-core-types@Reference"},"letterSpacing":{"params":{"reference":"super.textFormat.letterSpacing"},"component":"data2-core-types@Reference"},"textAlign":{"params":{"reference":"super.textFormat.textAlign"},"component":"data2-core-types@Reference"}},"children":{"params":{"reference":"label"},"component":"data2-core-types@Reference"}}}}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"link":{"component":"data2-core-primitives@String"},"target":{"component":"data2-core-primitives@String","oneOf":["_parent","_self","_blank","_top"]}}}},"component":"Link","package":"data2-blocks","icon":"link","extends":"data2-core-primitives@Block","visibility":"private"}},{"_id":"61438422fca3809432310874","component":"data2-core-types@Component","params":{"public":true,"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"html@a","params":{"rel":"noopener noreferrer","style":{"width":"100%","height":"100%","boxSizing":"border-box","color":{"params":{"reference":"super.textColor"},"component":"data2-core-types@Reference"},"border":"none","appearance":"none","outline":"none","cursor":"pointer","display":"flex","alignItems":"center","justifyContent":"center","position":"relative","textDecoration":"none"},"children":{"component":"html@span","params":{"style":{"width":"100%","display":"inline-block","position":"relative","whiteSpace":"pre-wrap","top":{"params":{"reference":"super.textFormat.top"},"component":"data2-core-types@Reference"},"left":{"params":{"reference":"super.textFormat.left"},"component":"data2-core-types@Reference"},"transform":{"params":{"reference":"super.textFormat.transform"},"component":"data2-core-types@Reference"},"lineHeight":{"params":{"reference":"super.textFormat.lineHeight"},"component":"data2-core-types@Reference"},"letterSpacing":{"params":{"reference":"super.textFormat.letterSpacing"},"component":"data2-core-types@Reference"},"textAlign":{"params":{"reference":"super.textFormat.textAlign"},"component":"data2-core-types@Reference"}},"children":{"params":{"reference":"label"},"component":"data2-core-types@Reference"}}},"href":{"params":{"reference":"link"},"component":"data2-core-types@Reference"},"target":{"params":{"reference":"target"},"component":"data2-core-types@Reference"}}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"link":{"component":"data2-core-primitives@String"},"label":{"component":"data2-core-primitives@String"},"target":{"component":"data2-core-primitives@String","oneOf":["_parent","_self","_blank","_top"]}}}},"component":"LinkBlock","package":"data2-blocks","icon":"link","extends":"data2-core-primitives@Block","visibility":"public"}},{"_id":"63cad59c55ade32bcad59361","component":"data2-core-types@Component","params":{"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-controls@MarkdownViewer","params":{"markdown":{"params":{"reference":"markdown"},"component":"data2-core-types@Reference"},"removeDefaultPadding":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"removeDefaultPadding"}}}}}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"markdown":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"defaultTarget":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String"}},"removeDefaultPadding":{"params":{"visibility":"public","component":"data2-core-primitives@Boolean"},"component":"data2-core-types@ComponentParameter"}}}},"component":"MarkdownViewer","package":"data2-blocks","icon":"code","extends":"data2-core-primitives@Block","visibility":"public"},"updatedAt":"2025-06-23T05:59:15.356Z"},{"_id":"5f7e8c44c8da12be8bb07aac","component":"data2-core-types@Component","params":{"public":true,"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"html@marquee","params":{"style":{"width":"100%","height":"100%","boxSizing":"border-box","background":{"params":{"reference":"super.fill"},"component":"data2-core-types@Reference"},"color":{"params":{"reference":"super.textColor"},"component":"data2-core-types@Reference"},"border":"none","appearance":"none","outline":"none","textDecoration":"none"},"children":{"params":{"reference":"label"},"component":"data2-core-types@Reference"},"behavior":{"params":{"reference":"behavior"},"component":"data2-core-types@Reference"},"direction":{"params":{"reference":"direction"},"component":"data2-core-types@Reference"},"scrollDelay":{"params":{"reference":"scrollDelay"},"component":"data2-core-types@Reference"},"scrollAmount":{"params":{"reference":"scrollAmount"},"component":"data2-core-types@Reference"},"loop":{"params":{"reference":"loop"},"component":"data2-core-types@Reference"}}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"behavior":{"component":"data2-core-primitives@String"},"direction":{"component":"data2-core-primitives@String"},"scrollDelay":{"component":"data2-core-primitives@Number"},"scrollAmount":{"component":"data2-core-primitives@Number"},"loop":{"component":"data2-core-primitives@Number"},"label":{"component":"data2-core-primitives@String"}}}},"component":"MarqueeBlock","package":"data2-blocks","icon":"link","extends":"data2-core-primitives@Block","visibility":"public"}},{"_id":"6070eaf1d7ec64d5fc7d457c","component":"data2-core-types@Component","params":{"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-controls@ModelViewer","params":{"model":{"width":{"component":"data2-core-types@Reference","params":{"reference":"super.dimensions.width"}},"height":{"component":"data2-core-types@Reference","params":{"reference":"super.dimensions.height"}},"anitialias":true,"model":{"component":"data2-core-types@Reference","params":{"reference":"model"}},"lightColor":{"component":"data2-core-types@Reference","params":{"reference":"lightColor"}},"positionX":{"component":"data2-core-types@Reference","params":{"reference":"positionX"}},"positionY":{"component":"data2-core-types@Reference","params":{"reference":"positionY"}},"positionZ":{"component":"data2-core-types@Reference","params":{"reference":"positionZ"}},"rotationX":{"component":"data2-core-types@Reference","params":{"reference":"rotationX"}},"rotationY":{"component":"data2-core-types@Reference","params":{"reference":"rotationY"}},"rotationZ":{"component":"data2-core-types@Reference","params":{"reference":"rotationZ"}}}}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"model":{"component":"data2-core-types@FileReference"},"lightColor":{"component":"data2-core-types@Color"},"rotationX":{"component":"data2-core-primitives@Number"},"rotationY":{"component":"data2-core-primitives@Number"},"rotationZ":{"component":"data2-core-primitives@Number"},"positionX":{"component":"data2-core-primitives@Number"},"positionY":{"component":"data2-core-primitives@Number"},"positionZ":{"component":"data2-core-primitives@Number"}}}},"public":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"component":"ModelViewer","package":"data2-blocks","icon":"cube","extends":"data2-core-primitives@Block","visibility":"deprecated"},"updatedAt":"2022-04-06T14:00:17.985Z"},{"_id":"5f08e5c51ca96def4266038f","component":"data2-core-types@Component","params":{"package":"data2-blocks","component":"OldFileField","extends":"data2-core-primitives@Block","public":true,"icon":"files-o","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"uploadText":{"component":"data2-core-primitives@String"},"replaceText":{"component":"data2-core-primitives@String"},"dataset":{"component":"data2-core-types@DataSetReference"},"record":{"component":"data2-core-types@Reference"},"field":{"component":"data2-core-types@DataSetColumnReference"},"folder":{"component":"data2-core-types@FileComponentReference"},"folderName":{"component":"data2-core-types@FieldReference"},"fileName":{"component":"data2-core-types@FieldReference"},"preview":{"component":"data2-core-primitives@Boolean"},"previewDimensions":{"component":"data2-core-types@Dimensions"},"previewFileName":{"component":"data2-core-primitives@Boolean"},"disabled":{"component":"data2-core-primitives@Boolean"},"autoSave":{"component":"data2-core-primitives@Boolean"},"tabIndex":"Number"}}},"visibility":"deprecated"}},{"_id":"5fa416a4c8da12be8bb2a922","component":"data2-core-types@Component","params":{"package":"data2-blocks","component":"OldFilePreview","icon":"file-video-o","extends":"data2-core-primitives@Block","public":true,"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"file":{"component":"data2-core-primitives@String"},"previewText":{"component":"data2-core-primitives@String"},"icon":{"component":"data2-core-primitives@String"}}}},"visibility":"deprecated"}},{"_id":"5f97389ec8da12be8b0859e3","component":"data2-core-types@Component","params":{"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-controls@Placeholder","params":{"fill":{"component":"data2-core-types@Reference","params":{"reference":"super.fill"}},"highlightColor":{"component":"data2-core-types@Reference","params":{"reference":"super.textColor"}},"width":{"component":"data2-core-types@Reference","params":{"reference":"super.dimensions.width"}},"height":{"component":"data2-core-types@Reference","params":{"reference":"super.dimensions.height"}},"duration":{"component":"data2-core-types@Reference","params":{"reference":"duration"}},"delay":{"component":"data2-core-types@Reference","params":{"reference":"delay"}}}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"duration":{"component":"data2-core-primitives@Number","index":0},"delay":{"component":"data2-core-primitives@Number","index":1}}}},"public":true,"component":"Placeholder","package":"data2-blocks","icon":"spinner","extends":"data2-core-primitives@Block","visibility":"public"}},{"_id":"5f6f7eeee2d6fd3e216ae8a4","component":"data2-core-types@Component","params":{"extendable":{"placeholder":"children"},"package":"data2-blocks","component":"Repeater","public":false,"extends":"data2-core-primitives@Block","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"dataset":{"component":"data2-core-types@DataSetReference"}}}},"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-core-functions@MapRecords","params":{"component":{"component":"data2-core-types@Reference","params":{"reference":"children"}},"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}}}}}},"visibility":"deprecated"},"updatedAt":"2022-03-22T14:29:53.459Z"},{"_id":"6123ff1592425036c3729a0a","component":"data2-core-types@Component","params":{"public":true,"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-controls@RichTextEditor","params":{"style":{"width":"100%","height":"100%","boxSizing":"border-box","background":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"type"},"component":"data2-core-types@Reference"},"comparisonSubject":"checkbox"}}],"then":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"component":"data2-core-types@DataLinkGetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record"}}}},"comparisonSubject":true}}],"then":"rgba(0,118,255,1)","else":{"params":{"reference":"super.fill"},"component":"data2-core-types@Reference"}}},"else":{"params":{"reference":"super.fill"},"component":"data2-core-types@Reference"}}},"color":{"params":{"reference":"super.textColor"},"component":"data2-core-types@Reference"},"border":"none","outline":"none","appearance":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"orient"},"component":"data2-core-types@Reference"},"comparisonSubject":"vertical"}}],"then":"slider-vertical","else":"none"}},"cursor":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"disabled"},"component":"data2-core-types@Reference"},"comparisonSubject":true}}],"then":"not-allowed","else":"auto"}}},"value":{"component":"data2-core-types@DataLinkGetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record"}},"mask":{"component":"data2-core-types@Reference","params":{"reference":"mask"}}}},"onChange":{"component":"data2-core-types@DataLinkSetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record"}},"recordUpsert":{"component":"data2-core-types@Reference","params":{"reference":"recordUpsert"}},"onChange":{"component":"data2-core-types@Reference","params":{"reference":"onChange"}},"mask":{"component":"data2-core-types@Reference","params":{"reference":"mask"}}}},"opacity":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"disabled"},"component":"data2-core-types@Reference"},"comparisonSubject":true}}],"then":0.38,"else":1}},"disabled":{"params":{"reference":"disabled"},"component":"data2-core-types@Reference"},"spellCheck":{"params":{"reference":"spellCheck"},"component":"data2-core-types@Reference"},"placeholder":{"component":"data2-core-logical-operators@Or","params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":"placeholder"}},{"component":"data2-core-types@Reference","params":{"reference":"field"}}]}},"toolbar":{"params":{"reference":"toolbar"},"component":"data2-core-types@Reference"},"toolbarFill":{"params":{"reference":"toolbarFill"},"component":"data2-core-types@Reference"},"toolbarTextColor":{"params":{"reference":"toolbarTextColor"},"component":"data2-core-types@Reference"}}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"dataset":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@InteractiveModuleReference"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":91}}},"component":"data2-core-types@ComponentParameter"},"field":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetColumnReference"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":92}}},"component":"data2-core-types@ComponentParameter"},"record":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Reference"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":203}}},"component":"data2-core-types@ComponentParameter"},"recordUpsert":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":204}}},"component":"data2-core-types@ComponentParameter"},"placeholder":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":102}}},"component":"data2-core-types@ComponentParameter"},"disabled":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":205}}},"component":"data2-core-types@ComponentParameter"},"onChange":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":301}}},"component":"data2-core-types@ComponentParameter"},"spellCheck":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":205}}},"component":"data2-core-types@ComponentParameter"},"toolbar":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@FieldSet"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Toolbar options"}}}},"toolbarFill":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Fill"}}}},"toolbarTextColor":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Color"}},"visibility":"private"}}}}},"component":"RichTextEditor","package":"data2-blocks","icon":"keyboard-o","extends":"data2-core-primitives@Block","visibility":"public"},"updatedAt":"2022-03-22T20:33:21.048Z"},{"_id":"61045854f302195bad7ea128","component":"data2-core-types@Component","params":{"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-controls@Spinner","params":{"spinner":{"component":"data2-core-types@Reference","params":{"reference":"spinner"}},"color":{"component":"data2-core-types@Reference","params":{"reference":"super.textColor"}},"width":{"component":"data2-core-types@Reference","params":{"reference":"super.dimensions.width"}},"height":{"component":"data2-core-types@Reference","params":{"reference":"super.dimensions.height"}},"speed":{"component":"data2-core-types@Reference","params":{"reference":"speed"}},"size":{"component":"data2-core-types@Reference","params":{"reference":"super.textSize"}},"margin":{"component":"data2-core-logical-operators@Or","params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":"margin"}},0]}}}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"spinner":{"component":"data2-core-primitives@String","oneOf":["Bar","Beat","Bounce","Circle","ClimbingBox","Clip","Clock","Dot","Fade","Grid","Hash","Moon","Pacman","Propagate","Puff","Pulse","Ring","Rise","Rotate","Scale","Sync"],"index":0},"speed":{"component":"data2-core-primitives@Number","index":1}}}},"public":true,"component":"Spinner","package":"data2-blocks","icon":"spinner","extends":"data2-core-primitives@Block","visibility":"public"},"updatedAt":"2025-01-13T18:04:24.324Z"},{"_id":"6a46c97314c51b168503d8a5","component":"data2-core-types@Component","params":{"component":"SvgIcon","package":"data2-blocks","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"color":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-types@Color"}},"src":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"},"StrokeDashArray":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Number"}},"StrokeDashOffset":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Number"}},"strokeColor":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-types@Color"}},"strokeWidth":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Number"}},"corners":{"params":{"component":"data2-core-primitives@String","oneOf":[{"component":"data2-core-primitives@String","params":{"content":"round"}},{"component":"data2-core-primitives@String","params":{"content":"sharp"}}]},"component":"data2-core-types@ComponentParameter"}}}},"icon":{"component":"data2-core-primitives@String","params":{"content":"star-o"}},"definition":{"component":"data2-blocks@SvgImageBlockControl","params":{"src":{"component":"data2-core-types@Reference","params":{"reference":"src"}},"color":{"component":"data2-core-types@Reference","params":{"reference":"color"}},"strokeColor":{"component":"data2-core-types@Reference","params":{"reference":"strokeColor"}},"strokeWidth":{"component":"data2-core-types@Reference","params":{"reference":"strokeWidth"}},"StrokeDashArray":{"component":"data2-core-types@Reference","params":{"reference":"StrokeDashArray"}},"StrokeDashOffset":{"component":"data2-core-types@Reference","params":{"reference":"StrokeDashOffset"}},"corners":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"corners"}}}}},"preventEvaluation":true},"visibility":"private","extends":"data2-core-primitives@Block"},"updatedAt":"2026-07-03T00:15:52.406Z","createdAt":"2026-07-02T20:26:27.257Z"},{"_id":"605a44ee28c3be06a615ddcc","component":"data2-core-types@Component","params":{"definition":{"component":"data2-core-types@Definition","params":{"def":{"component":"html@div","params":{"style":{"width":"100%","height":"100%","background":{"component":"data2-core-types@Reference","params":{"reference":"color"}},"maskImage":{"component":"data2-core-functions@StringConcat","params":{"portions":["url(",{"component":"data2-core-types@Reference","params":{"reference":"src"}},")"]}},"WebkitMaskImage":{"component":"data2-core-functions@StringConcat","params":{"portions":["url(",{"component":"data2-core-types@Reference","params":{"reference":"src"}},")"]}},"maskSize":"contain","WebkitMaskSize":"contain","maskRepeat":"no-repeat","WebkitMaskRepeat":"no-repeat","maskPosition":"center","WebkitMaskPosition":"center","StrokeDashArray":{"component":"data2-core-types@Reference","params":{"reference":"StrokeDashArray"}},"StrokeDashOffset":{"component":"data2-core-types@Reference","params":{"reference":"StrokeDashOffset"}},"stroke":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"strokeColor"}}}},"strokeWidth":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"strokeWidth"}}}}}}}},"preventEvaluation":true},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"color":{"component":"data2-core-types@Fill"},"src":{"component":"data2-core-types@FileComponentUrlReference"},"StrokeDashArray":{"params":{"component":"data2-core-primitives@Number"},"component":"data2-core-types@ComponentParameter"},"StrokeDashOffset":{"params":{"component":"data2-core-primitives@Number"},"component":"data2-core-types@ComponentParameter"},"strokeColor":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-types@Color"}},"strokeWidth":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Number"}},"inline":{"params":{"component":"data2-core-primitives@Boolean","defaultValue":{"params":{},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-types@ComponentParameter"}}}},"public":true,"component":"SvgImageBlock","package":"data2-blocks","icon":"star-o","extends":"data2-core-primitives@Block","visibility":"public"},"updatedAt":"2026-07-06T18:05:44.136Z"},{"_id":"63ac4b5ee920c80b07ecb724","component":"data2-core-types@Component","params":{"public":false,"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-controls@SyntheticInput","params":{"value":{"params":{"expression":{"params":{"content":true},"component":"data2-core-primitives@Boolean"},"defaultCase":{"component":"data2-core-types@DataLinkGetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record"}},"mask":{"component":"data2-core-types@Reference","params":{"reference":"mask"}}}},"cases":[{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"type"},"component":"data2-core-types@Reference"},"comparisonSubject":"date"}},"value":{"component":"data2-core-functions@DateFormat","params":{"date":{"component":"data2-core-types@DataLinkGetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record"}}}},"format":"YYYY-MM-DD","strict":false}}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"type"},"component":"data2-core-types@Reference"},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"month"}}}},"value":{"component":"data2-core-functions@DateFormat","params":{"date":{"component":"data2-core-types@DataLinkGetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record"}}}},"format":{"component":"data2-core-primitives@String","params":{"content":"YYYY-MM"}},"strict":false}}}}]},"component":"data2-core-flow@Switch"},"onChange":{"component":"data2-core-types@DataLinkSetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record"}},"recordUpsert":{"component":"data2-core-types@Reference","params":{"reference":"recordUpsert"}},"onChange":{"component":"data2-core-types@Reference","params":{"reference":"onChange"}},"mask":{"component":"data2-core-types@Reference","params":{"reference":"mask"}}}},"defaultChecked":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"type"},"component":"data2-core-types@Reference"},"comparisonSubject":"checkbox"}}],"then":{"component":"data2-core-types@DataLinkGetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record"}}}},"else":""}}}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"tabIndex":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":210}}},"component":"data2-core-types@ComponentParameter"},"dataset":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@InteractiveModuleReference"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":91}}},"component":"data2-core-types@ComponentParameter"},"field":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetColumnReference"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":92}},"alternativeParameterDefaultType":[{"parameter":{"component":"data2-core-primitives@String","params":{"content":"dataset"}},"value":{"params":{"reference":"__UIState"},"component":"data2-core-types@InteractiveModuleReference"},"type":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-user-interface@StateProp"}}},"component":"data2-core-types@ComponentParameter"}}],"shouldShow":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"dependsOn":[{"component":"data2-core-primitives@String","params":{"content":"dataset"}}]},"component":"data2-core-types@ComponentParameter"},"record":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Reference"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":203}}},"component":"data2-core-types@ComponentParameter"},"recordUpsert":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":204}}},"component":"data2-core-types@ComponentParameter"},"type":{"params":{"oneOf":["time","month","text","number","checkbox","email","password","range","date","color","radio"],"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":101}}},"component":"data2-core-types@ComponentParameter"},"mask":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":103}}},"component":"data2-core-types@ComponentParameter"},"placeholder":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":102}}},"component":"data2-core-types@ComponentParameter"},"disabled":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":205}}},"component":"data2-core-types@ComponentParameter"},"autoComplete":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":206}}},"component":"data2-core-types@ComponentParameter"},"step":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":207}}},"component":"data2-core-types@ComponentParameter"},"maxLength":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":208}}},"component":"data2-core-types@ComponentParameter"},"min":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":208}}},"component":"data2-core-types@ComponentParameter"},"max":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":209}}},"component":"data2-core-types@ComponentParameter"},"orient":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"oneOf":[{"params":{"content":"vertical"},"component":"data2-core-primitives@String"},{"params":{"content":"horizontal"},"component":"data2-core-primitives@String"}],"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":104}}},"component":"data2-core-types@ComponentParameter"},"onChange":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":301}}},"component":"data2-core-types@ComponentParameter"},"onFocus":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":302}}},"component":"data2-core-types@ComponentParameter"},"onBlur":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":303}}},"component":"data2-core-types@ComponentParameter"},"onKeyPress":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":304}}},"component":"data2-core-types@ComponentParameter"}}}},"component":"SynthDataFieldBlock","package":"data2-blocks","icon":"keyboard-o","extends":"data2-core-primitives@Block","visibility":"private"},"updatedAt":"2022-10-03T18:40:22.290Z"},{"_id":"5f6cb5c4a575399a456635b9","component":"data2-core-types@Component","params":{"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-controls@DynamicVideo","params":{"children":{"component":"html@source","params":{"src":{"component":"data2-core-types@Reference","params":{"reference":"videoFile"}}}},"muted":{"component":"data2-core-logical-operators@Or","params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":"autoPlay"}},{"component":"data2-core-types@Reference","params":{"reference":"muted"}}]}},"source":{"component":"data2-core-types@Reference","params":{"reference":"videoFile"}},"playsInline":{"component":"data2-core-types@Reference","params":{"reference":"playsInline"}},"chapters":{"component":"data2-core-types@Reference","params":{"reference":"chapters"}},"autoPlay":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Equal","params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":"builder"}},"comparisonSubject":true}}],"then":false,"else":{"component":"data2-core-types@Reference","params":{"reference":"autoPlay"}}}},"loop":{"component":"data2-core-types@Reference","params":{"reference":"loop"}},"controls":{"component":"data2-core-types@Reference","params":{"reference":"showControls"}},"poster":{"component":"data2-core-types@Reference","params":{"reference":"poster"}},"style":{"position":"absolute","width":"100%","height":{"params":{"components":[{"params":{"reference":"style.height"},"component":"data2-core-types@Reference"},{"component":"data2-core-primitives@String","params":{"content":"100%"}}]},"component":"data2-core-logical-operators@Or"},"border":"none","padding":"none","overflow":"hidden"}}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"videoFile":{"component":"data2-core-types@FileComponentUrlReference"},"autoPlay":"Boolean","loop":"Boolean","showControls":"Boolean","muted":"Boolean","chapters":{"component":"data2-core-media@Chapter","list":true},"playsInline":"Boolean","poster":{"component":"data2-core-types@FileComponentUrlReference"}}}},"component":"VideoBlock","package":"data2-blocks","icon":"video-camera","extends":"data2-core-primitives@Block","visibility":"public"},"updatedAt":"2025-01-17T03:37:51.460Z"},{"_id":"602e95f2c2dd12f0597f2d34","component":"data2-core-types@Component","params":{"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-controls@ChatRoom","params":{"roomname":{"component":"data2-core-types@Reference","params":{"reference":"roomname"}}}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"roomname":{"component":"data2-core-primitives@String"}}}},"public":true,"component":"VideoChatBlock","package":"data2-blocks","extends":"data2-core-primitives@Block","icon":"video-camera","visibility":"public"}},{"_id":"628cbfffa847c1744ef50362","component":"data2-core-types@Component","params":{"package":"data2-cashier","component":"Cart","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"position":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Position"}},"category":"appearance","simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"},"dimensions":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Dimensions"}},"category":"appearance","simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}},"defaultValue":{"preventEvaluation":true,"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768}},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"},"productsDataset":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetReference"}},"category":"appearance","simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":101}}},"component":"data2-core-types@ComponentParameter"},"paymentProvider":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-cashier@PaymentProviderReference"}},"category":"appearance","simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":101}}},"component":"data2-core-types@ComponentParameter"}}}},"title":{"component":"data2-core-primitives@String","params":{"content":"Cart"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"shopping-cart"}},"visibility":"private","interactions":{"params":{"fields":{"addItem":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"cart-plus"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"removeItem":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"cart-arrow-down"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"checkout":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"shopping-bag"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@FieldSet"}},"updatedAt":"2024-06-25T19:30:33.608Z"},{"_id":"628d2d8b565111060e219556","component":"data2-core-types@Component","params":{"component":"PagarMeProvider","package":"data2-cashier","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"position":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Position"}},"category":"appearance","simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":101}},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"},"dimensions":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Dimensions"}},"category":"appearance","simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":102}},"defaultValue":{"preventEvaluation":true,"component":"data2-core-types@Dimensions","params":{"width":400,"height":400}},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"},"secret":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"appearance","simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":101}}},"component":"data2-core-types@ComponentParameter"}}}},"title":{"component":"data2-core-primitives@String","params":{"content":"PagarMe Provider"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"cc-mastercard"}},"visibility":"private"},"updatedAt":"2022-07-06T22:43:46.376Z","createdAt":"2022-05-24T19:10:03.681Z"},{"_id":"628d3bf2a847c1744e34f44a","component":"data2-core-types@Component","params":{"component":"PayPalProvider","package":"data2-cashier","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"position":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Position"}},"category":"appearance","simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":101}},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"},"dimensions":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Dimensions"}},"category":"appearance","simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":102}},"defaultValue":{"preventEvaluation":true,"component":"data2-core-types@Dimensions","params":{"width":400,"height":400}},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"}}}},"title":{"component":"data2-core-primitives@String","params":{"content":"PayPal Provider"}},"icon":"cc-paypal","visibility":"private"},"updatedAt":"2022-07-06T22:43:25.798Z","createdAt":"2022-05-24T19:10:03.681Z"},{"_id":"63ee691e316bab28ad81d1fc","component":"data2-core-types@Component","params":{"package":"data2-cashier","component":"Product","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"position":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Position"}},"category":"appearance","simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"},"dimensions":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Dimensions"}},"category":"appearance","simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}},"defaultValue":{"preventEvaluation":true,"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768}},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"},"productsDataset":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetReference"}},"category":"appearance","simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":101}}},"component":"data2-core-types@ComponentParameter"},"paymentProvider":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-cashier@PaymentProviderReference"}},"category":"appearance","simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":101}}},"component":"data2-core-types@ComponentParameter"}}}},"title":{"component":"data2-core-primitives@String","params":{"content":"Cart"}},"icon":"gift","visibility":"private","interactions":{"params":{"fields":{"addItem":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"cart-plus"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"removeItem":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"cart-arrow-down"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"checkout":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"shopping-bag"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@FieldSet"}},"updatedAt":"2022-07-06T22:42:14.824Z"},{"_id":"628d3c0ca847c1744e350128","component":"data2-core-types@Component","params":{"component":"StripeProvider","package":"data2-cashier","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"position":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Position"}},"category":"appearance","simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":101}},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"},"dimensions":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Dimensions"}},"category":"appearance","simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":102}},"defaultValue":{"preventEvaluation":true,"component":"data2-core-types@Dimensions","params":{"width":400,"height":400}},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"}}}},"title":{"component":"data2-core-primitives@String","params":{"content":"Stripe Provider"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"cc-stripe"}},"visibility":"private"},"updatedAt":"2022-07-06T22:43:03.493Z","createdAt":"2022-05-24T19:10:03.681Z"},{"_id":"63ee6909316bab28ad81cf12","component":"data2-core-types@Component","params":{"package":"data2-cashier","component":"Subscription","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"position":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Position"}},"category":"appearance","simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"},"dimensions":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Dimensions"}},"category":"appearance","simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}},"defaultValue":{"preventEvaluation":true,"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768}},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"},"productsDataset":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetReference"}},"category":"appearance","simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":101}}},"component":"data2-core-types@ComponentParameter"},"paymentProvider":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-cashier@PaymentProviderReference"}},"category":"appearance","simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":101}}},"component":"data2-core-types@ComponentParameter"}}}},"title":{"component":"data2-core-primitives@String","params":{"content":"Cart"}},"icon":"users","visibility":"private","interactions":{"params":{"fields":{"addItem":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"cart-plus"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"removeItem":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"cart-arrow-down"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"checkout":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"shopping-bag"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@FieldSet"}},"updatedAt":"2022-07-06T22:42:14.824Z"},{"_id":"5ec57770993f46254ea52822","component":"data2-core-types@Component","params":{"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"title":"String","textColor":{"component":"data2-core-types@Color"},"textSize":{"component":"Number"},"dataset":{"component":"data2-core-types@DataSetReference"},"aggregation":{"component":"data2-core-types@DataSetColumnReference"},"type":{"component":"String","oneOf":["Horizontal","Bar","Doughnut"]}}}},"public":false,"component":"Chart","package":"data2-controls","visibility":"deprecated"},"updatedAt":"2022-03-22T14:23:36.739Z"},{"_id":"5f57efbaa575399a45c816b8","component":"data2-core-types@Component","params":{"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition"},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"dataset":{"component":"data2-core-types@DataSetReference"}}}},"public":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"component":"DataFilter","package":"data2-controls","extends":"data2-core-primitives@Block","visibility":"deprecated"},"updatedAt":"2022-04-06T13:59:10.333Z"},{"_id":"5ed4a856d68ce41360db31b4","component":"data2-core-types@Component","params":{"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"dataset":{"component":"data2-core-types@DataSetReference"},"fields":{"component":"data2-core-types@DataSetColumnReference"}}}},"public":false,"component":"DataGrid","package":"data2-controls","visibility":"deprecated"},"updatedAt":"2022-03-22T14:25:32.194Z"},{"_id":"5ec73d856f2b7c4f04f46617","component":"data2-core-types@Component","params":{"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"style":{"component":"data2-core-types@StyleSheet"},"dataset":{"component":"data2-core-types@DataSetReference"}}}},"public":false,"component":"DataMap","package":"data2-controls","visibility":"deprecated"},"updatedAt":"2022-03-22T14:24:43.846Z"},{"_id":"67ca3615a93fb9cbb7c8fa17","component":"data2-core-types@Component","params":{"component":"DataViz","package":"data2-controls","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"data":{"component":"data2-core-types@ComponentParameter","params":{}}}}},"title":"DataViz"},"updatedAt":"2025-03-06T23:56:05.086Z","createdAt":"2025-03-06T23:56:05.086Z"},{"_id":"6061f17ed7ec64d5fcd5ce4a","component":"data2-core-types@Component","params":{"interactions":{"component":"data2-core-types@FieldSet","params":{"fields":{"goTo":{"visibility":"public","icon":"share"},"play":{"visibility":"public","icon":"play-circle"},"pause":{"visibility":"public","icon":"pause-circle"}}}},"public":false,"component":"DynamicVideo","package":"data2-controls","icon":"video-camera","visibility":"deprecated"},"updatedAt":"2022-03-22T14:31:00.603Z"},{"_id":"5ec58cff3ddde34582cdae72","component":"data2-core-types@Component","params":{"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"field":"String","dataset":{"component":"data2-core-types@DataSetReference"}}}},"public":false,"component":"FieldRemote","package":"data2-controls","visibility":"deprecated"},"updatedAt":"2022-03-22T14:24:23.854Z"},{"_id":"5faabddcc8da12be8be5c40d","component":"data2-core-types@Component","params":{"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"mask":{"component":"data2-core-primitives@String"},"maskPlaceholder":{"component":"data2-core-primitives@String"},"alwaysShowMask":{"component":"data2-core-primitives@Boolean"}}}},"public":false,"component":"InputMask","package":"data2-controls","visibility":"deprecated"},"updatedAt":"2022-03-22T14:30:38.069Z"},{"_id":"60e63583da3861ca6516cb3a","component":"data2-core-types@Component","params":{"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{}}},"public":false,"component":"JsonViewer","package":"data2-controls","visibility":"deprecated"},"updatedAt":"2022-03-22T14:41:50.309Z"},{"_id":"63cad64255ade32bcad5a183","component":"data2-core-types@Component","params":{"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{}}},"public":false,"component":"MarkdownViewer","package":"data2-controls","visibility":"deprecated"},"updatedAt":"2023-01-20T14:41:50.309Z"},{"_id":"6070ea53d7ec64d5fc7d2c10","component":"data2-core-types@Component","params":{"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"model":{"component":"data2-core-types@FileReference"},"lightColor":{"component":"data2-core-types@Color"}}}},"public":false,"component":"ModelViewer","package":"data2-controls","visibility":"deprecated"},"updatedAt":"2022-03-22T14:31:21.458Z"},{"_id":"5f9738efc8da12be8b086982","component":"data2-core-types@Component","params":{"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{}}},"public":false,"component":"Placeholder","package":"data2-controls","visibility":"deprecated"},"updatedAt":"2022-03-22T14:30:14.233Z"},{"_id":"6123fd2b92425036c370d728","component":"data2-core-types@Component","params":{"public":false,"component":"RichTextEditor","package":"data2-controls","icon":"","visibility":"deprecated"},"updatedAt":"2022-03-22T14:42:34.077Z"},{"_id":"5ec57e67993f46254ea52824","component":"data2-core-types@Component","params":{"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"field":"String","dataset":{"component":"data2-core-types@DataSetReference"},"lookupField":"String","lookupDisplayField":"String","lookupDataset":{"component":"data2-core-types@DataSetReference"},"multiple":"Boolean"}}},"public":false,"component":"Select","package":"data2-controls","visibility":"deprecated"},"updatedAt":"2022-03-22T14:23:57.343Z"},{"_id":"6104578af302195bad7e7628","component":"data2-core-types@Component","params":{"public":false,"component":"Spinner","package":"data2-controls","icon":"","visibility":"deprecated"},"updatedAt":"2022-03-22T14:42:12.913Z"},{"_id":"63ac4c8ce920c80b07ecd454","component":"data2-core-types@Component","params":{"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"dataset":{"component":"data2-core-types@DataSetReference"},"fields":{"component":"data2-core-types@DataSetColumnReference"}}}},"public":false,"visibility":"private","component":"SyntheticInput","extends":"data2-core-primitives@Block","package":"data2-controls"},"updatedAt":"2022-03-22T14:25:32.194Z"},{"_id":"5ef92edd81a6537f79316af2","component":"data2-core-types@Component","params":{"package":"data2-core","component":"Api","icon":"cloud","visibility":"private","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"position":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Position"}}},"component":"data2-core-types@ComponentParameter"},"dimensions":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Dimensions"}},"defaultValue":{"preventEvaluation":true,"params":{"width":300,"height":300},"component":"data2-core-types@Dimensions"},"category":"appearance"},"component":"data2-core-types@ComponentParameter"},"database":{"component":"data2-core-types@ServiceDatabaseReference"},"paginate":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"defaultValue":{"default":{"params":{"content":100},"component":"data2-core-primitives@Number"}}},"component":"data2-core-types@ComponentParameter"},"multi":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"category":"behaviour","defaultValue":{"params":{"content":false},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-types@ComponentParameter"},"url":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"defaultValue":{"component":"data2-core-primitives@String","params":{"content":"someUrl"}}},"component":"data2-core-types@ComponentParameter"},"collection":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"defaultValue":{"component":"data2-core-primitives@String","params":{"content":"someCollection"}}},"component":"data2-core-types@ComponentParameter"},"hooks":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"defaultValue":{"params":{},"component":"data2-core-types@FieldSet"}},"component":"data2-core-types@ComponentParameter"},"schema":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"defaultValue":{"params":{},"component":"data2-core-types@FieldSet"}},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2022-01-21T18:27:51.447Z"},{"_id":"5f557d89a575399a455b31a2","component":"data2-core-types@Component","params":{"product":"id","icon":"id-card","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"position":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Position"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":101}},"simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"},"dimensions":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Dimensions"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":102}},"simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"defaultValue":{"preventEvaluation":true,"component":"data2-core-types@Dimensions","params":{"width":300,"height":300}},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"},"credentials":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@FieldReference"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":202}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"description":{"component":"data2-core-primitives@String","params":{"content":"The fields required to log in at your application."}}},"component":"data2-core-types@ComponentParameter"},"verifier":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetReference"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":201}},"description":{"component":"data2-core-primitives@String","params":{"content":"The DataSet used for authentication. This Authentication strategy will gain control over this DataSet and will automatically filter it to only show the authenticated user."}}},"component":"data2-core-types@ComponentParameter"},"session":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@FieldReference"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":203}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"description":{"component":"data2-core-primitives@String","params":{"content":"The fields that will be present in the user session when logged-in. If left empty the session will have all fields. The fields here are used to match with a user session, meaning that if a change happens to some of the data in the table, the session will be invalidaded. It is advised to only pick fields that should be used to identify the user."}}},"component":"data2-core-types@ComponentParameter"},"role":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetColumnReference"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":212}},"description":{"component":"data2-core-primitives@String","params":{"content":"The role field for the \"Verifier\" DataSet."}}},"component":"data2-core-types@ComponentParameter"},"roleDefault":{"params":{"oneOf":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@Reference","params":{"reference":"verifier"}},"prop":"getField","args":[{"component":"data2-core-types@Reference","params":{"reference":"role"}}]}},"prop":"validation.oneOf"}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":213}},"description":{"component":"data2-core-primitives@String","params":{"content":"Default value for the \"Role\" field."}}},"component":"data2-core-types@ComponentParameter"},"password":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetColumnReference"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":211}},"description":{"component":"data2-core-primitives@String","params":{"content":"The password field for your \"Verifier\" DataSet. Your Authentication Strategy required confirmation of its data when registering a user."}}},"component":"data2-core-types@ComponentParameter"},"email":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetColumnReference"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":210}},"description":{"component":"data2-core-primitives@String","params":{"content":"The email field for your \"Verifier\" DataSet.  Setting a field as an email will make it case insensitive for this Authentication Strategy."}}},"component":"data2-core-types@ComponentParameter"},"resetPassword":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"parameters":{"resetEmail":{"params":{"parameters":{"artboard":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@ArtboardReference"}},"defaultValue":{"preventEvaluation":true,"params":{"preventEvaluation":true},"component":"data2-core-types@ArtboardReference"},"description":{"component":"data2-core-primitives@String","params":{"content":"The artboard used for this email. You may access the reset link with a Reference of \"link\" (without quotes)"}}},"component":"data2-core-types@ComponentParameter"},"subject":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Email's subject"}}},"component":"data2-core-types@ComponentParameter"},"replyTo":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"description":{"component":"data2-core-primitives@String","params":{"content":"If the user wants to reply the email, for whose email the reply will be sent to."}}},"component":"data2-core-types@ComponentParameter"},"from":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"parameters":{"name":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}},"component":"data2-core-types@ComponentParameter"}},"description":{"component":"data2-core-primitives@String","params":{"content":"The name of the sender."}}},"component":"data2-core-types@ComponentParameter"}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"description":{"component":"data2-core-primitives@String","params":{"content":"The settings for the email sent for a user in order to reset its password.."}}},"component":"data2-core-types@ComponentParameter"},"resetSuccessEmail":{"params":{"parameters":{"artboard":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@ArtboardReference"}},"defaultValue":{"preventEvaluation":true,"params":{"preventEvaluation":true},"component":"data2-core-types@ArtboardReference"},"description":{"component":"data2-core-primitives@String","params":{"content":"The artboard used for this email. You may access the reset link with a Reference of \"link\" (without quotes)"}}},"component":"data2-core-types@ComponentParameter"},"subject":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Email's subject"}}},"component":"data2-core-types@ComponentParameter"},"replyTo":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"description":{"component":"data2-core-primitives@String","params":{"content":"If the user wants to reply the email, for whose email the reply will be sent to."}}},"component":"data2-core-types@ComponentParameter"},"from":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"parameters":{"name":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}},"component":"data2-core-types@ComponentParameter"}},"description":{"component":"data2-core-primitives@String","params":{"content":"The name of the sender."}}},"component":"data2-core-types@ComponentParameter"}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"description":{"component":"data2-core-primitives@String","params":{"content":"The settings for the email sent for a user when they successfully has reset their password."}}},"component":"data2-core-types@ComponentParameter"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Settings for the password reset emails of this Authentication Strategy."}}},"component":"data2-core-types@ComponentParameter"},"sessionExpiresIn":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":203.2}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"description":{"component":"data2-core-primitives@String","params":{"content":"Session expiration time in seconds. A session older than this value will be invalidated."}}},"component":"data2-core-types@ComponentParameter"},"sessionRenewal":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":203.2}},"shouldShow":{"component":"data2-core-primitives@Boolean","preventEvaluation":true,"params":{"content":{"component":"data2-core-types@Reference","params":{"reference":"sessionExpiresIn"}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"Allows for renewing the user session."}}},"component":"data2-core-types@ComponentParameter"},"identityProviders":{"params":{"visibility":"public","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-id@ProviderAuthenticationSettings"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Connects an Identity Provider to your Authentication Strategy, adding another way to log in at your app."}}},"component":"data2-core-types@ComponentParameter"},"shouldLoginAfterRegister":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":203.2}},"description":{"component":"data2-core-primitives@String","params":{"content":"If true, logs user in automatically after register. \nDefault: true"}}},"component":"data2-core-types@ComponentParameter"},"sessionShared":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Boolean","key":{"component":"data2-core-primitives@String","params":{"content":"sessionShared"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Session Shared"}},"visibility":"beta","description":{"component":"data2-core-primitives@String","params":{"content":"Controls whether the session is set on a cookie."}}}},"sessionMetadata":{"params":{"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":203.1}},"description":{"component":"data2-core-primitives@String","params":{"content":"Custom metadata that will be attached to the session. If an Error is returned, the login/session will fail."}},"component":"data2-core-flow@Series","visibility":"private"},"component":"data2-core-types@ComponentParameter"}}}},"interactions":{"component":"data2-core-types@FieldSet","params":{"fields":{"login":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"sign-in"}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"credentials":{"params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"credentials"}}},"component":"data2-core-types@ComponentParameter"},"metadata":{"params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"metadata"}}},"component":"data2-core-types@ComponentParameter"}},"visibility":"private"}}]},"component":"data2-core-types@ComponentParameter"},"logout":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"sign-out"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"register":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"user-plus"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"changePassword":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"id-card-o"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"sendResetPasswordEmail":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"envelope"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"resetPassword":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"refresh"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"loginIdentityProvider":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"sign-in"}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@IdentityProviderReference"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Identity Provider"}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Token"}}}}]},"component":"data2-core-types@ComponentParameter"}}}},"component":"AuthenticationStrategy","package":"data2-core"},"updatedAt":"2025-10-27T21:23:29.152Z"},{"_id":"5f472ae463c680de4ff296e9","component":"data2-core-types@Component","params":{"product":"registry","package":"data2-core","component":"Data2TableDataSource","extends":"data2-core@DataSource","icon":{"component":"data2-core-primitives@String","params":{"content":"table"}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"table":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"visibility":"private","defaultValue":{"params":{"reference":"reference"},"component":"data2-core-types@Reference"}},"component":"data2-core-types@ComponentParameter"},"schema":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Field"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"description":{"component":"data2-core-primitives@String","params":{"content":"Fields/Columns of the table"}}},"component":"data2-core-types@ComponentParameter"},"multi":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"index":{"component":"data2-core-primitives@Number","params":{"content":4}},"defaultValue":["create"],"autocomplete":{"params":{},"component":"data2-core-primitives@Object"}},"component":"data2-core-types@ComponentParameter"},"policies":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-auth@Policy"}},"index":{"component":"data2-core-primitives@Number","params":{"content":3}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"description":{"component":"data2-core-primitives@String","params":{"content":"Policies for allowing/denying access to the table"}}},"component":"data2-core-types@ComponentParameter"},"semanticSearch":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"index":{"component":"data2-core-primitives@Number","params":{"content":5}},"visibility":"public","saveCompiled":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"semanticSearchFilterFields":{"params":{"index":{"component":"data2-core-primitives@Number","params":{"content":6}},"visibility":"beta","saveCompiled":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"component":"data2-core-primitives@String","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"useEstimatedDocumentCount":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Boolean","visibility":"public","unversioned":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"description":{"component":"data2-core-primitives@String","params":{"content":"If true, will not run a query against the database to count the documents. Instead, will read the total records from the database metadata, avoiding scanning the database, thus improving performance for large tables. \nCaution: activating this will make the `pagination.total` parameter to always return all records of the table, ignoring any filters applied."}}}},"semanticSearchFields":{"params":{"index":{"component":"data2-core-primitives@Number","params":{"content":5}},"visibility":"beta","saveCompiled":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"component":"data2-core-primitives@String","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"schemaSource":{"params":{"component":"data2-core-types@SchemaReference","visibility":"private"},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"private","renderable":{"dimensions":{"disabled":false,"component":"data2-core-types@Dimensions","params":{"width":1366,"exactWidth":false,"exactHeight":false,"height":768}}}},"updatedAt":"2026-05-08T12:46:10.289Z"},{"_id":"5ea04dbbe6bac0d98ad27232","component":"data2-core-types@Component","params":{"package":"data2-core","component":"DataSet","icon":"table","product":"registry","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"master":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetMaster"}},"index":{"component":"data2-core-primitives@Number","params":{"content":9}},"description":{"component":"data2-core-primitives@String","params":{"content":"An automated filter based on another DataSet.\n Pick a field, a master DataSet, and a Master Field to configure this property.\n When set, this DataSet will only show entries in which the field has the data equal to the Master Field  of the Master DataSet current cursor."}}},"component":"data2-core-types@ComponentParameter"},"datasource":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core@DataSourceReference"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"visibility":"private"},"component":"data2-core-types@ComponentParameter"},"filter":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetFilter"}},"index":{"component":"data2-core-primitives@Number","params":{"content":3}},"arguments":[],"description":{"component":"data2-core-primitives@String","params":{"content":"Initial Filter settings of this DataSet.  Using the interaction \"filter\" overwrites this setting."}}},"component":"data2-core-types@ComponentParameter"},"fields":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@FieldReference"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}},"description":{"component":"data2-core-primitives@String","params":{"content":"Of all fields in the Table, what are those you want present in this DataSet?\nIf left empty, will always get all Table fields."}}},"component":"data2-core-types@ComponentParameter"},"pagination":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"index":{"component":"data2-core-primitives@Number","params":{"content":7}},"parameters":{"size":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Amount of records per page."}},"defaultValue":{"params":{"content":20},"component":"data2-core-primitives@Number"}}},"skip":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Amount of records to skip. For a page size of 5, a skip of 5 will show the second page fully, while a skip of 3 will show 2 elements of the first page."}}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"Limits the amount of data the DataSet retrieves from the table. This can be used to split the amount of records of the DataSet into pages. By default, the DataSet has a limit of 1000 Records."}}},"component":"data2-core-types@ComponentParameter"},"join":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetJoin"}},"visibility":"private","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"extend":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetExtend"}},"visibility":"private"},"component":"data2-core-types@ComponentParameter"},"refreshOnEdit":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"description":{"component":"data2-core-primitives@String","params":{"content":"If enabled, forces a refresh before editing the current cursor."}}},"component":"data2-core-types@ComponentParameter"},"select":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetSelectSettings"}},"index":{"component":"data2-core-primitives@Number","params":{"content":10}},"description":{"component":"data2-core-primitives@String","params":{"content":"Specify which record should be selected when the DataSet initially loads. Has no effect if the AutoSelect is not enabled."}}},"component":"data2-core-types@ComponentParameter"},"autoSelect":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"defaultValue":{"params":{"content":true},"component":"data2-core-primitives@Boolean"},"description":{"component":"data2-core-primitives@String","params":{"content":"When the DataSet is first loaded in a page,  whether it should automatically select its first item or not."}}},"component":"data2-core-types@ComponentParameter"},"sort":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetSort"}},"index":{"component":"data2-core-primitives@Number","params":{"content":8}},"description":{"component":"data2-core-primitives@String","params":{"content":"Sorting settings for the DataSet. Changes the order in which the results show on the DataSet."}}},"component":"data2-core-types@ComponentParameter"},"requiresConfirmation":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"description":{"component":"data2-core-primitives@String","params":{"content":"If active, asks the user to confirm deletion before actually deleting the selected records. You may change the type to be an InteractiveModuleReference, and pick a custom DialogService for using a custom Dialog."}}},"component":"data2-core-types@ComponentParameter"},"policies":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-auth@Policy"}},"index":{"component":"data2-core-primitives@Number","params":{"content":11}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"description":{"component":"data2-core-primitives@String","params":{"content":"Controls for allowing or denying access to the data on the DataSet."}}},"component":"data2-core-types@ComponentParameter"},"pk":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetColumnReference"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Primary field of the table. Should be changed only if the table is a Custom Data Source. Defaults to the \"_id\" field."}}},"component":"data2-core-types@ComponentParameter"},"collation":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"index":{"component":"data2-core-primitives@Number","params":{"content":8.5}},"arguments":[],"visibility":"beta","parameters":{"strength":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}}},"component":"data2-core-types@ComponentParameter"},"locale":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"oneOf":["af","sq","am","ar","hy","as","az","bn","be","bn","bs","bs_Cyrl","bg","my","ca","chr","zh","zh_Hant","hr","cs","da","nl","dz","en","en_US","en_US_POSIX","eo","et","ee","fo","fil","fi","fr","fr_CA","gl","ka","de","de_AT","el","gu","ha","haw","he","hi","hu","is","ig","smn","id","ga","it","ja","kl","kn","kk","km","kok","ko","ky","lkt","lo","lv","ln","lt","dsb","lb","mk","ms","ml","mt","mr","mn","ne","se","nb","nn","or","om","ps","fa","fa_AF","pl","pt","pa","ro","ru","sr","sr_Latn","si","sk","sl","es","sw","sv","ta","te","th","bo","to","tr","uk","hsb","ur","ug","vi","wae","cy","yi","yo","zu"]},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@ComponentParameter"},"visibilityMode":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"visibility":"public","oneOf":[{"params":{"content":"hide_deleted"},"component":"data2-core-primitives@String"},{"params":{"content":"only_show_deleted"},"component":"data2-core-primitives@String"},{"params":{"content":"show_all"},"component":"data2-core-primitives@String"}]}},"aggregations":{"component":"data2-core-types@ComponentParameter","params":{"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-registry@DataSetAggregation"}},"visibility":"public","description":{"component":"data2-core-primitives@String","params":{"content":"Configure settings for counting data, filtering, taking averages and other operations for analysing the data on a table."}}}},"lookupDataSets":{"component":"data2-core-types@ComponentParameter","params":{"visibility":"public","component":"data2-core-primitives@Inferred","componentOptions":{"inferredComponent":{"params":{"body":{"params":{"component":"data2-core-primitives@Object","parameters":{"params":{"fieldsList":{"params":{"array":{"params":{"array":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"param.executedInstanceParams.datasource.instance.schema"}}}},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"field"}}],"body":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"field.component"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Lookup"}}},"component":"data2-core-comparison-operators@Equal"}}}},"component":"data2-core-functions@ArrayFilter"},"mapper":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"field"}}],"body":{"key":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"field.key"}}}},"value":{"params":{"component":"data2-core-types@DataSetReference","fieldValidation":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"currentValue"}}],"body":{"params":{"then":{"component":"data2-core-primitives@String","params":{"content":"Please pick a default DataSet for the lookup field."}},"compare":[{"params":{"comparisonSubject":{"params":{},"component":"data2-core-primitives@Undefined"},"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"currentValue"}}}}},"component":"data2-core-comparison-operators@Equal"}]},"component":"data2-core-flow@If"}}}},"component":"data2-core-types@ComponentParameter"}}}}},"component":"data2-core-functions@ArrayMap"}},"component":"data2-core-types@FieldSet"}},"component":"data2-core-types@ComponentParameter"},"parameters":[{"component":"data2-core-primitives@String","params":{"content":"param"}}]},"component":"data2-core-functions@Function"}}}},"lookupPopulateDepths":{"component":"data2-core-types@ComponentParameter","params":{"visibility":"public","component":"data2-core-primitives@Inferred","componentOptions":{"inferredComponent":{"params":{"body":{"params":{"component":"data2-core-primitives@Object","parameters":{"params":{"fieldsList":{"params":{"array":{"params":{"array":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"param.executedInstanceParams.datasource.instance.schema"}}}},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"field"}}],"body":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"field.component"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Lookup"}}},"component":"data2-core-comparison-operators@Equal"}}}},"component":"data2-core-functions@ArrayFilter"},"mapper":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"field"}}],"body":{"key":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"field.key"}}}},"value":{"params":{"component":"data2-core-primitives@Number"},"component":"data2-core-types@ComponentParameter"}}}}},"component":"data2-core-functions@ArrayMap"}},"component":"data2-core-types@FieldSet"}},"component":"data2-core-types@ComponentParameter"},"parameters":[{"component":"data2-core-primitives@String","params":{"content":"param"}}]},"component":"data2-core-functions@Function"}}}},"versioning":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","key":{"component":"data2-core-primitives@String","params":{"content":"versioning"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Versioning"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Controls versioning behavior."}},"shouldShow":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"domain"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"data2"}}},"component":"data2-core-comparison-operators@Equal"},"saveCompiled":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"visibility":"private","oneOf":[{"params":{"content":"enabled"},"component":"data2-core-primitives@String"},{"params":{"content":"disabled"},"component":"data2-core-primitives@String"}]}},"autoEdit":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"description":{"component":"data2-core-primitives@String","params":{"content":"If true, when the cursor changes, the DataSet automatically saves the previous record and enter in Edit mode for the next record in the cursor."}},"category":"behaviour","visibility":"private"},"component":"data2-core-types@ComponentParameter"},"staticFilter":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetFilter"}},"index":{"component":"data2-core-primitives@Number","params":{"content":3.1}},"description":{"component":"data2-core-primitives@String","params":{"content":"Static Filter settings of this DataSet.  It is not overwritten by filterSettings or filter and it is always applied to the DataSet, along the normal filter."}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"staticPagination":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"index":{"component":"data2-core-primitives@Number","params":{"content":7.1}},"parameters":{"size":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Amount of records per page."}},"defaultValue":{"params":{"content":20},"component":"data2-core-primitives@Number"}}},"skip":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Amount of records to skip. For a page size of 5, a skip of 5 will show the second page fully, while a skip of 3 will show 2 elements of the first page."}}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"Static Pagination settings of this DataSet.  It is not overwritten by pagination or filter and it is always applied to the DataSet, overriding the normal pagination."}},"visibility":"private"},"component":"data2-core-types@ComponentParameter"}}}},"interactions":{"component":"data2-core-types@FieldSet","params":{"fields":{"insert":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"plus-circle"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"save":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"floppy-o"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"edit":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"pencil-square"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"cancel":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"times-circle"}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"key":{"component":"data2-core-primitives@String","params":{"content":"options"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Options"}},"parameters":{"disableRefresh":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Boolean","key":{"component":"data2-core-primitives@String","params":{"content":"disableRefresh"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Disable Refresh"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Disables refresh after cancel."}}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"Cancel options"}}}}]},"component":"data2-core-types@ComponentParameter"},"delete":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"minus-circle"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"refresh":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"refresh"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"filter":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"filter"}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@FieldSet"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Query"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Query to filter dataset."}}}}]},"component":"data2-core-types@ComponentParameter"},"select":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"i-cursor"}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-types@DataSetColumnReference","required":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"title":{"component":"data2-core-primitives@String","params":{"content":"Field"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Field to be used to select Record."}},"defaultValue":{"params":{},"component":"data2-core-types@DataSetColumnReference","preventEvaluation":true},"controlSettings":{"dataSet":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"module"}}}}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Field value"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Value of the field."}},"required":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}}]},"component":"data2-core-types@ComponentParameter"},"next":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"step-forward"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"prev":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"step-backward"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"nextPage":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"params":{"icon":"fa fa-fast-forward","content":"fa-fast-forward"},"component":"data2-core-primitives@String"},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"appendNextPage":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"forward"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"downloadAsCsv":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"table"}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"key":{"component":"data2-core-primitives@String","params":{"content":"options"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Options"}},"parameters":{"delimiter":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Boolean","key":{"component":"data2-core-primitives@String","params":{"content":"delimiter"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Delimiter"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Delimiter for generated file. Default is \",\"."}},"oneOf":[{"params":{"content":","},"component":"data2-core-primitives@String"},{"params":{"content":";"},"component":"data2-core-primitives@String"}]}},"encoding":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Boolean","key":{"component":"data2-core-primitives@String","params":{"content":"encoding"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Encoding"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Encoding for generated file. Default is \"utf-8\"."}},"oneOf":[{"params":{"content":"utf-8"},"component":"data2-core-primitives@String"},{"params":{"content":"windows-1252"},"component":"data2-core-primitives@String"}]}},"shouldPopulateLookups":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Boolean","key":{"component":"data2-core-primitives@String","params":{"content":"shouldPopulateLookups"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Should populate lookups"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Controls whether fully populated data is exported to the CSV."}}}},"brazilianExcelFormat":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Boolean","key":{"component":"data2-core-primitives@String","params":{"content":"brazilianExcelFormat"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Brazilian Excel Format"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Controls whether the CSV will be generated compatible with PT-BR Excel."}}}},"filename":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","key":{"component":"data2-core-primitives@String","params":{"content":"filename"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Filename"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Filename of the downloaded file. By default, it is the reference of the dataset."}}}},"aggregationAt":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Number","key":{"component":"data2-core-primitives@String","params":{"content":"aggregationAt"}},"index":{"component":"data2-core-primitives@Number","params":{"content":100}},"description":{"component":"data2-core-primitives@String","params":{"content":"If the DataSet is holding data from an aggregation, this parameter is used as the index of which aggregation is used to export the data (`aggregated.${aggregationAt}.data`)."}},"title":{"component":"data2-core-primitives@String","params":{"content":"Aggregation At"}}}},"flatten":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Boolean","key":{"component":"data2-core-primitives@String","params":{"content":"flatten"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Flatten"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Converts nested objects into dot-notation columns (e.g., `user.name`)"}}}},"stringify":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Boolean","key":{"component":"data2-core-primitives@String","params":{"content":"stringify"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Stringify"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Turns any complex data, like objects or arrays, into a JSON string within its cell."}}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"Download as CSV options"}}}}]},"component":"data2-core-types@ComponentParameter"},"uploadCsv":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"upload"}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"options"}},"flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"unsetEmptyFields":{"params":{"component":"data2-core-primitives@Boolean","title":{"component":"data2-core-primitives@String","params":{"content":"Unset Empty Fields"}},"key":{"component":"data2-core-primitives@String","params":{"content":"unsetEmptyFields"}},"description":{"component":"data2-core-primitives@String","params":{"content":"If true, will unset  fields that are left empty in CSV from the record."}}},"component":"data2-core-types@ComponentParameter"},"logOnly":{"params":{"component":"data2-core-primitives@Boolean","title":{"component":"data2-core-primitives@String","params":{"content":"Log Only"}},"key":{"component":"data2-core-primitives@String","params":{"content":"logOnly"}},"description":{"component":"data2-core-primitives@String","params":{"content":"If true, only log what is going to be created and updated. Useful to preview what will happen before running uploadCsv for real."}}},"component":"data2-core-types@ComponentParameter"}}}}]},"component":"data2-core-types@ComponentParameter"},"downloadModel":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"download"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"previousPage":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"fa-fast-backward"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"clearFilters":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"minus-circle"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"paginate":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"chevron-circle-right"}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"parameters":{"params":{"fields":{"size":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"title":{"component":"data2-core-primitives@String","params":{"content":"size"}}},"component":"data2-core-types@ComponentParameter"},"skip":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"title":{"component":"data2-core-primitives@String","params":{"content":"skip"}}},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@FieldSet"},"title":{"component":"data2-core-primitives@String","params":{"content":"pagination"}},"flat":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}}}]},"component":"data2-core-types@ComponentParameter"},"toggleSort":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"chevron-circle-right"}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetColumnReference"}},"parameters":{"params":{"fields":{"size":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"title":{"component":"data2-core-primitives@String","params":{"content":"size"}}},"component":"data2-core-types@ComponentParameter"},"skip":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"title":{"component":"data2-core-primitives@String","params":{"content":"skip"}}},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@FieldSet"},"title":{"component":"data2-core-primitives@String","params":{"content":"column"}},"flat":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}}}]},"component":"data2-core-types@ComponentParameter"},"sync":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"params":{"icon":"fa-flash"},"component":"data2-core-types@FontAwesomeIcon"},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"insertRecord":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"plus-circle"}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Record"}}}}]},"component":"data2-core-types@ComponentParameter"},"search":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"Search settings"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Search filter"}},"parameters":{"search":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":0}}}},"language":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":1}}}},"caseSensitive":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Boolean","index":{"component":"data2-core-primitives@Number","params":{"content":2}}}},"diacriticSensitive":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Boolean","index":{"component":"data2-core-primitives@Number","params":{"content":3}}}}}}}],"icon":{"component":"data2-core-primitives@String","params":{"content":"search"}}},"component":"data2-core-types@ComponentParameter"},"saveRecord":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"plus-circle"}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Record"}}}}]},"component":"data2-core-types@ComponentParameter"},"resetFilters":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"filter"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"sort":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"sort"}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@FieldSet"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Sort settings"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Settings to sort the dataset."}}}}]},"component":"data2-core-types@ComponentParameter"},"unselect":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"times-circle"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"downloadAsXlsx":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"file-excel-o"}},"visibility":"public","key":{"component":"data2-core-primitives@String","params":{"content":"downloadAsXlsx"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Download as XLSX"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","key":{"component":"data2-core-primitives@String","params":{"content":"options"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Options"}},"visibility":"public","description":{"component":"data2-core-primitives@String","params":{"content":"Options for downloadAsXlsx"}},"parameters":{"filename":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","key":{"component":"data2-core-primitives@String","params":{"content":"filename"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Filename"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Filename of the downloaded file. By default, it is the reference of the dataset."}}}},"useTitle":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Boolean","key":{"component":"data2-core-primitives@String","params":{"content":"useTitle"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Use Title"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Option to enable using the field title."}}}}},"flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}}]},"component":"data2-core-types@ComponentParameter"},"loadAllPages":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"table"}},"visibility":"public","key":{"component":"data2-core-primitives@String","params":{"content":"loadAllPages"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Load All Pages"}}},"component":"data2-core-types@ComponentParameter"},"exportToCsv":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"align-justify"}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"key":{"component":"data2-core-primitives@String","params":{"content":"options"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Options"}},"parameters":{"delimiter":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Boolean","key":{"component":"data2-core-primitives@String","params":{"content":"delimiter"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Delimiter"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Delimiter for generated file. Default is \",\"."}},"oneOf":[{"params":{"content":","},"component":"data2-core-primitives@String"},{"params":{"content":";"},"component":"data2-core-primitives@String"}]}},"shouldPopulateLookups":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Boolean","key":{"component":"data2-core-primitives@String","params":{"content":"shouldPopulateLookups"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Should populate lookups"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Controls whether fully populated data is exported to the CSV."}}}},"brazilianExcelFormat":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Boolean","key":{"component":"data2-core-primitives@String","params":{"content":"brazilianExcelFormat"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Brazilian Excel Format"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Controls whether the CSV will be generated compatible with PT-BR Excel."}}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"Export to CSV options"}}}}],"key":{"component":"data2-core-primitives@String","params":{"content":"exportToCsv"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Export to CSV"}}},"component":"data2-core-types@ComponentParameter"},"semanticSearch":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"query":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Query"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Query to semantic search"}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}}}},"options":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"Options"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Search options"}},"parameters":{"threshold":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Number"}},"limit":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Number"}},"score":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Boolean"}}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}}}}}}}],"icon":{"params":{"content":"search-plus"},"component":"data2-core-primitives@String"}},"component":"data2-core-types@ComponentParameter"}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"DataSets are how we access a data on a Data² Table.\n It contains rules and specification on what the data coming from the table is.\nE.g. In a table of pets, a dataset could only show dogs with brown fur."}}},"updatedAt":"2025-10-30T18:16:31.570Z"},{"_id":"5ed9bed7b9e0891ce913e884","component":"data2-core-types@Component","params":{"package":"data2-core","component":"DataSource","icon":"database","visibility":"private","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"position":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Position"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":101}},"simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"},"dimensions":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Dimensions"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":101}},"simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"defaultValue":{"preventEvaluation":true,"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768}},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"}}}},"renderable":{"dimensions":{"disabled":false,"component":"data2-core-types@Dimensions","params":{"width":1366,"exactWidth":false,"exactHeight":false,"height":768}}}},"updatedAt":"2022-07-06T22:30:08.401Z"},{"_id":"5efc341576b2b8399e02afad","component":"data2-core-types@Component","params":{"package":"data2-core","component":"Database","icon":"database","visibility":"private","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"position":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Position"}},"category":"appearance"},"component":"data2-core-types@ComponentParameter"},"dimensions":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Dimensions"}},"category":"appearance","defaultValue":{"preventEvaluation":true,"params":{"width":300,"height":300},"component":"data2-core-types@Dimensions"}},"component":"data2-core-types@ComponentParameter"},"stack":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"oneOf":["mongo","mysql","postgresql"],"category":"behaviour"},"component":"data2-core-types@ComponentParameter"},"mongo":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"defaultValue":{"host":{"component":"data2-core-primitives@String","params":{"content":""}},"database":{"component":"data2-core-primitives@String","params":{"content":""}},"user":{"component":"data2-core-primitives@String","params":{"content":""}},"password":{"component":"data2-core-primitives@String","params":{"content":""}},"options":{"retryWrites":{"params":{"content":true},"component":"data2-core-primitives@Boolean"},"w":{"component":"data2-core-primitives@String","params":{"content":"majority"}},"useNewUrlParser":{"params":{"content":true},"component":"data2-core-primitives@Boolean"},"useUnifiedTopology":{"params":{"content":true},"component":"data2-core-primitives@Boolean"},"bufferCommands":{"params":{"content":false},"component":"data2-core-primitives@Boolean"},"serverSelectionTimeoutMS":{"params":{"content":20000},"component":"data2-core-primitives@Number"}}}},"component":"data2-core-types@ComponentParameter"},"mysql":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"defaultValue":{"host":{"component":"data2-core-primitives@String","params":{"content":""}},"database":{"component":"data2-core-primitives@String","params":{"content":""}},"user":{"component":"data2-core-primitives@String","params":{"content":""}},"password":{"component":"data2-core-primitives@String","params":{"content":""}}}},"component":"data2-core-types@ComponentParameter"},"postgresql":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"defaultValue":{"host":{"component":"data2-core-primitives@String","params":{"content":""}},"database":{"component":"data2-core-primitives@String","params":{"content":""}},"user":{"component":"data2-core-primitives@String","params":{"content":""}},"password":{"component":"data2-core-primitives@String","params":{"content":""}}}},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2022-01-21T18:33:38.345Z"},{"_id":"5f0396441ca96def4287d501","component":"data2-core-types@Component","params":{"product":"media","package":"data2-core","component":"Drive","icon":"hdd-o","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"size":{"params":{"category":"content","component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"index":{"component":"data2-core-primitives@Number","params":{"content":200}},"defaultValue":{"params":{"content":10000000000},"component":"data2-core-primitives@Number"},"saveCompiled":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"fileTimeout":{"params":{"category":"behaviour","component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"index":{"component":"data2-core-primitives@Number","params":{"content":201}},"visibility":"private","description":{"component":"data2-core-primitives@String","params":{"content":"The number of days the files are kept in this drive. Files older than this value are deleted.\n Leave empty for no expiration."}}},"component":"data2-core-types@ComponentParameter"},"fileAcceptedFormats":{"params":{"category":"behaviour","component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":204}},"visibility":"private","description":{"component":"data2-core-primitives@String","params":{"content":"List of accepted formats for file upload in this Drive. Example: png, jpg, mp4"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"saveCompiled":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"fileMaxSize":{"params":{"category":"content","component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"index":{"component":"data2-core-primitives@Number","params":{"content":203}},"description":{"component":"data2-core-primitives@String","params":{"content":"Max file size (in bytes) that can be uploaded to the Drive."}},"visibility":"private","saveCompiled":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"policies":{"params":{"index":{"component":"data2-core-primitives@Number","params":{"content":30}},"visibility":"beta","category":"behaviour","component":"data2-core-auth@Policy","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}}}},"renderable":{"dimensions":{"disabled":false,"component":"data2-core-types@Dimensions","params":{"width":1366,"exactWidth":false,"exactHeight":false,"height":768}}},"interactions":{"params":{"fields":{"selectFolder":{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"selectFolder"}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"params":{"content":"data2-core-types@FileComponentReference"},"component":"data2-core-primitives@String"},"title":{"component":"data2-core-primitives@String","params":{"content":"folder"}}}}]}},"selectPreviousFolder":{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"selectPreviousFolder"}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}}}},"open":{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"open"}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"params":{"content":"data2-core-types@FileComponentReference"},"component":"data2-core-primitives@String"},"title":{"component":"data2-core-primitives@String","params":{"content":"File or folder to open"}}}},{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Target"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Where to open the file"}},"visibility":"public","required":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"oneOf":[{"params":{"content":"_blank"},"component":"data2-core-primitives@String"},{"params":{"content":"_self"},"component":"data2-core-primitives@String"},{"params":{"content":"_parent"},"component":"data2-core-primitives@String"},{"params":{"content":"_top"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"}]}},"delete":{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"delete"}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"params":{"content":"data2-core-types@FileComponentReference"},"component":"data2-core-primitives@String"},"title":{"component":"data2-core-primitives@String","params":{"content":"File or folder to delete"}}}}]}},"download":{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"download"}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"params":{"content":"data2-core-types@FileComponentReference"},"component":"data2-core-primitives@String"},"title":{"component":"data2-core-primitives@String","params":{"content":"file"}}}}]}},"createFolder":{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"createFolder"}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"params":{"content":"data2-core-primitives@Object"},"component":"data2-core-primitives@String"},"flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"params":{"fields":{"name":{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"name"}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}}}}},"component":"data2-core-types@FieldSet"}}}]}},"rename":{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"rename"}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"params":{"content":"data2-core-types@FileComponentReference"},"component":"data2-core-primitives@String"},"title":{"component":"data2-core-primitives@String","params":{"content":"FIle or folder"}}}},{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"name"}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}}}]}},"uploadFromFiles":{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"uploadFromFiles"}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Getter"}},"title":{"component":"data2-core-primitives@String","params":{"content":"files"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"parameters":{"params":{"fields":{"folder":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@FileComponentReference"}},"title":{"component":"data2-core-primitives@String","params":{"content":"folder"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}}},"fileNames":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"File names"}},"description":{"component":"data2-core-primitives@String","params":{"content":"List of names to be used to rename the uploaded files."}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}}}},"acceptedFormats":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":4}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"title":{"component":"data2-core-primitives@String","params":{"content":"Accepted formats"}}},"component":"data2-core-types@ComponentParameter"},"fileMaxSize":{"params":{"component":"data2-core-primitives@Number","index":{"component":"data2-core-primitives@Number","params":{"content":3}},"title":{"component":"data2-core-primitives@String","params":{"content":"Max file size"}}},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@FieldSet"},"title":{"component":"data2-core-primitives@String","params":{"content":"options"}}}}]}},"uploadFromUrls":{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"uploadFromUrls"}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"urls"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"parameters":{"params":{"fields":{"folder":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@FileComponentReference"}},"title":{"component":"data2-core-primitives@String","params":{"content":"folder"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}}},"fileNames":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"File names"}},"description":{"component":"data2-core-primitives@String","params":{"content":"List of names to be used to rename the uploaded files."}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}}}},"acceptedFormats":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":4}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"title":{"component":"data2-core-primitives@String","params":{"content":"Accepted formats"}}},"component":"data2-core-types@ComponentParameter"},"fileMaxSize":{"params":{"component":"data2-core-primitives@Number","index":{"component":"data2-core-primitives@Number","params":{"content":3}},"title":{"component":"data2-core-primitives@String","params":{"content":"Max file size"}}},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@FieldSet"},"title":{"component":"data2-core-primitives@String","params":{"content":"options"}}}}]}},"uploadFromPrompt":{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"uploadFromPrompt"}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"parameters":{"params":{"fields":{"folder":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@FileComponentReference"}},"title":{"component":"data2-core-primitives@String","params":{"content":"folder"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}}},"multiple":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"title":{"component":"data2-core-primitives@String","params":{"content":"multiple"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}}}},"fileNames":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"File names"}},"description":{"component":"data2-core-primitives@String","params":{"content":"List of names to be used to rename the uploaded files."}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":3}}}},"acceptedFormats":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":5}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"title":{"component":"data2-core-primitives@String","params":{"content":"Accepted formats"}}},"component":"data2-core-types@ComponentParameter"},"fileMaxSize":{"params":{"component":"data2-core-primitives@Number","index":{"component":"data2-core-primitives@Number","params":{"content":3}},"title":{"component":"data2-core-primitives@String","params":{"content":"Max file size"}}},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@FieldSet"},"flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}}]}},"moveToFolder":{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"moveToFolder"}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"params":{"content":"data2-core-types@FileComponentReference"},"component":"data2-core-primitives@String"},"title":{"component":"data2-core-primitives@String","params":{"content":"FIle or folder"}}}},{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Destination folder"}},"component":{"params":{"content":"data2-core-types@FileComponentReference"},"component":"data2-core-primitives@String"}}}]}},"uploadFromText":{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"uploadFromText"}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"text"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":false}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"parameters":{"params":{"fields":{"folder":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@FileComponentReference"}},"title":{"component":"data2-core-primitives@String","params":{"content":"folder"}}}},"filename":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"filename"}}}}}},"component":"data2-core-types@FieldSet"},"title":{"component":"data2-core-primitives@String","params":{"content":"options"}}}}]}}}},"component":"data2-core-types@FieldSet"}},"updatedAt":"2025-07-03T21:34:09.717Z"},{"_id":"5eea49efd68ce41360c75e50","component":"data2-core-types@Component","params":{"product":"connect","package":"data2-core","component":"FeathersDataSource","icon":"database","extends":"data2-core@DataSource","public":true,"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"service":"String","baseUrl":"String","pk":"String","schema":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Field"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"private","renderable":{"dimensions":{"disabled":false,"component":"data2-core-types@Dimensions","params":{"width":1366,"exactWidth":false,"exactHeight":false,"height":768}}}},"updatedAt":"2022-09-19T13:48:15.919Z"},{"_id":"5f02b4b41ca96def42658c55","component":"data2-core-types@Component","params":{"package":"data2-core","component":"File","icon":"file-o","visibility":"private","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"name":"string","contentType":"string","extension":"string","size":"number","folder":"string"}}}},"updatedAt":"2023-11-23T21:07:49.902Z"},{"_id":"5f02b4881ca96def426585b8","component":"data2-core-types@Component","params":{"package":"data2-core","component":"Folder","icon":"folder","visibility":"private","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"name":"String","folder":"String"}}}}},{"_id":"6335a6d05a870cfe3282562e","component":"data2-core-types@Component","params":{"icon":"connectdevelop","public":false,"package":"data2-core","component":"GraphQLAPI","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"serviceUrl":{"component":"data2-core-primitives@String"}}}},"title":{"component":"data2-core-primitives@String","params":{"content":"GraphQL API"}},"visibility":"public","renderable":{"dimensions":{"disabled":false,"component":"data2-core-types@Dimensions","params":{"width":1366,"exactWidth":false,"exactHeight":false,"height":768}}},"interactions":{"params":{"fields":{"execQuery":{"params":{},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@FieldSet"}},"updatedAt":"2022-11-11T14:10:17.692Z"},{"_id":"61e008476947419456ea80cd","component":"data2-core-types@Component","params":{"public":true,"package":"data2-core","component":"LocalStorageDataSource","extends":"data2-core@DataSource","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"fields":{"component":"data2-core-primitives@String","list":true},"initialData":{"component":"data2-core-primitives@String"},"pk":{"component":"data2-core-primitives@String"},"name":{"component":"data2-core-primitives@String"}}}},"title":{"component":"data2-core-primitives@String","params":{"content":"CustomHTTPDataSource"}},"visibility":"public","renderable":{"dimensions":{"disabled":false,"component":"data2-core-types@Dimensions","params":{"width":1366,"exactWidth":false,"exactHeight":false,"height":768}}}},"updatedAt":"2022-07-06T22:46:25.498Z"},{"_id":"6059ffb628c3be06a609da23","component":"data2-core-types@Component","params":{"package":"data2-core","component":"MemoryDataSource","icon":"database","extends":"data2-core@DataSource","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"initialData":{"component":"data2-core-primitives@String","list":true},"pk":"String"}}},"visibility":"private"}},{"_id":"62e2f099d435e269de45ad1c","component":"data2-core-types@Component","params":{"package":"data2-core","component":"Process","icon":"cube","visibility":"private","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"reference":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}}},"componentDefinition":{"component":"data2-core-types@ComponentParameter","params":{"component":{"params":{"content":"data2-core-types@ComponentDefinition"},"component":"data2-core-primitives@String"}}}}}}},"updatedAt":"2022-08-01T19:58:58.004Z"},{"_id":"607d9e82f1955d31297b164e","component":"data2-core-types@Component","params":{"package":"data2-core","component":"Store","product":"registry","icon":"archive","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"position":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Position"}},"simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":102}},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"},"dimensions":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Dimensions"}},"category":"appearance","defaultValue":{"preventEvaluation":true,"component":"data2-core-types@Dimensions","params":{"width":300,"height":300}},"index":{"component":"data2-core-primitives@Number","params":{"content":101}},"simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"},"initialData":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@FieldSet"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":203}}},"component":"data2-core-types@ComponentParameter"},"mockData":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@FieldSet"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":204}},"description":{"component":"data2-core-primitives@String","params":{"content":"initialData for mock purposes (only works in Builder and it is not published when genering a Version of your system)."}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"}}}},"interactions":{"params":{"fields":{"get":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Path to prop"}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"required":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}},{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Fallback"}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"required":{"component":"data2-core-primitives@Boolean","params":{"content":false}}}}],"index":{"component":"data2-core-primitives@Number","params":{"content":1}}}},"set":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Path to prop"}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"required":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}},{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Value to set"}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"required":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}}],"visibility":"public","index":{"component":"data2-core-primitives@Number","params":{"content":3}}}},"resetData":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","visibility":"private","flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"pickFields":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"title":{"component":"data2-core-primitives@String","params":{"content":"Pick Fields"}}}},"omitFields":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"title":{"component":"data2-core-primitives@String","params":{"content":"Omit Fields"}}}}}}}],"visibility":"private","index":{"component":"data2-core-primitives@Number","params":{"content":3}}}}}},"component":"data2-core-types@FieldSet"},"renderable":{"dimensions":{"disabled":false,"component":"data2-core-types@Dimensions","params":{"width":1360,"height":800,"exactWidth":false,"exactHeight":false}}}},"updatedAt":"2025-08-11T14:29:31.519Z"},{"_id":"6103616af302195bad61f3ac","component":"data2-core-types@Component","params":{"package":"data2-core","component":"Synth","icon":"volume-up","interactions":{"component":"data2-core-types@FieldSet","params":{"fields":{"play":{"visibility":"public","icon":"play"}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"position":{"component":"data2-core-types@Position","simple":true},"dimensions":{"component":"data2-core-types@Dimensions","simple":true},"bpm":{"component":"data2-core-types@Number","simple":true},"octave":{"component":"data2-core-types@String","simple":true},"duration":{"component":"data2-core-types@String","simple":true}}}}}},{"_id":"6397a19fe920c80b07719c04","component":"data2-core-types@Component","params":{"package":"data2-core-ai","component":"Assistant","icon":"user","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"premisses":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Premisses"}},"icon":{"params":{"icon":"fa-play-circle-o"},"component":"data2-core-types@FontAwesomeIcon"},"multiLine":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":3}}},"component":"data2-core-types@ComponentParameter"},"behaviour":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Behaviour"}},"icon":{"params":{"icon":"fa-play-circle-o"},"component":"data2-core-types@FontAwesomeIcon"},"multiLine":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}}},"component":"data2-core-types@ComponentParameter"},"_context":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Context"}},"icon":{"params":{"icon":"fa-play-circle-o"},"component":"data2-core-types@FontAwesomeIcon"},"multiLine":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"},"answerPreffix":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Answer Prefix"}},"icon":{"params":{"icon":"fa-play-circle-o"},"component":"data2-core-types@FontAwesomeIcon"},"multiLine":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":4}}},"component":"data2-core-types@ComponentParameter"},"model":{"params":{"visibility":"private","component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":5}},"oneOf":[{"params":{"content":"openai.gpt-4o"},"component":"data2-core-primitives@String"},{"component":"data2-core-primitives@String","params":{"content":"openai.gpt-5.4-nano"}},{"component":"data2-core-primitives@String","params":{"content":"openai.gpt-5.4-mini"}},{"component":"data2-core-primitives@String","params":{"content":"openai.gpt-5.4"}},{"component":"data2-core-primitives@String","params":{"content":"anthropic.claude-haiku-4-5-20251001-v1:0"}},{"component":"data2-core-primitives@String","params":{"content":"anthropic.claude-sonnet-4-5-20250929-v1:0"}},{"params":{"content":"Pliskin²"},"component":"data2-core-primitives@String"},{"params":{"content":"cerebras"},"component":"data2-core-primitives@String"}],"defaultValue":{"component":"data2-core-primitives@String","params":{"content":"cerebras"}}},"component":"data2-core-types@ComponentParameter"},"creativity":{"params":{"visibility":"private","component":"data2-core-primitives@Number","index":{"component":"data2-core-primitives@Number","params":{"content":6}},"description":{"component":"data2-core-primitives@String","params":{"content":"Number from 0 to 100. The higher the number, the more creative (and less predictable) the Assistant will be."}}},"component":"data2-core-types@ComponentParameter"}}}},"renderable":{"dimensions":{"disabled":false,"component":"data2-core-types@Dimensions","params":{"width":1360,"height":800,"exactWidth":false,"exactHeight":false}}},"interactions":{"component":"data2-core-types@FieldSet","params":{"fields":{"consult":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Consult"}},"component":{"component":"data2-core-primitives@String","params":{"content":""}},"icon":{"params":{"icon":"fa-magic"},"component":"data2-core-types@FontAwesomeIcon"},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Prompt"}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Aditional Context"}},"visibility":"public"}},{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"Params"}},"visibility":"public","parameters":{"options":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"Options"}},"visibility":"public","parameters":{"countTokens":{"params":{"component":"data2-core-primitives@Boolean","title":{"component":"data2-core-primitives@String","params":{"content":"Count Tokens"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}}}},"images":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":1}},"visibility":"private","title":{"component":"data2-core-primitives@String","params":{"content":"Images"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}}}}]},"component":"data2-core-types@ComponentParameter"},"draw":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Consult"}},"component":{"component":"data2-core-primitives@String","params":{"content":""}},"icon":{"params":{"icon":"fa-paint-brush"},"component":"data2-core-types@FontAwesomeIcon"},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","parameters":{"prompt":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Prompt"}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}}}},"images":{"params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Images"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"},"options":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Options"}},"parameters":{"size":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"size"}},"oneOf":[{"params":{"content":"256x256"},"component":"data2-core-primitives@String"},{"params":{"content":"512x512"},"component":"data2-core-primitives@String"},{"params":{"content":"1024x1024"},"component":"data2-core-primitives@String"}]}},"quantity":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"title":{"component":"data2-core-primitives@String","params":{"content":"quantity"}}}},"model":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"model"}},"oneOf":[{"params":{"content":"replicate"},"component":"data2-core-primitives@String"},{"component":"data2-core-primitives@String","params":{"content":"stability"}},{"component":"data2-core-primitives@String","params":{"content":"amazon"}}],"visibility":"private"}},"style":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"style"}},"oneOf":["3d-model","analog-film","anime","cinematic","comic-book","digital-art","enhance","fantasy-art","isometric","line-art","low-poly","modeling-compound","neon-punk","origami","photographic","pixel-art","tile-texture"],"visibility":"private"}}},"index":{"component":"data2-core-primitives@Number","params":{"content":10}}}}},"flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}}],"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"summarize":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Summarize"}},"component":{"component":"data2-core-primitives@String","params":{"content":""}},"icon":{"params":{"icon":"fa-book"},"component":"data2-core-types@FontAwesomeIcon"},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Content"}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Prompt"}}}}]},"component":"data2-core-types@ComponentParameter"},"listen":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Listen"}},"component":{"component":"data2-core-primitives@String","params":{"content":""}},"icon":{"params":{"icon":"fa-assistive-listening-systems"},"component":"data2-core-types@FontAwesomeIcon"},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Getter"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Audio File"}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Prompt"}}}},{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Options"}},"component":"data2-core-primitives@Object","parameters":{"speed":{"component":"data2-core-types@ComponentParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"speed"}},"component":"data2-core-primitives@Number"}},"language":{"component":"data2-core-types@ComponentParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"speed"}},"component":"data2-core-primitives@String","oneOf":["af","ar","hy","az","be","bs","bg","ca","zh","hr","cs","da","nl","en","et","fi","fr","gl","de","el","he","hi","hu","is","id","it","ja","kn","kk","ko","lv","lt","mk","ms","mr","mi","ne","no","fa","pl","pt","ro","ru","sr","sk","sl","es","sw","sv","tl","ta","th","tr","uk","ur","vi","cy"]}}},"visibility":"private"}}]},"component":"data2-core-types@ComponentParameter"},"speak":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Speak"}},"component":{"component":"data2-core-primitives@String","params":{"content":""}},"icon":{"params":{"icon":"fa-commenting-o"},"component":"data2-core-types@FontAwesomeIcon"},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Prompt"}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","parameters":{"language":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Language"}},"component":"data2-core-primitives@String","oneOf":["arb","cmn-CN","cy-GB","da-DK","de-DE","en-AU","en-GB","en-GB-WLS","en-IN","en-US","es-ES","es-MX","es-US","fr-CA","fr-FR","is-IS","it-IT","ja-JP","hi-IN","ko-KR","nb-NO","nl-NL","pl-PL","pt-BR","pt-PT","ro-RO","ru-RU","sv-SE","tr-TR","en-NZ","en-ZA","ca-ES","de-AT","yue-CN","ar-AE","fi-FI","en-IE","nl-BE","fr-BE"]},"component":"data2-core-types@ComponentParameter"},"voice":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Voice"}},"component":"data2-core-primitives@String","oneOf":["Aditi","Amy","Astrid","Bianca","Brian","Camila","Carla","Carmen","Celine","Chantal","Conchita","Cristiano","Dora","Emma","Enrique","Ewa","Filiz","Gabrielle","Geraint","Giorgio","Gwyneth","Hans","Ines","Ivy","Jacek","Jan","Joanna","Joey","Justin","Karl","Kendra","Kevin","Kimberly","Lea","Liv","Lotte","Lucia","Lupe","Mads","Maja","Marlene","Mathieu","Matthew","Maxim","Mia","Miguel","Mizuki","Naja","Nicole","Olivia","Penelope","Raveena","Ricardo","Ruben","Russell","Salli","Seoyeon","Takumi","Tatyana","Vicki","Vitoria","Zeina","Zhiyu","Aria","Ayanda","Arlet","Hannah","Arthur","Daniel","Liam","Pedro","Kajal","Hiujin","Laura","Elin","Ida","Suvi","Ola","Hala","Andres","Sergio","Remi","Adriano","Thiago","Ruth","Stephen","Kazuha","Tomoko","Niamh","Sofie","Lisa","Isabelle","Zayd","Danielle","Gregory"]},"component":"data2-core-types@ComponentParameter"},"speed":{"params":{"component":"data2-core-primitives@Number"},"component":"data2-core-types@ComponentParameter"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Options"}}}}],"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"reply":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Consult"}},"component":{"component":"data2-core-primitives@String","params":{"content":""}},"icon":{"params":{"icon":"fa-wechat"},"component":"data2-core-types@FontAwesomeIcon"},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"messages"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"component":"data2-core-primitives@Object"}},{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Aditional Context"}},"visibility":"public"}},{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"Params"}},"visibility":"public","parameters":{"options":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"Options"}},"visibility":"public","parameters":{"countTokens":{"params":{"component":"data2-core-primitives@Boolean","title":{"component":"data2-core-primitives@String","params":{"content":"Count Tokens"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"}}}}}}}]},"component":"data2-core-types@ComponentParameter"},"search":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Search"}},"component":{"component":"data2-core-primitives@String","params":{"content":""}},"icon":{"params":{"icon":"fa-search"},"component":"data2-core-types@FontAwesomeIcon"},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"prompt"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"Options"}},"visibility":"public"}}],"visibility":"private"},"component":"data2-core-types@ComponentParameter"},"textExtract":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Text Extract"}},"component":{"component":"data2-core-primitives@String","params":{"content":""}},"icon":{"params":{"icon":"fa-file-text-o"},"component":"data2-core-types@FontAwesomeIcon"},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Getter"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Image File"}}}},{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Options"}},"component":"data2-core-primitives@Object","parameters":{"pdfPageChunkSize":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Number","title":{"component":"data2-core-primitives@String","params":{"content":"pdfPageChunkSize"}}}}}}}],"visibility":"public"},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2026-06-20T20:38:35.861Z"},{"_id":"65843017d3014e092deb5682","component":"data2-core-types@Component","params":{"component":"FindNearestPoint","package":"data2-core-ai","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"queryVector":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Number","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}},"dataVectors":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Number","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}}}}},"title":"FindNearestPoint"},"updatedAt":"2023-12-21T12:37:18.664Z","createdAt":"2023-12-21T12:31:19.622Z"},{"_id":"67281c95143117b8d9289926","component":"data2-core-types@Component","params":{"component":"LocalAssistant","package":"data2-core-ai","parameters":{},"title":"LocalAssistant","interactions":{"initialize":{"params":{},"component":"data2-core-types@ComponentParameter"}}},"updatedAt":"2024-11-04T01:00:05.769Z","createdAt":"2024-11-04T01:00:05.769Z"},{"_id":"674fc22e14eb9637921bb979","component":"data2-core-types@Component","params":{"component":"SmartSwitch","package":"data2-core-ai","icon":"user","interactions":{"detectUseCase":{"params":{"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Prompt"}},"key":{"component":"data2-core-primitives@String","params":{"content":"prompt"}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Goal"}},"key":{"component":"data2-core-primitives@String","params":{"content":"goal"}}}},{"component":"data2-core-types@ComponentParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"useCaseLabelKey"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Use Case Label Key"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@ComponentParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"useCases"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Use Cases List"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"component":"data2-core-primitives@Object"}}]},"component":"data2-core-types@ComponentParameter"}},"renderable":{"dimensions":{"disabled":false,"component":"data2-core-types@Dimensions","params":{"width":1360,"height":800,"exactWidth":false,"exactHeight":false}}}},"updatedAt":"2024-12-15T18:10:01.772Z","createdAt":"2024-12-04T02:45:02.609Z"},{"_id":"6563b437b51f410936dbba75","component":"data2-core-types@Component","params":{"component":"Trick","package":"data2-core-ai","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"code":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"code"}}}}}}}},"updatedAt":"2023-11-26T21:10:15.642Z","createdAt":"2023-11-26T21:10:15.642Z"},{"_id":"6a676c89c4067eb777b44f71","component":"data2-core-types@Component","params":{"package":"data2-core-auth","component":"BuilderPolicy","visibility":"private","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{}}}},"updatedAt":"2026-07-27T00:00:00.000Z"},{"_id":"6a65ed32a7d619aaf615483c","component":"data2-core-types@Component","params":{"package":"data2-core-auth","component":"ConnectPolicy","visibility":"private","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"httpClients":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"title":{"component":"data2-core-primitives@String","params":{"content":"HTTP Clients"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Refina por HttpClient: allow vazio = qualquer client de um sistema permitido; caso contrário só os listados. Entries batem no httpClient.reference. deny sempre vence."}},"visibility":"beta","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"allow":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"deny":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}}}}},"component":"data2-core-types@ComponentParameter"},"systems":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}},"title":{"component":"data2-core-primitives@String","params":{"content":"Systems"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Gate por sistema: o sistema DONO do client precisa ser permitido (httpClient.system, não o sistema do rush de origem). O próprio sistema sempre passa, então allow só nomeia OUTROS sistemas; allow vazio = só o próprio sistema. Entries são DOMÍNIOS. deny sempre vence."}},"visibility":"beta","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"allow":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"deny":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}}}}},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2026-07-26T00:00:00.000Z"},{"_id":"620d205f8271aa41298f72ee","component":"data2-core-types@Component","params":{"product":"connect","icon":"id-card","package":"data2-core-auth","component":"CustomAuthenticationStrategy","interactions":{"component":"data2-core-types@FieldSet","params":{"fields":{"login":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"sign-in"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"logout":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"sign-out"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"register":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"user-plus"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"position":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Position"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":101}},"simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"},"dimensions":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Dimensions"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":102}},"simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"defaultValue":{"preventEvaluation":true,"component":"data2-core-types@Dimensions","params":{"width":300,"height":300}},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"},"login":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-flow@Series"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"},"sessions":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-flow@Series"}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}}},"component":"data2-core-types@ComponentParameter"},"logout":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-flow@Series"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}}},"component":"data2-core-types@ComponentParameter"},"localUsersDataset":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetReference"}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}},"visibility":"private"},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2022-07-06T22:45:22.397Z"},{"_id":"6a5a71ed2fc01b051d3fe153","component":"data2-core-types@Component","params":{"product":"connect","package":"data2-core-auth","component":"InvokedByBuilder","visibility":"private","icon":{"component":"data2-core-types@FontAwesomeIcon","params":{"icon":"fa-user-shield"}},"title":{"component":"data2-core-primitives@String","params":{"content":"InvokedByBuilder"}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{}}}},"updatedAt":"2026-07-18T00:00:00.000Z"},{"_id":"6a6b6f3ac4067eb777491003","component":"data2-core-types@Component","params":{"package":"data2-core-auth","component":"InvokedByClientIp","visibility":"private","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"ips":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"title":{"component":"data2-core-primitives@String","params":{"content":"IPs"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Endereços ou faixas CIDR (IPv4/IPv6). Retorna true se o IP confiável do chamador estiver em alguma delas. Predicado só do lado allow — a negação fica na expressão em volta (deny, ou um NOT). Use dentro do allow/deny de um Policy para compor com And/Or; sem IP confiável retorna false."}}},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2026-07-29T00:00:00.000Z"},{"_id":"6a5a71df2fc01b051d3fdd5b","component":"data2-core-types@Component","params":{"product":"connect","package":"data2-core-auth","component":"InvokedByRush","visibility":"private","icon":{"component":"data2-core-types@FontAwesomeIcon","params":{"icon":"fa-robot"}},"title":{"component":"data2-core-primitives@String","params":{"content":"InvokedByRush"}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{}}}},"updatedAt":"2026-07-18T00:00:00.000Z"},{"_id":"6a6a2c49dc1fded10b0636f0","component":"data2-core-types@Component","params":{"component":"IpAllowlistPolicy","package":"data2-core-auth","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"allowedIps":{"params":{"component":"data2-core-primitives@String","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"clientIp":{"params":{"component":"data2-core-primitives@String","list":{"component":"data2-core-primitives@Boolean","params":{"content":false}}},"component":"data2-core-types@ComponentParameter"}}}},"definition":{"params":{"allow":{"params":{"compare":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"allowedIps"}}}},"pattern":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"clientIp"}}}}},"component":"data2-core-functions@Includes"},"then":{"params":{"content":true},"component":"data2-core-primitives@Boolean"},"else":{"params":{"content":false},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-flow@If"}},"component":"data2-core-auth@Policy"}},"updatedAt":"2026-07-30T14:09:54.955Z","createdAt":"2026-07-29T16:37:29.750Z"},{"_id":"6a6b6e96c4067eb77748a9e7","component":"data2-core-types@Component","params":{"package":"data2-core-auth","component":"IpPolicy","visibility":"private","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"ips":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"title":{"component":"data2-core-primitives@String","params":{"content":"IPs"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Gate por IP do chamador. Entradas são endereços (200.182.103.70) ou faixas CIDR (200.182.103.64/28), IPv4 ou IPv6. deny sempre vence. allow não-vazio = allowlist estrita. allow vazio + deny preenchido = modo blocklist. Os dois vazios NEGA (config inútil falha fechado). Sem IP confiável (execuções internas, realtime) também NEGA. Atenção: o array de policies é um OR — para 'IP permitido E autenticado' use PolicyAnd."}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"allow":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"deny":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}}}}},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2026-07-29T00:00:00.000Z"},{"_id":"5fb43e73c8da12be8bde5e6e","component":"data2-core-types@Component","params":{"package":"data2-core-auth","component":"Policy","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"authenticationStrategy":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@InteractiveModuleReference"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"},"allowedRoles":{"params":{"oneOf":{"preventEvaluation":true,"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@Reference","params":{"reference":"authenticationStrategy"}},"prop":"dataset.instance.getField","args":[{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@Reference","params":{"reference":"authenticationStrategy"}},"prop":"roleField.key"}}]}},"prop":"validation.oneOf"}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"blockedRoles":{"params":{"oneOf":{"preventEvaluation":true,"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@Reference","params":{"reference":"authenticationStrategy"}},"prop":"dataset.instance.getField","args":[{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@Reference","params":{"reference":"authenticationStrategy"}},"prop":"roleField.key"}}]}},"prop":"validation.oneOf"}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"allow":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-flow@If"}},"visibility":"beta"},"component":"data2-core-types@ComponentParameter"},"deny":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-flow@If"}},"visibility":"beta"},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2025-07-03T21:48:20.079Z"},{"_id":"6a6b6eaec4067eb77748b7f6","component":"data2-core-types@Component","params":{"package":"data2-core-auth","component":"PolicyAnd","visibility":"private","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"policies":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-auth@Policy"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"title":{"component":"data2-core-primitives@String","params":{"content":"Policies"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Só libera se TODAS as policies aninhadas liberarem (AND). O array de policies do recurso é um OR, então use este componente como UMA das entradas para expressar conjunção: [PolicyAnd([IpPolicy, Policy(auth)]), BuilderPolicy] = (IP permitido E autenticado) OU builder. Array vazio NEGA, assim como filho que lança erro ou retorna Data2Error."}}},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2026-07-29T00:00:00.000Z"},{"_id":"6a676c9ac4067eb777b45a58","component":"data2-core-types@Component","params":{"package":"data2-core-auth","component":"PublicPolicy","visibility":"private","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"reason":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"title":{"component":"data2-core-primitives@String","params":{"content":"Reason"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Justificativa de por que este recurso é público. Não afeta a decisão (PublicPolicy sempre libera) — serve para auditoria: fica registrado no core_logs junto com quem alterou."}}},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2026-07-27T00:00:00.000Z"},{"_id":"6a633062a7d619aaf6336b47","component":"data2-core-types@Component","params":{"package":"data2-core-auth","component":"RushPolicy","visibility":"private","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"rushes":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"title":{"component":"data2-core-primitives@String","params":{"content":"Rushes"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Refina por rush: allow vazio = qualquer rush de um sistema permitido; caso contrário só os listados. Entries batem no rush.reference. deny sempre vence."}},"visibility":"beta","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"allow":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"deny":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}}}}},"component":"data2-core-types@ComponentParameter"},"systems":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}},"title":{"component":"data2-core-primitives@String","params":{"content":"Systems"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Gate por sistema: o sistema do caller precisa ser permitido. O próprio sistema sempre passa, então allow só nomeia OUTROS sistemas; allow vazio = só o próprio sistema. Entries são DOMÍNIOS. deny sempre vence."}},"visibility":"beta","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"allow":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"deny":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}}}}},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2026-07-24T00:00:00.000Z"},{"_id":"6936d4ae5c11770e0c2371a1","component":"data2-core-types@Component","params":{"component":"ColorClampChroma","package":"data2-core-color","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"color":{"params":{"component":"data2-core-primitives@String","description":{"component":"data2-core-primitives@String","params":{"content":"Any color input"}}},"component":"data2-core-types@ComponentParameter"},"mode":{"params":{"component":"data2-core-primitives@String","oneOf":[{"component":"data2-core-primitives@String","params":{"content":"rgb"}},{"component":"data2-core-primitives@String","params":{"content":"hsl"}},{"component":"data2-core-primitives@String","params":{"content":"lab"}},{"component":"data2-core-primitives@String","params":{"content":"lch"}},{"component":"data2-core-primitives@String","params":{"content":"oklch"}}],"description":{"component":"data2-core-primitives@String","params":{"content":"Color space to use for clamping (default: `'lch'`)"}}},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"private","description":{"component":"data2-core-primitives@String","params":{"content":"Clamps the chroma of a color to fit within the displayable RGB gamut."}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"color"}}},"updatedAt":"2025-12-08T17:37:33.203Z","createdAt":"2025-12-08T13:37:50.525Z"},{"_id":"6936d4f848846f0a319652c8","component":"data2-core-types@Component","params":{"component":"ColorDisplayable","package":"data2-core-color","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"color":{"params":{"component":"data2-core-primitives@String","description":{"component":"data2-core-primitives@String","params":{"content":"Any color input"}}},"component":"data2-core-types@ComponentParameter"}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"Checks if a color is displayable in the RGB gamut."}},"visibility":"private"},"updatedAt":"2025-12-08T13:39:04.398Z","createdAt":"2025-12-08T13:39:04.398Z"},{"_id":"6936d02290fed746465aaefb","component":"data2-core-types@Component","params":{"component":"ColorFormatHex","package":"data2-core-color","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"color":{"params":{"component":"data2-core-primitives@String","description":{"component":"data2-core-primitives@String","params":{"content":"Any color input (string or color object)"}}},"component":"data2-core-types@ComponentParameter"}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"Formats a color as a hexadecimal string."}},"visibility":"private"},"updatedAt":"2025-12-08T13:20:17.166Z","createdAt":"2025-12-08T13:18:26.032Z"},{"_id":"6936d13bd9ebe2bf171cf41f","component":"data2-core-types@Component","params":{"component":"ColorFormatHsl","package":"data2-core-color","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"color":{"params":{"component":"data2-core-primitives@String","description":{"component":"data2-core-primitives@String","params":{"content":"Any color input (string or color object)"}}},"component":"data2-core-types@ComponentParameter"}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"Formats a color as an HSL string."}},"visibility":"private"},"updatedAt":"2025-12-08T13:23:07.711Z","createdAt":"2025-12-08T13:23:07.711Z"},{"_id":"6936d0f07e09c9a53acc9b62","component":"data2-core-types@Component","params":{"component":"ColorFormatRgb","package":"data2-core-color","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"color":{"params":{"component":"data2-core-primitives@String","description":{"component":"data2-core-primitives@String","params":{"content":"Any color input (string or color object)"}}},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"private","description":{"component":"data2-core-primitives@String","params":{"content":"Formats a color as an RGB string."}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"color"}}},"updatedAt":"2025-12-08T17:38:29.742Z","createdAt":"2025-12-08T13:21:52.113Z"},{"_id":"6936d3d28166a81317fe6b2b","component":"data2-core-types@Component","params":{"component":"ColorInterpolate","package":"data2-core-color","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"colors":{"params":{"component":"data2-core-primitives@String","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"description":{"component":"data2-core-primitives@String","params":{"content":"Array of colors to interpolate between (minimum 2), any color input."}}},"component":"data2-core-types@ComponentParameter"},"mode":{"params":{"component":"data2-core-primitives@String","oneOf":[{"component":"data2-core-primitives@String","params":{"content":"rgb"}},{"component":"data2-core-primitives@String","params":{"content":"hsl"}},{"component":"data2-core-primitives@String","params":{"content":"lab"}},{"component":"data2-core-primitives@String","params":{"content":"lch"}},{"component":"data2-core-primitives@String","params":{"content":"oklch"}}],"description":{"component":"data2-core-primitives@String","params":{"content":"Interpolation color space (default: `'rgb'`)"}}},"component":"data2-core-types@ComponentParameter"},"t":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"Position between colors, 0-1 (default: `0.5`)"}}},"component":"data2-core-types@ComponentParameter"}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"Interpolates between two or more colors."}},"visibility":"private"},"updatedAt":"2025-12-08T13:34:10.160Z","createdAt":"2025-12-08T13:34:10.160Z"},{"_id":"6936cdcc7e09c9a53acc74dd","component":"data2-core-types@Component","params":{"component":"ColorParse","package":"data2-core-color","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"color":{"params":{"component":"data2-core-primitives@String","description":{"component":"data2-core-primitives@String","params":{"content":"Any valid color string (hex, rgb, hsl, named colors, etc.)"}}},"component":"data2-core-types@ComponentParameter"}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"Parses any color string into a color object."}}},"updatedAt":"2025-12-08T13:13:47.988Z","createdAt":"2025-12-08T13:08:28.407Z"},{"_id":"6936d1e58166a81317fe545c","component":"data2-core-types@Component","params":{"component":"ColorToHsl","package":"data2-core-color","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"color":{"params":{"component":"data2-core-primitives@String","description":{"component":"data2-core-primitives@String","params":{"content":"Any color input"}}},"component":"data2-core-types@ComponentParameter"}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"Converts a color to the HSL color space."}},"visibility":"private"},"updatedAt":"2025-12-08T13:25:57.942Z","createdAt":"2025-12-08T13:25:57.942Z"},{"_id":"6936d2487e09c9a53accac14","component":"data2-core-types@Component","params":{"component":"ColorToOklch","package":"data2-core-color","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"color":{"params":{"component":"data2-core-primitives@String","description":{"component":"data2-core-primitives@String","params":{"content":"Any color input"}}},"component":"data2-core-types@ComponentParameter"}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"Converts a color to the OKLCH color space (perceptually uniform)."}},"visibility":"private"},"updatedAt":"2025-12-08T13:27:36.897Z","createdAt":"2025-12-08T13:27:36.897Z"},{"_id":"6936d1a47e09c9a53acca3fe","component":"data2-core-types@Component","params":{"component":"ColorToRgb","package":"data2-core-color","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"color":{"params":{"component":"data2-core-primitives@String","description":{"component":"data2-core-primitives@String","params":{"content":"Any color input"}}},"component":"data2-core-types@ComponentParameter"}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"Converts a color to the RGB color space."}},"visibility":"private"},"updatedAt":"2025-12-08T13:24:52.757Z","createdAt":"2025-12-08T13:24:52.757Z"},{"_id":"5f6b9a02a575399a452b3879","component":"data2-core-types@Component","params":{"package":"data2-core-comparison-operators","component":"Different","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"comparisonSubject":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Comparison Subject"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"},"subject":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Subject"}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}}},"component":"data2-core-types@ComponentParameter"}}}},"returnPrimitiveTypes":[{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}}],"wrap":{"component":"data2-core-primitives@String","params":{"content":"subject"}}},"updatedAt":"2022-09-12T19:49:22.471Z"},{"_id":"5f6b99a4a575399a452b2964","component":"data2-core-types@Component","params":{"package":"data2-core-comparison-operators","component":"Equal","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"comparisonSubject":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Comparison Subject"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"},"subject":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Subject"}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}}},"component":"data2-core-types@ComponentParameter"}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"Equivalent to: subject == comparisonSubject. If either subject or comparisonSubject are missing, it returns true."}},"title":{"component":"data2-core-primitives@String","params":{"content":"Equal"}},"returnPrimitiveTypes":[{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}}],"wrap":{"component":"data2-core-primitives@String","params":{"content":"subject"}}},"updatedAt":"2022-09-12T19:49:41.741Z"},{"_id":"5f6b9985a575399a452b2386","component":"data2-core-types@Component","params":{"package":"data2-core-comparison-operators","component":"EqualOrGreaterThan","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"comparisonSubject":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"title":{"component":"data2-core-primitives@String","params":{"content":"Comparison Subject"}}},"component":"data2-core-types@ComponentParameter"},"subject":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}},"title":{"component":"data2-core-primitives@String","params":{"content":"Subject"}}},"component":"data2-core-types@ComponentParameter"}}}},"title":{"component":"data2-core-primitives@String","params":{"content":"EqualOrGreaterThan"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Equivalent to: subject ≥ comparisonSubject."}},"returnPrimitiveTypes":[{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}}],"wrap":{"component":"data2-core-primitives@String","params":{"content":"subject"}}},"updatedAt":"2026-06-16T17:08:46.201Z"},{"_id":"5f6b999aa575399a452b27c0","component":"data2-core-types@Component","params":{"package":"data2-core-comparison-operators","component":"EqualOrLesserThan","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"comparisonSubject":{"params":{"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Comparison Subject"}}},"component":"data2-core-types@ComponentParameter"},"subject":{"params":{"index":{"component":"data2-core-primitives@Number","params":{"content":0}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Subject"}}},"component":"data2-core-types@ComponentParameter"}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"Equivalent to: subject ≤ comparisonSubject."}},"returnPrimitiveTypes":[{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}}],"wrap":{"component":"data2-core-primitives@String","params":{"content":"subject"}}},"updatedAt":"2022-09-12T20:06:36.891Z"},{"_id":"5f6b9967a575399a452b1de7","component":"data2-core-types@Component","params":{"package":"data2-core-comparison-operators","component":"GreaterThan","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"comparisonSubject":{"params":{"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Comparison Subject"}}},"component":"data2-core-types@ComponentParameter"},"subject":{"params":{"index":{"component":"data2-core-primitives@Number","params":{"content":0}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Subject"}}},"component":"data2-core-types@ComponentParameter"}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"Equivalent to: subject > comparisonSubject."}},"title":{"component":"data2-core-primitives@String","params":{"content":"GreaterThan"}},"returnPrimitiveTypes":[{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}}],"wrap":{"component":"data2-core-primitives@String","params":{"content":"subject"}}},"updatedAt":"2022-09-12T20:18:46.502Z"},{"_id":"5f6b99f8a575399a452b374d","component":"data2-core-types@Component","params":{"package":"data2-core-comparison-operators","component":"Identical","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"comparisonSubject":{"params":{"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Comparison Subject"}}},"component":"data2-core-types@ComponentParameter"},"subject":{"params":{"index":{"component":"data2-core-primitives@Number","params":{"content":0}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Subject"}}},"component":"data2-core-types@ComponentParameter"}}}},"title":{"component":"data2-core-primitives@String","params":{"content":"Identical"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Checks if subject and comparison subject are identical. The difference between Identical and Equal, is that Identical returns false when primitives aren't the same, e.g., \"0\" (primitive: string) isn't identical to 0 (primitive: number), but \"0\" (primitive: string) and 0 (primitive: number) are Equal."}},"returnPrimitiveTypes":[{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}}],"wrap":{"component":"data2-core-primitives@String","params":{"content":"subject"}}},"updatedAt":"2022-09-12T20:19:15.899Z"},{"_id":"5f6b998da575399a452b256f","component":"data2-core-types@Component","params":{"package":"data2-core-comparison-operators","component":"LesserThan","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"comparisonSubject":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Comparison Subject"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"},"subject":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Subject"}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}}},"component":"data2-core-types@ComponentParameter"}}}},"returnPrimitiveTypes":[{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}}],"description":{"component":"data2-core-primitives@String","params":{"content":"Equivalent to: subject < comparisonSubject."}},"title":{"component":"data2-core-primitives@String","params":{"content":"LesserThan"}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"subject"}}},"updatedAt":"2022-09-12T20:19:29.076Z"},{"_id":"6841e951f220c5f37f02d9bf","component":"data2-core-types@Component","params":{"component":"AwsService","package":"data2-core-connect","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"region":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"},"accessKey":{"params":{"component":"data2-core-types@Getter","index":{"component":"data2-core-primitives@Number","params":{"content":2}}},"component":"data2-core-types@ComponentParameter"},"secret":{"params":{"component":"data2-core-types@Getter","index":{"component":"data2-core-primitives@Number","params":{"content":3}}},"component":"data2-core-types@ComponentParameter"},"policies":{"params":{"component":"data2-core-auth@Policy","index":{"component":"data2-core-primitives@Number","params":{"content":5}},"category":"behaviour","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}}}},"title":"AWSService","icon":{"component":"data2-core-primitives@String","params":{"content":"cubes"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Data² Connect integration with AWS Services"}},"visibility":"private","interactions":{"params":{"fields":{"s3Put":{"params":{"component":"data2-core-functions@Function","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","parameters":{"bucket":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":1}},"title":{"component":"data2-core-primitives@String","params":{"content":"bucket"}}},"component":"data2-core-types@ComponentParameter"},"key":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":2}},"title":{"component":"data2-core-primitives@String","params":{"content":"key"}}},"component":"data2-core-types@ComponentParameter"},"content":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":3}},"title":{"component":"data2-core-primitives@String","params":{"content":"content"}}},"component":"data2-core-types@ComponentParameter"},"contentType":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":4}},"title":{"component":"data2-core-primitives@String","params":{"content":"contentType"}}},"component":"data2-core-types@ComponentParameter"}},"flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}}]},"component":"data2-core-types@ComponentParameter"},"athenaQuery":{"params":{"component":"data2-core-functions@Function","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","parameters":{"query":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":2}},"title":{"component":"data2-core-primitives@String","params":{"content":"query"}}},"component":"data2-core-types@ComponentParameter"},"database":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":1}},"title":{"component":"data2-core-primitives@String","params":{"content":"database"}}},"component":"data2-core-types@ComponentParameter"},"outputLocation":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":10}},"title":{"component":"data2-core-primitives@String","params":{"content":"outputLocation"}}},"component":"data2-core-types@ComponentParameter"}},"flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}}]},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@FieldSet"}},"updatedAt":"2025-06-05T19:04:57.303Z","createdAt":"2025-06-05T14:16:55.317Z"},{"_id":"692639d93aea4e87c65a103e","component":"data2-core-types@Component","params":{"component":"Crawler","package":"data2-core-connect","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"policies":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-auth@Policy","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}}}}},"visibility":"private","title":"Crawler","interactions":{"params":{"fields":{"search":{"params":{"component":"data2-core-functions@Function","title":{"component":"data2-core-primitives@String","params":{"content":"Scrape"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"query":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","description":{"component":"data2-core-primitives@String","params":{"content":"Text to be searched"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"title":{"component":"data2-core-primitives@String","params":{"content":"Query"}}}},"sources":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","description":{"component":"data2-core-primitives@String","params":{"content":"Sources: web, images, news"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"oneOf":[{"component":"data2-core-primitives@String","params":{"content":"web"}},{"component":"data2-core-primitives@String","params":{"content":"images"}},{"component":"data2-core-primitives@String","params":{"content":"news"}}],"index":{"component":"data2-core-primitives@Number","params":{"content":2}},"title":{"component":"data2-core-primitives@String","params":{"content":"Sources"}}}},"includeDomains":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","description":{"component":"data2-core-primitives@String","params":{"content":"List of domains to include in search"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":3}},"title":{"component":"data2-core-primitives@String","params":{"content":"Include Domains"}}}},"excludeDomains":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","description":{"component":"data2-core-primitives@String","params":{"content":"List of domains to exclude in search"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":4}},"title":{"component":"data2-core-primitives@String","params":{"content":"Exclude Domains"}}}}}}}],"description":{"component":"data2-core-primitives@String","params":{"content":"Discovers relevant web resources based on a user query."}}},"component":"data2-core-types@ComponentParameter"},"scrape":{"params":{"component":"data2-core-functions@Function","title":{"component":"data2-core-primitives@String","params":{"content":"Scrape"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"url":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","description":{"component":"data2-core-primitives@String","params":{"content":"Url to be scraped"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"title":{"component":"data2-core-primitives@String","params":{"content":"Url"}}}},"formats":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","description":{"component":"data2-core-primitives@String","params":{"content":"List of formats to return: markdown, html, links, images, json, branding, summary"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}},"title":{"component":"data2-core-primitives@String","params":{"content":"Url"}},"oneOf":[{"component":"data2-core-primitives@String","params":{"content":"markdown"}},{"component":"data2-core-primitives@String","params":{"content":"summary"}},{"component":"data2-core-primitives@String","params":{"content":"html"}},{"component":"data2-core-primitives@String","params":{"content":"links"}},{"component":"data2-core-primitives@String","params":{"content":"images"}},{"component":"data2-core-primitives@String","params":{"content":"json"}},{"component":"data2-core-primitives@String","params":{"content":"branding"}}]}}}}}],"description":{"component":"data2-core-primitives@String","params":{"content":"Fetches content from a given URL and transform it into structured, easily consumable formats such as JSON, Markdown, or HTML."}}},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@FieldSet"},"icon":{"component":"data2-core-primitives@String","params":{"content":"search"}},"renderable":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768}}}},"updatedAt":"2026-06-08T19:15:09.718Z","createdAt":"2025-11-25T23:20:57.294Z"},{"_id":"6571d3d7a460a0092ae7cdcc","component":"data2-core-types@Component","params":{"component":"GoogleSheets","package":"data2-core-connect","parameters":{"component":"data2-core-types@FieldSet","params":{"fieldsList":[{"key":{"component":"data2-core-primitives@String","params":{"content":"spreadsheetId"}},"value":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Spreadsheet ID"}},"icon":{"params":{"icon":"fa-table"},"component":"data2-core-types@FontAwesomeIcon"},"multiLine":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"key":{"component":"data2-core-primitives@String","params":{"content":"spreadsheetId"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Google Sheets ID. Can be found in the sheet URL: \"https://docs.google.com/spreadsheets/d/SPREADSHEET_ID/\""}}},"component":"data2-core-types@ComponentParameter"}},{"key":{"component":"data2-core-primitives@String","params":{"content":"defaultSheet"}},"value":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Default Sheet"}},"icon":{"params":{"icon":"fa-newspaper-o"},"component":"data2-core-types@FontAwesomeIcon"},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}},"key":{"component":"data2-core-primitives@String","params":{"content":"defaultSheet"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Default sheet to be used by the integration."}}},"component":"data2-core-types@ComponentParameter"}},{"key":{"component":"data2-core-primitives@String","params":{"content":"policies"}},"value":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-auth@Policy"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":3}},"key":{"component":"data2-core-primitives@String","params":{"content":"policies"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Controls for allowing or denying access to the data"}}}}}]}},"title":"Google Sheets","icon":{"component":"data2-core-primitives@String","params":{"content":"google"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Data² Connect integration with Google Sheets"}},"visibility":"private","interactions":{"params":{"fieldsList":[{"key":{"component":"data2-core-primitives@String","params":{"content":"read"}},"value":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Read"}},"component":{"component":"data2-core-primitives@String","params":{"content":""}},"icon":{"params":{"icon":"fa-file-text"},"component":"data2-core-types@FontAwesomeIcon"},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","parameters":{"sheet":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Sheet"}},"component":"data2-core-primitives@String","description":{"component":"data2-core-primitives@String","params":{"content":"Optional: uses default sheet if not specified. Sheet name, such as \"Sheet1\"."}},"index":{"component":"data2-core-primitives@Number","params":{"content":15}}},"component":"data2-core-types@ComponentParameter"},"range":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Range"}},"component":"data2-core-primitives@String","description":{"component":"data2-core-primitives@String","params":{"content":"Optional. Range of cells to get, e.g., A1:B3"}},"index":{"component":"data2-core-primitives@Number","params":{"content":12}}},"component":"data2-core-types@ComponentParameter"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Read arguments"}}}}],"visibility":"private","description":{"component":"data2-core-primitives@String","params":{"content":"Read from spreadsheet"}}},"component":"data2-core-types@ComponentParameter"}},{"key":{"component":"data2-core-primitives@String","params":{"content":"append"}},"value":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Append"}},"component":{"component":"data2-core-primitives@String","params":{"content":""}},"icon":{"params":{"icon":"fa-bars"},"component":"data2-core-types@FontAwesomeIcon"},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","parameters":{"sheet":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Sheet"}},"component":"data2-core-primitives@String","description":{"component":"data2-core-primitives@String","params":{"content":"Optional: uses default sheet if not specified. Sheet name, such as \"Sheet1\"."}},"index":{"component":"data2-core-primitives@Number","params":{"content":15}}},"component":"data2-core-types@ComponentParameter"},"range":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Range"}},"component":"data2-core-primitives@String","description":{"component":"data2-core-primitives@String","params":{"content":"Optional. Range of cells to get, e.g., A1:B3"}},"index":{"component":"data2-core-primitives@Number","params":{"content":12}}},"component":"data2-core-types@ComponentParameter"},"values":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Values"}},"component":"data2-core-primitives@String","description":{"component":"data2-core-primitives@String","params":{"content":"Required. Values to be appended."}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Arguments"}}}}],"visibility":"private","description":{"component":"data2-core-primitives@String","params":{"content":"Append to sheet"}}},"component":"data2-core-types@ComponentParameter"}}]},"component":"data2-core-types@FieldSet"}},"updatedAt":"2026-08-07T22:18:22.611Z","createdAt":"2023-12-07T14:16:55.317Z"},{"_id":"64a85b11c91d9255f47c37e0","component":"data2-core-types@Component","params":{"package":"data2-core-connect","component":"HttpClient","icon":"globe","parameters":{"policies":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-auth@Policy"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"description":{"component":"data2-core-primitives@String","params":{"content":"Controls for allowing or denying access to the data"}}},"component":"data2-core-types@ComponentParameter"}},"interactions":{"params":{"fields":{"sendRequest":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Sends request"}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"params":{"fields":{"request":{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Request"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Request"}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@InstanceReference"}},"controlSettings":{"componentFilter":{"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"componentInstance"}}],"body":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"componentInstance.component"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"data2-core-connect@HttpRequest"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"componentInstance.params.parent.params.reference"}}}},"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"module.reference"}}}}},"component":"data2-core-comparison-operators@Equal"}]},"component":"data2-core-logical-operators@And"}},"break":true}}}},"requestParameters":{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Request Parameters"}},"componentOptions":{"inferredComponent":{"params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"p"}}],"body":{"params":{"component":"data2-core-primitives@Object","parameters":{"params":{"fieldsList":{"params":{"array":{"params":{"module":{"params":{"array":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"ServiceComponentInstancesDataSet"}},"_layer":{"component":"data2-core-primitives@String","params":{"content":"HostApplicationLayer"}}},"component":"data2-core-types@ProcessReference"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"c"}}],"body":{"params":{"components":[{"params":{"comparisonSubject":{"params":{"content":"data2-core-connect@HttpRequest"},"component":"data2-core-primitives@String"},"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"c.component"}}}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"p.rootExecutedInstanceParams.args.0.request"}}}},"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"c.reference"}}}}},"component":"data2-core-comparison-operators@Equal"}]},"component":"data2-core-logical-operators@And"}}}},"component":"data2-core-functions@ArrayFind"},"prop":{"component":"data2-core-primitives@String","params":{"content":"options.requestParameters"}}},"component":"data2-core-types@Getter"},"mapper":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"value"}}],"body":{"key":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"value"}}}},"prop":{"component":"data2-core-primitives@String","params":{"content":"key"}}}},"value":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"value"}}}}}}}},"component":"data2-core-functions@ArrayMap"}},"component":"data2-core-types@FieldSet"},"title":{"component":"data2-core-primitives@String","params":{"content":"Request Parameters"}}},"component":"data2-core-types@ComponentParameter"}},"component":"data2-core-functions@Function","break":true}},"visibility":"public","component":"data2-core-primitives@Inferred"}}}},"component":"data2-core-types@FieldSet"}}}]}},"getRequestParameters":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Get request parameters"}},"visibility":"private","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"params":{"fields":{"request":{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Request"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Request"}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@InstanceReference"}},"controlSettings":{"componentFilter":{"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"componentInstance"}}],"body":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"componentInstance.component"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"data2-core-connect@HttpRequest"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"componentInstance.params.parent.params.reference"}}}},"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"module.reference"}}}}},"component":"data2-core-comparison-operators@Equal"}]},"component":"data2-core-logical-operators@And"}},"break":true}}}},"requestParameters":{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Request Parameters"}},"componentOptions":{"inferredComponent":{"params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"p"}}],"body":{"params":{"component":"data2-core-primitives@Object","parameters":{"params":{"fieldsList":{"params":{"array":{"params":{"module":{"params":{"array":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"ServiceComponentInstancesDataSet"}},"_layer":{"component":"data2-core-primitives@String","params":{"content":"HostApplicationLayer"}}},"component":"data2-core-types@ProcessReference"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"c"}}],"body":{"params":{"components":[{"params":{"comparisonSubject":{"params":{"content":"data2-core-connect@HttpRequest"},"component":"data2-core-primitives@String"},"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"c.component"}}}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"p.rootExecutedInstanceParams.args.0.request"}}}},"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"c.reference"}}}}},"component":"data2-core-comparison-operators@Equal"}]},"component":"data2-core-logical-operators@And"}}}},"component":"data2-core-functions@ArrayFind"},"prop":{"component":"data2-core-primitives@String","params":{"content":"options.requestParameters"}}},"component":"data2-core-types@Getter"},"mapper":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"value"}}],"body":{"key":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"value"}}}},"prop":{"component":"data2-core-primitives@String","params":{"content":"key"}}}},"value":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"value"}}}}}}}},"component":"data2-core-functions@ArrayMap"}},"component":"data2-core-types@FieldSet"},"title":{"component":"data2-core-primitives@String","params":{"content":"Request Parameters"}}},"component":"data2-core-types@ComponentParameter"}},"component":"data2-core-functions@Function","break":true}},"visibility":"public","component":"data2-core-primitives@Inferred"}}}},"component":"data2-core-types@FieldSet"}}}]}},"getCurlCommand":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Get curl command from Request"}},"visibility":"private","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"params":{"fields":{"request":{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Request"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Request"}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@InstanceReference"}},"controlSettings":{"componentFilter":{"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"componentInstance"}}],"body":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"componentInstance.component"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"data2-core-connect@HttpRequest"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"componentInstance.params.parent.params.reference"}}}},"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"module.reference"}}}}},"component":"data2-core-comparison-operators@Equal"}]},"component":"data2-core-logical-operators@And"}},"break":true}}}},"requestParameters":{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Request Parameters"}},"componentOptions":{"inferredComponent":{"params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"p"}}],"body":{"params":{"component":"data2-core-primitives@Object","parameters":{"params":{"fieldsList":{"params":{"array":{"params":{"module":{"params":{"array":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"ServiceComponentInstancesDataSet"}},"_layer":{"component":"data2-core-primitives@String","params":{"content":"HostApplicationLayer"}}},"component":"data2-core-types@ProcessReference"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"c"}}],"body":{"params":{"components":[{"params":{"comparisonSubject":{"params":{"content":"data2-core-connect@HttpRequest"},"component":"data2-core-primitives@String"},"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"c.component"}}}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"p.rootExecutedInstanceParams.args.0.request"}}}},"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"c.reference"}}}}},"component":"data2-core-comparison-operators@Equal"}]},"component":"data2-core-logical-operators@And"}}}},"component":"data2-core-functions@ArrayFind"},"prop":{"component":"data2-core-primitives@String","params":{"content":"options.requestParameters"}}},"component":"data2-core-types@Getter"},"mapper":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"value"}}],"body":{"key":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"value"}}}},"prop":{"component":"data2-core-primitives@String","params":{"content":"key"}}}},"value":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"value"}}}}}}}},"component":"data2-core-functions@ArrayMap"}},"component":"data2-core-types@FieldSet"},"title":{"component":"data2-core-primitives@String","params":{"content":"Request Parameters"}}},"component":"data2-core-types@ComponentParameter"}},"component":"data2-core-functions@Function","break":true}},"visibility":"public","component":"data2-core-primitives@Inferred"}},"pretty":{"params":{"component":"data2-core-primitives@Boolean","defaultValue":{"params":{"content":true},"component":"data2-core-primitives@Boolean"},"title":{"component":"data2-core-primitives@String","params":{"content":"Pretty"}}},"component":"data2-core-types@ComponentParameter"},"useMocks":{"params":{"component":"data2-core-primitives@Boolean","defaultValue":{"params":{"content":false},"component":"data2-core-primitives@Boolean"},"title":{"component":"data2-core-primitives@String","params":{"content":"Use Mock"}}},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@FieldSet"}}}]}}}},"component":"data2-core-types@FieldSet"},"visibility":"public","renderable":{"dimensions":{"disabled":false,"component":"data2-core-types@Dimensions","params":{"width":1366,"exactWidth":false,"exactHeight":false,"height":768}}}},"updatedAt":"2026-01-09T17:29:47.531Z"},{"_id":"64a85b25c91d9255f47c39e7","component":"data2-core-types@Component","params":{"package":"data2-core-connect","component":"HttpRequest","icon":"envelope","visibility":"private","parameters":{"params":{"fields":{"parent":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@InstanceReference"}},"visibility":"private","index":{"component":"data2-core-primitives@Number","params":{"content":1}},"controlSettings":{"componentFilter":[{"component":"data2-core-primitives@String","params":{"content":"data2-core-connect@HttpClient"}}]}},"component":"data2-core-types@ComponentParameter"},"method":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":2}},"oneOf":[{"params":{"content":"GET"},"component":"data2-core-primitives@String"},{"params":{"content":"POST"},"component":"data2-core-primitives@String"},{"params":{"content":"PATCH"},"component":"data2-core-primitives@String"},{"params":{"content":"PUT"},"component":"data2-core-primitives@String"},{"params":{"content":"OPTIONS"},"component":"data2-core-primitives@String"},{"params":{"content":"DELETE"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"},"url":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":3}}},"component":"data2-core-types@ComponentParameter"},"headers":{"params":{"component":"data2-core-primitives@Object","index":{"component":"data2-core-primitives@Number","params":{"content":4}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"key":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"},"value":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@ComponentParameter"},"data":{"params":{"component":"data2-core-primitives@Object","index":{"component":"data2-core-primitives@Number","params":{"content":5}}},"component":"data2-core-types@ComponentParameter"},"responseType":{"params":{"component":"data2-core-primitives@String","oneOf":[{"params":{"content":"arraybuffer"},"component":"data2-core-primitives@String"},{"params":{"content":"document"},"component":"data2-core-primitives@String"},{"params":{"content":"json"},"component":"data2-core-primitives@String"},{"params":{"content":"text"},"component":"data2-core-primitives@String"},{"params":{"content":"stream"},"component":"data2-core-primitives@String"},{"params":{"content":"blob"},"component":"data2-core-primitives@String"},{"params":{"content":"blob-url"},"component":"data2-core-primitives@String"}],"index":{"component":"data2-core-primitives@Number","params":{"content":6}}},"component":"data2-core-types@ComponentParameter"},"rawResponse":{"params":{"index":{"component":"data2-core-primitives@Number","params":{"content":7}},"component":"data2-core-primitives@Boolean"},"component":"data2-core-types@ComponentParameter"},"useProxy":{"params":{"index":{"component":"data2-core-primitives@Number","params":{"content":8}},"component":"data2-core-primitives@Boolean","defaultValue":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-types@ComponentParameter"},"query":{"params":{"component":"data2-core-primitives@Object","index":{"component":"data2-core-primitives@Number","params":{"content":4.1}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"key":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"},"value":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@ComponentParameter"},"authentication":{"params":{"component":"data2-core-primitives@Object","index":{"component":"data2-core-primitives@Number","params":{"content":4.9}},"parameters":{"type":{"params":{"component":"data2-core-primitives@String","oneOf":[{"params":{"content":"Basic"},"component":"data2-core-primitives@String"},{"params":{"content":"Bearer"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"},"data":{"params":{"component":"data2-core-primitives@Object"},"component":"data2-core-types@ComponentParameter"}},"visibility":"private"},"component":"data2-core-types@ComponentParameter"},"requestParameters":{"params":{"component":"data2-core-types@PrimitiveParameter","index":{"component":"data2-core-primitives@Number","params":{"content":10}},"title":{"component":"data2-core-primitives@String","params":{"content":"Request Parameters"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"useCurl":{"params":{"index":{"component":"data2-core-primitives@Number","params":{"content":9}},"component":"data2-core-primitives@Boolean","dependsOn":[{"component":"data2-core-primitives@String","params":{"content":"useProxy"}}],"shouldShow":{"params":{"content":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"useProxy"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-primitives@Boolean","break":true}},"component":"data2-core-types@ComponentParameter"},"responseHeaderPrefix":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":6.1}}},"component":"data2-core-types@ComponentParameter"},"policies":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-auth@Policy"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"description":{"component":"data2-core-primitives@String","params":{"content":"Controls for allowing or denying access to the data"}}},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@FieldSet"},"componentOptions":{"contextPopulatedParams":{"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"p"}}],"body":{"params":{"fieldsList":{"params":{"mapper":{"params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"v"}}],"body":{"key":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"v.key"}}}},"value":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"v.mock"}}}}}},"component":"data2-core-functions@Function","break":true},"array":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"p.executedInstanceParams.requestParameters"}}}}},"component":"data2-core-functions@ArrayMap"}},"component":"data2-core-types@FieldSet"}},"break":true}}},"updatedAt":"2026-03-17T05:12:13.870Z"},{"_id":"67b3ec882b4fa5f211409520","component":"data2-core-types@Component","params":{"component":"HttpRequestBody","package":"data2-core-connect","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"type":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","oneOf":[{"params":{"content":"raw"},"component":"data2-core-primitives@String"},{"params":{"content":"binary"},"component":"data2-core-primitives@String"},{"params":{"content":"form-data"},"component":"data2-core-primitives@String"},{"params":{"content":"x-www-form-urlencoded"},"component":"data2-core-primitives@String"},{"params":{"content":"graphql"},"component":"data2-core-primitives@String"}]}},"file":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-types@FileComponentUrlReference","dependsOn":[{"component":"data2-core-primitives@String","params":{"content":"type"}}],"shouldShow":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"type"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"binary"}}},"component":"data2-core-comparison-operators@Equal"}}},"form":{"component":"data2-core-types@ComponentParameter","params":{"component":"http@FormData","dependsOn":[{"component":"data2-core-primitives@String","params":{"content":"type"}}],"shouldShow":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"type"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"form-data"}}},"component":"data2-core-comparison-operators@Equal"}}},"data":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","dependsOn":[{"component":"data2-core-primitives@String","params":{"content":"type"}}],"shouldShow":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"type"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"raw"}}},"component":"data2-core-comparison-operators@Equal"}}},"urlEncodedForm":{"component":"data2-core-types@ComponentParameter","params":{"component":"http@UrlEncodedFormData","dependsOn":[{"component":"data2-core-primitives@String","params":{"content":"type"}}],"shouldShow":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"type"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"x-www-form-urlencoded"}}},"component":"data2-core-comparison-operators@Equal"}}},"graphQlQuery":{"component":"data2-core-types@ComponentParameter","params":{"component":"http@GraphQLQuery","dependsOn":[{"component":"data2-core-primitives@String","params":{"content":"type"}}],"shouldShow":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"type"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"graphql"}}},"component":"data2-core-comparison-operators@Equal"}}}}}},"inlineParamsControl":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"updatedAt":"2025-02-18T02:56:07.495Z","createdAt":"2025-02-18T02:12:24.441Z"},{"_id":"6a7a012ee459187550e1f464","component":"data2-core-types@Component","params":{"public":true,"package":"data2-core-connect","component":"MailInviteTemplate","icon":"calendar","visibility":"public","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"parent":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@InstanceReference"}},"visibility":"private","index":{"component":"data2-core-primitives@Number","params":{"content":1}},"controlSettings":{"componentFilter":[{"component":"data2-core-primitives@String","params":{"content":"data2-core-connect@Mailer"}}]}},"component":"data2-core-types@ComponentParameter"},"from":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"parameters":{"name":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}},"component":"data2-core-types@ComponentParameter"}},"index":{"component":"data2-core-primitives@Number","params":{"content":5}}},"component":"data2-core-types@ComponentParameter"},"subject":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}}},"component":"data2-core-types@ComponentParameter"},"message":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2.1}}},"component":"data2-core-types@ComponentParameter"},"to":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":6}}},"component":"data2-core-types@ComponentParameter"},"replyTo":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":9}}},"component":"data2-core-types@ComponentParameter"},"templateParameters":{"params":{"component":"data2-core-types@PrimitiveParameter","index":{"component":"data2-core-primitives@Number","params":{"content":10}},"title":{"component":"data2-core-primitives@String","params":{"content":"Template Parameters"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"policies":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-auth@Policy"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"description":{"component":"data2-core-primitives@String","params":{"content":"Controls for allowing or denying access to the data"}}}},"title":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":20}},"description":{"component":"data2-core-primitives@String","params":{"content":"Calendar event title"}}}},"description":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":21}},"description":{"component":"data2-core-primitives@String","params":{"content":"Calendar event description"}}}},"location":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":22}},"description":{"component":"data2-core-primitives@String","params":{"content":"Calendar event location"}}}},"date":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":23}},"description":{"component":"data2-core-primitives@String","params":{"content":"Event start date, YYYY-MM-DD"}}}},"hour":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"index":{"component":"data2-core-primitives@Number","params":{"content":24}},"description":{"component":"data2-core-primitives@String","params":{"content":"Event start hour, UTC (0-23)"}}}},"minutes":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"index":{"component":"data2-core-primitives@Number","params":{"content":25}},"description":{"component":"data2-core-primitives@String","params":{"content":"Event start minutes (0-59)"}}}},"durationHour":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"index":{"component":"data2-core-primitives@Number","params":{"content":26}},"description":{"component":"data2-core-primitives@String","params":{"content":"Duration in hours"}}}},"durationMinute":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"index":{"component":"data2-core-primitives@Number","params":{"content":27}},"description":{"component":"data2-core-primitives@String","params":{"content":"Duration in minutes"}}}},"uid":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":28}},"description":{"component":"data2-core-primitives@String","params":{"content":"Stable event id — reuse it with a higher sequence to update an invite"}}}},"sequence":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"index":{"component":"data2-core-primitives@Number","params":{"content":29}},"description":{"component":"data2-core-primitives@String","params":{"content":"Revision number; increment when re-sending an updated invite"}}}},"categories":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":30}},"description":{"component":"data2-core-primitives@String","params":{"content":"Calendar categories"}}}}}}},"componentOptions":{"contextPopulatedParams":{"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"p"}}],"body":{"params":{"fieldsList":{"params":{"mapper":{"params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"v"}}],"body":{"key":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"v.key"}}}},"value":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"v.mock"}}}}}},"component":"data2-core-functions@Function","break":true},"array":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"p.executedInstanceParams.templateParameters"}}}}},"component":"data2-core-functions@ArrayMap"}},"component":"data2-core-types@FieldSet"}},"break":true}}},"updatedAt":"2026-08-10T16:49:50.780Z"},{"_id":"6407ac921803cb0b5c3d7f22","component":"data2-core-types@Component","params":{"public":true,"package":"data2-core-connect","component":"MailTemplate","icon":"envelope","visibility":"public","parameters":{"params":{"fields":{"artboard":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@ArtboardReference"}},"index":{"component":"data2-core-primitives@Number","params":{"content":3}}},"component":"data2-core-types@ComponentParameter"},"from":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"parameters":{"name":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}},"component":"data2-core-types@ComponentParameter"}},"index":{"component":"data2-core-primitives@Number","params":{"content":5}}},"component":"data2-core-types@ComponentParameter"},"subject":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}}},"component":"data2-core-types@ComponentParameter"},"to":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":6}}},"component":"data2-core-types@ComponentParameter"},"bcc":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":8}}},"component":"data2-core-types@ComponentParameter"},"cc":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":7}}},"component":"data2-core-types@ComponentParameter"},"message":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2.1}}},"component":"data2-core-types@ComponentParameter"},"parent":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@InstanceReference"}},"visibility":"private","index":{"component":"data2-core-primitives@Number","params":{"content":1}},"controlSettings":{"componentFilter":[{"component":"data2-core-primitives@String","params":{"content":"data2-core-connect@Mailer"}}]}},"component":"data2-core-types@ComponentParameter"},"replyTo":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":9}}},"component":"data2-core-types@ComponentParameter"},"templateParameters":{"params":{"component":"data2-core-types@PrimitiveParameter","index":{"component":"data2-core-primitives@Number","params":{"content":10}},"title":{"component":"data2-core-primitives@String","params":{"content":"Template Parameters"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"attachments":{"params":{"key":{"component":"data2-core-primitives@String","params":{"content":"attachments"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Attachments"}},"component":"data2-core-primitives@Object","description":{"component":"data2-core-primitives@String","params":{"content":"Attachments to be sent on the e-mail."}},"index":{"component":"data2-core-primitives@Number","params":{"content":600}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"content":{"params":{"component":"data2-core-primitives@String","key":{"component":"data2-core-primitives@String","params":{"content":"content"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Content"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Contents of the file. Limit 5MB."}},"index":{"component":"data2-core-primitives@Number","params":{"content":20}}},"component":"data2-core-types@ComponentParameter"},"filename":{"params":{"component":"data2-core-primitives@String","key":{"component":"data2-core-primitives@String","params":{"content":"filename"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Filename"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Name that will be displayed to the recipient."}},"index":{"component":"data2-core-primitives@Number","params":{"content":10}}},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@ComponentParameter"},"policies":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-auth@Policy"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"description":{"component":"data2-core-primitives@String","params":{"content":"Controls for allowing or denying access to the data"}}}}}},"component":"data2-core-types@FieldSet"},"componentOptions":{"contextPopulatedParams":{"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"p"}}],"body":{"params":{"fieldsList":{"params":{"mapper":{"params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"v"}}],"body":{"key":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"v.key"}}}},"value":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"v.mock"}}}}}},"component":"data2-core-functions@Function","break":true},"array":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"p.executedInstanceParams.templateParameters"}}}}},"component":"data2-core-functions@ArrayMap"}},"component":"data2-core-types@FieldSet"}},"break":true}}},"updatedAt":"2025-07-16T20:10:44.248Z"},{"_id":"6407a74c1803cb0b5c3d08c8","component":"data2-core-types@Component","params":{"package":"data2-core-connect","component":"Mailer","icon":"envelope","interactions":{"component":"data2-core-types@FieldSet","params":{"fields":{"send":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Sends email"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Email data"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Email data to be sent"}},"parameters":{"params":{"fields":{"from":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"parameters":{"name":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}},"component":"data2-core-types@ComponentParameter"}},"index":{"component":"data2-core-primitives@Number","params":{"content":5}}},"component":"data2-core-types@ComponentParameter"},"subject":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}}},"component":"data2-core-types@ComponentParameter"},"to":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":6}}},"component":"data2-core-types@ComponentParameter"},"bcc":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":8}}},"component":"data2-core-types@ComponentParameter"},"cc":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":7}}},"component":"data2-core-types@ComponentParameter"},"message":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2.1}}},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@FieldSet"}}}],"visibility":"private"}},"sendEmail":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Sends email"}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"params":{"fields":{"mailTemplate":{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Mail Template"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Mail Template"}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@InstanceReference"}},"controlSettings":{"componentFilter":{"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"componentInstance"}}],"body":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"componentInstance.component"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"data2-core-connect@MailTemplate"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"componentInstance.params.parent.params.reference"}}}},"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"module.reference"}}}}},"component":"data2-core-comparison-operators@Equal"}]},"component":"data2-core-logical-operators@And"}},"break":true}}}},"templateParameters":{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Template Parameters"}},"componentOptions":{"inferredComponent":{"params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"p"}}],"body":{"params":{"component":"data2-core-primitives@Object","parameters":{"params":{"fieldsList":{"params":{"array":{"params":{"module":{"params":{"array":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"ServiceComponentInstancesDataSet"}},"_layer":{"component":"data2-core-primitives@String","params":{"content":"HostApplicationLayer"}}},"component":"data2-core-types@ProcessReference"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"c"}}],"body":{"params":{"components":[{"params":{"comparisonSubject":{"params":{"content":"data2-core-connect@MailTemplate"},"component":"data2-core-primitives@String"},"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"c.component"}}}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"p.rootExecutedInstanceParams.args.0.mailTemplate"}}}},"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"c.reference"}}}}},"component":"data2-core-comparison-operators@Equal"}]},"component":"data2-core-logical-operators@And"}}}},"component":"data2-core-functions@ArrayFind"},"prop":{"component":"data2-core-primitives@String","params":{"content":"templateParameters"}}},"component":"data2-core-types@Getter"},"mapper":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"value"}}],"body":{"key":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"value"}}}},"prop":{"component":"data2-core-primitives@String","params":{"content":"key"}}}},"value":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"value"}}}}}}}},"component":"data2-core-functions@ArrayMap"}},"component":"data2-core-types@FieldSet"},"title":{"component":"data2-core-primitives@String","params":{"content":"Template Parameters"}}},"component":"data2-core-types@ComponentParameter"}},"component":"data2-core-functions@Function","break":true}},"visibility":"private","component":"data2-core-primitives@Inferred"}}}},"component":"data2-core-types@FieldSet"}}}]}},"sendEmailDebug":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"DEBUUUUUUUUG"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"template"}},"component":"data2-core-types@InstanceReference"}},{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Reference"}},"title":{"component":"data2-core-primitives@String","params":{"content":"navigationTest"}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Reference"}},"title":{"component":"data2-core-primitives@String","params":{"content":"navigationTest2"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Inferred"}},"componentOptions":{"inferredComponent":{"params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"params"}}],"body":{"params":{"compare":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"params.executedInstanceParams.banana"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"verde"}}},"component":"data2-core-comparison-operators@Equal"}],"then":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"else":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Reference"}}},"component":"data2-core-flow@If"}},"component":"data2-core-functions@Function","break":true}},"title":{"component":"data2-core-primitives@String","params":{"content":"inferredTest"}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Inferred"}},"componentOptions":{"inferredComponent":{"params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"params"}}],"body":{"params":{"compare":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"params.executedInstanceParams.banana"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"verde"}}},"component":"data2-core-comparison-operators@Equal"}],"then":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"else":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Reference"}}},"component":"data2-core-flow@If"}},"component":"data2-core-functions@Function","break":true}},"title":{"component":"data2-core-primitives@String","params":{"content":"inferredTestList"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}}],"visibility":"private"}},"sendInvite":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Sends invite"}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"params":{"fields":{"date":{"component":"data2-core-types@ComponentParameter","params":{"title":"date","component":"data2-core-primitives@Date"}},"hour":{"component":"data2-core-types@ComponentParameter","params":{"title":"hour","component":"data2-core-primitives@Number"}},"minutes":{"component":"data2-core-types@ComponentParameter","params":{"title":"minutes","component":"data2-core-primitives@Number"}},"durationHour":{"component":"data2-core-types@ComponentParameter","params":{"title":"durationHour","component":"data2-core-primitives@Number"}},"durationMinute":{"component":"data2-core-types@ComponentParameter","params":{"title":"durationMinute","component":"data2-core-primitives@Number"}},"title":{"component":"data2-core-types@ComponentParameter","params":{"title":"title","component":"data2-core-primitives@String"}},"description":{"component":"data2-core-types@ComponentParameter","params":{"title":"description","component":"data2-core-primitives@String"}},"location":{"component":"data2-core-types@ComponentParameter","params":{"title":"location","component":"data2-core-primitives@String"}},"uid":{"component":"data2-core-types@ComponentParameter","params":{"title":"uid","component":"data2-core-primitives@String"}},"sequence":{"component":"data2-core-types@ComponentParameter","params":{"title":"sequence","component":"data2-core-primitives@Number"}},"categories":{"component":"data2-core-types@ComponentParameter","params":{"title":"categories","component":"data2-core-primitives@String"}},"status":{"component":"data2-core-types@ComponentParameter","params":{"title":"status","component":"data2-core-primitives@String"}},"method":{"component":"data2-core-types@ComponentParameter","params":{"title":"method","component":"data2-core-primitives@String"}},"busyStatus":{"component":"data2-core-types@ComponentParameter","params":{"title":"busyStatus","component":"data2-core-primitives@String"}},"to":{"component":"data2-core-types@ComponentParameter","params":{"title":"to","component":"data2-core-primitives@String"}}}},"component":"data2-core-types@FieldSet"}}}]}}}}},"visibility":"public","renderable":{"dimensions":{"disabled":false,"component":"data2-core-types@Dimensions","params":{"width":1366,"exactWidth":false,"exactHeight":false,"height":768}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"policies":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-auth@Policy"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"description":{"component":"data2-core-primitives@String","params":{"content":"Controls for allowing or denying access to the data"}}}}}}}},"updatedAt":"2024-08-13T01:15:40.837Z"},{"_id":"673147f169fb93907bee351a","component":"data2-core-types@Component","params":{"component":"PowerCordSocket","package":"data2-core-connect","parameters":{"clientId":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String"}},"onMessage":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-types@Interaction"}},"onError":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-types@Interaction"}},"onOpen":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-types@Interaction"}},"onClose":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-types@Interaction"}},"autoConnect":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Boolean","defaultValue":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}}}},"interactions":{"connect":{"component":"data2-core-types@ComponentParameter","params":{}},"close":{"component":"data2-core-types@ComponentParameter","params":{}},"subscribe":{"component":"data2-core-types@ComponentParameter","params":{"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"room"}},"component":"data2-core-primitives@String"}}]}},"emit":{"component":"data2-core-types@ComponentParameter","params":{"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":""}},"title":{"component":"data2-core-primitives@String","params":{"content":"event"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@ComponentParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":""}},"title":{"component":"data2-core-primitives@String","params":{"content":"room"}},"component":"data2-core-primitives@String"}}]}},"unsubscribe":{"component":"data2-core-types@ComponentParameter","params":{"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"room"}},"component":"data2-core-primitives@String"}}]}}}},"updatedAt":"2025-01-14T03:22:44.768Z","createdAt":"2024-11-10T23:55:29.737Z"},{"_id":"6561080acda0c21750d151cd","component":"data2-core-types@Component","params":{"product":"whatsapp","package":"data2-core-connect","component":"WhatsAppMessenger","visibility":"private","title":{"component":"data2-core-primitives@String","params":{"content":"WhatsApp Messenger"}},"icon":{"params":{"icon":"fa-whatsapp"},"component":"data2-core-types@FontAwesomeIcon"},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"provider":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Provider"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Unofficial WhatsApp provider. Currently supports 'zapi'. 'baileys' is reserved for future use."}},"index":{"component":"data2-core-primitives@Number","params":{"content":0.1}}}},"providerInstanceId":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Provider Instance ID"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Z-API instance id. Populated automatically after Allocate."}},"index":{"component":"data2-core-primitives@Number","params":{"content":0.2}},"saveCompiled":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"visibility":"private"}},"providerInstanceToken":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Provider Instance Token"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Z-API instance token. Populated automatically after Allocate. Can be rebound to a KeyVault getter for encryption at rest."}},"index":{"component":"data2-core-primitives@Number","params":{"content":0.3}},"saveCompiled":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"visibility":"private"}},"webhooks":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"Webhooks"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Per-event webhook URLs the provider POSTs to. Edit via the Renderable's Webhooks tab — each URL is pushed to Z-API individually."}},"index":{"component":"data2-core-primitives@Number","params":{"content":0.4}},"parameters":{"onReceive":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"On receive"}},"description":{"component":"data2-core-primitives@String","params":{"content":"URL called for inbound messages."}}}},"onSend":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"On send"}},"description":{"component":"data2-core-primitives@String","params":{"content":"URL called when outbound messages are accepted by the provider."}}}},"onMessageStatus":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"On message status"}},"description":{"component":"data2-core-primitives@String","params":{"content":"URL called for delivery/read receipt updates."}}}},"onConnect":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"On connect"}},"description":{"component":"data2-core-primitives@String","params":{"content":"URL called when the messenger reconnects to WhatsApp."}}}},"onDisconnect":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"On disconnect"}},"description":{"component":"data2-core-primitives@String","params":{"content":"URL called when the messenger disconnects from WhatsApp."}}}},"onPresence":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"On presence"}},"description":{"component":"data2-core-primitives@String","params":{"content":"URL called for chat presence updates (typing, online)."}}}}}}},"phoneNumber":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Phone Number"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Phone number in raw digit format (e.g. 5511939208891). Populated automatically after sign-in. Informational only."}},"index":{"component":"data2-core-primitives@Number","params":{"content":0.5}},"saveCompiled":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"visibility":"private"}},"policies":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-auth@Policy"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"description":{"component":"data2-core-primitives@String","params":{"content":"Controls for allowing or denying access to the data"}}}}}}},"interactions":{"component":"data2-core-types@FieldSet","params":{"fields":{"allocate":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Provisions a new Z-API instance for this WhatsAppMessenger. Persists the returned providerInstanceId and providerInstanceToken back to the component params. Builder-only — invokes Data2's partner billing."}},"visibility":"private","arguments":[]}},"sign":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Returns the QR code for sign-in. Pass format='image' (default) for a base64 data URL ready for <img src>, or format='payload' for the raw text encoded inside the QR (render with a local QR library)."}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Format"}},"description":{"component":"data2-core-primitives@String","params":{"content":"'image' (default) or 'payload'"}}}}]}},"getStatus":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Returns the connection status: { connected, phoneNumber? }."}},"visibility":"public","arguments":[]}},"getInstanceInfo":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Returns a dump of the underlying provider instance: name, connection status, payment status, subscription expiry, all 6 webhook URLs, and current settings (autoRead, callReject, notifySentByMe, etc.)."}},"visibility":"public","arguments":[]}},"applySettings":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Applies a partial settings update to the underlying provider instance. Provide any subset of: autoReadMessages, autoReadStatuses, autoRejectCalls, callRejectMessage, notifySentByMe, disableQueueingWhenDisconnected. Omitted fields are left unchanged. Builder-only — settings are operator-level configuration."}},"visibility":"private","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"Settings"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Partial settings object. Each field is optional — omitted fields are left unchanged."}},"parameters":{"autoReadMessages":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Boolean","title":{"component":"data2-core-primitives@String","params":{"content":"Auto-read messages"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Mark inbound messages as read automatically."}}}},"autoReadStatuses":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Boolean","title":{"component":"data2-core-primitives@String","params":{"content":"Auto-read statuses"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Mark status (story) views as read automatically."}}}},"autoRejectCalls":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Boolean","title":{"component":"data2-core-primitives@String","params":{"content":"Auto-reject calls"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Automatically reject incoming voice/video calls."}}}},"callRejectMessage":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Call-reject message"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Optional message sent to the caller after auto-rejecting a call."}}}},"notifySentByMe":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Boolean","title":{"component":"data2-core-primitives@String","params":{"content":"Notify sent-by-me"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Forward outbound webhook events for messages this instance sent."}}}},"disableQueueingWhenDisconnected":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Boolean","title":{"component":"data2-core-primitives@String","params":{"content":"Disable queueing when disconnected"}},"description":{"component":"data2-core-primitives@String","params":{"content":"When disconnected, drop sends instead of queueing them for delivery on reconnect."}}}}}}}]}},"disconnect":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Logs the messenger out of WhatsApp. The instance remains allocated."}},"visibility":"public","arguments":[]}},"configureWebhook":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Pushes the component's webhooks to the provider. Pass an explicit { onReceive, onSend, onMessageStatus, onConnect, onDisconnect, onPresence } object to override, or omit to use the saved values. Builder-only — webhook URLs are operator-level configuration."}},"visibility":"private","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"Webhooks"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Optional. Per-event URL map; omit to use the saved values."}},"parameters":{"onReceive":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"On receive"}},"description":{"component":"data2-core-primitives@String","params":{"content":"URL called for inbound messages."}}}},"onSend":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"On send"}},"description":{"component":"data2-core-primitives@String","params":{"content":"URL called when outbound messages are accepted by the provider."}}}},"onMessageStatus":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"On message status"}},"description":{"component":"data2-core-primitives@String","params":{"content":"URL called for delivery/read receipt updates."}}}},"onConnect":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"On connect"}},"description":{"component":"data2-core-primitives@String","params":{"content":"URL called when the messenger reconnects to WhatsApp."}}}},"onDisconnect":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"On disconnect"}},"description":{"component":"data2-core-primitives@String","params":{"content":"URL called when the messenger disconnects from WhatsApp."}}}},"onPresence":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"On presence"}},"description":{"component":"data2-core-primitives@String","params":{"content":"URL called for chat presence updates (typing, online)."}}}}}}}]}},"syncInstanceName":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Renames the underlying provider instance to the canonical <systemDomain>-<systemId>-<reference> format so the Z-API dashboard shows which Messenger each instance belongs to. Server computes the canonical name — no args. Idempotent. Builder-only."}},"visibility":"private","arguments":[]}},"getQueueCount":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Returns the number of outbound messages currently waiting in the Z-API send queue. Useful for monitoring backpressure or detecting a stuck instance."}},"visibility":"public","arguments":[]}},"clearQueue":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Deletes all outbound messages currently waiting in the Z-API send queue. Destructive — confirm before calling."}},"visibility":"public","arguments":[]}},"sendMessage":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Sends a WhatsApp message (text, image, video, audio, document, location, contacts, reaction)."}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-whatsapp@WhatsAppMessage","title":{"component":"data2-core-primitives@String","params":{"content":"Message"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Message payload. Use a WhatsAppMessage component or provide { to, type, text/image/video/audio/document/location/contacts/reaction }."}}}}]}},"sendText":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Sends a text message. Shortcut for sendMessage({ type: 'text', to, text })."}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"To"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Recipient phone number (raw digits, e.g. 5511939208891)."}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Text"}},"description":{"component":"data2-core-primitives@String","params":{"content":"The text message body."}}}}]}},"sendImage":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Sends an image. Provide { link } or { id } and optionally { caption }."}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"To"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Recipient phone number."}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"Image"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Image object with link or id, and optional caption."}},"parameters":{"link":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Link"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Public URL of the image."}}}},"id":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"ID"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Provider media ID."}}}},"caption":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Caption"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Optional caption for the image."}}}}}}}]}},"sendVideo":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Sends a video. Provide { link } or { id } and optionally { caption }."}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"To"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Recipient phone number."}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"Video"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Video object with link or id, and optional caption."}},"parameters":{"link":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Link"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Public URL of the video."}}}},"id":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"ID"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Provider media ID."}}}},"caption":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Caption"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Optional caption for the video."}}}}}}}]}},"sendAudio":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Sends an audio file. Provide { link } or { id }."}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"To"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Recipient phone number."}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"Audio"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Audio object with link or id."}},"parameters":{"link":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Link"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Public URL of the audio file."}}}},"id":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"ID"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Provider media ID."}}}}}}}]}},"sendDocument":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Sends a document. Provide { link } or { id } and optionally { caption, filename }."}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"To"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Recipient phone number."}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"Document"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Document object with link or id, and optional caption/filename."}},"parameters":{"link":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Link"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Public URL of the document."}}}},"id":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"ID"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Provider media ID."}}}},"caption":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Caption"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Optional caption for the document."}}}},"filename":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Filename"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Filename displayed to the recipient."}}}}}}}]}},"sendLocation":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Sends a location pin."}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"To"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Recipient phone number."}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"Location"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Location with latitude, longitude, and optional name/address."}},"parameters":{"latitude":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Number","title":{"component":"data2-core-primitives@String","params":{"content":"Latitude"}}}},"longitude":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Number","title":{"component":"data2-core-primitives@String","params":{"content":"Longitude"}}}},"name":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Name"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Name of the location."}}}},"address":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Address"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Address of the location."}}}}}}}]}},"sendContacts":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Sends one or more contact cards."}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"To"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Recipient phone number."}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"Contacts"}},"description":{"component":"data2-core-primitives@String","params":{"content":"List of contact objects following the WhatsApp contacts format."}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}}]}},"sendReaction":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Reacts to a previously-received message with an emoji."}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"To"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Recipient phone number."}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Message ID"}},"description":{"component":"data2-core-primitives@String","params":{"content":"ID of the message to react to."}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Emoji"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Reaction emoji (single character)."}}}}]}},"subscribe":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Activates the paid subscription on a trial instance. Z-API begins billing Data2's partner account ($20/month) for this instance. Pass withCalls=true to enable WhatsApp voice/video call support (if available on the partner plan). Builder-only — billing-relevant."}},"visibility":"private","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Boolean","title":{"component":"data2-core-primitives@String","params":{"content":"With Calls"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Optional. Enable voice/video call support. Defaults to false."}}}}]}},"unsubscribe":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Cancels the Z-API subscription. The instance stays usable through the end of the current billing month, then stops renewing. Does not remove the instance or clear credentials — use deleteInstance for that. Builder-only — billing-relevant."}},"visibility":"private","arguments":[]}},"deleteInstance":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Decouples the WhatsAppMessenger from its underlying provider instance: cancels the Z-API subscription, then wipes providerInstanceId, providerInstanceToken, and phoneNumber from this component so the Renderable returns to 'not allocated'. Z-API has no immediate-delete endpoint — billing for the current cycle still applies. Builder-only — destructive."}},"visibility":"private","arguments":[]}},"normalize":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"TODO: not implemented yet. Will normalize a provider webhook payload (Z-API/Baileys) into a subset of the official NormalizedEvent shape. For now, read raw fields directly in your HTTPListener flow."}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-types@Any","title":{"component":"data2-core-primitives@String","params":{"content":"Body"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Raw provider webhook body to normalize."}}}}]}},"deallocate":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Deprecated — superseded by deleteInstance, which both cancels the Z-API subscription and clears the component's credentials in one call."}},"visibility":"deprecated","arguments":[]}}}}},"definition":{"params":{"actions":[]},"component":"data2-core-flow@Series"},"renderable":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768}}}},"updatedAt":"2026-05-14T00:00:00.000Z","createdAt":"2023-11-24T19:12:01.989Z"},{"_id":"64aca559c91d9255f4d32a50","component":"data2-core-types@Component","params":{"package":"data2-core-connect","component":"__HttpRequestBody","visibility":"private","parameters":{"params":{"fields":{"parent":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@InstanceReference"}},"visibility":"private","index":{"component":"data2-core-primitives@Number","params":{"content":1}},"controlSettings":{"componentFilter":[{"component":"data2-core-primitives@String","params":{"content":"data2-core-connect@HttpClient"}}]}},"component":"data2-core-types@ComponentParameter"},"method":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":2}},"oneOf":[{"params":{"content":"GET"},"component":"data2-core-primitives@String"},{"params":{"content":"POST"},"component":"data2-core-primitives@String"},{"params":{"content":"PATCH"},"component":"data2-core-primitives@String"},{"params":{"content":"PUT"},"component":"data2-core-primitives@String"},{"params":{"content":"OPTIONS"},"component":"data2-core-primitives@String"},{"params":{"content":"DELETE"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"},"url":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":3}}},"component":"data2-core-types@ComponentParameter"},"headers":{"params":{"component":"data2-core-primitives@Object","index":{"component":"data2-core-primitives@Number","params":{"content":4}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"key":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"},"value":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@ComponentParameter"},"data":{"params":{"component":"data2-core-primitives@Object","index":{"component":"data2-core-primitives@Number","params":{"content":5}}},"component":"data2-core-types@ComponentParameter"},"responseType":{"params":{"component":"data2-core-primitives@String","oneOf":[{"params":{"content":"arraybuffer"},"component":"data2-core-primitives@String"},{"params":{"content":"document"},"component":"data2-core-primitives@String"},{"params":{"content":"json"},"component":"data2-core-primitives@String"},{"params":{"content":"text"},"component":"data2-core-primitives@String"},{"params":{"content":"stream"},"component":"data2-core-primitives@String"},{"params":{"content":"blob"},"component":"data2-core-primitives@String"},{"params":{"content":"blob-url"},"component":"data2-core-primitives@String"}],"index":{"component":"data2-core-primitives@Number","params":{"content":6}}},"component":"data2-core-types@ComponentParameter"},"rawResponse":{"params":{"index":{"component":"data2-core-primitives@Number","params":{"content":7}},"component":"data2-core-primitives@Boolean"},"component":"data2-core-types@ComponentParameter"},"useProxy":{"params":{"index":{"component":"data2-core-primitives@Number","params":{"content":8}},"component":"data2-core-primitives@Boolean","defaultValue":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-types@ComponentParameter"},"query":{"params":{"component":"data2-core-primitives@Object","index":{"component":"data2-core-primitives@Number","params":{"content":4.1}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"key":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"},"value":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@ComponentParameter"},"authentication":{"params":{"component":"data2-core-primitives@Object","index":{"component":"data2-core-primitives@Number","params":{"content":4.9}},"parameters":{"type":{"params":{"component":"data2-core-primitives@String","oneOf":[{"params":{"content":"Basic"},"component":"data2-core-primitives@String"},{"params":{"content":"Bearer"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"},"data":{"params":{"component":"data2-core-primitives@Object"},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@FieldSet"}},"updatedAt":"2023-08-17T20:45:17.472Z"},{"_id":"6928b36e8cf58c66aa7b1e23","component":"data2-core-types@Component","params":{"component":"Amortization","package":"data2-core-financial","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"principal":{"params":{"component":"data2-core-primitives@Number"},"component":"data2-core-types@ComponentParameter"},"rate":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"The interest rate per period (expressed as a decimal, e.g., 0.05 for 5%)."}}},"component":"data2-core-types@ComponentParameter"},"totalPayments":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"The total number of payment periods over the life of the loan."}}},"component":"data2-core-types@ComponentParameter"},"type":{"params":{"component":"data2-core-primitives@String","description":{"component":"data2-core-primitives@String","params":{"content":"The payment frequency type - 'month' for monthly payments or 'year' for annual payments. Defaults to year if not specified."}},"oneOf":[{"component":"data2-core-primitives@String","params":{"content":"month"}},{"component":"data2-core-primitives@String","params":{"content":"year"}}]},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"private"},"updatedAt":"2025-11-28T13:38:51.091Z","createdAt":"2025-11-27T20:24:14.666Z"},{"_id":"6929a6cfe2f281c163e63071","component":"data2-core-types@Component","params":{"component":"CompoundAnnualGrowthRate","package":"data2-core-financial","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"beginningValue":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"The initial value of the investment at the start of the period."}}},"component":"data2-core-types@ComponentParameter"},"endingValue":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"The final value of the investment at the end of the period."}}},"component":"data2-core-types@ComponentParameter"},"periods":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"The number of time periods (usually years) over which the growth occurred."}}},"component":"data2-core-types@ComponentParameter"}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"Calculates the Compound Annual Growth Rate (CAGR), which represents the mean annual growth rate of an investment over a specified period of time."}},"visibility":"private"},"updatedAt":"2025-11-28T13:42:39.312Z","createdAt":"2025-11-28T13:42:39.312Z"},{"_id":"6929a7d84fb3cc9e6acd5a25","component":"data2-core-types@Component","params":{"component":"CompoundInterest","package":"data2-core-financial","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"rate":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"The interest rate per period (expressed as a decimal, e.g., 0.05 for 5%)."}}},"component":"data2-core-types@ComponentParameter"},"compoundingsPerPeriod":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"The number of times interest is compounded per period (e.g., 12 for monthly compounding in a year)."}}},"component":"data2-core-types@ComponentParameter"},"principal":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"The initial principal amount invested or deposited."}}},"component":"data2-core-types@ComponentParameter"},"periods":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"The total number of periods the money is invested or borrowed for."}}},"component":"data2-core-types@ComponentParameter"}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"Calculates the compound interest earned on an investment, accounting for interest earned on both the principal and accumulated interest."}},"visibility":"private"},"updatedAt":"2025-11-28T13:47:04.902Z","createdAt":"2025-11-28T13:47:04.902Z"},{"_id":"6929a82ed010d94e2e251edb","component":"data2-core-types@Component","params":{"component":"DiscountFactor","package":"data2-core-financial","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"rate":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"The discount rate per period (expressed as a decimal, e.g., 0.05 for 5%)."}}},"component":"data2-core-types@ComponentParameter"},"periods":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"The number of periods into the future for which to calculate the discount factor."}}},"component":"data2-core-types@ComponentParameter"}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"Calculates the discount factor used to convert future cash flows to present value, accounting for the time value of money."}}},"updatedAt":"2025-11-28T13:48:30.957Z","createdAt":"2025-11-28T13:48:30.957Z"},{"_id":"6929a8e4db66c4cf3d9b542b","component":"data2-core-types@Component","params":{"component":"ExtendedInternalRateOfReturn","package":"data2-core-financial","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"cashFlows":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"An array of cash flow values, where negative values represent investments and positive values represent returns."}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"dates":{"params":{"component":"data2-core-primitives@Date","description":{"component":"data2-core-primitives@String","params":{"content":"An array of dates corresponding to each cash flow, used to determine the exact timing of each flow."}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"guess":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"An initial guess for the rate of return. Used as a starting point for the iterative calculation. Defaults to 0.1 (10%) if not provided."}}},"component":"data2-core-types@ComponentParameter"}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"Calculates the Extended Internal Rate of Return (XIRR) for a series of cash flows occurring at irregular time intervals. More accurate than IRR for non-periodic cash flows."}},"visibility":"private"},"updatedAt":"2025-11-28T13:51:32.678Z","createdAt":"2025-11-28T13:51:32.678Z"},{"_id":"6929a99d4e8169fc118f3dd8","component":"data2-core-types@Component","params":{"component":"FutureValue","package":"data2-core-financial","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"rate":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"The interest rate per period (expressed as a decimal, e.g., 0.05 for 5%)."}}},"component":"data2-core-types@ComponentParameter"},"cashFlow":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"The payment amount made each period."}}},"component":"data2-core-types@ComponentParameter"},"periods":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"The total number of payment periods."}}},"component":"data2-core-types@ComponentParameter"}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"Calculates the future value of an investment based on periodic, constant payments and a constant interest rate."}},"visibility":"private"},"updatedAt":"2025-11-28T13:54:37.805Z","createdAt":"2025-11-28T13:54:37.805Z"},{"_id":"6929aa1f4e8169fc118f41f5","component":"data2-core-types@Component","params":{"component":"InflationAdjustedReturn","package":"data2-core-financial","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"investmentReturn":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"The nominal rate of return on the investment (expressed as a decimal, e.g., 0.08 for 8%)."}}},"component":"data2-core-types@ComponentParameter"},"inflationRate":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"The rate of inflation for the period (expressed as a decimal, e.g., 0.03 for 3%)."}}},"component":"data2-core-types@ComponentParameter"}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"Calculates the real rate of return on an investment after adjusting for inflation, showing the actual purchasing power gain or loss."}},"visibility":"private"},"updatedAt":"2025-11-28T13:56:47.197Z","createdAt":"2025-11-28T13:56:47.197Z"},{"_id":"6929aae48cf58c66aa7f2454","component":"data2-core-types@Component","params":{"component":"InternalRateOfReturn","package":"data2-core-financial","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"initialInvestment":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"The initial amount invested (usually a negative value representing cash outflow)."}}},"component":"data2-core-types@ComponentParameter"},"cashFlows":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"An array of cash flows expected to be received in future periods. Positive values represent inflows, negative values represent outflows."}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"Calculates the Internal Rate of Return (IRR), which is the discount rate that makes the net present value of all cash flows equal to zero. Used to evaluate the profitability of potential investments."}},"visibility":"private"},"updatedAt":"2025-11-28T14:00:04.225Z","createdAt":"2025-11-28T14:00:04.225Z"},{"_id":"6929ab95c9d4b9f9b2a06b22","component":"data2-core-types@Component","params":{"component":"LeverageRatio","package":"data2-core-financial","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"totalLiabilities":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"The total liabilities of the company or entity."}}},"component":"data2-core-types@ComponentParameter"},"totalDebts":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"The total debt obligations of the company or entity."}}},"component":"data2-core-types@ComponentParameter"},"totalIncome":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"The total income or revenue of the company or entity."}}},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"private"},"updatedAt":"2025-11-28T14:03:01.340Z","createdAt":"2025-11-28T14:03:01.340Z"},{"_id":"6929d755db66c4cf3d9cb58b","component":"data2-core-types@Component","params":{"component":"ModifiedInternalRateOfReturn","package":"data2-core-financial","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"cashFlows":{"params":{"component":"data2-core-primitives@Number","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"description":{"component":"data2-core-primitives@String","params":{"content":"An array of cash flows including the initial investment (negative) and all subsequent cash flows. For example: [-10000, 3000, 4000, 5000, 6000]."}}},"component":"data2-core-types@ComponentParameter"},"financeRate":{"params":{"component":"data2-core-primitives@Number","list":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"description":{"component":"data2-core-primitives@String","params":{"content":"The cost of capital or financing rate for negative cash flows (expressed as a decimal, e.g., 0.10 for 10%). This is typically your borrowing rate."}}},"component":"data2-core-types@ComponentParameter"},"reinvestRate":{"params":{"component":"data2-core-primitives@Number","list":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"description":{"component":"data2-core-primitives@String","params":{"content":"The rate at which positive cash flows can be reinvested (expressed as a decimal, e.g., 0.08 for 8%). This should be a realistic, conservative rate like a savings account or money market rate."}}},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"private","description":{"component":"data2-core-primitives@String","params":{"content":"Calculates the Modified Internal Rate of Return (MIRR), which provides a more realistic measure of investment returns by assuming cash flows are reinvested at a specified reinvestment rate rather than at the IRR itself. This addresses the unrealistic reinvestment assumption of traditional IRR."}}},"updatedAt":"2025-11-28T17:09:41.486Z","createdAt":"2025-11-28T17:09:41.486Z"},{"_id":"6929ac33bc5b01de7353b8cc","component":"data2-core-types@Component","params":{"component":"NetPresentValue","package":"data2-core-financial","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"rate":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"The discount rate per period used to calculate present value (expressed as a decimal, e.g., 0.1 for 10%)."}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":false}}},"component":"data2-core-types@ComponentParameter"},"initialInvestment":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"The initial amount invested at the start (usually a negative value representing cash outflow)."}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":false}}},"component":"data2-core-types@ComponentParameter"},"cashFlows":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"An array of expected cash flows for each period. Positive values represent inflows, negative values represent outflows."}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"Calculates the Net Present Value (NPV) of an investment, which is the difference between the present value of cash inflows and the initial investment. A positive NPV indicates a profitable investment."}},"visibility":"private"},"updatedAt":"2025-11-28T14:05:39.574Z","createdAt":"2025-11-28T14:05:39.574Z"},{"_id":"6929ad844e8169fc118f5e02","component":"data2-core-types@Component","params":{"component":"PaybackPeriod","package":"data2-core-financial","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"periods":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"The number of periods over which cash flows occur."}}},"component":"data2-core-types@ComponentParameter"},"cashFlows":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"An array of cash flow values for each period. The sum of these flows should eventually equal or exceed the initial investment."}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"Calculates the payback period, which is the time required to recover the initial investment from the cash flows generated by the investment."}},"visibility":"private"},"updatedAt":"2025-11-28T14:11:16.726Z","createdAt":"2025-11-28T14:11:16.726Z"},{"_id":"6929acbcbc5b01de7353bdba","component":"data2-core-types@Component","params":{"component":"Payment","package":"data2-core-financial","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"rate":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"The interest rate per period (expressed as a decimal, e.g., 0.05 for 5% per period)."}}},"component":"data2-core-types@ComponentParameter"},"numberOfPayments":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"The total number of payment periods for the loan or annuity."}}},"component":"data2-core-types@ComponentParameter"},"principal":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"The present value or principal amount of the loan or annuity."}}},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"private","description":{"component":"data2-core-primitives@String","params":{"content":"Calculates the periodic payment amount for a loan or annuity based on constant payments and a constant interest rate."}}},"updatedAt":"2025-11-28T14:07:56.673Z","createdAt":"2025-11-28T14:07:56.673Z"},{"_id":"6929ae16db66c4cf3d9b7c91","component":"data2-core-types@Component","params":{"component":"PresentValue","package":"data2-core-financial","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"rate":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"The discount rate per period (expressed as a decimal, e.g., 0.05 for 5%)."}}},"component":"data2-core-types@ComponentParameter"},"cashFlow":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"The cash flow amount received each period (or a single future cash flow)."}}},"component":"data2-core-types@ComponentParameter"},"periods":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"The number of periods over which cash flows occur."}}},"component":"data2-core-types@ComponentParameter"}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"Calculates the present value of an investment or series of future cash flows, discounted at a specified rate. Shows what future money is worth today."}},"visibility":"private"},"updatedAt":"2025-11-28T14:13:42.175Z","createdAt":"2025-11-28T14:13:42.175Z"},{"_id":"6929aeb88cf58c66aa7f4205","component":"data2-core-types@Component","params":{"component":"ProfitabilityIndex","package":"data2-core-financial","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"rate":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"The discount rate per period used to calculate present value (expressed as a decimal, e.g., 0.1 for 10%)."}}},"component":"data2-core-types@ComponentParameter"},"initialInvestment":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"The initial amount invested at the start of the project."}}},"component":"data2-core-types@ComponentParameter"},"cashFlows":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"An array of expected future cash flows for each period."}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"Calculates the Profitability Index (PI), which is the ratio of the present value of future cash flows to the initial investment. A PI greater than 1 indicates a good investment."}},"visibility":"private"},"updatedAt":"2025-11-28T14:16:24.158Z","createdAt":"2025-11-28T14:16:24.158Z"},{"_id":"6929b261c8c9d84b4a481983","component":"data2-core-types@Component","params":{"component":"ReturnOnInvestment","package":"data2-core-financial","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"initialInvestment":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"The initial amount invested or cost of the investment."}}},"component":"data2-core-types@ComponentParameter"},"earnings":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"The total earnings or profit generated from the investment (not including the initial investment)."}}},"component":"data2-core-types@ComponentParameter"}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"Calculates the Return on Investment (ROI), which measures the gain or loss generated on an investment relative to the amount invested. Expressed as a percentage."}},"visibility":"private"},"updatedAt":"2025-11-28T14:32:01.026Z","createdAt":"2025-11-28T14:32:01.026Z"},{"_id":"60edaca1da3861ca65b617c6","component":"data2-core-types@Component","params":{"package":"data2-core-flow","component":"AwaitReady","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"module":{"component":"data2-core-types@InteractiveModuleReference"}}}},"preview":{"params":{"portions":[{"component":"data2-core-primitives@String","params":{"content":"AwaitReady | "}},{"params":{"components":[{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"module"}}}},"prop":{"component":"data2-core-primitives@String","params":{"content":"displayName"}}}},{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"module"}}}},"prop":{"component":"data2-core-primitives@String","params":{"content":"reference"}}}}]},"component":"data2-core-logical-operators@Or"}]},"component":"data2-core-functions@StringConcat"}},"updatedAt":"2023-08-16T19:07:22.592Z"},{"_id":"5fdbbc674369e2af9518164b","component":"data2-core-types@Component","params":{"component":"Case","package":"data2-core-flow","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"expression":"String","value":"String"}}},"preview":{"params":{"portions":[{"component":"data2-core-primitives@String","params":{"content":"Case | "}},{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"expression"}}}}]},"component":"data2-core-functions@StringConcat"}},"updatedAt":"2023-08-09T21:27:40.970Z"},{"_id":"68ffd0db16a54e797472f6f0","component":"data2-core-types@Component","params":{"component":"Debounce","package":"data2-core-flow","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"wait":{"params":{"component":"data2-core-primitives@Number","index":{"component":"data2-core-primitives@Number","params":{"content":2}},"description":{"component":"data2-core-primitives@String","params":{"content":"The throttle window in milliseconds. The action executes at most once per interval, based on leading/trailing rules, using the latest event in the window."}}},"component":"data2-core-types@ComponentParameter"},"action":{"params":{"component":"data2-core-types@InteractiveModuleReference","description":{"component":"data2-core-primitives@String","params":{"content":"The core action or function to be throttled."}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"},"leading":{"params":{"component":"data2-core-primitives@Boolean","index":{"component":"data2-core-primitives@Number","params":{"content":3}},"description":{"component":"data2-core-primitives@String","params":{"content":"If true, triggers execution immediately on the first call within a window (leading edge). Any pending trailing timeout is cleared to avoid overlap. Ideal for responsive starts in events like scrolling."}}},"component":"data2-core-types@ComponentParameter"},"trailing":{"params":{"component":"data2-core-primitives@Boolean","index":{"component":"data2-core-primitives@Number","params":{"content":4}},"description":{"component":"data2-core-primitives@String","params":{"content":"If true, schedules an execution at the end of the window if no leading fire occurred or if calls continue. Uses remaining time calculation for precise alignment. Ensures the final event in a burst isn't dropped."}}},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"private"},"updatedAt":"2025-11-25T15:31:27.209Z","createdAt":"2025-10-27T20:06:51.565Z"},{"_id":"61f2ef3369474194565ae0f6","component":"data2-core-types@Component","params":{"component":"Delay","package":"data2-core-flow","public":true,"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"delay":{"component":"data2-core-primitives@Number"}}}},"visibility":"public","preview":{"params":{"portions":[{"component":"data2-core-primitives@String","params":{"content":"Delay | "}},{"params":{"reference":"delay"},"component":"data2-core-types@Reference"}]},"component":"data2-core-functions@StringConcat"}},"updatedAt":"2022-09-15T19:54:11.643Z"},{"_id":"5ec3096c44f1ebfde26300a5","component":"data2-core-types@Component","params":{"package":"data2-core-flow","component":"If","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"compare":{"params":{"module":{"params":{},"component":"data2-core-types@InteractiveModuleReference"},"prop":{"component":"data2-core-primitives@String","params":{"content":"loca"}},"args":[],"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Condition"}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"description":{"component":"data2-core-primitives@String","params":{"content":"The value to evaluate. Determines which branch is returned."}}},"component":"data2-core-types@ComponentParameter"},"else":{"params":{"module":{"params":{},"component":"data2-core-web@Window"},"prop":{"component":"data2-core-primitives@String","params":{"content":"localStorage.getItem"}},"args":[{"component":"data2-core-primitives@String","params":{"content":"tryon_deviceid"}}],"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Else"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}},"description":{"component":"data2-core-primitives@String","params":{"content":"The value returned when the condition is falsy."}}},"component":"data2-core-types@ComponentParameter"},"then":{"params":{"module":{"params":{},"component":"data2-core-types@InteractiveModuleReference"},"prop":{"component":"data2-core-primitives@String","params":{"content":"localStorage."}},"args":[],"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Then"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"description":{"component":"data2-core-primitives@String","params":{"content":"The value returned when the condition is truthy."}}},"component":"data2-core-types@ComponentParameter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"then"}},"title":"If","description":"Evaluates a condition and returns the then value if truthy, or the else value otherwise."},"updatedAt":"2026-05-22T15:51:45.916Z"},{"_id":"5f6282e8a575399a457ab470","component":"data2-core-types@Component","params":{"package":"data2-core-flow","component":"Parallel","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"actions":{"list":true,"component":"data2-core-types@Interaction"},"concurrency":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Concurrency"}},"description":{"component":"data2-core-primitives@String","params":{"content":"How many concurrent actions can occur at a time. It works as a queue, i.e., as soon as an action is done, another one starts."}},"visibility":"public"}}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"actions.0"}}},"updatedAt":"2023-04-28T20:43:42.110Z"},{"_id":"69f0d9f077fdebabbb9ddafa","component":"data2-core-types@Component","params":{"component":"Race","package":"data2-core-flow","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"actions":{"params":{"component":"data2-core-flow@Series","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"description":{"component":"data2-core-primitives@String","params":{"content":"Array of actions to race. Can also be a function/expression that resolves to an array"}}},"component":"data2-core-types@ComponentParameter"},"concurrency":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Concurrency"}},"description":{"component":"data2-core-primitives@String","params":{"content":"How many concurrent actions can occur at a time. It works as a queue, i.e., as soon as an action is done, another one starts."}},"visibility":"public"}},"onlySuccess":{"params":{"component":"data2-core-primitives@Boolean","defaultValue":{"params":{"content":true},"component":"data2-core-primitives@Boolean"},"description":{"component":"data2-core-primitives@String","params":{"content":"Ignores rejections and returns the first successful result"}}},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"private","wrap":{"component":"data2-core-primitives@String","params":{"content":"actions.0"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Runs multiple actions in parallel and resolves with the first one that finishes — useful for \"whichever responds first wins\" patterns (e.g. fastest of N data sources, primary-with-fallback timeouts, fetching from mirrors)."}}},"updatedAt":"2026-04-28T16:07:23.006Z","createdAt":"2026-04-28T16:01:52.509Z"},{"_id":"68b71f27d84239013ed8c0a9","component":"data2-core-types@Component","params":{"component":"Return","package":"data2-core-flow","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"result":{"params":{"component":"data2-core-types@Reference"},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"public"},"updatedAt":"2026-04-06T13:00:35.612Z","createdAt":"2025-09-02T16:45:27.971Z"},{"_id":"5f628477a575399a457af8fc","component":"data2-core-types@Component","params":{"package":"data2-core-flow","component":"Series","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"actions":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"injectContext":[{"component":"data2-core-primitives@String","params":{"content":"prevResult"}}]},"component":"data2-core-types@ComponentParameter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"actions.0"}}},"updatedAt":"2022-09-12T19:45:24.684Z"},{"_id":"6215097608e952a88dba6d7d","component":"data2-core-types@Component","params":{"package":"data2-core-flow","component":"Step","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"action":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Action"}},"description":{"component":"data2-core-primitives@String","params":{"content":"The interaction to execute when this step runs."}}},"component":"data2-core-types@ComponentParameter"},"onError":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"title":{"component":"data2-core-primitives@String","params":{"content":"On Error"}},"description":{"component":"data2-core-primitives@String","params":{"content":"The interaction to execute if the action throws an error."}}},"component":"data2-core-types@ComponentParameter"},"retries":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"visibility":"private","title":{"component":"data2-core-primitives@String","params":{"content":"Retries"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Number of times to retry the action if it fails before triggering onError."}}},"component":"data2-core-types@ComponentParameter"},"resultName":{"params":{"component":"data2-core-primitives@String","visibility":"public","description":{"component":"data2-core-primitives@String","params":{"content":"Name under which the result of this step will be accessible as a reference in subsequent steps."}},"title":{"component":"data2-core-primitives@String","params":{"content":"Result Name"}}},"component":"data2-core-types@ComponentParameter"}}}},"inlineParamsControl":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"action"}},"title":"Step","description":"Executes an action within a flow and optionally stores the result under a named reference for use in subsequent steps."},"updatedAt":"2026-05-22T17:14:37.451Z"},{"_id":"5fdbbc3b4369e2af9518138b","component":"data2-core-types@Component","params":{"component":"Switch","package":"data2-core-flow","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"expression":"String","cases":{"component":"data2-core-flow@Case","list":true},"defaultCase":"String"}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"defaultCase"}}},"updatedAt":"2025-07-15T15:00:38.347Z"},{"_id":"68d6f4b9986de5abfa480e4e","component":"data2-core-types@Component","params":{"component":"Throttle","package":"data2-core-flow","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"action":{"params":{"component":"data2-core-flow@Series","description":{"component":"data2-core-primitives@String","params":{"content":"The core action or function to be debounced."}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"},"wait":{"params":{"component":"data2-core-primitives@Number","index":{"component":"data2-core-primitives@Number","params":{"content":2}},"description":{"component":"data2-core-primitives@String","params":{"content":"The debounce delay in milliseconds. Invocations within this window are ignored (except for leading edge if enabled), and the action executes once at the end of the window using the most recent event."}}},"component":"data2-core-types@ComponentParameter"},"leading":{"params":{"component":"data2-core-primitives@Boolean","index":{"component":"data2-core-primitives@Number","params":{"content":3}},"description":{"component":"data2-core-primitives@String","params":{"content":"If true, executes the action immediately on the first invocation (leading edge), then resets the timer. Subsequent calls within wait are ignored until the timer completes. Useful for immediate feedback in UX flows like search inputs."}}},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"private"},"updatedAt":"2025-11-25T15:32:58.062Z","createdAt":"2025-09-26T20:16:57.835Z"},{"_id":"625704e2978be06d55f09ec4","component":"data2-core-types@Component","params":{"component":"ArrayChunk","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"array":{"params":{"component":"data2-core-primitives@String","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"description":{"component":"data2-core-primitives@String","params":{"content":"The input array to be split into smaller chunks. Each element will be preserved in the order it appears in the original array."}}},"component":"data2-core-types@ComponentParameter"},"size":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"The maximum number of elements each chunk should contain. The last chunk may contain fewer elements if the array length is not evenly divisible by this value."}}},"component":"data2-core-types@ComponentParameter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"array"}}},"updatedAt":"2026-04-15T19:50:45.750Z"},{"_id":"61faa9e26947419456a3168d","component":"data2-core-types@Component","params":{"component":"ArrayConcat","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"arrays":{"params":{"component":"data2-core-primitives@String","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"description":{"component":"data2-core-primitives@String","params":{"content":"teste description"}}},"component":"data2-core-types@ComponentParameter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"arrays.0"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Takes two or more arrays as input and combines them into a single array. The resulting array contains all elements from the first array followed by all elements from the second array, preserving insertion order. No elements are removed or deduplicated.\n### Example:\n**Input**\n```json\n[1, 2, 3, 4, 5]\n```\n```json\n[3, 4, 5, 6, 7]\n```\n**Output**:\n```json\n[1, 2, 3, 4, 5, 3, 4, 5, 6, 7]\n```\n\n> **Note:** Even if both arrays share common elements, no deduplication is applied. The concatenation is purely additive. The second array is appended to the end of the first as-is, meaning duplicate values will appear multiple times in the resulting array. If deduplication is needed, consider using an **Array Unique** component after concatenation."}}},"updatedAt":"2026-04-15T21:01:56.248Z"},{"_id":"6047f928c2dd12f059b9ee92","component":"data2-core-types@Component","params":{"component":"ArrayFilter","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"array":{"component":"data2-core-types@Getter"},"filter":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-functions@Function"}},"arguments":[{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":""}},"title":{"component":"data2-core-primitives@String","params":{"content":"item"}}},"component":"data2-core-types@ComponentParameter"},{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Index"}}},"component":"data2-core-types@ComponentParameter"}]},"component":"data2-core-types@ComponentParameter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"array"}}},"updatedAt":"2022-12-23T18:35:07.031Z"},{"_id":"606e11ccd7ec64d5fcf1f34b","component":"data2-core-types@Component","params":{"component":"ArrayFind","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"array":{"component":"data2-core-types@Getter"},"filter":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-functions@Function"}},"arguments":[{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":""}},"title":{"component":"data2-core-primitives@String","params":{"content":"item"}}},"component":"data2-core-types@ComponentParameter"},{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Index"}}},"component":"data2-core-types@ComponentParameter"}]},"component":"data2-core-types@ComponentParameter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"array"}}},"updatedAt":"2022-12-23T18:35:33.262Z"},{"_id":"60809cf3f1955d3129c9deb2","component":"data2-core-types@Component","params":{"component":"ArrayFindIndex","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"array":{"component":"data2-core-types@Getter"},"filter":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-functions@Function"}},"arguments":[{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":""}},"title":{"component":"data2-core-primitives@String","params":{"content":"item"}}},"component":"data2-core-types@ComponentParameter"},{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Index"}}},"component":"data2-core-types@ComponentParameter"}]},"component":"data2-core-types@ComponentParameter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"array"}}},"updatedAt":"2023-01-16T21:38:10.043Z"},{"_id":"60809cfcf1955d3129c9e118","component":"data2-core-types@Component","params":{"component":"ArrayFindLastIndex","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"array":{"component":"data2-core-types@Getter"},"filter":{"component":"data2-core-primitives@String"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"array"}}},"updatedAt":"2022-12-23T18:36:40.583Z"},{"_id":"618d4b96976026c073eaf293","component":"data2-core-types@Component","params":{"component":"ArrayJoin","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"array":{"component":"data2-core-types@Getter"},"separator":{"component":"data2-core-primitives@String"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"array"}}},"updatedAt":"2022-12-23T18:37:07.359Z"},{"_id":"6036bc46c2dd12f05997e05b","component":"data2-core-types@Component","params":{"component":"ArrayMap","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"array":{"component":"data2-core-types@Getter"},"mapper":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-functions@Function"}},"arguments":[{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":""}},"title":{"component":"data2-core-primitives@String","params":{"content":"item"}}},"component":"data2-core-types@ComponentParameter"},{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Index"}}},"component":"data2-core-types@ComponentParameter"},{"params":{"component":"data2-core-primitives@Array","title":{"component":"data2-core-primitives@String","params":{"content":"list"}}},"component":"data2-core-types@ComponentParameter"}]},"component":"data2-core-types@ComponentParameter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"array"}},"title":""},"updatedAt":"2026-05-22T14:59:58.302Z"},{"_id":"6047ea59c2dd12f059b70a99","component":"data2-core-types@Component","params":{"component":"ArrayPush","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"array":{"component":"data2-core-types@Getter"},"item":{"component":"data2-core-primitives@String"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"array"}}},"updatedAt":"2022-12-23T18:38:17.686Z"},{"_id":"63a5e350e920c80b07715d99","component":"data2-core-types@Component","params":{"component":"ArrayReject","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"array":{"component":"data2-core-types@Getter"},"filter":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-functions@Function"}},"arguments":[{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":""}},"title":{"component":"data2-core-primitives@String","params":{"content":"item"}}},"component":"data2-core-types@ComponentParameter"},{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"title":{"component":"data2-core-primitives@String","params":{"content":"index"}}},"component":"data2-core-types@ComponentParameter"}]},"component":"data2-core-types@ComponentParameter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"array"}}},"updatedAt":"2022-12-23T18:38:40.673Z"},{"_id":"63784c747bcf559c0ac30bec","component":"data2-core-types@Component","params":{"component":"ArrayRemoveItemAt","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"array":{"component":"data2-core-types@Getter"},"index":{"component":"data2-core-primitives@Number"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"array"}}},"updatedAt":"2022-12-23T18:39:03.065Z"},{"_id":"68ffe12b6869727b970b02f4","component":"data2-core-types@Component","params":{"component":"ArrayReverse","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"array":{"params":{"component":"data2-core-primitives@String","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"private","wrap":{"component":"data2-core-primitives@String","params":{"content":"array"}}},"updatedAt":"2025-11-03T17:29:35.028Z","createdAt":"2025-10-27T21:16:27.773Z"},{"_id":"619c50a78db3b3abdeffe3a9","component":"data2-core-types@Component","params":{"component":"ArrayShuffle","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"array":{"component":"data2-core-types@Getter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"array"}}},"updatedAt":"2022-12-23T18:39:26.497Z"},{"_id":"608b13592ad4f87cf58a85b9","component":"data2-core-types@Component","params":{"component":"ArraySlice","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"array":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Getter"}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}}},"component":"data2-core-types@ComponentParameter"},"start":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"},"end":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}}},"component":"data2-core-types@ComponentParameter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"array"}}},"updatedAt":"2022-12-23T18:39:49.343Z"},{"_id":"646ea41f46d7280637267fd9","component":"data2-core-types@Component","params":{"component":"Base64Decode","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"string":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}},"component":"data2-core-types@ComponentParameter"}}}},"title":"Base64Decode"},"updatedAt":"2023-05-24T23:57:23.463Z","createdAt":"2023-05-24T23:56:15.292Z"},{"_id":"646ea5876a4b830637346685","component":"data2-core-types@Component","params":{"component":"Base64Encode","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"string":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2023-05-25T00:02:15.907Z","createdAt":"2023-05-25T00:02:15.907Z"},{"_id":"65c66ea74a7aa1092f04893b","component":"data2-core-types@Component","params":{"component":"CSVParse","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"csv":{"params":{"component":"data2-core-primitives@String","description":{"component":"data2-core-primitives@String","params":{"content":"CSV string to parse"}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}}},"component":"data2-core-types@ComponentParameter"},"config":{"params":{"component":"data2-core-primitives@Object","description":{"component":"data2-core-primitives@String","params":{"content":"Optional config parameters"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"visibility":"private"},"component":"data2-core-types@ComponentParameter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"csv"}}},"updatedAt":"2026-01-06T19:47:24.607Z","createdAt":"2024-02-09T18:27:51.195Z"},{"_id":"65c66e404a7aa1092f048791","component":"data2-core-types@Component","params":{"component":"CSVStringify","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"data":{"params":{"component":"data2-core-types@Getter","index":{"component":"data2-core-primitives@Number","params":{"content":0}},"description":{"component":"data2-core-primitives@String","params":{"content":"Can be any of:\n- An array of arrays\n- An array of objects\n- An object explicitly defining fields and data"}}},"component":"data2-core-types@ComponentParameter"},"config":{"params":{"description":{"component":"data2-core-primitives@String","params":{"content":"Optional config parameters"}},"visibility":"beta","component":"data2-core-primitives@Object","parameters":{"columns":{"params":{"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"component":"data2-core-primitives@String","description":{"component":"data2-core-primitives@String","params":{"content":"If data is an array of objects this option can be used to manually specify the keys (columns) you expect in the objects. If not set the keys of the first objects are used as column."}}},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2025-07-15T21:18:05.674Z","createdAt":"2024-02-09T18:26:08.542Z"},{"_id":"636e99f37bcf559c0a869526","component":"data2-core-types@Component","params":{"visibility":"public","package":"data2-core-functions","component":"Capitalize","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"string":{"component":"data2-core-primitives@String"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"string"}}},"updatedAt":"2022-11-11T19:02:41.586Z"},{"_id":"64a46b47c91d9255f4275929","component":"data2-core-types@Component","params":{"component":"Ceil","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"value":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}}},"component":"data2-core-types@ComponentParameter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"value"}}},"updatedAt":"2025-08-12T16:39:19.532Z","createdAt":"2022-12-29T16:43:02.834Z"},{"_id":"633ad7675a870cfe322fa356","component":"data2-core-types@Component","params":{"component":"CreateArray","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"length":{"component":"data2-core-primitives@Number"}}}}}},{"_id":"6109ae7ef302195bad04c4ec","component":"data2-core-types@Component","params":{"package":"data2-core-functions","component":"DateAdd","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"date":{"component":"data2-core-primitives@Date","index":0},"count":{"component":"data2-core-primitives@Number","index":1},"period":{"component":"data2-core-primitives@String","oneOf":["milliseconds","seconds","minutes","hours","days","weeks","months","quarters","years"],"index":2}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"date"}}},"updatedAt":"2022-12-28T18:38:56.768Z"},{"_id":"60a63e0822c2a8041f4edc0b","component":"data2-core-types@Component","params":{"package":"data2-core-functions","component":"DateDiff","title":"DateDiff","description":"Calculates the difference between two dates in the specified time unit. Returns the result as a Number. The difference is computed as left - right.","wrap":{"component":"data2-core-primitives@String","params":{"content":"date"}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"left":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Date"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Left Date"}},"description":{"component":"data2-core-primitives@String","params":{"content":"The first date in the comparison. The result is left minus right."}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}}},"right":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Date"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Right Date"}},"description":{"component":"data2-core-primitives@String","params":{"content":"The second date in the comparison. Subtracted from the left date to produce the result."}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}}}},"period":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Period"}},"description":{"component":"data2-core-primitives@String","params":{"content":"The time unit used to express the difference between the two dates."}},"index":{"component":"data2-core-primitives@Number","params":{"content":3}},"oneOf":[{"component":"data2-core-primitives@String","params":{"content":"years"}},{"component":"data2-core-primitives@String","params":{"content":"months"}},{"component":"data2-core-primitives@String","params":{"content":"weeks"}},{"component":"data2-core-primitives@String","params":{"content":"days"}},{"component":"data2-core-primitives@String","params":{"content":"hours"}},{"component":"data2-core-primitives@String","params":{"content":"minutes"}},{"component":"data2-core-primitives@String","params":{"content":"seconds"}}]}}}}}},"updatedAt":"2026-05-22T15:10:52.582Z"},{"_id":"6109aee3f302195bad04d9b3","component":"data2-core-types@Component","params":{"package":"data2-core-functions","component":"DateEndOf","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"date":{"component":"data2-core-primitives@Date","index":0},"period":{"component":"data2-core-primitives@String","oneOf":["second","minute","hour","date","day","isoWeek","week","quarter","month","year"],"index":1}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"date"}}},"updatedAt":"2022-12-28T18:40:34.913Z"},{"_id":"5fd2979222b5215848969cde","component":"data2-core-types@Component","params":{"package":"data2-core-functions","component":"DateFormat","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"date":{"component":"data2-core-primitives@Date"},"format":{"component":"data2-core-primitives@String"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"date"}}},"updatedAt":"2026-04-23T16:29:45.020Z"},{"_id":"603d57a6c2dd12f059b47fba","component":"data2-core-types@Component","params":{"package":"data2-core-functions","component":"DateNow","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{}}}}},{"_id":"6109b047f302195bad054bd9","component":"data2-core-types@Component","params":{"package":"data2-core-functions","component":"DateParse","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"date":{"component":"data2-core-primitives@String"},"format":{"component":"data2-core-primitives@String"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"date"}}},"updatedAt":"2022-12-28T18:40:00.990Z"},{"_id":"64064b1b1803cb0b5c1e52c4","component":"data2-core-types@Component","params":{"package":"data2-core-functions","component":"DateRange","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"start":{"component":"data2-core-primitives@Date","index":0},"end":{"component":"data2-core-primitives@Date","index":1}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"start"}}},"updatedAt":"2022-12-28T18:38:56.768Z"},{"_id":"6109aeddf302195bad04d765","component":"data2-core-types@Component","params":{"package":"data2-core-functions","component":"DateStartOf","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"date":{"component":"data2-core-primitives@Date","index":0},"period":{"component":"data2-core-primitives@String","oneOf":["second","minute","hour","date","day","isoWeek","week","quarter","month","year"],"index":1}}}}}},{"_id":"6109ae8af302195bad04c800","component":"data2-core-types@Component","params":{"package":"data2-core-functions","component":"DateSubtract","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"date":{"component":"data2-core-primitives@Date","index":0},"count":{"component":"data2-core-primitives@Number","index":1},"period":{"component":"data2-core-primitives@String","oneOf":["milliseconds","seconds","minutes","hours","days","weeks","months","quarters","years"],"index":2}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"date"}}},"updatedAt":"2022-12-28T18:41:20.980Z"},{"_id":"697a8713bec05a29dedc55c8","component":"data2-core-types@Component","params":{"package":"data2-core-functions","component":"DateToObjectId","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"date":{"component":"data2-core-primitives@Date"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"date"}}},"updatedAt":"2026-01-28T21:57:06.254Z","createdAt":"2026-01-28T21:57:06.254Z"},{"_id":"610aec40f302195bad291894","component":"data2-core-types@Component","params":{"package":"data2-core-functions","component":"DateZone","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"date":{"component":"data2-core-primitives@Date","index":0},"zone":{"component":"data2-core-primitives@String","index":1}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"date"}}},"updatedAt":"2022-12-28T18:39:20.610Z"},{"_id":"68a65ef11fce3aa94f670af8","component":"data2-core-types@Component","params":{"component":"Decrypt","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"value":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"},"password":{"params":{"component":"data2-core-primitives@String","shouldShow":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"type"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"symmetrical"}}},"component":"data2-core-comparison-operators@Equal"}},"component":"data2-core-types@ComponentParameter"},"salt":{"params":{"component":"data2-core-primitives@String","shouldShow":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"type"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"symmetrical"}}},"component":"data2-core-comparison-operators@Equal"}},"component":"data2-core-types@ComponentParameter"},"privateKey":{"params":{"component":"data2-core-primitives@String","multiLine":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"shouldShow":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"type"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"asymmetrical"}}},"component":"data2-core-comparison-operators@Equal"}},"component":"data2-core-types@ComponentParameter"},"type":{"params":{"component":"data2-core-primitives@String","defaultValue":{"params":{"content":"symmetrical"},"component":"data2-core-primitives@String"},"oneOf":[{"params":{"content":"symmetrical"},"component":"data2-core-primitives@String"},{"params":{"content":"asymmetrical"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"private"},"updatedAt":"2025-08-27T16:02:35.313Z","createdAt":"2025-08-20T23:49:05.596Z"},{"_id":"690a349e378338d21a37c35f","component":"data2-core-types@Component","params":{"component":"DecryptMetaFlowPayload","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"payload":{"params":{"component":"data2-core-primitives@Object"},"component":"data2-core-types@ComponentParameter"},"privateKey":{"params":{"component":"data2-core-primitives@String","multiLine":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"public"},"updatedAt":"2026-07-08T17:06:38.336Z","createdAt":"2025-11-04T17:11:55.738Z"},{"_id":"68a62bfd308004bab53fdec1","component":"data2-core-types@Component","params":{"component":"Encrypt","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"value":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"},"password":{"params":{"component":"data2-core-primitives@String","shouldShow":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"type"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"symmetrical"}}},"component":"data2-core-comparison-operators@Equal"}},"component":"data2-core-types@ComponentParameter"},"salt":{"params":{"component":"data2-core-primitives@String","shouldShow":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"type"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"symmetrical"}}},"component":"data2-core-comparison-operators@Equal"}},"component":"data2-core-types@ComponentParameter"},"publicKey":{"params":{"component":"data2-core-primitives@String","multiLine":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"shouldShow":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"type"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"asymmetrical"}}},"component":"data2-core-comparison-operators@Equal"}},"component":"data2-core-types@ComponentParameter"},"type":{"params":{"component":"data2-core-primitives@String","defaultValue":{"params":{"content":"symmetrical"},"component":"data2-core-primitives@String"},"oneOf":[{"params":{"content":"symmetrical"},"component":"data2-core-primitives@String"},{"params":{"content":"asymmetrical"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"private"},"updatedAt":"2025-08-27T16:01:09.327Z","createdAt":"2025-08-20T20:11:41.740Z"},{"_id":"690c9114ae4d6d06f917016a","component":"data2-core-types@Component","params":{"component":"EncryptMetaFlowPayload","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"data":{"params":{"component":"data2-core-primitives@Object"},"component":"data2-core-types@ComponentParameter"},"aesKeyBuffer":{"params":{"component":"data2-core-primitives@String","multiLine":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"initialVectorBuffer":{"params":{"component":"data2-core-primitives@String","multiLine":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"public"},"updatedAt":"2026-07-08T17:07:22.363Z","createdAt":"2025-11-06T12:14:12.743Z"},{"_id":"68434278f220c5f37fa04db4","component":"data2-core-types@Component","params":{"component":"FileBinary","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"value":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"},"filename":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":2}}},"component":"data2-core-types@ComponentParameter"},"contentType":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":3}}},"component":"data2-core-types@ComponentParameter"},"as":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":3}},"oneOf":[{"params":{"content":"auto"},"component":"data2-core-primitives@String"},{"params":{"content":"buffer"},"component":"data2-core-primitives@String"},{"params":{"content":"blob"},"component":"data2-core-primitives@String"},{"params":{"content":"file"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"private"},"updatedAt":"2025-06-06T19:49:14.785Z","createdAt":"2024-04-25T18:27:51.195Z"},{"_id":"664f6d54295cba31f58e7f65","component":"data2-core-types@Component","params":{"component":"FileFromBase64","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"base64":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":1}}}},"contentType":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":3}}}},"fileName":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":2}}}}}}}},"updatedAt":"2024-05-23T16:46:40.691Z","createdAt":"2024-04-25T18:27:51.195Z"},{"_id":"662a6de2552f2dfd5436b6e8","component":"data2-core-types@Component","params":{"component":"FileToBase64","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"file":{"params":{"component":"data2-core-primitives@String","description":{"component":"data2-core-primitives@String","params":{"content":"File to transform to Base64"}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}}},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2024-04-25T18:27:51.195Z","createdAt":"2024-04-25T18:27:51.195Z"},{"_id":"66ff1dfafb9eca40c1f6bf2b","component":"data2-core-types@Component","params":{"component":"FileUrlToBase64","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"url":{"params":{"component":"data2-core-primitives@String","description":{"component":"data2-core-primitives@String","params":{"content":"File to transform to Base64"}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}}},"component":"data2-core-types@ComponentParameter"}}}}}},{"_id":"64a46b53c91d9255f4275ac3","component":"data2-core-types@Component","params":{"component":"Floor","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"value":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}}},"component":"data2-core-types@ComponentParameter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"value"}}},"updatedAt":"2025-08-12T16:40:00.545Z","createdAt":"2022-12-29T16:43:02.834Z"},{"_id":"5ec1b7ce44f1ebfde2380e3d","component":"data2-core-types@Component","params":{"package":"data2-core-functions","component":"Function","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"body":"string","parameters":{"params":{"component":"data2-core-primitives@String","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2026-05-04T14:17:38.429Z"},{"_id":"6040d377c2dd12f0595c284e","component":"data2-core-types@Component","params":{"package":"data2-core-functions","component":"Group","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"subject":{"component":"data2-core-primitives@String"},"column":{"component":"data2-core-primitives@String"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"subject"}}},"updatedAt":"2024-12-15T16:42:11.788Z"},{"_id":"68b1d255ac2138dbd7b33469","component":"data2-core-types@Component","params":{"component":"HexToString","package":"data2-core-functions","parameters":{"hex":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String"}}},"title":"HexToString"},"updatedAt":"2025-08-29T16:16:57.005Z","createdAt":"2025-08-29T16:16:21.501Z"},{"_id":"610d181af302195bad656792","component":"data2-core-types@Component","params":{"package":"data2-core-functions","public":true,"component":"Includes","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"subject":{"params":{"component":{"params":{"content":"data2-core-primitives@String"},"component":"data2-core-primitives@String"},"index":{"component":"data2-core-primitives@Number","params":{"content":0}}},"component":"data2-core-types@ComponentParameter"},"pattern":{"params":{"component":{"params":{"content":"data2-core-primitives@String"},"component":"data2-core-primitives@String"},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"public","wrap":{"component":"data2-core-primitives@String","params":{"content":"subject"}}},"updatedAt":"2022-12-23T18:41:53.452Z"},{"_id":"64d40acce4f9069248ae210a","component":"data2-core-types@Component","params":{"component":"IsArray","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"value":{"component":"data2-core-types@Getter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"value"}}},"updatedAt":"2022-12-23T18:37:07.359Z"},{"_id":"6622d92cb9f5c5ee69ae48dc","component":"data2-core-types@Component","params":{"component":"IsBoolean","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"value":{"component":"data2-core-types@Getter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"value"}}},"createdAt":"2024-04-19T18:37:07.359Z"},{"_id":"6622d92cb9f5c5ee69ae48d9","component":"data2-core-types@Component","params":{"component":"IsDate","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"value":{"component":"data2-core-types@Getter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"value"}}},"createdAt":"2024-04-19T18:37:07.359Z"},{"_id":"6622d92cb9f5c5ee69ae48de","component":"data2-core-types@Component","params":{"component":"IsFunction","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"value":{"component":"data2-core-types@Getter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"value"}}},"createdAt":"2024-04-19T18:37:07.359Z"},{"_id":"6622d92cb9f5c5ee69ae48db","component":"data2-core-types@Component","params":{"component":"IsNaN","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"value":{"component":"data2-core-types@Getter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"value"}}},"createdAt":"2024-04-19T18:37:07.359Z"},{"_id":"6622d92cb9f5c5ee69ae48e0","component":"data2-core-types@Component","params":{"component":"IsNil","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"value":{"component":"data2-core-types@Getter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"value"}}},"createdAt":"2024-04-19T18:37:07.359Z"},{"_id":"6622d92cb9f5c5ee69ae48da","component":"data2-core-types@Component","params":{"component":"IsNumber","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"value":{"component":"data2-core-types@Getter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"value"}}},"createdAt":"2024-04-19T18:37:07.359Z"},{"_id":"6622d92cb9f5c5ee69ae48df","component":"data2-core-types@Component","params":{"component":"IsObject","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"value":{"component":"data2-core-types@Getter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"value"}}},"createdAt":"2024-04-19T18:37:07.359Z"},{"_id":"6622d92cb9f5c5ee69ae48dd","component":"data2-core-types@Component","params":{"component":"IsString","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"value":{"component":"data2-core-types@Getter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"value"}}},"createdAt":"2024-04-19T18:37:07.359Z"},{"_id":"620d338f8271aa4129951712","component":"data2-core-types@Component","params":{"package":"data2-core-functions","component":"JSONParse","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"text":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}},"component":"data2-core-types@ComponentParameter"},"reviver":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"text"}}},"updatedAt":"2023-12-19T12:22:07.541Z"},{"_id":"620d32d98271aa412994b6f6","component":"data2-core-types@Component","params":{"package":"data2-core-functions","component":"JSONStringify","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"value":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}}},"component":"data2-core-types@ComponentParameter"},"replacer":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"visibility":"deprecated","index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"},"space":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}}},"component":"data2-core-types@ComponentParameter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"value"}}},"updatedAt":"2024-07-06T04:13:35.035Z"},{"_id":"6970f45dec887f581a71bba9","component":"data2-core-types@Component","params":{"component":"JSONToMarkdown","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{}}},"visibility":"private"},"updatedAt":"2026-01-21T15:44:29.910Z","createdAt":"2026-01-21T15:44:29.910Z"},{"_id":"691356d5c94a87fcd0569df8","component":"data2-core-types@Component","params":{"component":"MarkdownToHTML","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"markdown":{"params":{"component":"data2-core-primitives@String","multiLine":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"private"},"updatedAt":"2025-11-11T15:31:33.649Z","createdAt":"2025-11-11T15:31:33.649Z"},{"_id":"61ddd20e6947419456adaf34","component":"data2-core-types@Component","params":{"package":"data2-core-functions","component":"Match","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"text":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":1}},"description":{"component":"data2-core-primitives@String","params":{"content":"(String): The target string where the search will be performed."}}},"component":"data2-core-types@ComponentParameter"},"pattern":{"params":{"component":"data2-core-types@Regex","index":{"component":"data2-core-primitives@Number","params":{"content":2}},"description":{"component":"data2-core-primitives@String","params":{"content":"(RegExp): The regular expression defining the search criteria and capture groups."}}},"component":"data2-core-types@ComponentParameter"},"excludesInput":{"params":{"component":"data2-core-primitives@Boolean","index":{"component":"data2-core-primitives@Number","params":{"content":3}},"description":{"component":"data2-core-primitives@String","params":{"content":"(Boolean): Optional. If set to true, it prevents the full original text match from being included in the returned array, returning only the specific capture groups."}}},"component":"data2-core-types@ComponentParameter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"text"}},"title":"Match","description":{"component":"data2-core-primitives@String","params":{"content":"The match function is used to search for and extract occurrences of a specific pattern within a string. It scans the provided text and returns an array of the matched results, with the option to filter out the full string match and keep only the captured groups."}}},"updatedAt":"2026-05-20T20:07:26.930Z"},{"_id":"620d33a98271aa4129952187","component":"data2-core-types@Component","params":{"package":"data2-core-functions","component":"MathRandom","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{}}}}},{"_id":"63adc396be3dea0726f4d35e","component":"data2-core-types@Component","params":{"component":"Max","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"values":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2022-12-29T16:43:02.834Z","createdAt":"2022-12-29T16:43:02.834Z"},{"_id":"6048d4d4c2dd12f059dd353d","component":"data2-core-types@Component","params":{"package":"data2-core-functions","component":"Merge","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"lists":{"component":"data2-core-types@DataSetReference","list":true},"column":{"component":"data2-core-types@DataSetColumnReference"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"lists.0"}}},"updatedAt":"2022-12-23T18:42:52.986Z"},{"_id":"63adc37dbe3dea0726f4d34c","component":"data2-core-types@Component","params":{"component":"Min","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"values":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2022-12-29T16:42:37.446Z","createdAt":"2022-12-29T16:42:37.446Z"},{"_id":"602aedb0c2dd12f059f607b6","component":"data2-core-types@Component","params":{"component":"NumberFormat","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"number":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Number"}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}},"description":{"component":"data2-core-primitives@String","params":{"content":"Number to be formatted."}}},"component":"data2-core-types@ComponentParameter"},"format":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Format"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"description":{"component":"data2-core-primitives@String","params":{"content":"How the number should be formatted. Example: for the number 1, and format '0%', the output would be 100%. For more information, see the link."}},"link":{"component":"data2-core-primitives@String","params":{"content":"http://numeraljs.com/#format"}}},"component":"data2-core-types@ComponentParameter"},"locale":{"params":{"component":"data2-core-primitives@String","oneOf":[{"params":{"content":"en"},"component":"data2-core-primitives@String"},{"params":{"content":"pt-br"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"}}}},"title":{"component":"data2-core-primitives@String","params":{"content":"NumberFormat"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Format number into a string."}},"returnPrimitiveTypes":[{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}],"wrap":{"component":"data2-core-primitives@String","params":{"content":"number"}}},"updatedAt":"2025-08-16T19:48:25.781Z"},{"_id":"6169acb5976026c073d80c5f","component":"data2-core-types@Component","params":{"component":"ObjectAssign","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"object":{"component":"data2-core-types@Getter"},"sources":{"component":"data2-core-types@FieldSet","list":true}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"object"}}},"updatedAt":"2024-08-23T13:17:19.799Z"},{"_id":"696a99ad83077819f1ec6099","component":"data2-core-types@Component","params":{"component":"ObjectEntries","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"object":{"params":{"component":"data2-core-primitives@Object"},"component":"data2-core-types@ComponentParameter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"object"}}},"updatedAt":"2026-01-16T20:03:57.779Z","createdAt":"2026-01-16T20:03:57.779Z"},{"_id":"697a8adabec05a29dedf2ea2","component":"data2-core-types@Component","params":{"package":"data2-core-functions","component":"ObjectIdToDate","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"objectId":{"component":"data2-core-primitives@String"}}}}},"updatedAt":"2026-01-28T21:57:06.254Z","createdAt":"2026-01-28T21:57:06.254Z"},{"_id":"696a63da54e81cfebef64bf3","component":"data2-core-types@Component","params":{"component":"ObjectKeys","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"object":{"params":{"component":"data2-core-primitives@Object"},"component":"data2-core-types@ComponentParameter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"object"}}},"updatedAt":"2026-01-16T20:00:43.259Z","createdAt":"2026-01-16T16:14:18.200Z"},{"_id":"699c80a1cbf5f052ddccd9c6","component":"data2-core-types@Component","params":{"component":"ObjectMerge","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"objects":{"params":{"component":"data2-core-primitives@Object","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2026-02-23T16:52:28.074Z","createdAt":"2026-02-23T16:30:25.638Z"},{"_id":"6050ef11c2dd12f0590e5a37","component":"data2-core-types@Component","params":{"component":"ObjectOmit","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"object":{"component":"data2-core-types@Getter"},"omitter":{"component":"data2-core-primitives@String","list":true}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"object"}}},"updatedAt":"2024-08-23T13:14:56.388Z"},{"_id":"6169ac93976026c073d7e9cb","component":"data2-core-types@Component","params":{"component":"ObjectPick","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"object":{"component":"data2-core-types@Getter"},"picker":{"component":"data2-core-primitives@String","list":true}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"object"}}},"updatedAt":"2023-02-16T18:51:57.461Z"},{"_id":"60510c66c2dd12f059147c31","component":"data2-core-types@Component","params":{"component":"ObjectSet","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"object":{"component":"data2-core-types@Getter"},"path":{"component":"data2-core-primitives@String"},"value":{"component":"data2-core-primitives@String"}}}}}},{"_id":"6169ac7d976026c073d7c578","component":"data2-core-types@Component","params":{"component":"ObjectUnset","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"object":{"component":"data2-core-types@Getter"},"path":{"component":"data2-core-primitives@String"}}}}}},{"_id":"696a98799aa139cbb010e654","component":"data2-core-types@Component","params":{"component":"ObjectValues","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"object":{"params":{"component":"data2-core-primitives@Object"},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"private","wrap":{"component":"data2-core-primitives@String","params":{"content":"object"}}},"updatedAt":"2026-01-16T19:58:49.632Z","createdAt":"2026-01-16T19:58:49.632Z"},{"_id":"60c9101822c2a8041f93fabb","component":"data2-core-types@Component","params":{"package":"data2-core-functions","component":"Reduce","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"array":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Getter"}}},"component":"data2-core-types@ComponentParameter"},"reducer":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-functions@Function"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"accumulator"}}}},{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"item"}}}},{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"index"}}}}]},"component":"data2-core-types@ComponentParameter"},"initialValue":{"params":{},"component":"data2-core-types@ComponentParameter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"array"}}},"updatedAt":"2022-12-23T18:43:23.865Z"},{"_id":"6061c943d7ec64d5fccb2f1c","component":"data2-core-types@Component","params":{"asd":1,"package":"data2-core-functions","component":"Replace","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"haystack":{"params":{"component":"data2-core-primitives@String","multiLine":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"needle":{"params":{"component":"data2-core-primitives@String","multiLine":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"patch":{"params":{"component":"data2-core-primitives@String","multiLine":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"haystack"}}},"updatedAt":"2026-05-08T20:04:02.364Z"},{"_id":"64a46b4ec91d9255f4275a63","component":"data2-core-types@Component","params":{"component":"Round","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"value":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}}},"component":"data2-core-types@ComponentParameter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"value"}}},"updatedAt":"2025-08-12T16:40:35.039Z","createdAt":"2022-12-29T16:43:02.834Z"},{"_id":"644bd94a3012225bf198c794","component":"data2-core-types@Component","params":{"package":"data2-core-functions","component":"Slugify","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"string":{"component":"data2-core-primitives@String"}}}},"returnPrimitiveTypes":["data2-core-primitives@String"],"wrap":{"component":"data2-core-primitives@String","params":{"content":"string"}},"visibility":"public"},"updatedAt":"2024-08-02T17:58:41.798Z"},{"_id":"625d6ab9978be06d5597edc2","component":"data2-core-types@Component","params":{"component":"Sort","package":"data2-core-functions","visibility":"public","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"array":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Getter"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Array"}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}}},"component":"data2-core-types@ComponentParameter"},"order":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"Order"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Order to be used by Sort, ordered by priority."}},"list":true,"parameters":{"field":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"item"}}}},{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"index"}}}}]},"component":"data2-core-types@ComponentParameter"},"order":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"oneOf":[{"params":{"content":"asc"},"component":"data2-core-primitives@String"},{"params":{"content":"desc"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"}}}}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"array"}}},"updatedAt":"2022-12-23T18:43:52.633Z","createdAt":"2022-04-18T13:41:23.258Z"},{"_id":"606dd6b5d7ec64d5fcdf9813","component":"data2-core-types@Component","params":{"package":"data2-core-functions","component":"Split","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"haystack":{"component":"data2-core-primitives@String","content":{"params":{"date":{"params":{},"component":"data2-core-functions@DateNow"},"format":{"component":"data2-core-primitives@String","params":{"content":"LL"}}},"component":"data2-core-functions@DateFormat"}},"needle":{"component":"data2-core-primitives@String","content":"video"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"haystack"}}},"updatedAt":"2025-12-15T19:36:42.325Z"},{"_id":"5f7141a1e2d6fd3e21baeed0","component":"data2-core-types@Component","params":{"package":"data2-core-functions","component":"StringConcat","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"portions":{"component":"data2-core-primitives@String","inline":true,"list":true}}}},"returnPrimitiveTypes":["data2-core-primitives@String"],"wrap":{"component":"data2-core-primitives@String","params":{"content":"portions.0"}}},"updatedAt":"2022-09-12T20:29:27.218Z"},{"_id":"6155ebc6976026c0734a590d","component":"data2-core-types@Component","params":{"package":"data2-core-functions","component":"StringNormalize","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"string":{"component":"data2-core-primitives@String"},"form":{"component":"data2-core-primitives@String"}}}}}},{"_id":"639b2c01e920c80b07058025","component":"data2-core-types@Component","params":{"package":"data2-core-functions","component":"StringTrim","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"string":{"component":"data2-core-primitives@String"}}}},"returnPrimitiveTypes":["data2-core-primitives@String"],"wrap":{"component":"data2-core-primitives@String","params":{"content":"string"}}},"updatedAt":"2022-09-12T20:29:27.218Z"},{"_id":"6408ce8dfb4a0d06340a385a","component":"data2-core-types@Component","params":{"component":"SubString","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"string":{"params":{"index":{"component":"data2-core-primitives@Number","params":{"content":0}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}},"component":"data2-core-types@ComponentParameter"},"start":{"params":{"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}}},"component":"data2-core-types@ComponentParameter"},"end":{"params":{"index":{"component":"data2-core-primitives@Number","params":{"content":2}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}}},"component":"data2-core-types@ComponentParameter"}}}},"title":"SubString"},"updatedAt":"2023-03-08T18:06:05.231Z","createdAt":"2023-03-08T18:06:05.231Z"},{"_id":"65f330e71902cc41389b7130","component":"data2-core-types@Component","params":{"visibility":"public","package":"data2-core-functions","component":"Template","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"string":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":0}}},"component":"data2-core-types@ComponentParameter"},"data":{"params":{"component":"data2-core-primitives@Object","index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"string"}}},"updatedAt":"2024-03-14T17:19:26.546Z"},{"_id":"6995d25a435c5ee7daab816c","component":"data2-core-types@Component","params":{"component":"ToFixed","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"value":{"params":{"component":"data2-core-primitives@Number"},"component":"data2-core-types@ComponentParameter"},"decimals":{"params":{"component":"data2-core-primitives@Number"},"component":"data2-core-types@ComponentParameter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"value"}},"visibility":"private"},"updatedAt":"2026-02-18T14:53:14.791Z","createdAt":"2026-02-18T14:53:14.791Z"},{"_id":"63c99c1b55ade32bcabc8031","component":"data2-core-types@Component","params":{"component":"Uniq","package":"data2-core-functions","visibility":"public","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"array":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Getter"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Array"}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}}},"component":"data2-core-types@ComponentParameter"},"field":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String"}}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"array"}}},"updatedAt":"2023-02-01T20:32:39.032Z","createdAt":"2023-01-19T13:41:23.258Z"},{"_id":"679bdf4eec1c10c0d55723e2","component":"data2-core-types@Component","params":{"component":"UriDecode","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"string":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}},"component":"data2-core-types@ComponentParameter"}}}},"title":"UriDecode"},"updatedAt":"2025-01-30T23:57:23.463Z","createdAt":"2025-01-30T23:56:15.292Z"},{"_id":"679bdf60ec1c10c0d55723e3","component":"data2-core-types@Component","params":{"component":"UriEncode","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"string":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}},"component":"data2-core-types@ComponentParameter"}}}},"title":"UriEncode"},"updatedAt":"2025-01-30T23:57:23.463Z","createdAt":"2025-01-30T23:56:15.292Z"},{"_id":"69bad48959d9f49bf4f7a7a6","component":"data2-core-types@Component","params":{"component":"VerifyKey","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"data":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"},"signature":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"},"publicKey":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"},"secret":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"},"algorithm":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"},"enconding":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"private"},"updatedAt":"2026-03-18T17:04:02.775Z","createdAt":"2026-03-18T16:36:25.537Z"},{"_id":"68c35f63911fcc052ff8fca2","component":"data2-core-types@Component","params":{"component":"XMLParse","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"text":{"params":{"component":"data2-core-primitives@String","multiLine":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"private"},"updatedAt":"2025-09-11T23:46:43.049Z","createdAt":"2025-09-11T23:46:43.049Z"},{"_id":"68c4584b8870ff8fa3752f81","component":"data2-core-types@Component","params":{"component":"XMLStringify","package":"data2-core-functions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"value":{"params":{"component":"data2-core-primitives@Object"},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"private"},"updatedAt":"2025-09-12T17:29:53.564Z","createdAt":"2025-09-12T17:28:43.875Z"},{"_id":"61129ab7f302195bad3d0b9c","component":"data2-core-types@Component","params":{"package":"data2-core-functions","component":"toLowerCase","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"string":{"component":"data2-core-primitives@String"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"string"}}},"updatedAt":"2022-09-12T20:30:46.614Z"},{"_id":"61129ae7f302195bad3d943f","component":"data2-core-types@Component","params":{"package":"data2-core-functions","component":"toUpperCase","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"string":{"component":"data2-core-primitives@String"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"string"}}},"updatedAt":"2022-09-12T20:30:31.063Z"},{"_id":"6418a5f25e956b06389b55f9","component":"data2-core-types@Component","params":{"component":"IdentityProvider","package":"data2-core-id","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"getSessionPayload":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"http@Request"}}}},"getProviderId":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Reference"}}}},"sessionNamespace":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"visibility":"public"}}}}},"title":"IdentityProvider","visibility":"public"},"updatedAt":"2023-06-26T18:48:27.016Z","createdAt":"2023-03-20T18:29:06.486Z"},{"_id":"66de4e734d41709d67075e72","component":"data2-core-types@Component","params":{"component":"JwtDecode","package":"data2-core-id","parameters":{"payload":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}}}},"privateKey":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}}}},"visibility":"public"},"updatedAt":"2025-01-16T00:39:01.440Z","createdAt":"2024-09-09T01:25:07.915Z"},{"_id":"646e81ee903d327946e7119c","component":"data2-core-types@Component","params":{"component":"JwtSign","package":"data2-core-id","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"payload":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}}}},"headers":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}}}},"expirationTime":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}}},"privateKey":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}}},"algorithm":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"shouldShow":{"component":"data2-core-primitives@Boolean","preventEvaluation":true,"params":{"content":{"params":{"subject":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"privateKey"}}}},"pattern":{"component":"data2-core-primitives@String","params":{"content":"https://"}}},"component":"data2-core-functions@Includes"},{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"privateKey"}}}},"pattern":{"component":"data2-core-primitives@String","params":{"content":"http://"}}},"component":"data2-core-functions@Includes"}]},"component":"data2-core-logical-operators@Or"}},"component":"data2-core-logical-operators@Not"}},"break":false},"oneOf":[{"params":{"content":"RS256"},"component":"data2-core-primitives@String"},{"params":{"content":"HS256"},"component":"data2-core-primitives@String"}]}},"keytype":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"oneOf":[{"params":{"content":"pkcs8"},"component":"data2-core-primitives@String"},{"params":{"content":"spki"},"component":"data2-core-primitives@String"},{"params":{"content":"x509"},"component":"data2-core-primitives@String"},{"params":{"content":"secret"},"component":"data2-core-primitives@String"}],"shouldShow":{"component":"data2-core-primitives@Boolean","preventEvaluation":true,"params":{"content":{"params":{"subject":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"privateKey"}}}},"pattern":{"component":"data2-core-primitives@String","params":{"content":"https://"}}},"component":"data2-core-functions@Includes"},{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"privateKey"}}}},"pattern":{"component":"data2-core-primitives@String","params":{"content":"http://"}}},"component":"data2-core-functions@Includes"}]},"component":"data2-core-logical-operators@Or"}},"component":"data2-core-logical-operators@Not"}},"break":false}}}}}},"inlineParamsControl":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"visibility":"public"},"updatedAt":"2024-09-09T01:19:02.277Z","createdAt":"2023-05-24T21:27:54.502Z"},{"_id":"64343c6ed39def0637f1bb22","component":"data2-core-types@Component","params":{"component":"JwtVerify","package":"data2-core-id","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"token":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}}},"verifyingKey":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}}},"audience":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}}},"algorithm":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"shouldShow":{"component":"data2-core-primitives@Boolean","preventEvaluation":true,"params":{"content":{"params":{"subject":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"verifyingKey"}}}},"pattern":{"component":"data2-core-primitives@String","params":{"content":"https://"}}},"component":"data2-core-functions@Includes"},{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"verifyingKey"}}}},"pattern":{"component":"data2-core-primitives@String","params":{"content":"http://"}}},"component":"data2-core-functions@Includes"}]},"component":"data2-core-logical-operators@Or"}},"component":"data2-core-logical-operators@Not"}},"break":false}}},"keytype":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"oneOf":[{"params":{"content":"pkcs8"},"component":"data2-core-primitives@String"},{"params":{"content":"spki"},"component":"data2-core-primitives@String"},{"params":{"content":"x509"},"component":"data2-core-primitives@String"}],"shouldShow":{"component":"data2-core-primitives@Boolean","preventEvaluation":true,"params":{"content":{"params":{"subject":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"verifyingKey"}}}},"pattern":{"component":"data2-core-primitives@String","params":{"content":"https://"}}},"component":"data2-core-functions@Includes"},{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"verifyingKey"}}}},"pattern":{"component":"data2-core-primitives@String","params":{"content":"http://"}}},"component":"data2-core-functions@Includes"}]},"component":"data2-core-logical-operators@Or"}},"component":"data2-core-logical-operators@Not"}},"break":false}}}}}},"inlineParamsControl":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"visibility":"public"},"updatedAt":"2025-01-08T15:30:12.597Z","createdAt":"2023-04-10T16:42:22.906Z"},{"_id":"629aa05c124771821a37fd60","component":"data2-core-types@Component","params":{"package":"data2-core-id","component":"Key","preview":{"params":{"reference":"title"},"component":"data2-core-types@Reference"},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"value":{"params":{"component":"data2-core-primitives@String","index":1},"component":"data2-core-types@ComponentParameter"},"name":{"params":{"component":"data2-core-primitives@String","index":0,"title":{"component":"data2-core-primitives@String","params":{"content":"Name"}}},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2022-06-07T19:55:28.888Z"},{"_id":"620f81bd8271aa4129fb2148","component":"data2-core-types@Component","params":{"icon":"key","product":"id","package":"data2-core-id","component":"KeyVault","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"position":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Position"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":101}},"simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"},"dimensions":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Dimensions"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":102}},"simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"defaultValue":{"preventEvaluation":true,"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768,"exactWidth":false,"exactHeight":false}},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"},"keyPair":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-id@KeyPair"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Key Pair"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Holds the public and encrypted private key."}},"visibility":"private","index":{"component":"data2-core-primitives@Number","params":{"content":10}},"defaultValue":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@Reference","params":{"reference":"environment.layers.UserInterfaceLayer"}},"prop":"getProcess","args":["EncryptionController"]}},"prop":"generateKeyPair"}}}},"keys":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-id@Key"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Key"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"defaultValue":[],"visibility":"private"},"component":"data2-core-types@ComponentParameter"}}}},"title":"KeyVault","renderable":{"dimensions":{"disabled":false,"component":"data2-core-types@Dimensions","params":{"width":1360,"height":800,"exactWidth":false,"exactHeight":false}}},"interactions":{"params":{"fields":{"getValue":{"params":{"component":"data2-core-functions@Function","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"name"}}}}],"visibility":"private"},"component":"data2-core-types@ComponentParameter"},"generateRSA":{"params":{"component":"data2-core-functions@Function","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"alg":{"params":{"component":"data2-core-primitives@String","key":{"component":"data2-core-primitives@String","params":{"content":""}},"title":{"component":"data2-core-primitives@String","params":{"content":"Alg"}}},"component":"data2-core-types@ComponentParameter"}}}}],"visibility":"private"},"component":"data2-core-types@ComponentParameter"},"generateUserRSAKeys":{"component":"data2-core-primitives@String","params":{"content":"2048"}},"generateUserECDHKeys":{"params":{"component":"data2-core-functions@Function","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"curve":{"params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"curve"}},"oneOf":[{"params":{"content":"P-256"},"component":"data2-core-primitives@String"},{"params":{"content":"P-384"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"}}}}],"visibility":"private"},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@FieldSet"}},"updatedAt":"2025-08-27T15:20:12.159Z"},{"_id":"62a0f8cad7fd053166e83c20","component":"data2-core-types@Component","params":{"package":"data2-core-id","component":"NanoId","visibility":"public","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"alphabet":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String"}},"size":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Number"}}}}}},"updatedAt":"2024-09-05T23:19:08.765Z"},{"_id":"6425992884bcee362f85ccc9","component":"data2-core-types@Component","params":{"component":"ProviderAuthenticationSettings","package":"data2-core-id","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"providerField":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@FieldReference"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"description":{"component":"data2-core-primitives@String","params":{"content":"Pick the column in the DataSet that represents an ID by the Identity Provider."}}}},"identityProvider":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@IdentityProviderReference"}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}},"description":{"component":"data2-core-primitives@String","params":{"content":"The Third party identity provider to be allowed in this Authentication Strategy."}}}},"allowSignup":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"visibility":"public","index":{"component":"data2-core-primitives@Number","params":{"content":2}},"description":{"component":"data2-core-primitives@String","params":{"content":"When logging in with a user that has no match in the verifier, should create a new user instead of denying the login."}}}},"onBeforeCreateSession":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-flow@Series","visibility":"public","index":{"component":"data2-core-primitives@Number","params":{"content":3}},"description":{"component":"data2-core-primitives@String","params":{"content":"Action to be executed before creating the user session."}}}},"omitSessionToken":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"visibility":"public","index":{"component":"data2-core-primitives@Number","params":{"content":2}},"description":{"component":"data2-core-primitives@String","params":{"content":"If true, omits the key \"sessionToken\" from credentials when creating the session."}}}},"shouldForwardErrors":{"component":"data2-core-types@ComponentParameter","params":{"index":{"component":"data2-core-primitives@Number","params":{"content":10}},"description":{"component":"data2-core-primitives@String","params":{"content":"If true, will send to client eventual errors when logging in with ID Provider. Useful for debugging the integration."}},"component":"data2-core-primitives@Boolean"}}}}},"visibility":"private","title":"ProviderAuthenticationSettings","inlineParamsControl":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"updatedAt":"2024-12-13T13:12:44.753Z","createdAt":"2023-03-30T14:14:00.761Z"},{"_id":"5f6d161ba575399a457b0697","component":"data2-core-types@Component","params":{"package":"data2-core-logical-operators","component":"And","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"components":{"component":"data2-core-primitives@String","list":true}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"components.0"}}},"updatedAt":"2022-09-12T20:24:32.676Z"},{"_id":"5f6d167ca575399a457b1a7e","component":"data2-core-types@Component","params":{"package":"data2-core-logical-operators","component":"Not","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"subject":{"component":"data2-core-primitives@Boolean"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"subject"}},"inlineParamsControl":{"component":"data2-core-primitives@Boolean","params":{"content":false}}},"updatedAt":"2023-10-19T10:30:47.029Z"},{"_id":"5ec30dd044f1ebfde263a2d5","component":"data2-core-types@Component","params":{"package":"data2-core-logical-operators","component":"Or","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"components":{"component":"data2-core-primitives@String","list":true}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"components.0"}}},"updatedAt":"2022-09-12T20:24:14.051Z"},{"_id":"600dfeb35c0bce53adf1e8e8","component":"data2-core-types@Component","params":{"preview":{"params":{"reference":"title"},"component":"data2-core-types@Reference"},"package":"data2-core-media","component":"Chapter","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"timeStart":"Number","timeEnd":"Number","title":"String","onEnd":{"component":"data2-core-types@Interaction"},"onEnter":{"component":"data2-core-types@Interaction"}}}}}},{"_id":"672a3925c363a5d578b62dd1","component":"data2-core-types@Component","params":{"component":"CsvToXlsx","package":"data2-core-media","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"input":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String"}}}}},"title":"CsvToXlsx"},"updatedAt":"2024-11-05T15:26:55.971Z","createdAt":"2024-11-05T15:26:29.873Z"},{"_id":"628e781e25e0de0609d20af9","component":"data2-core-types@Component","params":{"product":"media","component":"DynamicImage","package":"data2-core-media","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"position":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Position"}},"category":"appearance","simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":101}},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"},"dimensions":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Dimensions"}},"category":"appearance","simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":102}},"defaultValue":{"preventEvaluation":true,"component":"data2-core-types@Dimensions","params":{"width":800,"height":500}},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"},"scaleFactor":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}}},"component":"data2-core-types@ComponentParameter"},"policies":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-auth@Policy"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"description":{"component":"data2-core-primitives@String","params":{"content":"Controls for allowing or denying access to the data"}}}}}}},"title":{"component":"data2-core-primitives@String","params":{"content":"Dynamic Image"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"camera-retro"}},"visibility":"public","interactions":{"params":{"fields":{"print":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"params":{"icon":"fa-print"},"component":"data2-core-types@FontAwesomeIcon"},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"parameters":{"params":{"fields":{"width":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Width of print"}}},"component":"data2-core-types@ComponentParameter"},"height":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Height of print"}}},"component":"data2-core-types@ComponentParameter"},"component":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@UserComponentInterface"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Component to Print"}}},"component":"data2-core-types@ComponentParameter"},"scaleFactor":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"title":{"component":"data2-core-primitives@String","params":{"content":"scale factor"}}},"component":"data2-core-types@ComponentParameter"},"title":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Title of file"}}}}}},"component":"data2-core-types@FieldSet"},"flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}}]},"component":"data2-core-types@ComponentParameter"},"webPrint":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"params":{"icon":"fa-globe"},"component":"data2-core-types@FontAwesomeIcon"},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"parameters":{"params":{"fields":{"width":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Width of print"}}},"component":"data2-core-types@ComponentParameter"},"height":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Height of print"}}},"component":"data2-core-types@ComponentParameter"},"url":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Web Address to Print"}}},"component":"data2-core-types@ComponentParameter"},"title":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Title of file"}}}}}},"component":"data2-core-types@FieldSet"},"flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}}]},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@FieldSet"}},"updatedAt":"2023-01-23T21:41:48.954Z","createdAt":"2022-05-25T18:40:30.888Z"},{"_id":"641c91904625490637c2b696","component":"data2-core-types@Component","params":{"component":"ExtractTextFromDocX","package":"data2-core-media","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"file":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"File"}},"description":{"component":"data2-core-primitives@String","params":{"content":"PDF File to have the text extracted."}}},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"public"},"updatedAt":"2023-03-23T17:51:59.273Z","createdAt":"2023-03-23T17:51:12.007Z"},{"_id":"640873991803cb0b5c4cac3b","component":"data2-core-types@Component","params":{"package":"data2-core-media","component":"ExtractTextFromFile","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"file":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"File"}},"description":{"component":"data2-core-primitives@String","params":{"content":"File to have the text extracted."}}},"component":"data2-core-types@ComponentParameter"},"encoding":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Encoding"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Enconding of the file"}},"oneOf":[{"params":{"content":"UTF-8"},"component":"data2-core-primitives@String"},{"params":{"content":"UTF-16"},"component":"data2-core-primitives@String"},{"params":{"content":"iso-8859-1"},"component":"data2-core-primitives@String"},{"params":{"content":"windows-1252"},"component":"data2-core-primitives@String"}],"defaultValue":{"params":{"content":"UTF-8"},"component":"data2-core-primitives@String"}},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"public"},"updatedAt":"2025-08-22T16:53:17.466Z"},{"_id":"64086a961803cb0b5c4bf774","component":"data2-core-types@Component","params":{"package":"data2-core-media","component":"ExtractTextFromPDF","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"file":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"File"}},"description":{"component":"data2-core-primitives@String","params":{"content":"PDF File to have the text extracted."}}},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"public"}},{"_id":"6924f95e15f85827e134aeeb","component":"data2-core-types@Component","params":{"component":"XlsxToCsv","package":"data2-core-media","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"input":{"params":{"component":"data2-core-types@Reference"},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2025-11-25T00:33:34.725Z","createdAt":"2025-11-25T00:33:34.725Z"},{"_id":"605b9c73f4da57a543329761","component":"data2-core-types@Component","params":{"package":"data2-core-numerical-operators","component":"Add","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"components":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Components"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"description":{"component":"data2-core-primitives@String","params":{"content":"Numbers to be added."}}},"component":"data2-core-types@ComponentParameter"}}}},"title":{"component":"data2-core-primitives@String","params":{"content":"Add"}},"returnPrimitiveTypes":[{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}}],"description":{"component":"data2-core-primitives@String","params":{"content":""}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"components.0"}}},"updatedAt":"2022-09-12T20:27:37.722Z"},{"_id":"605b9c8cf4da57a543329d96","component":"data2-core-types@Component","params":{"package":"data2-core-numerical-operators","component":"Divide","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"components":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Components"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}}}},"title":{"component":"data2-core-primitives@String","params":{"content":"Divide"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Applies division sequentially, example: if components is [4, 2, 2], the result will be 1 (4 / 2 / 2)."}},"returnPrimitiveTypes":[{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}}],"wrap":{"component":"data2-core-primitives@String","params":{"content":"components.0"}}},"updatedAt":"2022-09-12T20:28:19.753Z"},{"_id":"61fac3106947419456ac9796","component":"data2-core-types@Component","params":{"component":"Modulo","package":"data2-core-numerical-operators","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"components":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Components"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"description":{"component":"data2-core-primitives@String","params":{"content":"Only the first two numbers will be used."}}},"component":"data2-core-types@ComponentParameter"}}}},"title":{"component":"data2-core-primitives@String","params":{"content":"Modulo"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Applies the module operation to two numbers, i.e., returns the remainder of the division of the first number divided by the second. Example: 5 mod 2 yields 1."}},"returnPrimitiveTypes":[{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}}]},"updatedAt":"2022-03-04T13:48:42.764Z"},{"_id":"605b9c85f4da57a543329b97","component":"data2-core-types@Component","params":{"package":"data2-core-numerical-operators","component":"Multiply","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"components":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Components"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Numbers that will be multiplied."}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}}}},"title":{"component":"data2-core-primitives@String","params":{"content":"Multiply"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Multiply all the numbers and returns the result."}},"returnPrimitiveTypes":[{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}}],"wrap":{"component":"data2-core-primitives@String","params":{"content":"components.0"}}},"updatedAt":"2022-09-12T20:27:48.667Z"},{"_id":"605b9c7ef4da57a5433299e2","component":"data2-core-types@Component","params":{"package":"data2-core-numerical-operators","component":"Subtract","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"components":{"component":"data2-core-primitives@Number","list":true}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"components.0"}}},"updatedAt":"2022-09-12T20:27:27.636Z"},{"_id":"6948984825397ecddc468c33","component":"data2-core-types@Component","params":{"component":"Preset","package":"data2-core-presets","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"constructType":{"params":{},"component":"data2-core-types@ComponentParameter"},"params":{"params":{},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2025-12-22T01:00:56.846Z","createdAt":"2025-12-22T01:00:56.846Z"},{"_id":"5f56fac4a575399a459f7a61","component":"data2-core-types@Component","params":{"product":"ui","package":"data2-core-primitives","component":"Application","icon":"window-maximize","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"position":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Position"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":101}},"simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"},"dimensions":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Dimensions"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":102}},"simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"defaultValue":{"preventEvaluation":true,"component":"data2-core-types@Dimensions","params":{"width":1440,"height":900}},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"},"domain":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":200}},"title":{"component":"data2-core-primitives@String","params":{"content":"Domain"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Subdomain to be used when accessing the application through a data2.app URL, e.g., if the domain is 'site', you'll access your application through site.yoursystemdomain.data2.app. To have your application render on yoursystemdomain.data2.app, use 'app' as the domain value."}},"fieldValidation":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"currentValue"}}],"body":{"params":{"then":{"component":"data2-core-primitives@String","params":{"content":"Domain must not include special characters other than hyphen (-). Only lower case letters are allowed."}},"compare":[{"params":{"comparisonSubject":{"component":"data2-core-primitives@Number","params":{"content":0}},"subject":{"component":"data2-core-types@Getter","params":{"module":{"params":{"pattern":{"component":"data2-core-types@Regex","params":{"pattern":"[^a-z0-9-]","flags":"gm"}},"text":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"currentValue"}}}}},"component":"data2-core-functions@Match"},"prop":{"component":"data2-core-primitives@String","params":{"content":"length"}}}}},"component":"data2-core-comparison-operators@GreaterThan"}]},"component":"data2-core-flow@If"}}},"unversioned":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"name":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":201}},"title":{"component":"data2-core-primitives@String","params":{"content":"Name"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Name to used as the title of the page."}}},"component":"data2-core-types@ComponentParameter"},"shortName":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":201.1}},"title":{"component":"data2-core-primitives@String","params":{"content":"Short Name"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Short name of the web manifest."}}},"component":"data2-core-types@ComponentParameter"},"description":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":202}},"multiLine":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"title":{"component":"data2-core-primitives@String","params":{"content":"Description"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Description to be used in the HTML metatags and in the web app manifest."}}},"component":"data2-core-types@ComponentParameter"},"display":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":203}},"oneOf":["browser","fullscreen","standalone","minimal-ui"],"title":{"component":"data2-core-primitives@String","params":{"content":"Display"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Preferred display mode. This value is used in the Web app manifest. Defaults to 'browser'."}}},"component":"data2-core-types@ComponentParameter"},"orientation":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":204}},"oneOf":["any","natural","portrait","landscape"],"title":{"component":"data2-core-primitives@String","params":{"content":"Orientation"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Default orientation, used in the web app manifest. Defaults to 'any'."}}},"component":"data2-core-types@ComponentParameter"},"themeColor":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Color"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":205}},"title":{"component":"data2-core-primitives@String","params":{"content":"Theme Color"}},"link":{"component":"data2-core-primitives@String","params":{"content":"https://developer.mozilla.org/en-US/docs/Web/Manifest/theme_color"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Default theme color, used in the web app manifest."}}},"component":"data2-core-types@ComponentParameter"},"backgroundColor":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Color"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":206}},"title":{"component":"data2-core-primitives@String","params":{"content":"Background Color"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Placeholder color for the application. Used in the resulting HTML and in the web app manifest."}}},"component":"data2-core-types@ComponentParameter"},"entryPoint":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@ComponentInstanceReference"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":210}},"title":{"component":"data2-core-primitives@String","params":{"content":"Entry Point"}},"description":{"component":"data2-core-primitives@String","params":{"content":"What the application will render, usually an Artboard or a Router."}}},"component":"data2-core-types@ComponentParameter"},"font":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-web@Fonts"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":103}},"title":{"component":"data2-core-primitives@String","params":{"content":"Font"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Fonts that will be used as default, i.e., when the Block doesn't select a Text Font."}}},"component":"data2-core-types@ComponentParameter"},"icon":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@FileComponentUrlReference"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":104}}},"component":"data2-core-types@ComponentParameter"},"appIcon":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":105}},"title":{"component":"data2-core-primitives@String","params":{"content":"App Icon"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Icon to be used in the web app manifest. Can also be used as the iOS Icon if the iOS Icon isn't configured."}}},"component":"data2-core-types@ComponentParameter"},"image":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":106}},"title":{"component":"data2-core-primitives@String","params":{"content":"Image"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Image to be used in the og:image meta tag."}}},"component":"data2-core-types@ComponentParameter"},"responseHeaders":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","index":{"component":"data2-core-primitives@Number","params":{"content":300}},"category":"other","description":{"component":"data2-core-primitives@String","params":{"content":"Sets some HTTP headers in the response. Advanced usage!"}},"visibility":"public","parameters":{"X-Frame-Options":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"X-Frame-Options"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Sets the header X-Frame-Options. For more information on this header, see the link."}},"link":{"component":"data2-core-primitives@String","params":{"content":"https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"oneOf":[{"params":{"content":"DENY"},"component":"data2-core-primitives@String"},{"params":{"content":"SAMEORIGIN"},"component":"data2-core-primitives@String"}],"category":"other","defaultValue":{"preventEvaluation":true,"params":{"content":""},"component":"data2-core-primitives@String"}}},"Content-Security-Policy":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Content Security Policy"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Sets the Content-Security-Policy header."}},"link":{"component":"data2-core-primitives@String","params":{"content":"https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}},"defaultValue":{"preventEvaluation":true,"params":{"content":""},"component":"data2-core-primitives@String"}},"component":"data2-core-types@ComponentParameter"},"X-XSS-Protection":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"X-XSS-Protection"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Sets the header X-XSS-Protection. For more information on this header, see the link."}},"link":{"component":"data2-core-primitives@String","params":{"content":"https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-XSS-Protection"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"oneOf":[{"params":{"content":"DENY"},"component":"data2-core-primitives@String"},{"params":{"content":"SAMEORIGIN"},"component":"data2-core-primitives@String"}],"category":"other","defaultValue":{"preventEvaluation":true,"params":{"content":""},"component":"data2-core-primitives@String"}}}}}},"metaTags":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-web@MetaTag"}},"index":{"component":"data2-core-primitives@Number","params":{"content":301}},"category":"other","description":{"component":"data2-core-primitives@String","params":{"content":"Meta tags that will be set in the HTML."}},"visibility":"public","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}},"scriptTags":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"multiLine":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"visibility":"public"}},"serverSideRendering":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"visibility":"beta","unversioned":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}},"language":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":202.1}},"multiLine":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"title":{"component":"data2-core-primitives@String","params":{"content":"Language"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Language (ISO Code) to be used in the HTML metatags. Examples: en, pt-BR, es"}}},"component":"data2-core-types@ComponentParameter"},"minimalBundle":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"category":"behaviour","visibility":"private","unversioned":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"title":{"component":"data2-core-primitives@String","params":{"content":"Minimal Bundle"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Load only this Application's minimal bundle from storage instead of the full system bundle. Falls back to the full bundle if the minimal bundle is unavailable."}}}},"embeddedBundle":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"category":"behaviour","visibility":"private","unversioned":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"title":{"component":"data2-core-primitives@String","params":{"content":"Embedded Bundle"}},"description":{"component":"data2-core-primitives@String","params":{"content":"If true, embed bundle in html."}}}},"onStaleBundle":{"params":{"component":"data2-core-flow@Series","category":"behaviour","visibility":"private"},"component":"data2-core-types@ComponentParameter"}}}},"renderable":{"dimensions":{"disabled":false,"component":"data2-core-types@Dimensions","params":{"width":1366,"exactWidth":false,"exactHeight":false,"height":768}}}},"updatedAt":"2026-08-12T21:02:01.344Z"},{"_id":"5eceb27f3888745c0d57155d","component":"data2-core-types@Component","params":{"product":"ui","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"position":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Position"}},"category":"appearance","simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":101}},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"},"dimensions":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Dimensions"}},"category":"appearance","simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":102}},"defaultValue":{"preventEvaluation":true,"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768}},"visibility":"public","description":{"component":"data2-core-primitives@String","params":{"content":"Move and resize the artboard boundaries, direclty affecting how the content is displayed."}}},"component":"data2-core-types@ComponentParameter"},"fill":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Fill"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":103}},"defaultValue":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","preventEvaluation":true},"description":{"component":"data2-core-primitives@String","params":{"content":"Color Background of the artboard."}}},"component":"data2-core-types@ComponentParameter"},"alternativeArtboards":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@ResponsiveArtboards"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":201}},"description":{"component":"data2-core-primitives@String","params":{"content":"Pick alternative artboards for different devices. When configured, the alternative artboard will automatically show instead of the main one on the targeted device."}}},"component":"data2-core-types@ComponentParameter"},"componentClass":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@ComponentClass"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":301}},"description":{"component":"data2-core-primitives@String","params":{"content":"Makes this artboard a component, enabling easy reuse of its content, with the option to configure parameters to be reused in each of the component instances."}}},"component":"data2-core-types@ComponentParameter"},"componentStates":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@ComponentState"}},"category":"behaviour","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":302}},"description":{"component":"data2-core-primitives@String","params":{"content":"When the current artboard is a component, you may configure its states. Each state can be attributed to another artboard, rendering it when the state is set in the instance of the component."}},"shouldShow":{"component":"data2-core-primitives@Boolean","preventEvaluation":true,"params":{"content":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"componentClass"}}}}},"break":false}},"component":"data2-core-types@ComponentParameter"},"childrenOverflow":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":101}},"description":{"component":"data2-core-primitives@String","params":{"content":"No longer confines the content of the Artboard to its boundaries. Overflowing elements will not be cropped."}}},"component":"data2-core-types@ComponentParameter"},"font":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-web@GoogleFont"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":213}},"description":{"component":"data2-core-primitives@String","params":{"content":"The font face of the Artboard and its children."}}},"component":"data2-core-types@ComponentParameter"},"globalLights":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@GlobalLights"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":104}},"description":{"component":"data2-core-primitives@String","params":{"content":"Directional lights applied to descendant blocks that opt-in via lightInteraction. Edit all lights together on the shared 2D pad."}},"visibility":"private"}}}}},"component":"Artboard","package":"data2-core-primitives","icon":"object-group","title":{"component":"data2-core-primitives@String","params":{"content":"Artboard"}},"definition":{"params":{"teste":{"component":"data2-core-primitives@String","params":{}}},"component":"data2-core-types@Definition"}},"updatedAt":"2026-05-20T14:05:41.173Z"},{"_id":"5ecd05ded68ce41360f74b43","component":"data2-core-types@Component","params":{"public":true,"product":"ui","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"position":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Position"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":102}},"description":{"component":"data2-core-primitives@String","params":{"content":"Position and move your block around the Artboard. Clicking the crosshair axis fixates the block's distance to its parent's boundaries in the clicked axis direction. Inner axis are proportional wihle outside axis are absolute."}}},"component":"data2-core-types@ComponentParameter"},"dimensions":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Dimensions"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":103}},"description":{"component":"data2-core-primitives@String","params":{"content":"Size and content-related dimensions of the block."}}},"component":"data2-core-types@ComponentParameter"},"childrenMode":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"content","oneOf":[{"params":{"content":"rows"},"component":"data2-core-primitives@String"},{"params":{"content":"reversed-rows"},"component":"data2-core-primitives@String"},{"params":{"content":"cols"},"component":"data2-core-primitives@String"},{"params":{"content":"reversed-cols"},"component":"data2-core-primitives@String"},{"params":{"content":"grid"},"component":"data2-core-primitives@String"},{"params":{"content":"reference"},"component":"data2-core-primitives@String"}],"index":{"component":"data2-core-primitives@Number","params":{"content":221}},"description":{"component":"data2-core-primitives@String","params":{"content":"Determines how children without \"free transform\" option enabled are placed relative to eachother."}}},"component":"data2-core-types@ComponentParameter"},"onClick":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":311}},"injectContext":[{"component":"data2-core-primitives@String","params":{"content":"mouseEvent"}}],"description":{"component":"data2-core-primitives@String","params":{"content":"Executes an action upon user click."}}},"component":"data2-core-types@ComponentParameter"},"onClickOutside":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":311.1}},"description":{"component":"data2-core-primitives@String","params":{"content":"Executes an action upon user clicking outside this block."}}},"component":"data2-core-types@ComponentParameter"},"onMouseEnter":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":313}},"description":{"component":"data2-core-primitives@String","params":{"content":"Executes an action upon user moving the mouse into the block."}}},"component":"data2-core-types@ComponentParameter"},"onMouseLeave":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":313}},"description":{"component":"data2-core-primitives@String","params":{"content":"Executes an action upon user moving the cursor to outside the block."}}},"component":"data2-core-types@ComponentParameter"},"onVisibleOnScreen":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":314}},"description":{"component":"data2-core-primitives@String","params":{"content":"Triggers an action when the block is appearing on the screen."}}},"component":"data2-core-types@ComponentParameter"},"shadow":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Shadow"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":106}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"description":{"component":"data2-core-primitives@String","params":{"content":"Controls shadows and highlights of your block."}}},"component":"data2-core-types@ComponentParameter"},"filter":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@BitmapFilter"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":106}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"description":{"component":"data2-core-primitives@String","params":{"content":"Makes the contents blurred, grayscale, and many other filters."}}},"component":"data2-core-types@ComponentParameter"},"backdropFilter":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@BitmapFilter"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":106}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"description":{"component":"data2-core-primitives@String","params":{"content":"Applies specified filters to what is behind/underneath the block"}}},"component":"data2-core-types@ComponentParameter"},"border":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Border"}},"description":{"component":"data2-core-primitives@String","params":{"content":"border thickness, color and corner radius"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":100}},"defaultValue":{"preventEvaluation":true,"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}}},"component":"data2-core-types@ComponentParameter"},"fill":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Fill"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":104}},"defaultValue":{"preventEvaluation":true,"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"title":{"component":"data2-core-primitives@String","params":{"content":"Fill"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Related to background color."}}},"component":"data2-core-types@ComponentParameter"},"text":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":211}},"description":{"component":"data2-core-primitives@String","params":{"content":"Text content of the block. If defined, the block's children will not be displayed."}},"multiLine":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"textFormat":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@TextFormat"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":215}},"description":{"component":"data2-core-primitives@String","params":{"content":"Formatting of this block's text content."}}},"component":"data2-core-types@ComponentParameter"},"textColor":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Color"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":214}},"description":{"component":"data2-core-primitives@String","params":{"content":"Block's text content color. Unless specified, children will inherit this value."}}},"component":"data2-core-types@ComponentParameter"},"childrenReference":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@ComponentInstanceReference"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":222}},"shouldShow":{"component":"data2-core-comparison-operators@Identical","preventEvaluation":true,"params":{"subject":"reference","comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":"childrenMode"}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"Applies the content of this block as something referenced from other artboards or a router."}}},"component":"data2-core-types@ComponentParameter"},"textSize":{"params":{"category":"content","component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"index":{"component":"data2-core-primitives@Number","params":{"content":212}},"description":{"component":"data2-core-primitives@String","params":{"content":"Block's text font sizing. Unless specified, children will inherit this value."}}},"component":"data2-core-types@ComponentParameter"},"font":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-web@GoogleFont"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":213}},"description":{"component":"data2-core-primitives@String","params":{"content":"The font face of the block and its children. If not specified, uses the nearest specified parent's font."}}},"component":"data2-core-types@ComponentParameter"},"scroll":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Scroll"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":107}},"description":{"component":"data2-core-primitives@String","params":{"content":"Enable or disable scroll behavior and scrollbars."}}},"component":"data2-core-types@ComponentParameter"},"repeat":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetReference"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":231}},"description":{"component":"data2-core-primitives@String","params":{"content":"Repeats (copies) the children of the block 'N' times.  If this property is a DataSet or an Array, 'N' will be equal to its length. Disable the children's \"free transform\" property to place them one after eachother automatically."}}},"component":"data2-core-types@ComponentParameter"},"repeatFilter":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@FieldSet"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":233}},"shouldShow":{"component":"data2-core-primitives@Boolean","preventEvaluation":true,"params":{"content":{"component":"data2-core-types@Reference","params":{"reference":"repeat"}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"Filters the content of the repeater. Works only when the 'repeater' property is a DataSet. Using this property creates a copy of the DataSet that cannot be controlled/refreshed."}}},"component":"data2-core-types@ComponentParameter"},"repeatEmptyState":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@ComponentInstanceReference"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":235}},"shouldShow":{"component":"data2-core-primitives@Boolean","preventEvaluation":true,"params":{"content":{"component":"data2-core-types@Reference","params":{"reference":"repeat"}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"Displays something else when the repeater is empty ('N' = 0)."}}},"component":"data2-core-types@ComponentParameter"},"repeatLoadingState":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@ComponentInstanceReference"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":234}},"shouldShow":{"component":"data2-core-primitives@Boolean","preventEvaluation":true,"params":{"content":{"component":"data2-core-types@Reference","params":{"reference":"repeat"}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"Displays something else when the repeater's DataSet is loading. Has no effect if the \"repeat\" property is not a DataSet"}}},"component":"data2-core-types@ComponentParameter"},"rotate":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":108}},"description":{"component":"data2-core-primitives@String","params":{"content":"Rotates the block around its center."}}},"component":"data2-core-types@ComponentParameter"},"transitions":{"params":{"category":"appearance","component":"data2-core-types@Transition","index":{"component":"data2-core-primitives@Number","params":{"content":109}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"description":{"component":"data2-core-primitives@String","params":{"content":"Defines transitions with duration, delay, and easing settings. Transitions are how the block should interpolate a change of property over time. Note that not all properties can be transitioned."}}},"component":"data2-core-types@ComponentParameter"},"repeatReference":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":232}},"shouldShow":{"component":"data2-core-primitives@Boolean","preventEvaluation":true,"params":{"content":{"component":"data2-core-types@Reference","params":{"reference":"repeat"}}}},"visibility":"public","description":{"component":"data2-core-primitives@String","params":{"content":"Names the data from the \"repeat\" property for each of the block's children. The data can be accessed in this block's children by using a Reference."}}},"component":"data2-core-types@ComponentParameter"},"childrenOverflow":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":101}},"description":{"component":"data2-core-primitives@String","params":{"content":"When activated, no longer confines the children of this block to its boundaries"}}},"component":"data2-core-types@ComponentParameter"},"hide":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":101}},"description":{"component":"data2-core-primitives@String","params":{"content":"Hidden components will not render and will not occupy space affecting non free-transform elements."}}},"component":"data2-core-types@ComponentParameter"},"opacity":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-types@Opacity","category":"appearance","index":101,"description":{"component":"data2-core-primitives@String","params":{"content":"General transparency of the block and its contents. Children has their opacity value relative to their parents."}}}},"stateDefinitions":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-user-interface@StateDefinition"}},"category":"behaviour","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":301}},"description":{"component":"data2-core-primitives@String","params":{"content":"Defines multiple temporary states initialized with their default values. For example, this can be used to hold states like whether the block is hovered, or the amount of times it was clicked. Any data changed is lost when the artboard page is refreshed."}}},"component":"data2-core-types@ComponentParameter"},"onMouseDown":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":312}},"description":{"component":"data2-core-primitives@String","params":{"content":"Executes an action upon user pressing the mouse click."}}},"component":"data2-core-types@ComponentParameter"},"onMouseUp":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":312}},"description":{"component":"data2-core-primitives@String","params":{"content":"Executes an action upon user releasing the mouse click button."}}},"component":"data2-core-types@ComponentParameter"},"cursor":{"params":{"index":{"component":"data2-core-primitives@Number","params":{"content":311}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Cursor style"}},"oneOf":["alias","all-scroll","auto","cell","context-menu","col-resize","copy","crosshair","default","e-resize","ew-resize","grab","grabbing","help","move","n-resize","ne-resize","nesw-resize","ns-resize","nw-resize","nwse-resize","no-drop","none","not-allowed","pointer","progress","row-resize","s-resize","se-resize","sw-resize","text","w-resize","wait","zoom-in","zoom-out"],"category":"appearance","visibility":"public"},"component":"data2-core-types@ComponentParameter"},"repeatLimit":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":232.1}},"shouldShow":{"component":"data2-core-primitives@Boolean","preventEvaluation":true,"params":{"content":{"component":"data2-core-types@Reference","params":{"reference":"repeat"}}}},"visibility":"public","description":{"component":"data2-core-primitives@String","params":{"content":"Limits the 'N' size of the repeater to a specified amount, omitting further copies of the children."}}},"component":"data2-core-types@ComponentParameter"},"repeatKey":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":232.5}},"shouldShow":{"component":"data2-core-primitives@Boolean","preventEvaluation":true,"params":{"content":{"component":"data2-core-types@Reference","params":{"reference":"repeat"}}}},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"},"tabIndex":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":315}},"description":{"component":"data2-core-primitives@String","params":{"content":"Defines the order of block accessibility when pressing TAB."}}},"component":"data2-core-types@ComponentParameter"},"textDecoration":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@TextDecoration"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":215.1}},"visibility":"public","description":{"component":"data2-core-primitives@String","params":{"content":"Block's text support elements. Unless specified, children will inherit this value."}}},"component":"data2-core-types@ComponentParameter"},"tooltip":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":215.2}},"description":{"component":"data2-core-primitives@String","params":{"content":"Displays a text tooltip when hovering the block."}}},"component":"data2-core-types@ComponentParameter"},"preventUserSelection":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Prevent User Selection"}},"category":"behaviour","description":{"component":"data2-core-primitives@String","params":{"content":"Makes the blocks text unselectable. Great for buttons or any clickable content."}}},"component":"data2-core-types@ComponentParameter"},"ignoreMouseEvents":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Ignore Mouse Events"}},"category":"behaviour","description":{"component":"data2-core-primitives@String","params":{"content":"Ingores any cursor interaction with the block. Children may override this value for themselves.\nAlso ignores default TAB behavior."}}},"component":"data2-core-types@ComponentParameter"},"index":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":314.5}},"description":{"component":"data2-core-primitives@String","params":{"content":"Orders the element depth-wise. A higher value will put the current block on top of its siblings with lesser indexes"}}},"component":"data2-core-types@ComponentParameter"},"disabled":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"category":"behaviour","visibility":"public","description":{"component":"data2-core-primitives@String","params":{"content":"Determines if the block can be clicked to execute the \"onClicked\" interaction or not.\nWhen true, it will replace the cursor to \"not-allowed\" on hovering the element."}}},"component":"data2-core-types@ComponentParameter"},"onInvisibleOnScreen":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":314.1}},"visibility":"public","description":{"component":"data2-core-primitives@String","params":{"content":"Triggers an action when the block is no longer seen on screen."}}},"component":"data2-core-types@ComponentParameter"},"onTouchStart":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":302}},"injectContext":[{"component":"data2-core-primitives@String","params":{"content":"mouseEvent"}}],"description":{"component":"data2-core-primitives@String","params":{"content":"Executes an action upon user touch starts."}}},"component":"data2-core-types@ComponentParameter"},"onTouchEnd":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":303}},"injectContext":[{"component":"data2-core-primitives@String","params":{"content":"mouseEvent"}}],"description":{"component":"data2-core-primitives@String","params":{"content":"Executes an action upon user touch ends."}}},"component":"data2-core-types@ComponentParameter"},"accessibilityRole":{"params":{"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":316}},"description":{"component":"data2-core-primitives@String","params":{"content":"Defines the role of an element, helping assistive technologies understand its purpose (e.g., role=\"button\")."}},"component":"data2-core-primitives@String","oneOf":["banner","navigation","main","complementary","contentinfo","region","alert","dialog","button","checkbox","heading","link","list","listitem","tablist","tab","tabpanel","textbox","progressbar","slider",{"params":{"content":"alertdialog"},"component":"data2-core-primitives@String"}],"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"accessibilityLabel":{"params":{"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":332}},"description":{"component":"data2-core-primitives@String","params":{"content":"Provides a text label for an element that might not have visible text, offering a description for assistive tech."}},"component":"data2-core-primitives@String","visibility":"public"},"component":"data2-core-types@ComponentParameter"},"accessibilityLevel":{"params":{"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":318}},"description":{"component":"data2-core-primitives@String","params":{"content":"Defines the level of an element, helping assistive technologies (e.g., aria-level=\"1\")."}},"component":"data2-core-primitives@String","visibility":"public"},"component":"data2-core-types@ComponentParameter"},"accessibilityHide":{"params":{"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":315.5}},"description":{"component":"data2-core-primitives@String","params":{"content":"If true, hides the Block from screen readers"}},"component":"data2-core-primitives@Boolean","visibility":"public"},"component":"data2-core-types@ComponentParameter"},"onDragEnter":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":311}},"injectContext":[{"component":"data2-core-primitives@String","params":{"content":"mouseEvent"}}],"description":{"component":"data2-core-primitives@String","params":{"content":"Executes an action upon user is dragging a file and enters the block area."}}},"component":"data2-core-types@ComponentParameter"},"onDragLeave":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":311}},"injectContext":[{"component":"data2-core-primitives@String","params":{"content":"mouseEvent"}}],"description":{"component":"data2-core-primitives@String","params":{"content":"Executes an action upon user is dragging a file and leaves the block area."}}},"component":"data2-core-types@ComponentParameter"},"onDrop":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":311}},"injectContext":[{"component":"data2-core-primitives@String","params":{"content":"mouseEvent"}}],"description":{"component":"data2-core-primitives@String","params":{"content":"Executes an action upon user is dragging a file and drops inside the block area."}}},"component":"data2-core-types@ComponentParameter"},"accessibilityModal":{"params":{"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":320}},"description":{"component":"data2-core-primitives@String","params":{"content":"Defines if an element is a modal for accessibility purposes."}},"component":"data2-core-primitives@Boolean","visibility":"private"},"component":"data2-core-types@ComponentParameter"},"transform":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Transform"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":110}},"description":{"component":"data2-core-primitives@String","params":{"content":"Composable list of CSS transforms (translate, scale, rotate, skew, perspective). Order matters — items render left-to-right. Adding any 3D transform automatically applies preserve-3d so children render in 3D space."}},"visibility":"private","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"lightInteraction":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@LightInteraction"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":111}},"description":{"component":"data2-core-primitives@String","params":{"content":"Opts this block into the Artboard's GlobalLights. Configure whether the block casts a shadow per light and whether it catches the light's color as an inner highlight."}},"visibility":"private"},"component":"data2-core-types@ComponentParameter"}}}},"extendable":{"placeholder":"children"},"component":"Block","package":"data2-core-primitives","icon":"square","title":{"component":"data2-core-primitives@String","params":{"content":"Block"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Block is the main primitive for building layouts."}},"preview":{"disabled":true,"component":"data2-core-types@FileComponentUrlReference","params":{}},"visibility":"public"},"updatedAt":"2026-05-20T13:31:51.228Z"},{"_id":"5f64d109a575399a45e26049","component":"data2-core-types@Component","params":{"component":"Boolean","package":"data2-core-primitives","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"content":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"sensitive":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"visibility":"private"},"component":"data2-core-types@ComponentParameter"}}}},"validation":{"required":{"component":"data2-core-primitives@Boolean","default":false}}},"updatedAt":"2023-11-23T21:05:08.514Z"},{"_id":"6260284c978be06d5538ed10","component":"data2-core-types@Component","params":{"component":"Date","package":"data2-core-primitives","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"content":{"component":"data2-core-primitives@String"},"list":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"visibility":"private"},"component":"data2-core-types@ComponentParameter"},"unique":{"component":"data2-core-primitives@Boolean"},"sensitive":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"visibility":"private"},"component":"data2-core-types@ComponentParameter"}}}},"validation":{"required":{"component":"data2-core-primitives@Boolean","default":false}},"returnPrimitiveTypes":["data2-core-primitives@Date"]},"updatedAt":"2023-11-23T21:05:30.452Z"},{"_id":"607f1aebf1955d3129a4371c","component":"data2-core-types@Component","params":{"component":"Null","package":"data2-core-primitives","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{}}}}},{"_id":"5f51ca6ba575399a45a34cd3","component":"data2-core-types@Component","params":{"component":"Number","package":"data2-core-primitives","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"content":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"list":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"visibility":"private"},"component":"data2-core-types@ComponentParameter"},"sensitive":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"visibility":"private"},"component":"data2-core-types@ComponentParameter"}}}},"validation":{"required":{"component":"data2-core-primitives@Boolean","default":false},"integer":{"component":"data2-core-primitives@Boolean","default":false},"greaterThan":{"component":"data2-core-primitives@Number"},"lessThan":{"component":"data2-core-primitives@Number"},"oneOf":{"component":"data2-core-primitives@Number"}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"content"}}},"updatedAt":"2024-08-23T12:53:36.548Z"},{"_id":"60d11ef797fd5f38beb9bf76","component":"data2-core-types@Component","params":{"component":"Object","package":"data2-core-primitives","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"schema":{"component":"data2-core-types@Field","list":true},"list":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"visibility":"private"},"component":"data2-core-types@ComponentParameter"},"sensitive":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"visibility":"private"},"component":"data2-core-types@ComponentParameter"}}}},"validation":{},"visibility":"private"},"updatedAt":"2023-11-23T21:06:13.982Z"},{"_id":"67fd48946f69d741e3f3349b","component":"data2-core-types@Component","params":{"component":"ObjectId","package":"data2-core-primitives","parameters":{"component":"data2-core-types@FieldSet","params":{}},"visibility":"public"},"updatedAt":"2025-04-14T17:39:50.723Z","createdAt":"2025-04-14T17:39:50.723Z"},{"_id":"5f492a45a575399a45fc539c","component":"data2-core-types@Component","params":{"package":"data2-core-primitives","component":"Route","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"content":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@ArtboardReference"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":202}},"description":{"component":"data2-core-primitives@String","params":{"content":"This is what the router should display when the page is accessed."}}},"component":"data2-core-types@ComponentParameter"},"policies":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-auth@Policy"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":310}},"description":{"component":"data2-core-primitives@String","params":{"content":"Defines rules for allowing access to the route or not."}}},"component":"data2-core-types@ComponentParameter"},"path":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":201}},"description":{"component":"data2-core-primitives@String","params":{"content":"Path in which the \"content\" should be accessible.  It should start with a forward slash (/), and subdivisions should be done with forward slashes as well. You may receive parameters as part of the path by adding a colon (:) followed by the name of the parameter.\n\nExample: /path/subpath/:parameter"}}},"component":"data2-core-types@ComponentParameter"},"onEnter":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":301}},"description":{"component":"data2-core-primitives@String","params":{"content":"Action to be executed as soon as the user enters the route."}}},"component":"data2-core-types@ComponentParameter"},"onExit":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":302}},"description":{"component":"data2-core-primitives@String","params":{"content":"An action to be executed as soon as the user leaves the route."}}},"component":"data2-core-types@ComponentParameter"},"name":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":201}},"description":{"component":"data2-core-primitives@String","params":{"content":"Sets the name of the route, shown on the browser's tab."}}},"component":"data2-core-types@ComponentParameter"},"description":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":202}},"multiLine":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"description":{"component":"data2-core-primitives@String","params":{"content":"Describe the routes details or intent here. It should display on links' previews when shared."}}},"component":"data2-core-types@ComponentParameter"},"icon":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@FileComponentUrlReference"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":104}},"description":{"component":"data2-core-primitives@String","params":{"content":"Sets the icon that appears on the browser tab."}}},"component":"data2-core-types@ComponentParameter"},"image":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":104.1}},"description":{"component":"data2-core-primitives@String","params":{"content":"Set an image do be displayed on a link preview when shared."}}},"component":"data2-core-types@ComponentParameter"},"priority":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":201}},"description":{"component":"data2-core-primitives@String","params":{"content":"Signals the importance of this page to your whole website. This value has only affects your sitemap, thus has no effect the sitemap it is disabled by your Router's configuration."}}},"component":"data2-core-types@ComponentParameter"},"changefreq":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":201}},"oneOf":[{"params":{"content":"always"},"component":"data2-core-primitives@String"},{"params":{"content":"hourly"},"component":"data2-core-primitives@String"},{"params":{"content":"daily"},"component":"data2-core-primitives@String"},{"params":{"content":"weekly"},"component":"data2-core-primitives@String"},{"params":{"content":"monthly"},"component":"data2-core-primitives@String"},{"params":{"content":"anual"},"component":"data2-core-primitives@String"},{"params":{"content":"never"},"component":"data2-core-primitives@String"}],"description":{"component":"data2-core-primitives@String","params":{"content":"Indicates how often the current page is updated. This information is passed in the sitemap when available, and has no effect if the router's Sitemap is disabled."}}},"component":"data2-core-types@ComponentParameter"},"notAllowed":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@ArtboardReference"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":202.1}},"description":{"component":"data2-core-primitives@String","params":{"content":"Artboard to display when the route's content has been denied access due to a policy."}}},"component":"data2-core-types@ComponentParameter"},"serverSideRendering":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"category":"behaviour","visibility":"beta","description":{"component":"data2-core-primitives@String","params":{"content":"Enables or Disables Server-Side rendering for this route. Enabling may improve user experience on loading static content.\nIf your \"Content\" has user-specific data, or elements only shown to logged-in users, the server-rendered page will not show those items. After the page is properly loaded in the user's browser, it should display those elements normally."}}},"component":"data2-core-types@ComponentParameter"},"url":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":201}},"description":{"component":"data2-core-primitives@String","params":{"content":"Sets the og:url meta property of the route."}}},"component":"data2-core-types@ComponentParameter"},"headerTags":{"params":{"category":"behaviour","visibility":"public","description":{"component":"data2-core-primitives@String","params":{"content":"List of custom tags to be added to the header"}},"component":"data2-core-primitives@String","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}}}},"preview":{"params":{"portions":[{"component":"data2-core-primitives@String","params":{"content":"Route | "}},{"params":{"reference":"path"},"component":"data2-core-types@Reference"}]},"component":"data2-core-functions@StringConcat"}},"updatedAt":"2025-11-07T15:34:48.077Z"},{"_id":"5f52a278a575399a45d239b4","component":"data2-core-types@Component","params":{"product":"ui","package":"data2-core-primitives","component":"Router","icon":"sitemap","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"position":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Position"}},"simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":101}},"category":"appearance","visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"},"dimensions":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Dimensions"}},"simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":102}},"category":"appearance","definition":{"preventEvaluation":true,"component":"data2-core-types@Dimensions","params":{"width":300,"height":300}},"defaultValue":{"preventEvaluation":true,"params":{"width":300,"height":300},"component":"data2-core-types@Dimensions"},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"},"routes":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Route"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":205}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"description":{"component":"data2-core-primitives@String","params":{"content":"The router's page structure. Defines the routes and their respective content, as well as their rules."}}},"component":"data2-core-types@ComponentParameter"},"initialPath":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":201}},"category":"content","description":{"component":"data2-core-primitives@String","params":{"content":"Define the initial path to be rendered when the router initializes."}}},"component":"data2-core-types@ComponentParameter"},"login":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@ArtboardReference"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":202}},"description":{"component":"data2-core-primitives@String","params":{"content":"Artboard used for login in your application. Whenever a route with a declared policy with an Authentication Strategy gets accessed by a logged-out user, the login artboard will be rendered instead of the route's content."}}},"component":"data2-core-types@ComponentParameter"},"resetPassword":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@ArtboardReference"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":204}},"description":{"component":"data2-core-primitives@String","params":{"content":"Pick an Artboard to be used in a Password Reset flow."}}},"component":"data2-core-types@ComponentParameter"},"notFound":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@ArtboardReference"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":203}},"description":{"component":"data2-core-primitives@String","params":{"content":"The artboard to show when a route with no matching \"path\" is accessed."}}},"component":"data2-core-types@ComponentParameter"},"sitemap":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":210}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"description":{"component":"data2-core-primitives@String","params":{"content":"Enables the auto generation of a Sitemap, for bots and users to be able to explore your application without requiring to directly access every page."}}},"component":"data2-core-types@ComponentParameter"},"splash":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@ArtboardReference"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":210}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"title":{"component":"data2-core-primitives@String","params":{"content":"Splash"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Pick an Artboard to display while the main page content is still loading."}}},"component":"data2-core-types@ComponentParameter"},"notAllowed":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@ArtboardReference"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":203.1}},"description":{"component":"data2-core-primitives@String","params":{"content":"Shows another artboard when the access of a route gets denied by a policy. The \"Not Allowed\" option on the Route Itself takes precedence."}}},"component":"data2-core-types@ComponentParameter"},"onBeforeRouteEnter":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":301}},"description":{"component":"data2-core-primitives@String","params":{"content":"An action to be executed before every route enter, before executing each route's own \"onEnter\" action."}}},"component":"data2-core-types@ComponentParameter"},"onAfterRouteEnter":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":302}},"description":{"component":"data2-core-primitives@String","params":{"content":"An action to be executed after every route enter, after each route's own \"onEnter\" action."}}},"component":"data2-core-types@ComponentParameter"},"onBeforeRouteExit":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":303}},"description":{"component":"data2-core-primitives@String","params":{"content":"An action to be executed before every route exit, before executing each route's own \"onExit\" action."}}},"component":"data2-core-types@ComponentParameter"},"onAfterRouteExit":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"category":"behaviour","index":{"component":"data2-core-primitives@Number","params":{"content":304}},"description":{"component":"data2-core-primitives@String","params":{"content":"An action to be executed after every route exit, after each route's own \"onExit\" action."}}},"component":"data2-core-types@ComponentParameter"}}}},"interactions":{"component":"data2-core-types@FieldSet","params":{"fields":{"goBack":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Function"}},"definition":{"component":"data2-core-functions@Function","params":{"body":{"preventEvaluation":true,"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@This","params":{}},"prop":"history.goBack","args":[]}}}},"icon":{"component":"data2-core-primitives@String","params":{"content":"arrow-left"}},"visibility":"public"}},"goTo":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"definition":{"component":"data2-core-functions@Function","params":{"body":{"preventEvaluation":true,"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@This","params":{}},"prop":"history.push","args":[{"component":"data2-core-types@Reference","params":{"reference":"url"}},{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"preserveQuery"}}}}]}},"parameters":[{"component":"data2-core-primitives@String","params":{"content":"url"}},{"component":"data2-core-primitives@String","params":{"content":"preserveQuery"}}]},"break":true},"icon":{"component":"data2-core-primitives@String","params":{"content":"share"}},"visibility":"public","arguments":[{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Path to route"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Path to redirect user"}},"visibility":"public","required":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Preserve Query"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Preserve query string parameters  preserve query parameters on navigating."}},"visibility":"public","required":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}]}},"open":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Function"}},"definition":{"component":"data2-core-functions@Function","params":{"body":{"preventEvaluation":true,"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@This","params":{}},"prop":"history.push","args":[{"pathname":{"component":"data2-core-types@Reference","params":{"reference":"value"}}}]}},"parameters":["value"]}},"icon":{"component":"data2-core-primitives@String","params":{"content":"share"}},"visibility":"public","arguments":[{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Link to open"}},"description":{"component":"data2-core-primitives@String","params":{"content":""}},"visibility":"public","required":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Target"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Where to open the link"}},"visibility":"public","required":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"oneOf":[{"params":{"content":"_blank"},"component":"data2-core-primitives@String"},{"params":{"content":"_self"},"component":"data2-core-primitives@String"},{"params":{"content":"_parent"},"component":"data2-core-primitives@String"},{"params":{"content":"_top"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"}]}},"close":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Function"}},"definition":{"component":"data2-core-functions@Function","params":{"body":{"preventEvaluation":true,"component":"data2-core-types@Getter","params":{"module":{"params":{},"component":"data2-core-web@Window"},"prop":"close"}},"parameters":["value"]}},"icon":{"component":"data2-core-primitives@String","params":{"content":"times"}},"visibility":"public","arguments":[{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Link to open"}},"description":{"component":"data2-core-primitives@String","params":{"content":""}},"visibility":"public","required":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Target"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Where to open the link"}},"visibility":"public","required":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"oneOf":[{"params":{"content":"_blank"},"component":"data2-core-primitives@String"},{"params":{"content":"_self"},"component":"data2-core-primitives@String"},{"params":{"content":"_parent"},"component":"data2-core-primitives@String"},{"params":{"content":"_top"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"}],"description":{"component":"data2-core-primitives@String","params":{"content":"Closes a window that was opened via router.open."}}}}}}},"title":{"component":"data2-core-primitives@String","params":{"content":"Router"}}},"updatedAt":"2023-07-12T23:16:20.085Z"},{"_id":"5f48007aa575399a45c52847","component":"data2-core-types@Component","params":{"component":"String","package":"data2-core-primitives","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"content":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"visibility":"public","saveCompiled":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"list":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"visibility":"private"},"component":"data2-core-types@ComponentParameter"},"unique":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"visibility":"private"},"component":"data2-core-types@ComponentParameter"},"sensitive":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"visibility":"private"},"component":"data2-core-types@ComponentParameter"}}}},"validation":{"required":{"component":"data2-core-primitives@Boolean","default":false},"minLength":{"component":"data2-core-primitives@Number"},"maxLength":{"component":"data2-core-primitives@Number"},"oneOf":{"component":"data2-core-primitives@String"},"regex":{"component":"data2-core-primitives@Regex"}},"returnPrimitiveTypes":["data2-core-primitives@String"]},"updatedAt":"2025-08-12T14:53:44.996Z"},{"_id":"607f1ae2f1955d3129a43615","component":"data2-core-types@Component","params":{"component":"Undefined","package":"data2-core-primitives","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{}}}}},{"_id":"643ef5a87d0ae595853b9102","component":"data2-core-types@Component","params":{"package":"data2-core-registry","component":"DataSetAggregation","visibility":"private","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"expressions":{"component":"data2-core-types@ComponentParameter","params":{"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-registry@DataSetAggregationExpression"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"description":{"component":"data2-core-primitives@String","params":{"content":"Here you can define the operations to be executed on the grouped data, like counting records, taking an average of a field, and more."}}}},"filter":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}},"description":{"component":"data2-core-primitives@String","params":{"content":"Filter out some of the Records from the analysis."}}}},"group":{"component":"data2-core-types@ComponentParameter","params":{"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-registry@DataSetAggregationField"}},"index":{"component":"data2-core-primitives@Number","params":{"content":3}},"description":{"component":"data2-core-primitives@String","params":{"content":"Group DataSet records by a common value in their columns. If multiple columns are picked, only records with all the picked columns matching will be grouped."}}}},"sort":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"index":{"component":"data2-core-primitives@Number","params":{"content":4}},"description":{"component":"data2-core-primitives@String","params":{"content":"Change the data order from the Aggregation."}}}}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"Controls and settings for analyzing data on a DataSet."}}},"updatedAt":"2023-07-13T15:40:47.152Z"},{"_id":"644831fb4cbb9e44047b6b8d","component":"data2-core-types@Component","params":{"package":"data2-core-registry","component":"DataSetAggregationExpression","visibility":"private","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"operation":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"oneOf":[{"params":{"content":"count"},"component":"data2-core-primitives@String"},{"params":{"content":"sum"},"component":"data2-core-primitives@String"},{"params":{"content":"avg"},"component":"data2-core-primitives@String"},{"params":{"content":"max"},"component":"data2-core-primitives@String"},{"params":{"content":"min"},"component":"data2-core-primitives@String"}],"description":{"component":"data2-core-primitives@String","params":{"content":"The operation to be performed at the field."}}}},"field":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetColumnReference"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}},"description":{"component":"data2-core-primitives@String","params":{"content":"The field to apply the operation to"}}}},"as":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":3}},"description":{"component":"data2-core-primitives@String","params":{"content":"The name of the field after the applied operation."}}}}}}},"inlineParamsControl":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"description":{"component":"data2-core-primitives@String","params":{"content":"Apply an operation to a field in an Aggregation."}}},"updatedAt":"2023-07-13T15:51:36.541Z"},{"_id":"64483e7f4cbb9e44047c8810","component":"data2-core-types@Component","params":{"package":"data2-core-registry","component":"DataSetAggregationField","visibility":"private","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"field":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetColumnReference"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"description":{"component":"data2-core-primitives@String","params":{"content":"The column you want to group the items by."}}}},"as":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":3}},"description":{"component":"data2-core-primitives@String","params":{"content":"The name of the field after grouping."}}}},"dataTransformer":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":2}},"visibility":"public","oneOf":[{"params":{"content":"year"},"component":"data2-core-primitives@String"},{"params":{"content":"month"},"component":"data2-core-primitives@String"},{"params":{"content":"week"},"component":"data2-core-primitives@String"}],"description":{"component":"data2-core-primitives@String","params":{"content":"Apply a data transformation to the field before grouping them."}}}}}}},"inlineParamsControl":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"description":{"component":"data2-core-primitives@String","params":{"content":"Control for the grouping settings for an aggregation."}}},"updatedAt":"2023-07-13T15:48:23.688Z"},{"_id":"5f46b3f463c680de4fdce11d","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"ArtboardReference","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"reference":"String"}}}}},{"_id":"601ae9c9c2dd12f059304d55","component":"data2-core-types@Component","params":{"public":true,"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"color":{"component":"data2-core-types@ColorGradient"},"gradient":{"component":"data2-core-types@ColorGradient"},"image":{"component":"data2-core-types@FileComponentUrlReference"},"size":{"component":"data2-core-primitives@String","oneOf":["auto","contain","cover"]},"positionX":{"component":"data2-core-primitives@String","oneOf":["left","center","right"]},"positionY":{"component":"data2-core-primitives@String","oneOf":["top","center","bottom"]},"repeat":{"component":"data2-core-primitives@String","oneOf":["repeat","repeat-x","repeat-y","no-repeat","space","round"]},"attachment":{"component":"data2-core-primitives@String","oneOf":["scroll","fixed","local"]},"origin":{"component":"data2-core-primitives@String","oneOf":["border-box","padding-box","content-box"]},"clip":{"component":"data2-core-primitives@String","oneOf":["border-box","padding-box","content-box"]},"skipServerSideProcessing":{"component":"data2-core-primitives@Boolean"}}}},"component":"Background","package":"data2-core-types","visibility":"public"},"updatedAt":"2026-02-22T02:34:52.063Z"},{"_id":"619798538db3b3abde7c1719","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"BitmapFilter","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"type":{"component":"data2-core-primitives@String","oneOf":["sepia","grayscale","blur","contrast","brightness","invert","hue-rotate","saturate"],"content":"url"},"value":"Number","unit":{"component":"data2-core-primitives@String","oneOf":["px","deg","%"]}}}}},"updatedAt":"2026-04-08T14:59:58.679Z"},{"_id":"5f7289e2e2d6fd3e21f1a3ff","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"Border","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"color":{"component":"data2-core-types@Color"},"width":{"params":{"component":"data2-core-primitives@Object","parameters":{"top":{"params":{"component":"data2-core-primitives@Number"},"component":"data2-core-types@ComponentParameter"},"left":{"params":{"component":"data2-core-primitives@Number"},"component":"data2-core-types@ComponentParameter"},"right":{"params":{"component":"data2-core-primitives@Number"},"component":"data2-core-types@ComponentParameter"},"bottom":{"params":{"component":"data2-core-primitives@Number"},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@ComponentParameter"},"radius":{"leftTop":{"component":"data2-core-primitives@Number"},"rightTop":{"component":"data2-core-primitives@Number"},"leftBottom":{"component":"data2-core-primitives@Number"},"rightBottom":{"component":"data2-core-primitives@Number"}},"type":"Number"}}}},"updatedAt":"2026-05-22T15:03:06.293Z"},{"_id":"641080472ca92b0633f34e51","component":"data2-core-types@Component","params":{"component":"CalculateAiTokens","package":"data2-core-types","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"prompt":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"multiLine":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}}}},"title":"CalculateAiTokens"},"updatedAt":"2023-03-14T14:10:15.104Z","createdAt":"2023-03-14T14:10:15.104Z"},{"_id":"60de0e59da3861ca654d3ab5","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"Clone","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"module":{"component":"data2-core-types@InteractiveModuleReference"},"params":{"component":"data2-core-types@FieldSet"}}}}}},{"_id":"5e9b5444f137eaacb04b3a30","component":"data2-core-types@Component","params":{"public":true,"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"rgba":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"appearance"},"component":"data2-core-types@ComponentParameter"}}}},"component":"Color","package":"data2-core-types","visibility":"public"},"updatedAt":"2022-01-26T19:56:28.471Z"},{"_id":"60186499c2dd12f059e325e2","component":"data2-core-types@Component","params":{"public":true,"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"colors":{"component":"data2-core-types@ColorGradientStop","list":true},"type":{"component":"data2-core-primitives@String","oneOf":["linear","radial","repeating-linear","repeating-radial","conic"]},"angle":{"component":"data2-core-primitives@Number"}}}},"component":"ColorGradient","package":"data2-core-types","visibility":"public"}},{"_id":"60199aa2c2dd12f059004ef1","component":"data2-core-types@Component","params":{"public":true,"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"color":{"component":"data2-core-types@Color"},"offset":{"component":"data2-core-primitives@String"}}}},"component":"ColorGradientStop","package":"data2-core-types","visibility":"public"}},{"_id":"5ec1bc5144f1ebfde238a2e3","component":"data2-core-types@Component","params":{"component":"Component","package":"data2-core-types","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"component":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}},"visibility":{"component":"data2-core-primitives@String","params":{"content":"private"}},"saveCompiled":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"package":{"params":{"visibility":"private","component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"saveCompiled":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"icon":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":3}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"title":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}},"visibility":"public","saveCompiled":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"description":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Description"}},"index":{"component":"data2-core-primitives@Number","params":{"content":4}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"multiLine":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"preview":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@FileComponentUrlReference"}},"index":{"component":"data2-core-primitives@Number","params":{"content":""}},"visibility":"private"},"component":"data2-core-types@ComponentParameter"},"link":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":5}},"visibility":"private"},"component":"data2-core-types@ComponentParameter"},"extends":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":8}},"visibility":"private"},"component":"data2-core-types@ComponentParameter"},"parameters":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@FieldSet"}},"index":{"component":"data2-core-primitives@Number","params":{"content":9}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"interactions":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@FieldSet"}},"index":{"component":"data2-core-primitives@Number","params":{"content":10}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"returnPrimitiveTypes":{"params":{"oneOf":["data2-core-primitives@String","data2-core-primitives@Boolean","data2-core-primitives@Number","data2-core-primitives@Object","data2-core-primitives@Function","data2-core-primitives@Undefined","data2-core-primitives@Null","data2-core-primitives@Generic"],"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"visibility":"private"},"component":"data2-core-types@ComponentParameter"},"definition":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Definition"}},"index":{"component":"data2-core-primitives@Number","params":{"content":12}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"visibility":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Visibility"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Sets the visibility of the component."}},"visibility":"private","oneOf":[{"params":{"content":"public"},"component":"data2-core-primitives@String"},{"params":{"content":"private"},"component":"data2-core-primitives@String"},{"params":{"content":"deprecated"},"component":"data2-core-primitives@String"}],"index":{"component":"data2-core-primitives@Number","params":{"content":6}}}},"states":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@FieldSet"}},"index":{"component":"data2-core-primitives@Number","params":{"content":9.5}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"renderable":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"parameters":{"dimensions":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Dimensions"}},"simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":102}},"category":"appearance"},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@ComponentParameter"},"wrap":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":101}}},"component":"data2-core-types@ComponentParameter"},"hasReference":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"index":{"component":"data2-core-primitives@Number","params":{"content":8}},"visibility":"private"},"component":"data2-core-types@ComponentParameter"},"inlineParamsControl":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"index":{"component":"data2-core-primitives@Number","params":{"content":""}},"visibility":"beta"},"component":"data2-core-types@ComponentParameter"},"fieldValidation":{"component":"data2-core-types@ComponentParameter","params":{"visibility":"private","component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-functions@Function"}},"arguments":[{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":""}},"title":{"component":"data2-core-primitives@String","params":{"content":"currentValue"}}},"component":"data2-core-types@ComponentParameter"}]}},"componentOptions":{"params":{"component":"data2-core-primitives@Object","index":{"component":"data2-core-primitives@Number","params":{"content":20}},"visibility":"private"},"component":"data2-core-types@ComponentParameter"}}}},"componentOptions":{"contextPopulatedParams":{"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"p"}}],"body":{"params":{"fieldsList":{"params":{"mapper":{"params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"v"}},{"component":"data2-core-primitives@String","params":{"content":"k"}}],"body":{"key":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"k"}}}},"value":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"v.mock"}}}}}},"component":"data2-core-functions@Function","break":true},"array":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"p.executedInstanceParams.parameters"}}}}},"component":"data2-core-functions@ArrayMap"}},"component":"data2-core-types@FieldSet"}},"break":true}}},"updatedAt":"2026-05-22T15:04:19.587Z"},{"_id":"620e55a58271aa4129c61825","component":"data2-core-types@Component","params":{"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"component":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}}},"preventEvaluation":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"system":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}}},"_id":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}}},"reference":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}}},"displayName":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}}},"params":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}}}}}}},"component":"ComponentDefinition","package":"data2-core-types"},"updatedAt":"2022-07-25T19:27:00.107Z"},{"_id":"5edda6c6b9e0891ce913e885","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"ComponentInstanceReference","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"component":"String","reference":"String"}}}}},{"_id":"60e5eee4da3861ca650af718","component":"data2-core-types@Component","params":{"component":"ComponentParameter","package":"data2-core-types","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"component":{"params":{"component":{"params":{"content":"data2-core-primitives@String"},"component":"data2-core-primitives@String"},"index":{"component":"data2-core-primitives@Number","params":{"content":0}},"required":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"oneOf":{"params":{"mapper":{"params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"c"}}],"body":{"params":{"portions":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"c.params.package"}}}},{"component":"data2-core-primitives@String","params":{"content":"@"}},{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"c.params.component"}}}}]},"component":"data2-core-functions@StringConcat"}},"component":"data2-core-functions@Function","break":true},"array":{"params":{"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}},"module":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"ComponentsDataSet"}},"_layer":{"component":"data2-core-primitives@String","params":{"content":"HostApplicationLayer"}}},"component":"data2-core-types@ProcessReference"}},"component":"data2-core-types@Getter"}},"component":"data2-core-functions@ArrayMap","preventEvaluation":true},"saveCompiled":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"title":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"},"category":{"params":{"oneOf":["appearance","content","behaviour","other"],"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":6}}},"component":"data2-core-types@ComponentParameter"},"icon":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":3}}},"component":"data2-core-types@ComponentParameter"},"description":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":4}}},"component":"data2-core-types@ComponentParameter"},"preview":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@FileComponentUrlReference"}},"index":{"component":"data2-core-primitives@Number","params":{"content":5}}},"component":"data2-core-types@ComponentParameter"},"visibility":{"params":{"oneOf":[{"component":"data2-core-primitives@String","params":{"content":"deprecated"}},"private",{"component":"data2-core-primitives@String","params":{"content":"alpha"}},{"component":"data2-core-primitives@String","params":{"content":"beta"}},"public"],"index":{"component":"data2-core-primitives@Number","params":{"content":6}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}},"component":"data2-core-types@ComponentParameter"},"index":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"index":{"component":"data2-core-primitives@Number","params":{"content":7}}},"component":"data2-core-types@ComponentParameter"},"link":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":8}}},"component":"data2-core-types@ComponentParameter"},"strict":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"description":{"component":"data2-core-primitives@String","params":{"content":"If true, ƒ() suggestions will only suggest matching component types."}}},"component":"data2-core-types@ComponentParameter"},"list":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"description":{"component":"data2-core-primitives@String","params":{"content":"If true, the field is a list."}}},"component":"data2-core-types@ComponentParameter"},"multiLine":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"description":{"component":"data2-core-primitives@String","params":{"content":"If true, the field Control should be multiline."}}}},"simple":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"description":{"component":"data2-core-primitives@String","params":{"content":"If true, the CustomControl should be simple."}}},"component":"data2-core-types@ComponentParameter"},"saveCompiled":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Saves evaluated value instead of the complete definition."}},"visibility":"private"},"component":"data2-core-types@ComponentParameter"},"oneOf":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"autocomplete":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Definition"}}},"component":"data2-core-types@ComponentParameter"},"mock":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@FieldSet"}}},"component":"data2-core-types@ComponentParameter"},"definition":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Definition"}}},"component":"data2-core-types@ComponentParameter"},"defaultValue":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Definition"}}},"component":"data2-core-types@ComponentParameter"},"expectedPrimitiveTypes":{"params":{"oneOf":["data2-core-primitives@String","data2-core-primitives@Boolean","data2-core-primitives@Number","data2-core-primitives@Object","data2-core-primitives@Function","data2-core-primitives@Undefined","data2-core-primitives@Null"],"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"required":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"description":{"component":"data2-core-primitives@String","params":{"content":"If true, the field is required."}}}},"parameters":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}}}},"arguments":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@ComponentParameter"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}},"async":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"description":{"component":"data2-core-primitives@String","params":{"content":"If true, the Function is asynchronous."}}},"component":"data2-core-types@ComponentParameter"},"pure":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"description":{"component":"data2-core-primitives@String","params":{"content":"If true, the Function is pure."}}},"component":"data2-core-types@ComponentParameter"},"returnPrimitiveTypes":{"params":{"oneOf":["data2-core-primitives@String","data2-core-primitives@Boolean","data2-core-primitives@Number","data2-core-primitives@Object","data2-core-primitives@Function","data2-core-primitives@Undefined","data2-core-primitives@Null"],"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"fallbackValue":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Definition"}}},"component":"data2-core-types@ComponentParameter"},"dependsOn":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"shouldShow":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}}}},"flat":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"description":{"component":"data2-core-primitives@String","params":{"content":"If true, the Object should be displayed flattened in Inspector (avoid deep navigation)"}}},"component":"data2-core-types@ComponentParameter"},"fieldValidation":{"component":"data2-core-types@ComponentParameter","params":{"visibility":"private","component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-functions@Function"}},"arguments":[{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":""}},"title":{"component":"data2-core-primitives@String","params":{"content":"currentValue"}}},"component":"data2-core-types@ComponentParameter"}]}},"componentOptions":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object"}},"key":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":0.5}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"unversioned":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Used to show in the Builder inspector if a param isn't versioned, and changes are instantly applied."}},"title":{"component":"data2-core-primitives@String","params":{"content":"Unversioned"}},"key":{"component":"data2-core-primitives@String","params":{"content":"unversioned"}}},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2025-07-03T21:25:43.071Z"},{"_id":"5f95c724c8da12be8bbc9549","component":"data2-core-types@Component","params":{"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"state":{"component":"data2-core-primitives@String"},"artboard":{"component":"data2-core-types@ArtboardReference"}}}},"component":"ComponentState","package":"data2-core-types","preview":{"params":{"reference":"state"},"component":"data2-core-types@Reference"}},"updatedAt":"2022-10-24T19:43:14.227Z"},{"_id":"5f5b83eea575399a455f3939","component":"data2-core-types@Component","params":{"public":false,"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"reference":{"component":"String"}}}},"component":"CustomFontFace","package":"data2-core-types","visibility":"deprecated"},"updatedAt":"2022-03-22T14:29:30.508Z"},{"_id":"5f6393aba575399a45a6b16a","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"DataColor","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"value":{"component":"data2-core-primitives@String"},"color":{"component":"data2-core-types@Color"},"field":{"component":"data2-core-types@FieldReference"}}}}}},{"_id":"5ee2bc53d68ce41360d88f70","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"DataLinkGetter","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"dataset":{"component":"data2-core-types@DataSetReference"},"field":{"component":"data2-core-types@DataSetColumnReference"},"record":{"component":"data2-core-types@Reference"}}}}}},{"_id":"5ee2bc3cd68ce41360d88c5a","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"DataLinkSetter","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"dataset":{"component":"data2-core-types@DataSetReference"},"field":{"component":"data2-core-types@DataSetColumnReference"},"record":{"component":"data2-core-types@Reference"},"onChange":{"component":"data2-core-types@Interaction"},"value":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2024-12-02T17:39:57.782Z"},{"_id":"5ec592e6993f46254ea5282b","component":"data2-core-types@Component","params":{"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"column":"String"}}},"component":"DataSetColumnReference","package":"data2-core-types"}},{"_id":"5ea05435e6bac0d98ad3a651","component":"data2-core-types@DataSetReference","params":{"package":"data2-core-types","component":"DataSetExtend","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"dataset":{"component":"data2-core-types@DataSetReference"},"localField":{"component":"data2-core-types@DataSetColumnReference"},"extendField":{"component":"data2-core-types@DataSetExtendColumnReference","dependsOn":["localField","dataset"]}}}}}},{"_id":"5f492cc7a575399a45fccdc4","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"DataSetJoin","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"reference":"String","dataset":"data2-core-types@DataSetReference","localField":"data2-core-types@DataSetColumnReference","joinField":"String"}}}}},{"_id":"5ea0536be6bac0d98ad3808c","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"DataSetMaster","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"dataset":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetReference"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"description":{"component":"data2-core-primitives@String","params":{"content":"The Master DataSet. The cursor of the Master will control the filter of this DataSet."}}},"component":"data2-core-types@ComponentParameter"},"localField":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetColumnReference"}},"index":{"component":"data2-core-primitives@Number","params":{"content":3}},"controlSettings":{"datasetOrigin":{"component":"data2-core-primitives@String","params":{"content":"self"}},"showFilters":{"params":{"content":false},"component":"data2-core-primitives@Boolean"},"dataSet":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"self"}}}}},"expectedPrimitiveTypes":[],"description":{"component":"data2-core-primitives@String","params":{"content":"The field of this DataSet that should match the data of the Master DataSet Field."}}},"component":"data2-core-types@ComponentParameter"},"masterField":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetColumnReference"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}},"controlSettings":{"showFilters":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"datasetOrigin":{"component":"data2-core-primitives@String","params":{"content":"dataset"}},"dataSet":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"dataSet"}}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"The Master DataSet field that should be used to match with the \"local field\"."}},"dependsOn":[{"component":"data2-core-primitives@String","params":{"content":"dataset"}}],"shouldShow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"defaultEmptyId":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":4}},"expectedPrimitiveTypes":[],"title":{"component":"data2-core-primitives@String","params":{"content":"Default Empty Id"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Id that is sent when the master dataset has no current."}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2023-08-16T22:16:11.612Z"},{"_id":"5ec59355993f46254ea5282c","component":"data2-core-types@Component","params":{"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"column":"String"}}},"component":"DataSetMasterColumnReference","package":"data2-core-types"}},{"_id":"5ec30ac844f1ebfde26332ab","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"DataSetReference","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"reference":"String"}}}}},{"_id":"5f72aed7e2d6fd3e21f86726","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"DataSetSelectSettings","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"column":"String","value":"String"}}}}},{"_id":"61b8ae6142211e3ce8ac1cf6","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"DataSourceReference","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"reference":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"oneOf":{"preventEvaluation":true,"params":{"array":{"params":{"prop":"getQuickFilteredRecords","module":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"DataComponentInstancesDataSet"}},"_layer":{"component":"data2-core-primitives@String","params":{"content":"HostApplicationLayer"}}},"component":"data2-core-types@ProcessReference"},"args":[{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core@Data2TableDataSource"}}}]},"component":"data2-core-types@Getter"},"mapper":{"params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"item"}}],"body":{"preventEvaluation":true,"params":{"sources":[{"component":"data2-core-types@FieldSet","params":{"fields":{"label":{"params":{"components":[{"params":{"reference":"item.displayName"},"component":"data2-core-types@Reference"},{"params":{"reference":"item.reference"},"component":"data2-core-types@Reference"}]},"component":"data2-core-logical-operators@Or"},"value":{"params":{"reference":"item.reference"},"component":"data2-core-types@Reference"}}}}]},"component":"data2-core-functions@ObjectAssign"}},"component":"data2-core-functions@Function"}},"component":"data2-core-functions@ArrayMap"}}}}}},"updatedAt":"2021-12-14T21:39:14.260Z"},{"_id":"5ed64d9dd68ce413600996c9","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"Dimensions","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"width":{"params":{"component":"data2-core-primitives@Number","saveCompiled":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"height":{"params":{"component":"data2-core-primitives@Number","saveCompiled":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"exactHeight":{"params":{"component":"data2-core-primitives@Number","saveCompiled":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"visibility":"private"},"component":"data2-core-types@ComponentParameter"},"exactWidth":{"params":{"component":"data2-core-primitives@Number","saveCompiled":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"visibility":"private"},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2025-03-07T19:27:31.829Z"},{"_id":"61a7e9b28db3b3abde26febc","component":"data2-core-types@Component","params":{"public":true,"parameters":{},"component":"EnvironmentReference","package":"data2-core-types","visibility":"public"}},{"_id":"645e8d505bbbecaee6a9c12d","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"Error","visibility":"public","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"message":{"component":"data2-core-types@ComponentParameter","params":{"index":{"component":"data2-core-primitives@Number","params":{"content":0}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}}},"code":{"component":"data2-core-types@ComponentParameter","params":{"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"component":"data2-core-primitives@Number"}},"data":{"component":"data2-core-types@ComponentParameter","params":{"index":{"component":"data2-core-primitives@Number","params":{"content":2}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}}}}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"A Data² Error. Can be used in a Series to stop executing the next steps of it."}}},"updatedAt":"2023-09-14T13:45:22.876Z"},{"_id":"5ff498c94369e2af95ba6f7d","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"ExternalDataSetReference","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"externalSystem":{"component":"data2-core-types@ExternalSystemServiceReference"},"reference":{"component":"data2-core-primitives@String"}}}}}},{"_id":"5ff495d34369e2af95ba4273","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"ExternalSystemService","icon":"exchange","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"system":{"params":{"component":"data2-core-primitives@String","saveCompiled":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"version":{"params":{"component":"data2-core-primitives@String","saveCompiled":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2024-02-23T17:10:10.273Z"},{"_id":"5ff498764369e2af95ba68c6","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"ExternalSystemServiceReference","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"reference":"String"}}}}},{"_id":"5f51b32ca575399a459efcd1","component":"data2-core-types@Component","params":{"component":"Field","package":"data2-core-types","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"key":"data2-core-primitives@String","title":"data2-core-primitives@String","component":{"component":"data2-core-primitives@String","oneOf":["data2-core-primitives@String","data2-core-primitives@Boolean"]},"customValidations":{"params":{"visibility":"private"},"component":"data2-core-types@ComponentParameter"},"customListValidations":{"params":{"visibility":"private"},"component":"data2-core-types@ComponentParameter"},"transform":{"params":{"visibility":"private"},"component":"data2-core-types@ComponentParameter"}}}},"description":{"component":"data2-core-primitives@String","params":{"content":"Define the name, the type and the rules for each field."}},"preview":{"params":{"portions":[{"component":"data2-core-primitives@String","params":{"content":"Field | "}},{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"key"}}}}]},"component":"data2-core-functions@StringConcat"}},"updatedAt":"2026-05-08T00:45:06.911Z"},{"_id":"5f6418cea575399a45c1366c","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"FieldReference","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"key":{"component":"data2-core-primitives@String"}}}}}},{"_id":"5ec1c29a44f1ebfde2397325","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"FieldSet","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"fields":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}}},"component":"data2-core-types@ComponentParameter"},"fieldsList":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"params":{"fields":{"key":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}},"component":"data2-core-types@ComponentParameter"},"value":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@FieldSet"},"visibility":"public","description":{"component":"data2-core-primitives@String","params":{"content":"Define separately every key and its value. This allows for dynamic keyed objects. If a key conflicts with a key defined in the \"fieldSet\" prop, this one will override it."}}},"component":"data2-core-types@ComponentParameter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"fields"}}},"updatedAt":"2023-12-19T12:20:44.793Z"},{"_id":"5fca5a9222b5215848683e2b","component":"data2-core-types@Component","params":{"component":"File","package":"data2-core-types","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"list":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"visibility":"private"},"component":"data2-core-types@ComponentParameter"},"folder":{"component":"data2-core-types@FileComponentReference"},"folderName":{"component":"data2-core-types@FieldReference"},"fileName":{"component":"data2-core-types@FieldReference"},"sensitive":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"visibility":"private"},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2023-11-23T21:08:08.201Z"},{"_id":"5f3e0e74ce656fcadc211511","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"FileComponentReference","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"reference":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}},"component":"data2-core-types@ComponentParameter"},"preventEvaluation":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"defaultValue":{"params":{},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2023-02-27T22:37:10.168Z"},{"_id":"5f58fc8da575399a45f59c2b","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"FileComponentUrlReference","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"reference":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Reference"}},"description":{"component":"data2-core-primitives@String","params":{"content":"File component instance reference."}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}}}},"extension":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Extension"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Requests the file with an extension. If an image, tries to covert it to the requested extension."}},"index":{"component":"data2-core-primitives@Number","params":{"content":14}}}}}}}},"updatedAt":"2022-03-18T19:26:54.302Z"},{"_id":"600af5265c0bce53ad8d501d","component":"data2-core-types@Component","params":{"public":true,"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"backgrounds":{"component":"data2-core-types@Background","list":true}}}},"component":"Fill","package":"data2-core-types","visibility":"public"}},{"_id":"60548592c2dd12f059ca8823","component":"data2-core-types@Component","params":{"package":"data2-core-types","public":true,"component":"FontAwesomeIcon","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"icon":{"component":"data2-core-primitives@String"}}}},"visibility":"private"},"updatedAt":"2023-04-15T00:28:49.126Z"},{"_id":"5f737ab9e2d6fd3e211b1fd1","component":"data2-core-types@Component","params":{"component":"Formula","package":"data2-core-types","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"formula":{"component":"data2-core-primitives@String"},"dataset":{"component":"data2-core-types@DataSetReference"},"variables":{"component":"data2-core-types@FieldSet"}}}},"validation":{"required":{"component":"data2-core-primitives@Boolean","default":false}}}},{"_id":"5f3e0dbace656fcadc20f2a4","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"Getter","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"module":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@InteractiveModuleReference"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"},"prop":{"params":{"autocomplete":{"preventEvaluation":true,"component":"data2-core-types@FieldSet","params":{"fields":{"module":{"component":"data2-core-types@Reference","params":{"reference":"module"}}}}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}},"dependsOn":[{"component":"data2-core-primitives@String","params":{"content":"module"}}],"parameters":{},"alternativeParameterDefaultType":[{"parameter":{"component":"data2-core-primitives@String","params":{"content":"module"}},"value":{"params":{"reference":"__UIState"},"component":"data2-core-types@InteractiveModuleReference"},"type":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-user-interface@StateProp"}}},"component":"data2-core-types@ComponentParameter"}}],"shouldShow":{"component":"data2-core-primitives@Boolean","params":{"content":true},"preventEvaluation":true}},"component":"data2-core-types@ComponentParameter"},"args":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":3}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"dependsOn":[{"component":"data2-core-primitives@String","params":{"content":"module"}}]},"component":"data2-core-types@ComponentParameter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"module"}},"preview":{"params":{"portions":[{"component":"data2-core-primitives@String","params":{"content":"Getter | "}},{"params":{"compare":[{"component":"data2-core-types@Getter","params":{"module":{"params":{"pattern":{"component":"data2-core-types@Regex","params":{"pattern":"^data\\.states"}},"text":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"prop"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-functions@Match"},"prop":{"component":"data2-core-primitives@String","params":{"content":"0"}}}}],"else":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"prop"}}}},"then":{"params":{"content":"UIState"},"component":"data2-core-primitives@String"}},"component":"data2-core-flow@If"}]},"component":"data2-core-functions@StringConcat"}},"updatedAt":"2026-07-16T15:17:34.946Z"},{"_id":"6a0db775f792f1759f8fa223","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"GlobalLight","icon":"lightbulb","title":{"component":"data2-core-primitives@String","params":{"content":"Global Light"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Directional light source defined at the Artboard. Blocks opt-in via LightInteraction to cast shadows or catch the light."}},"visibility":"private","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"x":{"component":"data2-core-primitives@Number"},"y":{"component":"data2-core-primitives@Number"},"z":{"component":"data2-core-primitives@Number"},"intensity":{"component":"data2-core-primitives@Number"},"color":{"component":"data2-core-primitives@String"},"fixed":{"component":"data2-core-primitives@Boolean"},"enabled":{"component":"data2-core-primitives@Boolean"}}}}},"updatedAt":"2026-05-20T13:30:29.363Z","createdAt":"2026-05-20T13:30:29.363Z"},{"_id":"6a0db75c6e98ef6f7d27e60f","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"GlobalLight","icon":"lightbulb","title":{"component":"data2-core-primitives@String","params":{"content":"Global Light"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Directional light source defined at the Artboard. Blocks opt-in via LightInteraction to cast shadows or catch the light."}},"visibility":"private","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"x":{"component":"data2-core-primitives@Number"},"y":{"component":"data2-core-primitives@Number"},"z":{"component":"data2-core-primitives@Number"},"intensity":{"component":"data2-core-primitives@Number"},"color":{"component":"data2-core-primitives@String"},"fixed":{"component":"data2-core-primitives@Boolean"},"enabled":{"component":"data2-core-primitives@Boolean"}}}}},"updatedAt":"2026-05-20T13:30:04.142Z","createdAt":"2026-05-20T13:30:04.142Z"},{"_id":"6a0dbfa4eb9b489e4a79aefc","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"GlobalLights","icon":"lightbulb","title":{"component":"data2-core-primitives@String","params":{"content":"Global Lights"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Wrapper holding the array of GlobalLight sources for an Artboard. Keeps all lights in a single Type so the inspector can render them on a shared 2D pad."}},"visibility":"private","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"lights":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@GlobalLight"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"visibility":"private"}}}}}},"updatedAt":"2026-05-20T14:05:24.297Z","createdAt":"2026-05-20T14:05:24.297Z"},{"_id":"604bc223c2dd12f05958ccd1","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"HostComponentReference","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"dummy":{"component":"data2-core-primitives@String"}}}}}},{"_id":"6418ba7212979394b3036038","component":"data2-core-types@Component","params":{"component":"IdentityProviderReference","package":"data2-core-types","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"reference":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}}}}}},"title":"IdentityProviderReference","visibility":"public"},"updatedAt":"2023-03-28T17:25:36.761Z","createdAt":"2023-03-20T19:56:34.802Z"},{"_id":"646d2729903d327946c95fec","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"InstanceReference","visibility":"private","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"mode":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"visibility":"private","index":{"component":"data2-core-primitives@Number","params":{"content":3}}},"component":"data2-core-types@ComponentParameter"},"reference":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}}},"component":"data2-core-types@ComponentParameter"},"component":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2023-05-23T21:03:36.804Z"},{"_id":"5e9f5ff0e6bac0d98aa63597","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"Interaction","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"module":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@InteractiveModuleReference"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"},"prop":{"params":{"autocomplete":{"module":{"component":"data2-core-types@Reference","params":{"reference":"module"}}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}}},"component":"data2-core-types@ComponentParameter"},"args":{"params":{"index":{"component":"data2-core-primitives@Number","params":{"content":3}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Inferred"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"componentOptions":{"inferredComponent":{"params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"params"}}],"body":{"component":"data2-core-types@Getter","params":{"args":[{"component":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"params.executedInstanceParams.module.componentDefinition.component"}}}},"subSchemaPath":{"params":{"portions":[{"component":"data2-core-primitives@String","params":{"content":"interactions."}},{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"params.executedInstanceParams.prop"}}}},{"component":"data2-core-primitives@String","params":{"content":".arguments."}},{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"params.innerSubSchemaPath"}}}}]},"component":"data2-core-functions@StringConcat"},"executedInstanceParams":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"params.executedInstanceParams.module.componentDefinition.params"}}}},"instanceReference":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"params.executedInstanceParams.module.componentDefinition.reference"}}}},"rootExecutedInstanceParams":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"params.rootExecutedInstanceParams"}}}}}],"prop":{"component":"data2-core-primitives@String","params":{"content":"inferComponentType"}},"module":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"InspectorController"}},"_layer":{"component":"data2-core-primitives@String","params":{"content":"UserInterfaceLayer"}}},"component":"data2-core-types@ProcessReference"}}}},"component":"data2-core-functions@Function","break":true}}},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2026-03-17T04:46:27.950Z"},{"_id":"5f729fa7e2d6fd3e21f599fb","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"InteractiveModuleReference","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"reference":"String"}}}}},{"_id":"6a0db7a7369c6dd49125c1e9","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"LightInteraction","icon":"flashlight-line","title":{"component":"data2-core-primitives@String","params":{"content":"Light Interaction"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Per-Block opt-in for the Artboard's global lights. Controls cast-shadow (outer) and catch-light (inner highlight)."}},"visibility":"private","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"castShadow":{"component":"data2-core-primitives@Boolean"},"catchLight":{"component":"data2-core-primitives@Boolean"},"reflectance":{"component":"data2-core-primitives@Number"},"shadowStrength":{"component":"data2-core-primitives@Number"}}}}},"updatedAt":"2026-05-20T13:31:19.603Z","createdAt":"2026-05-20T13:31:19.603Z"},{"_id":"5f612d81a575399a4542af4b","component":"data2-core-types@Component","params":{"component":"Lookup","package":"data2-core-types","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"table":{"component":"data2-core-primitives@String","oneOf":{"preventEvaluation":true,"params":{"array":{"params":{"prop":"getQuickFilteredRecords","module":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"DataComponentInstancesDataSet"}},"_layer":{"component":"data2-core-primitives@String","params":{"content":"HostApplicationLayer"}}},"component":"data2-core-types@ProcessReference"},"args":[{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core@Data2TableDataSource"}}}]},"component":"data2-core-types@Getter"},"mapper":{"params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"item"}}],"body":{"preventEvaluation":true,"params":{"sources":[{"component":"data2-core-types@FieldSet","params":{"fields":{"label":{"params":{"components":[{"params":{"reference":"item.displayName"},"component":"data2-core-types@Reference"},{"params":{"reference":"item.reference"},"component":"data2-core-types@Reference"}]},"component":"data2-core-logical-operators@Or"},"value":{"params":{"reference":"item.reference"},"component":"data2-core-types@Reference"}}}}]},"component":"data2-core-functions@ObjectAssign"}},"component":"data2-core-functions@Function"}},"component":"data2-core-functions@ArrayMap"}},"list":{"component":"data2-core-primitives@Boolean"},"unique":{"component":"data2-core-primitives@Boolean"},"patchable":{"component":"data2-core-primitives@Boolean"},"externalKey":{"component":"data2-core-primitives@String","default":"_id"},"populateDepth":{"component":"data2-core-primitives@Number"}}}},"validation":{"required":{"component":"data2-core-primitives@Boolean","default":false}}}},{"_id":"61e187a46947419456154104","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"MailMessageParameters","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"artboard":{"component":"data2-core-types@ArtboardReference"},"subject":{"component":"data2-core-primitives@String"},"type":{"component":"data2-core-primitives@String"},"to":{"component":"data2-core-primitives@String","list":true},"data":{"component":"data2-core-primitives@Object"}}}}}},{"_id":"61f53e1c6947419456151f9f","component":"data2-core-types@Component","params":{"public":true,"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"value":{"component":"data2-core-primitives@Number"}}}},"component":"Opacity","package":"data2-core-types","visibility":"public"}},{"_id":"5f6b4ed5a575399a451d4189","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"Package","visibility":"private","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"mode":{"component":"data2-core-primitives@String","oneOf":["dark","light"]}}}}}},{"_id":"601be018c2dd12f05956a70f","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"PackageGetter","visibility":"private","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"field":{"component":"data2-core-primitives@String"},"packageReference":{"component":"data2-core-primitives@String"}}}}}},{"_id":"606e1425d7ec64d5fcf2c954","component":"data2-core-types@Component","params":{"component":"Password","package":"data2-core-types","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"unique":{"component":"data2-core-primitives@Boolean"}}}},"validation":{"required":{"component":"data2-core-primitives@Boolean","default":false}}}},{"_id":"628d44c6a847c1744e3dfcbf","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"PaymentProviderReference","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"reference":"String"}}}}},{"_id":"5ed03a8fd68ce413605ac619","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"Position","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"x":{"params":{"component":"data2-core-primitives@Number","saveCompiled":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"y":{"params":{"component":"data2-core-primitives@Number","saveCompiled":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"left":"Boolean","top":"Boolean","right":"Boolean","bottom":"Boolean","growH":"Boolean","growV":"Boolean","freeTransform":"Boolean","fixed":"Boolean","exactX":{"params":{"component":"data2-core-primitives@Number","saveCompiled":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"visibility":"private"},"component":"data2-core-types@ComponentParameter"},"exactY":{"params":{"component":"data2-core-primitives@Number","saveCompiled":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"visibility":"private"},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2023-10-26T19:42:58.193Z"},{"_id":"614dc0e133fad3ebeb88c21b","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"PrevValueSetter","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"module":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@InteractiveModuleReference"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"},"prop":{"params":{"autocomplete":{"module":{"component":"data2-core-types@Reference","params":{"reference":"module"}}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}}},"component":"data2-core-types@ComponentParameter"}}}}}},{"_id":"649b5381c91d9255f46789bf","component":"data2-core-types@Component","params":{"component":"PrimitiveParameter","package":"data2-core-types","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"component":{"params":{"component":{"params":{"content":"data2-core-primitives@String"},"component":"data2-core-primitives@String"},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"required":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"oneOf":[{"params":{"content":"data2-core-primitives@String"},"component":"data2-core-primitives@String"},{"params":{"content":"data2-core-primitives@Boolean"},"component":"data2-core-primitives@String"},{"params":{"content":"data2-core-primitives@Number"},"component":"data2-core-primitives@String"}],"saveCompiled":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"oneOf":{"params":{"component":"data2-core-primitives@Inferred","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}},"dependsOn":[{"component":"data2-core-primitives@String","params":{"content":"component"}}],"shouldShow":{"params":{"subject":[{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}}],"pattern":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"component"}}}}},"component":"data2-core-functions@Includes"},"componentOptions":{"inferredComponent":{"params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"p"}}],"body":{"params":{"then":{"params":{"component":"data2-core-primitives@Number","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}},"dependsOn":[{"component":"data2-core-primitives@String","params":{"content":"component"}}],"shouldShow":{"params":{"subject":[{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}}],"pattern":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"component"}}}}},"component":"data2-core-functions@Includes"}},"component":"data2-core-types@ComponentParameter"},"else":{"params":{"component":"data2-core-primitives@String","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}},"dependsOn":[{"component":"data2-core-primitives@String","params":{"content":"component"}}],"shouldShow":{"params":{"subject":[{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}}],"pattern":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"component"}}}}},"component":"data2-core-functions@Includes"}},"component":"data2-core-types@ComponentParameter"},"compare":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"p.executedInstanceParams.component"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}}},"component":"data2-core-comparison-operators@Equal"}]},"component":"data2-core-flow@If"}},"component":"data2-core-functions@Function","break":true}}},"component":"data2-core-types@ComponentParameter"},"key":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"list":{"params":{"component":"data2-core-primitives@Boolean","index":{"component":"data2-core-primitives@Number","params":{"content":3}}},"component":"data2-core-types@ComponentParameter"},"mock":{"params":{"component":"data2-core-primitives@Inferred","index":{"component":"data2-core-primitives@Number","params":{"content":4}},"dependsOn":[{"component":"data2-core-primitives@String","params":{"content":"component"}}],"shouldShow":{"params":{"content":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"component"}}}}},"component":"data2-core-primitives@Boolean","break":true},"componentOptions":{"inferredComponent":{"params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"p"}}],"body":{"params":{"component":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"p.executedInstanceParams.component"}}}},"list":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"p.executedInstanceParams.list"}}}},"shouldShow":{"params":{"content":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"component"}}}}},"component":"data2-core-primitives@Boolean","break":true},"dependsOn":[{"component":"data2-core-primitives@String","params":{"content":"component"}}]},"component":"data2-core-types@ComponentParameter"}},"component":"data2-core-functions@Function","break":true}}},"component":"data2-core-types@ComponentParameter"}}}},"inlineParamsControl":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"visibility":"public"},"updatedAt":"2023-11-10T16:52:01.914Z"},{"_id":"5f6d01a1a575399a4576854b","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"ProcessGetter","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"reference":{"component":"data2-core-primitives@String"},"field":{"component":"data2-core-primitives@String"}}}}}},{"_id":"5f931b7bc8da12be8b31d2a1","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"ProcessReference","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"reference":"String"}}}}},{"_id":"5ec336b544f1ebfde26991d1","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"Reference","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"reference":{"params":{"component":"data2-core-primitives@String","autocomplete":{"context":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}}},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"public","preview":{"params":{"portions":[{"component":"data2-core-primitives@String","params":{"content":"Reference | "}},{"params":{"components":[{"params":{"reference":"reference"},"component":"data2-core-types@Reference"},{"component":"data2-core-primitives@String","params":{"content":""}}]},"component":"data2-core-logical-operators@Or"}]},"component":"data2-core-functions@StringConcat"},"wrap":{"component":"data2-core-primitives@String","params":{"content":"reference"}}},"updatedAt":"2025-07-17T17:53:33.652Z"},{"_id":"61ddf7ae6947419456b23d29","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"Regex","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"pattern":{"component":"data2-core-primitives@String"},"flags":{"component":"data2-core-primitives@String"}}}}}},{"_id":"643612c3ac93122e727ec45b","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"RemixIcon","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"icon":{"component":"data2-core-primitives@String"}}}},"visibility":"deprecated"},"updatedAt":"2023-04-15T01:01:15.470Z","createdAt":"2023-04-12T02:08:21.900Z"},{"_id":"6079a761d7ec64d5fce3b4f3","component":"data2-core-types@Component","params":{"package":"data2-core-types","public":true,"component":"RepeaterReference","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"reference":{"params":{"component":"data2-core-primitives@String","oneOf":{"component":"data2-core-functions@ArrayMap","params":{"array":{"component":"data2-core-types@Reference","params":{"reference":"__D2_REPEATERS"}},"mapper":"reference"}}},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"public"}},{"_id":"5f46b40d63c680de4fdce538","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"ResponsiveArtboards","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"mobile":{"component":"data2-core-types@ArtboardReference"},"tablet":{"component":"data2-core-types@ArtboardReference"}}}}}},{"_id":"5f56fb31a575399a459f8e99","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"RouterReference","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"reference":{"component":"data2-core-primitives@String"}}}}}},{"_id":"69fa7f4e995fe360575ea473","component":"data2-core-types@Component","params":{"component":"Schema","package":"data2-core-types","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"fields":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Field"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"description":{"component":"data2-core-primitives@String","params":{"content":"Fields of the Schema"}}},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"private","interactions":{"params":{"fields":{"validate":{"params":{"component":"data2-core-functions@Function","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"input"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Record to validate"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"options"}},"flat":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"parameters":{"mode":{"params":{"component":"data2-core-primitives@String","oneOf":[{"component":"data2-core-primitives@String","params":{"content":"strict"}},{"component":"data2-core-primitives@String","params":{"content":"strip"}},{"component":"data2-core-primitives@String","params":{"content":"coerce"}},{"component":"data2-core-primitives@String","params":{"content":"partial"}},{"component":"data2-core-primitives@String","params":{"content":"passtrough"}}],"index":{"component":"data2-core-primitives@Number","params":{"content":0}},"icon":{"params":{"iconSet":"remix","icon":"ri-focus-mode"},"component":"data2-core-web@Icon"},"defaultValue":{"params":{"content":"strip"},"component":"data2-core-primitives@String"}},"component":"data2-core-types@ComponentParameter"},"extras":{"params":{"component":"data2-core-primitives@String","oneOf":[{"component":"data2-core-primitives@String","params":{"content":"strict"}},{"component":"data2-core-primitives@String","params":{"content":"strip"}},{"component":"data2-core-primitives@String","params":{"content":"passtrough"}}],"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"icon":{"params":{"iconSet":"remix","icon":"ri-focus-mode"},"component":"data2-core-web@Icon"},"defaultValue":{"params":{"content":"strip"},"component":"data2-core-primitives@String"}},"component":"data2-core-types@ComponentParameter"},"required":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":2}},"defaultValue":{"params":{"content":"all"},"component":"data2-core-primitives@String"},"oneOf":[{"component":"data2-core-primitives@String","params":{"content":"all"}},{"component":"data2-core-primitives@String","params":{"content":"partial"}}]},"component":"data2-core-types@ComponentParameter"},"coerce":{"params":{"component":"data2-core-primitives@Boolean","index":{"component":"data2-core-primitives@Number","params":{"content":0}},"icon":{"params":{"iconSet":"remix","icon":"ri-focus-mode"},"component":"data2-core-web@Icon"},"defaultValue":{"params":{},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-types@ComponentParameter"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Mode preset + flag overrides"}}}}],"title":{"component":"data2-core-primitives@String","params":{"content":"Validate"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Validate input against the schema. Returns { valid, errors[], data } — never throws."}},"icon":{"params":{"iconSet":"remix","icon":"ri-shield-check-line"},"component":"data2-core-web@Icon"}},"component":"data2-core-types@ComponentParameter"},"parse":{"params":{"component":"data2-core-functions@Function","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"input"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Record to validate"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"options"}},"flat":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"parameters":{"mode":{"params":{"component":"data2-core-primitives@String","oneOf":[{"component":"data2-core-primitives@String","params":{"content":"strict"}},{"component":"data2-core-primitives@String","params":{"content":"strip"}},{"component":"data2-core-primitives@String","params":{"content":"coerce"}},{"component":"data2-core-primitives@String","params":{"content":"partial"}},{"component":"data2-core-primitives@String","params":{"content":"passtrough"}}],"index":{"component":"data2-core-primitives@Number","params":{"content":0}},"icon":{"params":{"iconSet":"remix","icon":"ri-focus-mode"},"component":"data2-core-web@Icon"},"defaultValue":{"params":{"content":"strip"},"component":"data2-core-primitives@String"}},"component":"data2-core-types@ComponentParameter"},"extras":{"params":{"component":"data2-core-primitives@String","oneOf":[{"component":"data2-core-primitives@String","params":{"content":"strict"}},{"component":"data2-core-primitives@String","params":{"content":"strip"}},{"component":"data2-core-primitives@String","params":{"content":"passtrough"}}],"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"icon":{"params":{"iconSet":"remix","icon":"ri-focus-mode"},"component":"data2-core-web@Icon"},"defaultValue":{"params":{"content":"strip"},"component":"data2-core-primitives@String"}},"component":"data2-core-types@ComponentParameter"},"required":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":2}},"defaultValue":{"params":{"content":"all"},"component":"data2-core-primitives@String"},"oneOf":[{"component":"data2-core-primitives@String","params":{"content":"all"}},{"component":"data2-core-primitives@String","params":{"content":"partial"}}]},"component":"data2-core-types@ComponentParameter"},"coerce":{"params":{"component":"data2-core-primitives@Boolean","index":{"component":"data2-core-primitives@Number","params":{"content":0}},"icon":{"params":{"iconSet":"remix","icon":"ri-focus-mode"},"component":"data2-core-web@Icon"},"defaultValue":{"params":{},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-types@ComponentParameter"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Mode preset + flag overrides"}}}}],"title":{"component":"data2-core-primitives@String","params":{"content":"Parse"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Same as Validate but throws."}},"icon":{"params":{"iconSet":"remix","icon":"ri-shield-check-line"},"component":"data2-core-web@Icon"}},"component":"data2-core-types@ComponentParameter"},"mask":{"params":{"component":"data2-core-functions@Function","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"input"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Record to validate"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}}}],"title":{"component":"data2-core-primitives@String","params":{"content":"Mask"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Validate input against the schema. Returns { valid, errors[], data } — never throws."}},"icon":{"params":{"iconSet":"fontawesome4","icon":"fa fa-eye-slash"},"component":"data2-core-web@Icon"}},"component":"data2-core-types@ComponentParameter"},"generate":{"params":{"component":"data2-core-functions@Function","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"overrides"}},"description":{"component":"data2-core-primitives@String","params":{"content":""}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}}}],"title":{"component":"data2-core-primitives@String","params":{"content":"Generate"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Returns a record filled with per-field defaults ('', 0, false, [], {}, null)"}},"icon":{"params":{"iconSet":"fontawesome4","icon":"fa fa-newspaper-o"},"component":"data2-core-web@Icon"}},"component":"data2-core-types@ComponentParameter"},"patch":{"params":{"component":"data2-core-functions@Function","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"base"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Record to validate"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"partial"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Record to validate"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"options"}},"flat":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"parameters":{"mode":{"params":{"component":"data2-core-primitives@String","oneOf":[{"component":"data2-core-primitives@String","params":{"content":"strict"}},{"component":"data2-core-primitives@String","params":{"content":"strip"}},{"component":"data2-core-primitives@String","params":{"content":"coerce"}},{"component":"data2-core-primitives@String","params":{"content":"partial"}},{"component":"data2-core-primitives@String","params":{"content":"passtrough"}}],"index":{"component":"data2-core-primitives@Number","params":{"content":0}},"icon":{"params":{"iconSet":"remix","icon":"ri-focus-mode"},"component":"data2-core-web@Icon"},"defaultValue":{"params":{"content":"strip"},"component":"data2-core-primitives@String"}},"component":"data2-core-types@ComponentParameter"},"extras":{"params":{"component":"data2-core-primitives@String","oneOf":[{"component":"data2-core-primitives@String","params":{"content":"strict"}},{"component":"data2-core-primitives@String","params":{"content":"strip"}},{"component":"data2-core-primitives@String","params":{"content":"passtrough"}}],"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"icon":{"params":{"iconSet":"remix","icon":"ri-focus-mode"},"component":"data2-core-web@Icon"},"defaultValue":{"params":{"content":"strip"},"component":"data2-core-primitives@String"}},"component":"data2-core-types@ComponentParameter"},"required":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":2}},"defaultValue":{"params":{"content":"all"},"component":"data2-core-primitives@String"},"oneOf":[{"component":"data2-core-primitives@String","params":{"content":"all"}},{"component":"data2-core-primitives@String","params":{"content":"partial"}}]},"component":"data2-core-types@ComponentParameter"},"coerce":{"params":{"component":"data2-core-primitives@Boolean","index":{"component":"data2-core-primitives@Number","params":{"content":0}},"icon":{"params":{"iconSet":"remix","icon":"ri-focus-mode"},"component":"data2-core-web@Icon"},"defaultValue":{"params":{},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-types@ComponentParameter"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Mode preset + flag overrides"}}}}],"title":{"component":"data2-core-primitives@String","params":{"content":"Patch"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Deep-merges then validates."}},"icon":{"params":{"iconSet":"remix","icon":"ri-shield-check-line"},"component":"data2-core-web@Icon"}},"component":"data2-core-types@ComponentParameter"},"diff":{"params":{"component":"data2-core-functions@Function","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"a"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Record to validate"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"b"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Record to validate"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}}}],"title":{"component":"data2-core-primitives@String","params":{"content":"Diff"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Diff schemas"}},"icon":{"params":{"iconSet":"fontawesome4","icon":"fa fa-exchange"},"component":"data2-core-web@Icon"}},"component":"data2-core-types@ComponentParameter"},"describe":{"params":{"component":"data2-core-functions@Function","title":{"component":"data2-core-primitives@String","params":{"content":""}},"icon":{"params":{"iconSet":"fontawesome4","icon":"fa fa-search"},"component":"data2-core-web@Icon"}},"component":"data2-core-types@ComponentParameter"},"mock":{"params":{"component":"data2-core-functions@Function","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"options"}},"flat":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"parameters":{"mode":{"params":{"component":"data2-core-primitives@String","oneOf":[{"component":"data2-core-primitives@String","params":{"content":"strict"}},{"component":"data2-core-primitives@String","params":{"content":"strip"}},{"component":"data2-core-primitives@String","params":{"content":"coerce"}},{"component":"data2-core-primitives@String","params":{"content":"partial"}},{"component":"data2-core-primitives@String","params":{"content":"passtrough"}}],"index":{"component":"data2-core-primitives@Number","params":{"content":0}},"icon":{"params":{"iconSet":"remix","icon":"ri-focus-mode"},"component":"data2-core-web@Icon"},"defaultValue":{"params":{"content":"strip"},"component":"data2-core-primitives@String"}},"component":"data2-core-types@ComponentParameter"},"extras":{"params":{"component":"data2-core-primitives@String","oneOf":[{"component":"data2-core-primitives@String","params":{"content":"strict"}},{"component":"data2-core-primitives@String","params":{"content":"strip"}},{"component":"data2-core-primitives@String","params":{"content":"passtrough"}}],"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"icon":{"params":{"iconSet":"remix","icon":"ri-focus-mode"},"component":"data2-core-web@Icon"},"defaultValue":{"params":{"content":"strip"},"component":"data2-core-primitives@String"}},"component":"data2-core-types@ComponentParameter"},"required":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":2}},"defaultValue":{"params":{"content":"all"},"component":"data2-core-primitives@String"},"oneOf":[{"component":"data2-core-primitives@String","params":{"content":"all"}},{"component":"data2-core-primitives@String","params":{"content":"partial"}}]},"component":"data2-core-types@ComponentParameter"},"coerce":{"params":{"component":"data2-core-primitives@Boolean","index":{"component":"data2-core-primitives@Number","params":{"content":0}},"icon":{"params":{"iconSet":"remix","icon":"ri-focus-mode"},"component":"data2-core-web@Icon"},"defaultValue":{"params":{},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-types@ComponentParameter"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Mode preset + flag overrides"}}}}],"title":{"component":"data2-core-primitives@String","params":{"content":"Mock"}},"description":{"component":"data2-core-primitives@String","params":{"content":""}},"icon":{"params":{"iconSet":"fontawesome4","icon":"fa fa-id-card"},"component":"data2-core-web@Icon"}},"component":"data2-core-types@ComponentParameter"},"derive":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Derive"}},"component":"data2-core-primitives@Object","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"op"}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"keys"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"asReference"}}}}]},"component":"data2-core-types@ComponentParameter"},"rederive":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Rederive"}}},"component":"data2-core-types@ComponentParameter"},"setFields":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Set Fields"}}},"component":"data2-core-types@ComponentParameter"},"addField":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Add field"}}},"component":"data2-core-types@ComponentParameter"},"removeField":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Remove Field"}}},"component":"data2-core-types@ComponentParameter"},"unlink":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Unlink"}}},"component":"data2-core-types@ComponentParameter"},"relink":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Relink"}}},"component":"data2-core-types@ComponentParameter"},"setDeriveKeys":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Set Derive Keys"}}},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@FieldSet"}},"updatedAt":"2026-05-07T14:23:04.221Z","createdAt":"2026-05-05T23:37:50.739Z"},{"_id":"69fd4c4939064a789b95e2ec","component":"data2-core-types@Component","params":{"component":"SchemaReference","package":"data2-core-types","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"reference":{"params":{},"component":"data2-core-primitives@String"}}}},"visibility":"private"},"updatedAt":"2026-05-08T02:39:38.472Z","createdAt":"2026-05-08T02:36:57.065Z"},{"_id":"69fca132e0c744d974640ae3","component":"data2-core-types@Component","params":{"component":"SchemaSet","package":"data2-core-types","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{}}},"icon":{"params":{"icon":"fa fa-th"},"component":"data2-core-web@Icon"},"interactions":{"params":{"fields":{"listSchemas":{"params":{},"component":"data2-core-types@ComponentParameter"},"listReferences":{"params":{},"component":"data2-core-types@ComponentParameter"},"getSchema":{"params":{},"component":"data2-core-types@ComponentParameter"},"getRegistry":{"params":{},"component":"data2-core-types@ComponentParameter"},"getMaster":{"params":{},"component":"data2-core-types@ComponentParameter"},"validate":{"params":{},"component":"data2-core-types@ComponentParameter"},"cascade":{"params":{},"component":"data2-core-types@ComponentParameter"},"updateMaster":{"params":{},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@FieldSet"}},"updatedAt":"2026-05-07T14:43:07.051Z","createdAt":"2026-05-07T14:26:58.632Z"},{"_id":"5f61fd8ba575399a45655c77","component":"data2-core-types@Component","params":{"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"x":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}}},"component":"data2-core-types@ComponentParameter"},"y":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}}},"component":"data2-core-types@ComponentParameter"}}}},"component":"Scroll","package":"data2-core-types"},"updatedAt":"2022-06-20T18:57:28.221Z"},{"_id":"603ed801c2dd12f059fb6d9f","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"ServiceDatabaseReference","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"reference":"String"}}}}},{"_id":"5f6e0909a575399a45a9d81e","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"Setter","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"module":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@InteractiveModuleReference"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"},"prop":{"params":{"autocomplete":{"module":{"component":"data2-core-types@Reference","params":{"reference":"module"}}},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}},"dependsOn":[{"component":"data2-core-primitives@String","params":{"content":"module"}}],"alternativeParameterDefaultType":[{"parameter":{"component":"data2-core-primitives@String","params":{"content":"module"}},"value":{"params":{"reference":"__UIState"},"component":"data2-core-types@InteractiveModuleReference"},"type":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-user-interface@StateProp"}}},"component":"data2-core-types@ComponentParameter"}}],"shouldShow":{"component":"data2-core-primitives@Boolean","params":{"content":true},"preventEvaluation":true}},"component":"data2-core-types@ComponentParameter"},"value":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":3}},"dependsOn":[{"component":"data2-core-primitives@String","params":{"content":"module"}}]},"component":"data2-core-types@ComponentParameter"}}}},"wrap":{"component":"data2-core-primitives@String","params":{"content":"then"}},"preview":{"params":{"portions":[{"component":"data2-core-primitives@String","params":{"content":"Setter | "}},{"params":{"compare":[{"component":"data2-core-types@Getter","params":{"module":{"params":{"pattern":{"component":"data2-core-types@Regex","params":{"pattern":"^data\\.states"}},"text":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"prop"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-functions@Match"},"prop":{"component":"data2-core-primitives@String","params":{"content":"0"}}}}],"else":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"prop"}}}},"then":{"params":{"content":"UIState"},"component":"data2-core-primitives@String"}},"component":"data2-core-flow@If"}]},"component":"data2-core-functions@StringConcat"}},"updatedAt":"2023-01-24T17:25:34.597Z"},{"_id":"5f4d6ac7a575399a45c38265","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"Shadow","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"type":{"component":"data2-core-primitives@String","oneOf":["outset","inset"]},"offsetX":{"component":"data2-core-primitives@Number"},"offsetY":{"component":"data2-core-primitives@Number"},"blur":{"component":"data2-core-primitives@Number"},"spread":{"component":"data2-core-primitives@Number"},"color":{"component":"data2-core-types@Color"}}}}}},{"_id":"5f714812e2d6fd3e21bc1387","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"SimpleShadow","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"offsetX":"String","offsetY":"String","blur":"String","color":{"component":"data2-core-types@Color"}}}}}},{"_id":"601034a15c0bce53ad279a08","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"Skill","visibility":"private","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"policies":{"component":"data2-core-auth@Policy","list":true},"action":{"component":"data2-core-flow@Series"},"title":{"component":"data2-core-primitives@String"}}}}}},{"_id":"5ede861cd68ce41360353f77","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"StyleSheet","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"background":{"component":"data2-core-types@Color","list":true},"borderRadius":"String","whiteSpace":{"component":"String","oneOf":["normal","nowrap","pre","pre-line","pre-wrap","initial","inherit"]},"boxShadow":"String","fontFamily":"String","fontSize":"String","color":"data2-core-types@Color","cursor":{"component":"String","oneOf":["pointer","text","default","auto","not-allowed"]},"textAlign":{"component":"String","oneOf":["center","left","right","justify"]}}}}}},{"_id":"6233629ee067e2ca5d04daa4","component":"data2-core-types@Component","params":{"package":"data2-core-types","public":false,"component":"SuperReference","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"reference":{"component":"data2-core-primitives@String","autocomplete":{"context":true}}}}},"visibility":"private"},"updatedAt":"2022-03-22T14:43:42.212Z"},{"_id":"62fd47af77c914c6acaa3679","component":"data2-core-types@Component","params":{"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"line":{"params":{"oneOf":["overline","underline","line-through"],"component":"data2-core-primitives@String","description":{"component":"data2-core-primitives@String","params":{"content":"Sets the decoration line style."}}},"component":"data2-core-types@ComponentParameter"},"color":{"params":{"component":"data2-core-types@Color","description":{"component":"data2-core-primitives@String","params":{"content":"Sets the color of the decoration."}}},"component":"data2-core-types@ComponentParameter"},"style":{"params":{"oneOf":["solid","wavy","dotted","dashed","double"],"component":"data2-core-primitives@String","description":{"component":"data2-core-primitives@String","params":{"content":"Sets the style of the decoration line."}}},"component":"data2-core-types@ComponentParameter"},"thickness":{"params":{"component":"data2-core-primitives@Number","description":{"component":"data2-core-primitives@String","params":{"content":"Sets the thickness of the decoration."}}},"component":"data2-core-types@ComponentParameter"}}}},"component":"TextDecoration","package":"data2-core-types","visibility":"public"},"updatedAt":"2023-07-11T18:35:50.022Z"},{"_id":"5fdbb0754369e2af9514749f","component":"data2-core-types@Component","params":{"public":true,"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"horizontalAlignment":{"component":"data2-core-primitives@String","oneOf":["left","center","right"]},"verticalAlignment":{"component":"data2-core-primitives@String","oneOf":["top","middle","bottom"]},"lineHeight":{"component":"data2-core-primitives@Number"},"letterSpacing":{"component":"data2-core-primitives@Number"},"wordWrap":{"params":{"component":"data2-core-primitives@String","oneOf":[{"params":{"content":"break-word"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"},"spaceWrap":{"params":{"component":"data2-core-primitives@String","oneOf":[{"params":{"content":"nowrap"},"component":"data2-core-primitives@String"},{"params":{"content":"pre"},"component":"data2-core-primitives@String"},{"params":{"content":"pre-wrap"},"component":"data2-core-primitives@String"},{"params":{"content":"pre-line"},"component":"data2-core-primitives@String"},{"params":{"content":"break-spaces"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"}}}},"component":"TextFormat","package":"data2-core-types","visibility":"public"},"updatedAt":"2023-11-01T22:35:59.845Z"},{"_id":"62bcca4bc8f80c23ec6f2bd2","component":"data2-core-types@Component","params":{"package":"data2-core-types","public":false,"component":"This","parameters":{"component":"data2-core-types@FieldSet","params":{}},"visibility":"public"}},{"_id":"606d2136d7ec64d5fcbb899f","component":"data2-core-types@Component","params":{"component":"Timer","package":"data2-core-types","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"reference":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"visibility":"private"},"component":"data2-core-types@ComponentParameter"},"interval":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Interval to run onTick (in ms)"}}},"component":"data2-core-types@ComponentParameter"},"activeInBuilder":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}}},"component":"data2-core-types@ComponentParameter"},"onTick":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}}},"component":"data2-core-types@ComponentParameter"}}}},"icon":{"params":{"icon":"fa-clock-o"},"component":"data2-core-types@FontAwesomeIcon"}},"updatedAt":"2022-10-14T17:58:32.922Z"},{"_id":"6a0db7a7aaba61ff463d9b00","component":"data2-core-types@Component","params":{"package":"data2-core-types","component":"Transform","icon":"drag-move-2-line","title":{"component":"data2-core-primitives@String","params":{"content":"Transform"}},"description":{"component":"data2-core-primitives@String","params":{"content":"One composable CSS transform step (translate, scale, rotate, skew, perspective; 2D and 3D variants)."}},"visibility":"private","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"kind":{"component":"data2-core-primitives@String","oneOf":["translate","translate3d","scale","scale3d","rotate","rotateX","rotateY","rotateZ","skew","perspective"]},"x":{"component":"data2-core-primitives@Number"},"y":{"component":"data2-core-primitives@Number"},"z":{"component":"data2-core-primitives@Number"},"angle":{"component":"data2-core-primitives@Number"},"distance":{"component":"data2-core-primitives@Number"},"unit":{"component":"data2-core-primitives@String","oneOf":["px","%","em","rem","vw","vh"]}}}}},"updatedAt":"2026-05-20T13:31:19.397Z","createdAt":"2026-05-20T13:31:19.397Z"},{"_id":"62b2355b18187a6cb1f08ecb","component":"data2-core-types@Component","params":{"component":"TranslatableText","package":"data2-core-types","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"translations":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"category":"content","simple":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"index":{"component":"data2-core-primitives@Number","params":{"content":101}},"title":{"component":"data2-core-primitives@String","params":{"content":"Translations"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"text":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"content","simple":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"index":{"component":"data2-core-primitives@Number","params":{"content":101}},"title":{"component":"data2-core-primitives@String","params":{"content":"Text"}}},"component":"data2-core-types@ComponentParameter"},"locale":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"content","simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":101}},"title":{"component":"data2-core-primitives@String","params":{"content":"Locale"}}},"component":"data2-core-types@ComponentParameter"}},"shouldShow":{"params":{"content":{"params":{"reference":"defaultText"},"component":"data2-core-types@Reference"}},"component":"data2-core-primitives@Boolean","preventEvaluation":true,"break":true}},"component":"data2-core-types@ComponentParameter"},"locale":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"appearance","simple":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"index":{"component":"data2-core-primitives@Number","params":{"content":101}},"title":{"component":"data2-core-primitives@String","params":{"content":"Locale"}},"shouldShow":{"params":{"content":{"params":{"reference":"defaultText"},"component":"data2-core-types@Reference"}},"component":"data2-core-primitives@Boolean","preventEvaluation":true,"break":true}},"component":"data2-core-types@ComponentParameter"},"defaultText":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"category":"appearance","simple":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"index":{"component":"data2-core-primitives@Number","params":{"content":101}},"title":{"component":"data2-core-primitives@String","params":{"content":"Default Text"}}},"component":"data2-core-types@ComponentParameter"}}}},"title":"TranslatableText","visibility":"private"},"updatedAt":"2024-07-01T22:26:26.439Z","createdAt":"2022-05-24T19:10:03.681Z"},{"_id":"6296714710ec9b060a686a26","component":"data2-core-types@Component","params":{"component":"UserComponentInterface","package":"data2-core-types","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{}}}},"updatedAt":"2022-05-31T19:49:27.642Z","createdAt":"2022-05-31T19:49:27.642Z"},{"_id":"629102ea12df7506096d622a","component":"data2-core-types@Component","params":{"component":"UserComponentReference","package":"data2-core-types","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"reference":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}},"component":"data2-core-types@ComponentParameter"}}}},"title":{"component":"data2-core-primitives@String","params":{"content":"User Component Reference"}},"icon":{"params":{"icon":"fa-paint-brush"},"component":"data2-core-types@FontAwesomeIcon"},"visibility":"private"},"updatedAt":"2022-05-27T16:57:55.859Z","createdAt":"2022-05-27T16:57:14.127Z"},{"_id":"5f92db48c8da12be8b24a6c2","component":"data2-core-types@Component","params":{"component":"Variable","package":"data2-core-types","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"reference":{"component":"data2-core-primitives@String"},"key":{"component":"data2-core-primitives@String"},"initialValue":{"component":"data2-core-primitives@String"},"component":{"component":"data2-core-primitives@String","oneOf":["data2-core-primitives@String","data2-core-primitives@Boolean","data2-core-primitives@Number"]}}}}}},{"_id":"6331f4725a870cfe32ea4c94","component":"data2-core-types@Component","params":{"component":"Virtual","package":"data2-core-types","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"definition":{"component":"data2-core-primitives@String"}}}},"validation":{}}},{"_id":"60774872d7ec64d5fc5e0a4c","component":"data2-core-types@Component","params":{"public":true,"component":"StateDefinition","package":"data2-core-user-interface","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"key":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}}},"component":"data2-core-types@ComponentParameter"},"initialValue":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"alternativeParameterDefaultType":[{"parameter":{"component":"data2-core-primitives@String","params":{"content":"component"}},"value":"data2-core-primitives@Boolean","type":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}}},"component":"data2-core-types@ComponentParameter"}},{"parameter":{"component":"data2-core-primitives@String","params":{"content":"component"}},"value":"data2-core-primitives@Number","type":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}}},"component":"data2-core-types@ComponentParameter"}},{"parameter":{"component":"data2-core-primitives@String","params":{"content":"component"}},"value":"data2-core-functions@Function","type":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-functions@Function"}}},"component":"data2-core-types@ComponentParameter"}}],"index":{"component":"data2-core-primitives@Number","params":{"content":2}},"dependsOn":[{"component":"data2-core-primitives@String","params":{"content":"component"}}],"shouldShow":{"component":"data2-core-primitives@Boolean","params":{"content":true},"preventEvaluation":true}},"component":"data2-core-types@ComponentParameter"},"component":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"oneOf":["data2-core-primitives@String","data2-core-primitives@Boolean","data2-core-primitives@Number",{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},{"component":"data2-core-primitives@String","params":{"content":"data2-core-functions@Function"}}],"index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"public","preview":{"params":{"reference":"key"},"component":"data2-core-types@Reference"}},"updatedAt":"2023-10-30T20:32:52.970Z"},{"_id":"60774899d7ec64d5fc5e1e2f","component":"data2-core-types@Component","params":{"public":false,"component":"StateGetter","package":"data2-core-user-interface","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"componentId":{"component":"data2-core-primitives@String"},"key":{"component":"data2-core-primitives@String"}}}},"visibility":"deprecated"},"updatedAt":"2022-03-22T14:41:09.465Z"},{"_id":"6078aa0cd7ec64d5fccdb605","component":"data2-core-types@Component","params":{"public":true,"component":"StateProp","package":"data2-core-user-interface","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"key":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":2}}},"component":"data2-core-types@ComponentParameter"},"componentId":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":0}}},"component":"data2-core-types@ComponentParameter"},"rootStateProp":{"params":{"component":"data2-core-primitives@String","visibility":"private","index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"public"},"updatedAt":"2023-11-09T19:43:34.565Z"},{"_id":"607748b2d7ec64d5fc5e2c70","component":"data2-core-types@Component","params":{"public":false,"component":"StateSetter","package":"data2-core-user-interface","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"componentId":{"component":"data2-core-primitives@String"},"key":{"component":"data2-core-primitives@String"},"value":{"component":"data2-core-primitives@String"}}}},"visibility":"deprecated"},"updatedAt":"2022-03-22T14:41:31.563Z"},{"_id":"611e74ce92425036c3c8648b","component":"data2-core-types@Component","params":{"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"fontFamily":{"component":"String","oneOf":["system-ui","sans-serif","Arial","Helvetica","Verdana","Gill Sans","Optima","Arial Narrow","serif","Times","Didot","Georgia","Palatino","American Typewriter","monospace","Andale Mono","Courier","Courier New","cursive","Comic Sans MS","Apple Chancery","Bradley Hand","Brush Script MT","Snell Roundhand","fantasy","Impact","Luminari","Chalkduster","Marker Felt","Trattatello"]}}}},"component":"DefaultFont","package":"data2-core-web"}},{"_id":"6903958a31c63269886baf19","component":"data2-core-types@Component","params":{"component":"FocusElement","package":"data2-core-web","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"ariaLabel":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"},"id":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"},"className":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"},"selector":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2025-10-30T19:08:03.880Z","createdAt":"2025-10-30T16:42:50.422Z"},{"_id":"64c28b135652482f13285370","component":"data2-core-types@Component","params":{"package":"data2-core-web","component":"FocusField","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"id":{"component":"data2-core-primitives@String"}}}}},"updatedAt":"2023-04-26T19:58:33.046Z"},{"_id":"60dcdd43da3861ca652deeb8","component":"data2-core-types@Component","params":{"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"family":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"},"faces":{"params":{"component":"data2-core-primitives@Object","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"src":{"params":{"component":"data2-core-types@FileComponentUrlReference","index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"},"format":{"params":{"component":"data2-core-primitives@String","oneOf":[{"params":{"content":"opentype"},"component":"data2-core-primitives@String"},{"params":{"content":"truetype"},"component":"data2-core-primitives@String"},{"params":{"content":"woff"},"component":"data2-core-primitives@String"},{"params":{"content":"woff2"},"component":"data2-core-primitives@String"},{"params":{"content":"embedded-opentype"},"component":"data2-core-primitives@String"}],"index":{"component":"data2-core-primitives@Number","params":{"content":2}}},"component":"data2-core-types@ComponentParameter"},"style":{"params":{"component":"data2-core-primitives@String","oneOf":[{"params":{"content":"normal"},"component":"data2-core-primitives@String"},{"params":{"content":"italic"},"component":"data2-core-primitives@String"},{"params":{"content":"oblique"},"component":"data2-core-primitives@String"}],"index":{"component":"data2-core-primitives@Number","params":{"content":3}}},"component":"data2-core-types@ComponentParameter"},"weight":{"params":{"component":"data2-core-primitives@String","oneOf":[{"params":{"content":"normal"},"component":"data2-core-primitives@String"},{"params":{"content":"bold"},"component":"data2-core-primitives@String"},{"params":{"content":"100"},"component":"data2-core-primitives@String"},{"params":{"content":"200"},"component":"data2-core-primitives@String"},{"params":{"content":"300"},"component":"data2-core-primitives@String"},{"params":{"content":"400"},"component":"data2-core-primitives@String"},{"params":{"content":"500"},"component":"data2-core-primitives@String"},{"params":{"content":"600"},"component":"data2-core-primitives@String"},{"params":{"content":"700"},"component":"data2-core-primitives@String"},{"params":{"content":"800"},"component":"data2-core-primitives@String"},{"params":{"content":"900"},"component":"data2-core-primitives@String"}],"index":{"component":"data2-core-primitives@Number","params":{"content":4}}},"component":"data2-core-types@ComponentParameter"},"sources":{"params":{"component":"data2-core-primitives@Object","parameters":{"src":{"params":{"component":"data2-core-types@FileComponentUrlReference","index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"},"format":{"params":{"component":"data2-core-primitives@String","oneOf":[{"params":{"content":"opentype"},"component":"data2-core-primitives@String"},{"params":{"content":"truetype"},"component":"data2-core-primitives@String"},{"params":{"content":"woff"},"component":"data2-core-primitives@String"},{"params":{"content":"woff2"},"component":"data2-core-primitives@String"},{"params":{"content":"embedded-opentype"},"component":"data2-core-primitives@String"}],"index":{"component":"data2-core-primitives@Number","params":{"content":2}}},"component":"data2-core-types@ComponentParameter"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}}},"component":"data2-core-types@ComponentParameter"},"display":{"params":{"component":"data2-core-primitives@String","oneOf":[{"params":{"content":"auto"},"component":"data2-core-primitives@String"},{"params":{"content":"block"},"component":"data2-core-primitives@String"},{"params":{"content":"swap"},"component":"data2-core-primitives@String"},{"params":{"content":"fallback"},"component":"data2-core-primitives@String"},{"params":{"content":"optional"},"component":"data2-core-primitives@String"}],"index":{"component":"data2-core-primitives@Number","params":{"content":5}}},"component":"data2-core-types@ComponentParameter"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}}},"component":"data2-core-types@ComponentParameter"}}}},"component":"Font","package":"data2-core-web"},"updatedAt":"2024-04-08T14:26:23.871Z"},{"_id":"611e97a492425036c3f050c2","component":"data2-core-types@Component","params":{"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"fonts":{"list":true,"component":"data2-core-web@DefaultFont"}}}},"component":"Fonts","package":"data2-core-web"}},{"_id":"5f5fb895a575399a4506a936","component":"data2-core-types@Component","params":{"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"fontFamily":{"component":"String"}}}},"component":"GoogleFont","package":"data2-core-web"}},{"_id":"6439ef81a9851b0634520016","component":"data2-core-types@Component","params":{"component":"Icon","package":"data2-core-web","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"icon":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}},"title":{"component":"data2-core-primitives@String","params":{"content":"Icon"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Icon to be used."}},"defaultValue":{"params":{},"component":"data2-core-types@Definition"}}},"iconSet":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}},"title":{"component":"data2-core-primitives@String","params":{"content":"Icon Set"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Set of icons to be used."}},"defaultValue":{"params":{},"component":"data2-core-types@Definition"},"visibility":"public"}}}}},"title":"Icon","visibility":"public"},"updatedAt":"2023-08-17T13:03:29.815Z","createdAt":"2023-04-15T00:27:45.831Z"},{"_id":"620d30f08271aa4129940945","component":"data2-core-types@Component","params":{"package":"data2-core-web","component":"LocalStorage","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{}}}}},{"_id":"6245f6ece0fc64b6bf60875f","component":"data2-core-types@Component","params":{"public":true,"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"name":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Name"}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}}},"component":"data2-core-types@ComponentParameter"},"content":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Content"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"}}}},"component":"MetaTag","package":"data2-core-web","visibility":"private","preview":{"params":{"reference":"name"},"component":"data2-core-types@Reference"}},"updatedAt":"2022-03-31T19:25:09.891Z"},{"_id":"6284531beb0304060bb3cba6","component":"data2-core-types@Component","params":{"component":"QueryParameter","package":"data2-core-web","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{}}}},"updatedAt":"2022-05-18T01:59:55.733Z","createdAt":"2022-05-18T01:59:55.733Z"},{"_id":"6356fae8c06fa8444e936090","component":"data2-core-types@Component","params":{"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"querySelector":{"component":"String"}}}},"component":"QuerySelector","package":"data2-core-web","definition":{"params":{"compare":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"querySelector"}}}},"then":{"component":"data2-core-types@Getter","params":{"module":{"params":{},"component":"data2-core-web@Window"},"args":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"querySelector"}}}}],"prop":{"component":"data2-core-primitives@String","params":{"content":"querySelector"}}}}},"component":"data2-core-flow@If"}},"updatedAt":"2024-10-09T13:45:15.555Z"},{"_id":"6491d957c91d9255f4a20306","component":"data2-core-types@Component","params":{"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"string":{"component":"String"}}}},"component":"QueryStringParse","package":"data2-core-web"}},{"_id":"6a7cdc995f201cb1ceffe622","component":"data2-core-types@Component","params":{"package":"data2-core-web","component":"Reload","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{}}}},"updatedAt":"2026-08-12T00:00:00.000Z"},{"_id":"60ef33efda3861ca65e2b7bf","component":"data2-core-types@Component","params":{"package":"data2-core-web","component":"Script","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"reference":{"component":"data2-core-primitives@String"},"src":{"component":"data2-core-primitives@String"},"script":{"component":"data2-core-primitives@String","multiLine":true}}}}}},{"_id":"6138a0a392425036c35e6412","component":"data2-core-types@Component","params":{"package":"data2-core-web","component":"ScrollIntoView","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"id":{"component":"data2-core-primitives@String"},"alignment":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"visibility":"public","oneOf":[{"params":{"content":"start"},"component":"data2-core-primitives@String"},{"params":{"content":"center"},"component":"data2-core-primitives@String"},{"params":{"content":"end"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"},"behavior":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"visibility":"public","oneOf":[{"params":{"content":"smooth"},"component":"data2-core-primitives@String"},{"params":{"content":"instant"},"component":"data2-core-primitives@String"},{"params":{"content":"auto"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2024-11-12T20:19:04.771Z"},{"_id":"66fdb019e3b3600723092662","component":"data2-core-types@Component","params":{"package":"data2-core-web","component":"ScrollTo","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"id":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"},"position":{"params":{"component":"data2-core-primitives@String","oneOf":[{"params":{"content":"top"},"component":"data2-core-primitives@String"},{"params":{"content":"bottom"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2024-10-02T20:52:49.035Z"},{"_id":"618d8cbc976026c073f76f2c","component":"data2-core-types@Component","params":{"package":"data2-core-web","public":true,"component":"Window","parameters":{"component":"data2-core-types@FieldSet","params":{}},"visibility":"public"}},{"_id":"632b88285a870cfe32166631","component":"data2-core-types@Component","params":{"product":"ui","package":"data2-interface-services","component":"AudioService","icon":{"params":{"icon":"fa-volume-up"},"component":"data2-core-types@FontAwesomeIcon"},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"dimensions":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Dimensions"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":101}},"simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"defaultValue":{"preventEvaluation":true,"params":{"width":300,"height":300},"component":"data2-core-types@Dimensions"},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"},"src":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@FileComponentUrlReference"}}},"component":"data2-core-types@ComponentParameter"}}}},"interactions":{"component":"data2-core-types@FieldSet","params":{"fields":{"pause":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}}},"component":"data2-core-types@ComponentParameter"},"play":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}}}]},"component":"data2-core-types@ComponentParameter"},"goTo":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"title":{"component":"data2-core-primitives@String","params":{"content":"timestamp"}}}}]},"component":"data2-core-types@ComponentParameter"},"setSrc":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@FileComponentUrlReference"}},"title":{"component":"data2-core-primitives@String","params":{"content":"src"}}}}]},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"public","states":{"params":{},"component":"data2-core-types@FieldSet"}},"updatedAt":"2022-09-21T22:35:01.941Z"},{"_id":"631667071f40e120a9aec0f0","component":"data2-core-types@Component","params":{"public":true,"package":"data2-interface-services","component":"CursorController","icon":"mouse-pointer","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{}}},"visibility":"public"}},{"_id":"620d28658271aa4129919d89","component":"data2-core-types@Component","params":{"public":true,"package":"data2-interface-services","component":"DeviceController","icon":"mobile","visibility":"public","interactions":{"params":{"fields":{"postMessage":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"data"}}}}]},"component":"data2-core-types@ComponentParameter"},"print":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"zoom":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"title":{"component":"data2-core-primitives@String","params":{"content":"zoom"}},"visibility":"public"}}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"}],"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"share":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}}},"component":"data2-core-types@ComponentParameter"},"clipboard.copy":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}}}]},"component":"data2-core-types@ComponentParameter"},"clipboard.paste":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}}}]},"component":"data2-core-types@ComponentParameter"},"download":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Filename"}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Content"}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Options"}},"parameters":{"params":{"fields":{"type":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Mimetype"}}}}}},"component":"data2-core-types@FieldSet"}}}]},"component":"data2-core-types@ComponentParameter"},"downloadUrl":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Filename"}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Url"}}}}]},"component":"data2-core-types@ComponentParameter"},"promptFiles":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"params":{"fields":{"multiple":{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Multiple"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Whether or not to allow selecting multiple files"}},"component":"data2-core-primitives@Boolean"}},"acceptedFormats":{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Accepted Formats"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Accepted file formats"}},"component":"data2-core-primitives@String","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}},"timeout":{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Timeout"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Max milliseconds to wait for file upload"}},"component":"data2-core-primitives@Number"}}}},"component":"data2-core-types@FieldSet"}}}],"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"meetingRecord":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"visibility":"public","definition":{"params":{"actions":[{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"meeting"}},"script":{"component":"data2-core-primitives@String","params":{"content":"(function() {\n  let mediaRecorder;\n  let audioChunks = [];\n  let combinedStream;\n  let audioContext;\n  \n  window.meetingCapture = async function() {\n    try {\n      // Solicitar acesso ao áudio da guia (e vídeo, que será ignorado depois)\n      const tabStream = await navigator.mediaDevices.getDisplayMedia({ \n        video: true, // Necessário para alguns navegadores\n        audio: true\n      });\n      \n      // Remover a trilha de vídeo\n      const tabAudioTrack = tabStream.getAudioTracks()[0];\n      \n      // Solicitar acesso ao microfone\n      const micStream = await navigator.mediaDevices.getUserMedia({ audio: true });\n      const micAudioTrack = micStream.getAudioTracks()[0];\n      \n      // Criar um novo MediaStream com ambas as trilhas de áudio\n      combinedStream = new MediaStream([tabAudioTrack, micAudioTrack]);\n      \n      // Criar um contexto de áudio para misturar os streams\n      audioContext = new AudioContext();\n      const destination = audioContext.createMediaStreamDestination();\n      \n      // Conectar a trilha de áudio da guia\n      const tabSource = audioContext.createMediaStreamSource(new MediaStream([tabAudioTrack]));\n      tabSource.connect(destination);\n      \n      // Conectar a trilha de áudio do microfone\n      const micSource = audioContext.createMediaStreamSource(new MediaStream([micAudioTrack]));\n      micSource.connect(destination);\n      \n      // Iniciar gravação com o stream misturado\n      mediaRecorder = new MediaRecorder(destination.stream);\n      audioChunks = [];\n      mediaRecorder.ondataavailable = (e) => audioChunks.push(e.data);\n      mediaRecorder.start();\n      \n      console.log('Gravação iniciada. Chame meetingCaptureStop() para finalizar.');\n    } catch (error) {\n      console.error('Erro ao iniciar a captura:', error);\n    }\n  };\n  \n  window.meetingCaptureStop = function() {\n    return new Promise((resolve, reject) => {\n      if (!mediaRecorder) {\n        reject('Nenhuma gravação em andamento.');\n        return;\n      }\n      \n      mediaRecorder.onstop = () => {\n        const audioBlob = new Blob(audioChunks, { type: 'audio/webm' });\n        combinedStream.getTracks().forEach(track => track.stop());\n        audioContext.close();\n        \n        resolve(audioBlob);\n        console.log('Gravação finalizada. O arquivo de áudio está pronto para upload.');\n      };\n      \n      mediaRecorder.stop();\n    });\n  };\n})();"}}},"component":"data2-core-web@Script"},{"component":"data2-core-types@Getter","params":{"module":{"params":{},"component":"data2-core-web@Window"},"prop":{"component":"data2-core-primitives@String","params":{"content":"meetingCapture"}}}}]},"component":"data2-core-flow@Series"}},"component":"data2-core-types@ComponentParameter"},"meetingRecordStop":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Filename"}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Content"}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Options"}},"parameters":{"params":{"fields":{"type":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Mimetype"}}}}}},"component":"data2-core-types@FieldSet"}}}],"definition":{"params":{"actions":[{"component":"data2-core-types@Getter","params":{"module":{"params":{},"component":"data2-core-web@Window"},"prop":{"component":"data2-core-primitives@String","params":{"content":"meetingCaptureStop"}}}}]},"component":"data2-core-flow@Series"}},"component":"data2-core-types@ComponentParameter"},"notify":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"visibility":"private","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","parameters":{"title":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":0}},"title":{"component":"data2-core-primitives@String","params":{"content":"title"}}},"component":"data2-core-types@ComponentParameter"},"sound":{"params":{"component":"data2-core-types@FileComponentUrlReference","index":{"component":"data2-core-primitives@Number","params":{"content":1}},"title":{"component":"data2-core-primitives@String","params":{"content":"sound"}}},"component":"data2-core-types@ComponentParameter"}},"flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}}]},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@FieldSet"}},"updatedAt":"2025-02-28T21:14:39.083Z"},{"_id":"5f6229cda575399a456c7208","component":"data2-core-types@Component","params":{"product":"ui","public":true,"package":"data2-interface-services","component":"DialogsService","icon":"window-maximize","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"confirmArtboard":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@ArtboardReference"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":202}},"defaultValue":{"preventEvaluation":true,"params":{"preventEvaluation":true},"component":"data2-core-types@ArtboardReference"},"description":{"component":"data2-core-primitives@String","params":{"content":"Artboard to display when the \"confirm\" interaction is triggered."}}},"component":"data2-core-types@ComponentParameter"},"alertArtboard":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@ArtboardReference"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":201}},"defaultValue":{"preventEvaluation":true,"params":{"preventEvaluation":true},"component":"data2-core-types@ArtboardReference"},"description":{"component":"data2-core-primitives@String","params":{"content":"Artboard to display when the \"alert\" interaction is triggered."}}},"component":"data2-core-types@ComponentParameter"},"promptArtboard":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@ArtboardReference"}},"category":"content","index":{"component":"data2-core-primitives@Number","params":{"content":201}},"defaultValue":{"preventEvaluation":true,"params":{"preventEvaluation":true},"component":"data2-core-types@ArtboardReference"},"description":{"component":"data2-core-primitives@String","params":{"content":"Artboard to display when the \"prompt\" interaction is triggered."}}},"component":"data2-core-types@ComponentParameter"},"position":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Position"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":101}},"simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"},"dimensions":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Dimensions"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":101}},"simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"defaultValue":{"preventEvaluation":true,"params":{"width":300,"height":300},"component":"data2-core-types@Dimensions"},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"}}}},"interactions":{"component":"data2-core-types@FieldSet","params":{"fields":{"confirm":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"check-circle"}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Message to display"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Message"}}}}]},"component":"data2-core-types@ComponentParameter"},"alert":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"exclamation-circle"}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Message to display"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Message"}}}}]},"component":"data2-core-types@ComponentParameter"},"prompt":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"terminal"}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Message to display"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Message"}}}}]},"component":"data2-core-types@ComponentParameter"},"close":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"times-circle"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"submit":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"paper-plane"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"public"},"updatedAt":"2023-11-01T21:00:55.297Z"},{"_id":"6329c5b85a870cfe32be0616","component":"data2-core-types@Component","params":{"public":true,"package":"data2-interface-services","component":"HotkeysService","icon":"keyboard-o","product":"ui","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"dimensions":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Dimensions"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":101}},"simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"defaultValue":{"preventEvaluation":true,"params":{"width":300,"height":300},"component":"data2-core-types@Dimensions"},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"},"initialEnabled":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}}},"component":"data2-core-types@ComponentParameter"},"initialShortcuts":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"parameters":{"params":{"fields":{"description":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}},"component":"data2-core-types@ComponentParameter"},"keys":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"options":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"parameters":{"params":{"fields":{"passive":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}}},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@FieldSet"}},"component":"data2-core-types@ComponentParameter"},"handler":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}}},"component":"data2-core-types@ComponentParameter"},"event":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"oneOf":[{"params":{"content":"keydown"},"component":"data2-core-primitives@String"},{"params":{"content":"keyup"},"component":"data2-core-primitives@String"},{"params":{"content":"keypress"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@FieldSet"},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}}}},"interactions":{"component":"data2-core-types@FieldSet","params":{"fields":{"enableHandlers":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}}},"component":"data2-core-types@ComponentParameter"},"disableHandlers":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}}},"component":"data2-core-types@ComponentParameter"},"addShortcut":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"parameters":{"params":{"fields":{"description":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}},"component":"data2-core-types@ComponentParameter"},"keys":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"options":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"parameters":{"params":{"fields":{"passive":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}}},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@FieldSet"}},"component":"data2-core-types@ComponentParameter"},"handler":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}}},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@FieldSet"},"list":{"component":"data2-core-primitives@Boolean","params":{"content":false}}},"component":"data2-core-types@ComponentParameter"}]},"component":"data2-core-types@ComponentParameter"},"clearShortcut":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}}]},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"public","states":{"params":{},"component":"data2-core-types@FieldSet"}},"updatedAt":"2022-10-14T15:28:42.673Z"},{"_id":"64d0e185e6833f0644f07d1c","component":"data2-core-types@Component","params":{"component":"LoggerService","package":"data2-interface-services","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{}}},"title":"LoggerService","visibility":"private","icon":{"component":"data2-core-primitives@String","params":{"content":"terminal"}},"interactions":{"params":{"fields":{"log":{"params":{"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"message"}},"title":{"component":"data2-core-primitives@String","params":{"content":"message"}},"component":"data2-core-primitives@String","description":{"component":"data2-core-primitives@String","params":{"content":"Message to be logged."}},"visibility":"public","icon":{"component":"data2-core-primitives@String","params":{"content":"comment"}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","key":{"component":"data2-core-primitives@String","params":{"content":"additionalInfo"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Additional Info"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Any additional info to be logged."}},"visibility":"public"}},{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","key":{"component":"data2-core-primitives@String","params":{"content":"returnValue"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Return Value"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Value that will be returned by the function."}},"visibility":"public"}}],"icon":{"component":"data2-core-primitives@String","params":{"content":"comment"}}},"component":"data2-core-types@ComponentParameter"},"toggleShouldOutput":{"params":{"icon":{"component":"data2-core-primitives@String","params":{"content":"toggle-off"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Turns on/off logging to console."}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Boolean","key":{"component":"data2-core-primitives@String","params":{"content":"shouldOutput"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Should Output"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Optional value to set shouldOutput to. Otherwise, it just toggle on/off."}}}}]},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@FieldSet"}},"updatedAt":"2024-03-07T20:05:25.993Z","createdAt":"2023-08-07T12:20:21.648Z"},{"_id":"632b6a785a870cfe32101bf8","component":"data2-core-types@Component","params":{"package":"data2-interface-services","component":"SpeechSynthesisService","icon":{"params":{"icon":"fa-volume-up"},"component":"data2-core-types@FontAwesomeIcon"},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"dimensions":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Dimensions"}},"category":"appearance","index":{"component":"data2-core-primitives@Number","params":{"content":101}},"simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"defaultValue":{"preventEvaluation":true,"params":{"width":300,"height":300},"component":"data2-core-types@Dimensions"},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"},"voice":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"oneOf":["Alex","Alice","Alva","Amelie","Anna","Carmit","Damayanti","Daniel","Diego","Ellen","Fiona","Fred","Ioana","Joana","Jorge","Juan","Kanya","Karen","Kyoko","Laura","Lekha","Luca","Luciana","Maged","Mariska","Mei-Jia","Melina","Milena","Moira","Monica","Nora","Paulina","Rishi","Samantha","Sara","Satu","Sin-ji","Tessa","Thomas","Ting-Ting","Veena","Victoria","Xander","Yelda","Yuna","Yuri","Zosia","Zuzana","Google Deutsch","Google US English","Google UK English Female","Google UK English Male","Google español","Google español de Estados Unidos","Google français","Google हिन्दी","Google Bahasa Indonesia","Google italiano","Google 日本語","Google 한국의","Google Nederlands","Google polski","Google português do Brasil","Google русский","Google 普通话（中国大陆）","Google 粤語（香港）","Google 國語（臺灣）"],"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"lang":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"oneOf":["ar-SA","cs-CZ","da-DK","de-DE","el-GR","en","en-AU","en-GB","en-IE","en-IN","en-US","en-ZA","es-AR","es-ES","es-MX","es-US","fi-FI","fr-CA","fr-FR","he-IL","hi-IN","hu-HU","id-ID","it-IT","ja-JP","ko-KR","nb-NO","nl-BE","nl-NL","pl-PL","pt-BR","pt-PT","ro-RO","ru-RU","sk-SK","sv-SE","th-TH","tr-TR","zh-CN","zh-HK","zh-TW"]},"component":"data2-core-types@ComponentParameter"}}}},"interactions":{"component":"data2-core-types@FieldSet","params":{"fields":{"cancel":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}}},"component":"data2-core-types@ComponentParameter"},"pause":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}}},"component":"data2-core-types@ComponentParameter"},"speak":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}}}]},"component":"data2-core-types@ComponentParameter"}}}},"visibility":"public","states":{"params":{},"component":"data2-core-types@FieldSet"}},"updatedAt":"2022-09-21T21:39:51.106Z"},{"_id":"6349a413c06fa8444e047f7a","component":"data2-core-types@Component","params":{"product":"ui","component":"Timer","package":"data2-interface-services","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"interval":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Interval to run onTick (in ms)"}}},"component":"data2-core-types@ComponentParameter"},"activeInBuilder":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}}},"component":"data2-core-types@ComponentParameter"},"onTick":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}}},"component":"data2-core-types@ComponentParameter"},"autoStart":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}}},"component":"data2-core-types@ComponentParameter"},"preventConcurrentExecution":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}}},"component":"data2-core-types@ComponentParameter"}}}},"icon":{"params":{"icon":"fa-clock-o"},"component":"data2-core-types@FontAwesomeIcon"},"interactions":{"params":{"fields":{"start":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}}},"stop":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}}}},"reset":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"index":{"component":"data2-core-primitives@Number","params":{"content":3}}}},"toggle":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"index":{"component":"data2-core-primitives@Number","params":{"content":4}}}}}},"component":"data2-core-types@FieldSet"}},"updatedAt":"2024-11-13T16:54:01.966Z"},{"_id":"67aea2591088ff6d51215d09","component":"data2-core-types@Component","params":{"component":"VoiceActivityRecorderService","package":"data2-interface-services","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{}}},"title":"VoiceActivityRecorderService","visibility":"private","interactions":{"start":{"params":{},"component":"data2-core-types@ComponentParameter"},"stop":{"params":{},"component":"data2-core-types@ComponentParameter"}}},"updatedAt":"2025-02-14T02:01:45.056Z","createdAt":"2025-02-14T01:54:33.951Z"},{"_id":"652dad65c10b43bc8fdc26d3","component":"data2-core-types@Component","params":{"component":"VoiceRecorderService","package":"data2-interface-services","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"dataset":{"params":{"component":"data2-core-types@InteractiveModuleReference","visibility":"public","index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"},"prop":{"params":{"component":"data2-core-user-interface@StateProp","visibility":"public","index":{"component":"data2-core-primitives@Number","params":{"content":2}}},"component":"data2-core-types@ComponentParameter"}}}},"interactions":{"params":{"fields":{"startRecording":{"params":{"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"stopRecording":{"params":{"visibility":"public"},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@FieldSet"},"icon":{"params":{"icon":"fa-microphone"},"component":"data2-core-types@FontAwesomeIcon"},"visibility":"public"},"updatedAt":"2024-09-08T22:54:15.398Z"},{"_id":"5f6b5d16a575399a451fd71d","component":"data2-core-types@Component","params":{"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"html@button","params":{"type":"button","children":[{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@EqualOrLesserThan","params":{"subject":{"component":"data2-core-functions@Count","params":{"subject":{"params":{"reference":"icon"},"component":"data2-core-types@Reference"}}},"comparisonSubject":0}}],"then":null,"else":{"component":"html@i","params":{"aria-hidden":"true","className":{"component":"data2-core-functions@StringConcat","params":{"portions":["fa fa-",{"component":"data2-core-types@Reference","params":{"reference":"icon"}}]}},"style":{"marginRight":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@EqualOrLesserThan","params":{"subject":{"component":"data2-core-functions@Count","params":{"subject":{"params":{"reference":"label"},"component":"data2-core-types@Reference"}}},"comparisonSubject":0}}],"then":0,"else":8}}}}}}},{"component":"data2-core-types@Reference","params":{"reference":"label"}}],"style":{"fontFamily":"inherit","background":"none","width":"100%","height":"100%","border":"none","cursor":"pointer","color":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"type"},"component":"data2-core-types@Reference"},"comparisonSubject":"secondary"}}],"then":{"params":{"field":"colors.color-2","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}},"component":"data2-core-types@PackageGetter"},"else":{"component":"data2-core-types@PackageGetter","params":{"field":"colors.primary","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}}}},"fontSize":{"params":{"reference":"super.textSize"},"component":"data2-core-types@Reference"},"textTransform":"uppercase"},"disabled":{"params":{"reference":"disabled"},"component":"data2-core-types@Reference"}}}}},"super":{"style":{"background":{"params":{"field":"colors.background-2","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}},"component":"data2-core-types@PackageGetter"},":hover":{"background":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"disabled"},"component":"data2-core-types@Reference"},"comparisonSubject":true}}],"then":{"component":"data2-core-functions@StringConcat","params":{"portions":[{"params":{"field":"colors.background-2","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}},"component":"data2-core-types@PackageGetter"}," !important"]}},"else":{"component":"data2-core-functions@StringConcat","params":{"portions":[{"params":{"field":"colors.background-3","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}},"component":"data2-core-types@PackageGetter"}," !important"]}}}}},"opacity":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"disabled"},"component":"data2-core-types@Reference"},"comparisonSubject":true}}],"then":0.5,"else":1}}},"font":{"component":"data2-core-types@PackageGetter","params":{"field":"font","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}},"shadow":{"component":"data2-core-types@PackageGetter","params":{"field":"gums.small","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}},"border":{"component":"data2-core-types@Border","params":{"color":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"type"},"component":"data2-core-types@Reference"},"comparisonSubject":"secondary"}}],"then":{"params":{"field":"colors.background-3","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}},"component":"data2-core-types@PackageGetter"},"else":{"component":"data2-core-types@PackageGetter","params":{"field":"colors.primary","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}}}},"radius":{"component":"data2-core-types@PackageGetter","params":{"field":"radius.r2","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}},"width":{"left":1,"top":1,"right":1,"bottom":1}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"icon":{"component":"data2-core-primitives@String"},"label":{"component":"data2-core-primitives@String"},"disabled":{"component":"data2-core-primitives@Boolean"},"type":{"component":"data2-core-primitives@String","oneOf":["primary","secondary"]},"packageReference":{"component":"data2-core-primitives@String"}}}},"component":"ButtonVirtualOld","package":"data2-porcelain","icon":"caret-square-o-right","extends":"data2-core-primitives@Block","visibility":"deprecated"}},{"_id":"5f82227ec8da12be8be3966f","component":"data2-core-types@Component","params":{"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"html@label","params":{"children":[{"component":"html@input","params":{"key":"checkbox","type":"checkbox","style":{"width":18,"height":18,"boxSizing":"border-box","background":{"params":{"reference":"super.fill"},"component":"data2-core-types@Reference"},"color":{"params":{"reference":"super.textColor"},"component":"data2-core-types@Reference"},"appearance":"none","border":"none","outline":"none","cursor":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"disabled"},"component":"data2-core-types@Reference"},"comparisonSubject":true}}],"then":"not-allowed","else":"auto"}}},"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"placeholder":{"component":"data2-core-logical-operators@Or","params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":"placeholder"}},{"component":"data2-core-types@Reference","params":{"reference":"field"}}]}},"checked":{"component":"data2-core-logical-operators@Or","params":{"components":[{"component":"data2-core-types@DataLinkGetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record"}}}},false]}},"onChange":{"component":"data2-core-types@DataLinkSetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record"}}}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"disabled":{"params":{"reference":"disabled"},"component":"data2-core-types@Reference"}}},{"component":"data2-porcelain@Label","params":{"key":"label","super":{"text":{"component":"data2-core-types@Reference","params":{"reference":"label"}},"style":{"marginLeft":10}},"packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}}],"style":{"display":"flex"}}}}},"super":{"fill":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"type"},"component":"data2-core-types@Reference"},"comparisonSubject":"button"}}],"then":{"component":"data2-core-types@PackageGetter","params":{"field":"colors.background-2","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}}}},"font":{"component":"data2-core-types@PackageGetter","params":{"field":"font","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}},"border":{"radius":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"type"},"component":"data2-core-types@Reference"},"comparisonSubject":"button"}}],"then":{"component":"data2-core-types@PackageGetter","params":{"field":"radius.r2","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}}}}},"shadow":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"type"},"component":"data2-core-types@Reference"},"comparisonSubject":"button"}}],"then":{"component":"data2-core-types@PackageGetter","params":{"field":"gums.small","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}}}},"style":{"display":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"type"},"component":"data2-core-types@Reference"},"comparisonSubject":"button"}}],"then":"flex"}},"alignItems":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"type"},"component":"data2-core-types@Reference"},"comparisonSubject":"button"}}],"then":"center"}},"justifyContent":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"type"},"component":"data2-core-types@Reference"},"comparisonSubject":"button"}}],"then":"center"}},"opacity":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"disabled"},"component":"data2-core-types@Reference"},"comparisonSubject":true}}],"then":0.38,"else":1}}," input[type=\"checkbox\"]":{"position":"relative","cursor":"pointer"}," input[type=\"checkbox\"]:before":{"content":" ","display":"block","position":"absolute","width":14,"height":14,"top":0,"left":0,"border":"2px solid","borderColor":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"component":"data2-core-types@PackageGetter","params":{"field":"mode","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}},"comparisonSubject":"dark"}}],"then":{"component":"data2-core-types@PackageGetter","params":{"field":"colors.white-60","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}},"else":{"component":"data2-core-types@PackageGetter","params":{"field":"colors.black-20","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}}}},"borderRadius":2}," input[type=\"checkbox\"]:checked:before":{"border":"2px solid","borderColor":{"component":"data2-core-types@PackageGetter","params":{"field":"colors.primary","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}},"backgroundColor":{"component":"data2-core-types@PackageGetter","params":{"field":"colors.primary","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}}}," input[type=\"checkbox\"]:checked:after":{"content":" ","display":"block","width":5,"height":10,"borderStyle":"solid","borderColor":{"component":"data2-core-types@PackageGetter","params":{"field":"colors.white","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}},"borderWidth":"0 2px 2px 0","transform":"rotate(45deg)","position":"absolute","top":2,"left":6}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"dataset":{"component":"data2-core-types@DataSetReference"},"field":{"component":"data2-core-types@DataSetColumnReference"},"record":{"component":"data2-core-types@Reference"},"label":{"component":"data2-core-primitives@String"},"disabled":{"component":"data2-core-primitives@Boolean"},"type":{"component":"data2-core-primitives@String","oneOf":["normal","button"]},"packageReference":{"component":"data2-core-primitives@String"}}}},"component":"Checkbox","package":"data2-porcelain","icon":"check-square-o","extends":"data2-core-primitives@Block","visibility":"deprecated"}},{"_id":"5f8733a0c8da12be8b7910f8","component":"data2-core-types@Component","params":{"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"html@div","params":{"children":[{"component":"html@input","params":{"key":"input","type":{"component":"data2-core-types@Reference","params":{"reference":"type"}},"style":{"width":"100%","height":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"variation"},"component":"data2-core-types@Reference"},"comparisonSubject":"underlinedLabelAside"}}],"then":"calc(100% - 12px)","else":"100%"}},"minWidth":0,"boxSizing":"border-box","color":{"component":"data2-core-types@PackageGetter","params":{"field":"colors.color-2","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}},"position":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"variation"},"component":"data2-core-types@Reference"},"comparisonSubject":"underlinedLabelAside"}}],"else":"absolute"}},"background":"none","appearance":"none","border":"none","borderBottom":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"variation"},"component":"data2-core-types@Reference"},"comparisonSubject":"underlinedLabelAside"}}],"then":{"component":"data2-core-functions@StringConcat","params":{"portions":["solid 2px ",{"component":"data2-core-types@PackageGetter","params":{"field":"colors.background-4","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}}]}},"else":"none"}},"outline":"none","padding":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"variation"},"component":"data2-core-types@Reference"},"comparisonSubject":"outlined"}}],"then":"0 0 0 1rem","else":0}},"paddingTop":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"variation"},"component":"data2-core-types@Reference"},"comparisonSubject":"underlinedLabelAside"}}],"then":"12px"}},"cursor":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"disabled"},"component":"data2-core-types@Reference"},"comparisonSubject":true}}],"then":"not-allowed","else":"auto"}}},"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"value":{"component":"data2-core-types@DataLinkGetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record"}}}},"onChange":{"component":"data2-core-types@DataLinkSetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record"}}}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"disabled":{"params":{"reference":"disabled"},"component":"data2-core-types@Reference"}}},{"component":"html@label","params":{"key":"label","children":{"component":"data2-core-logical-operators@Or","params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":"label"}},{"component":"data2-core-types@Reference","params":{"reference":"field"}}]}},"style":{"fontFamily":"inherit","top":0,"left":0,"position":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"variation"},"component":"data2-core-types@Reference"},"comparisonSubject":"underlinedLabelAside"}}],"else":"absolute"}},"zIndex":1,"color":{"component":"data2-core-types@PackageGetter","params":{"field":"colors.color-5","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}},"marginRight":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"variation"},"component":"data2-core-types@Reference"},"comparisonSubject":"underlinedLabelAside"}}],"then":8,"else":0}},"pointerEvents":"none","transition":"color 200ms cubic-bezier(0.0, 0, 0.2, 1) 0ms,transform 200ms cubic-bezier(0.0, 0, 0.2, 1) 0ms","transform":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-logical-operators@Or","params":{"components":[{"component":"data2-core-comparison-operators@EqualOrLesserThan","params":{"subject":{"component":"data2-core-functions@Count","params":{"subject":{"component":"data2-core-types@DataLinkGetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record"}}}}}},"comparisonSubject":0}},{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"variation"},"component":"data2-core-types@Reference"},"comparisonSubject":"underlinedLabelAside"}}]}}],"then":{"component":"data2-core-functions@StringConcat","params":{"portions":["translate(",{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"variation"},"component":"data2-core-types@Reference"},"comparisonSubject":"outlined"}}],"then":16,"else":0}},"px, calc(",{"component":"data2-core-types@Reference","params":{"reference":"super.dimensions.height"}},"px / 2 - 10px)) scale(1)"]}},"else":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"variation"},"component":"data2-core-types@Reference"},"comparisonSubject":"outlined"}}],"then":"translate(8px, -2px) scale(0.75)","else":"translate(-6px, -2px) scale(0.75)"}}}}}}},{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"variation"},"component":"data2-core-types@Reference"},"comparisonSubject":"underlinedLabelAside"}}],"then":null,"else":{"component":"html@fieldset","params":{"style":{"boxSizing":"border-box","width":"100%","height":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"variation"},"component":"data2-core-types@Reference"},"comparisonSubject":"outlined"}}],"then":"100%","else":"calc(100% - 12px)"}},"padding":"0 8px","overflow":"hidden","position":"absolute","borderStyle":"solid","borderWidth":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"variation"},"component":"data2-core-types@Reference"},"comparisonSubject":"outlined"}}],"then":1,"else":"0 0 2px"}},"borderRadius":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"variation"},"component":"data2-core-types@Reference"},"comparisonSubject":"outlined"}}],"then":2,"else":0}},"transition":"border-color 200ms cubic-bezier(0.0, 0, 0.2, 1) 0ms","borderColor":{"component":"data2-core-types@PackageGetter","params":{"field":"colors.background-4","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}},"pointerEvents":"none","margin":0},"children":{"component":"html@legend","params":{"style":{"display":"block","visibility":"hidden","fontSize":"0.75em","textAlign":"left","width":"auto","transition":"max-width 50ms cubic-bezier(0.0, 0, 0.2, 1) 0ms","padding":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@EqualOrLesserThan","params":{"subject":{"component":"data2-core-functions@Count","params":{"subject":{"component":"data2-core-types@DataLinkGetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record"}}}}}},"comparisonSubject":0}}],"then":0,"else":"0 5px"}},"maxWidth":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@EqualOrLesserThan","params":{"subject":{"component":"data2-core-functions@Count","params":{"subject":{"component":"data2-core-types@DataLinkGetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record"}}}}}},"comparisonSubject":0}}],"then":0}}},"children":{"component":"data2-core-logical-operators@Or","params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":"label"}},{"component":"data2-core-types@Reference","params":{"reference":"field"}}]}}}}}}}}],"style":{"position":"relative","width":"100%","height":"100%","display":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"variation"},"component":"data2-core-types@Reference"},"comparisonSubject":"underlinedLabelAside"}}],"then":"flex"}},"flexDirection":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"variation"},"component":"data2-core-types@Reference"},"comparisonSubject":"underlinedLabelAside"}}],"then":"row-reverse"}}}}}}},"super":{"font":{"component":"data2-core-types@PackageGetter","params":{"field":"font","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}},"style":{" input:hover ~ fieldset":{"borderColor":{"component":"data2-core-functions@StringConcat","params":{"portions":[{"component":"data2-core-types@PackageGetter","params":{"field":"colors.background-5","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}}," !important"]}}}," input:hover ~ label":{"color":{"component":"data2-core-functions@StringConcat","params":{"portions":[{"component":"data2-core-types@PackageGetter","params":{"field":"colors.color-2","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}}," !important"]}}}," input:hover":{"borderBottomColor":{"component":"data2-core-functions@StringConcat","params":{"portions":[{"component":"data2-core-types@PackageGetter","params":{"field":"colors.background-5","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}}," !important"]}}}," input:focus":{"borderBottomColor":{"component":"data2-core-functions@StringConcat","params":{"portions":[{"component":"data2-core-types@PackageGetter","params":{"field":"colors.primary","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}}," !important"]}}}," input:focus ~ fieldset":{"borderColor":{"component":"data2-core-functions@StringConcat","params":{"portions":[{"component":"data2-core-types@PackageGetter","params":{"field":"colors.primary","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}}," !important"]}}}," input:focus ~ label":{"color":{"component":"data2-core-functions@StringConcat","params":{"portions":[{"component":"data2-core-types@PackageGetter","params":{"field":"colors.primary","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}}," !important"]}},"transform":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"variation"},"component":"data2-core-types@Reference"},"comparisonSubject":"underlinedLabelAside"}}],"else":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"variation"},"component":"data2-core-types@Reference"},"comparisonSubject":"outlined"}}],"then":"translate(8px, -2px) scale(0.75) !important","else":"translate(-6px, -2px) scale(0.75) !important"}}}}}," input:focus ~ fieldset > legend":{"maxWidth":"99999px !important","padding":"0 5px !important"},"opacity":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"disabled"},"component":"data2-core-types@Reference"},"comparisonSubject":true}}],"then":0.38,"else":1}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"variation":{"component":"data2-core-primitives@String","oneOf":["outlined","underlined","underlinedLabelAside"]},"dataset":{"component":"data2-core-types@DataSetReference"},"field":{"component":"data2-core-types@DataSetColumnReference"},"record":{"component":"data2-core-types@Reference"},"label":{"component":"data2-core-primitives@String"},"disabled":{"component":"data2-core-primitives@Boolean"},"type":{"component":"data2-core-primitives@String","oneOf":["text","password","number","email"]},"packageReference":{"component":"data2-core-primitives@String"}}}},"component":"Input","package":"data2-porcelain","icon":"keyboard-o","extends":"data2-core-primitives@Block","visibility":"deprecated"},"updatedAt":"2020-10-14T17:22:35.179Z","createdAt":"2020-10-14T17:22:35.179Z"},{"_id":"5f81b34bc8da12be8bbf3075","component":"data2-core-types@Component","params":{"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":null}},"super":{"border":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@EqualOrLesserThan","params":{"subject":{"component":"data2-core-functions@Count","params":{"subject":{"params":{"reference":"background"},"component":"data2-core-types@Reference"}}},"comparisonSubject":0}}],"else":{"component":"data2-core-types@Border","params":{"radius":{"component":"data2-core-types@PackageGetter","params":{"field":"radius.r3","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}}}}}},"font":{"component":"data2-core-types@PackageGetter","params":{"field":"font","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}},"fill":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@EqualOrLesserThan","params":{"subject":{"component":"data2-core-functions@Count","params":{"subject":{"params":{"reference":"background"},"component":"data2-core-types@Reference"}}},"comparisonSubject":0}}],"else":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"background"},"component":"data2-core-types@Reference"},"comparisonSubject":"faded"}}],"then":{"params":{"field":"colors.background-4","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}},"component":"data2-core-types@PackageGetter"},"else":{"params":{"field":"colors.primary","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}},"component":"data2-core-types@PackageGetter"}}}}},"style":{"padding":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@EqualOrLesserThan","params":{"subject":{"component":"data2-core-functions@Count","params":{"subject":{"params":{"reference":"background"},"component":"data2-core-types@Reference"}}},"comparisonSubject":0}}],"else":".25rem .5rem"}}},"textColor":{"params":{"field":"colors.color-2","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}},"component":"data2-core-types@PackageGetter"}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"background":{"component":"data2-core-primitives@String","oneOf":["primary","faded"]},"packageReference":{"component":"data2-core-primitives@String"}}}},"component":"Label","package":"data2-porcelain","icon":"tag","extends":"data2-core-primitives@Block","visibility":"deprecated"}},{"_id":"5f8ef794c8da12be8b43934b","component":"data2-core-types@Component","params":{"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"html@label","params":{"children":[{"component":"html@input","params":{"key":"input","type":"radio","style":{"width":18,"height":18,"boxSizing":"border-box","background":{"params":{"reference":"super.fill"},"component":"data2-core-types@Reference"},"color":{"params":{"reference":"super.textColor"},"component":"data2-core-types@Reference"},"appearance":"none","border":"none","outline":"none","cursor":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"disabled"},"component":"data2-core-types@Reference"},"comparisonSubject":true}}],"then":"not-allowed","else":"auto"}}},"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"placeholder":{"component":"data2-core-logical-operators@Or","params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":"placeholder"}},{"component":"data2-core-types@Reference","params":{"reference":"field"}}]}},"value":{"component":"data2-core-types@Reference","params":{"reference":"value"}},"name":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"checked":{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"component":"data2-core-types@DataLinkGetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record"}}}},"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":"value"}}}},"onChange":{"component":"data2-core-types@DataLinkSetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record"}}}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"disabled":{"params":{"reference":"disabled"},"component":"data2-core-types@Reference"}}},{"component":"data2-porcelain@Label","params":{"key":"label","super":{"style":{"marginLeft":10},"text":{"component":"data2-core-types@Reference","params":{"reference":"label"}}},"packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}}],"style":{"display":"flex"}}}}},"super":{"fill":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"type"},"component":"data2-core-types@Reference"},"comparisonSubject":"button"}}],"then":{"component":"data2-core-types@PackageGetter","params":{"field":"colors.background-2","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}}}},"font":{"component":"data2-core-types@PackageGetter","params":{"field":"font","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}},"border":{"radius":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"type"},"component":"data2-core-types@Reference"},"comparisonSubject":"button"}}],"then":{"component":"data2-core-types@PackageGetter","params":{"field":"radius.r2","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}}}}},"shadow":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"type"},"component":"data2-core-types@Reference"},"comparisonSubject":"button"}}],"then":{"component":"data2-core-types@PackageGetter","params":{"field":"gums.small","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}}}},"style":{"display":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"type"},"component":"data2-core-types@Reference"},"comparisonSubject":"button"}}],"then":"flex"}},"alignItems":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"type"},"component":"data2-core-types@Reference"},"comparisonSubject":"button"}}],"then":"center"}},"justifyContent":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"type"},"component":"data2-core-types@Reference"},"comparisonSubject":"button"}}],"then":"center"}},"opacity":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"params":{"reference":"disabled"},"component":"data2-core-types@Reference"},"comparisonSubject":true}}],"then":0.38,"else":1}}," input[type=\"radio\"]":{"position":"relative","cursor":"pointer"}," input[type=\"radio\"]:before":{"content":" ","display":"block","position":"absolute","width":18,"height":18,"top":0,"left":0,"boxSizing":"border-box","border":"2px solid","borderColor":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"component":"data2-core-types@PackageGetter","params":{"field":"mode","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}},"comparisonSubject":"dark"}}],"then":{"component":"data2-core-types@PackageGetter","params":{"field":"colors.white-60","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}},"else":{"component":"data2-core-types@PackageGetter","params":{"field":"colors.black-20","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}}}},"borderRadius":"100%"}," input[type=\"radio\"]:checked:before":{"border":"2px solid","borderColor":{"component":"data2-core-types@PackageGetter","params":{"field":"colors.primary","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}}}," input[type=\"radio\"]:checked:after":{"content":" ","display":"block","width":6,"height":6,"backgroundColor":{"component":"data2-core-types@PackageGetter","params":{"field":"colors.primary","packageReference":{"component":"data2-core-types@Reference","params":{"reference":"packageReference"}}}},"borderRadius":"100%","position":"absolute","top":6,"left":6}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"dataset":{"component":"data2-core-types@DataSetReference"},"field":{"component":"data2-core-types@DataSetColumnReference"},"record":{"component":"data2-core-types@Reference"},"label":{"component":"data2-core-primitives@String"},"value":{"component":"data2-core-primitives@String"},"disabled":{"component":"data2-core-primitives@Boolean"},"type":{"component":"data2-core-primitives@String","oneOf":["normal","button"]},"packageReference":{"component":"data2-core-primitives@String"}}}},"component":"Radio","package":"data2-porcelain","icon":"dot-circle-o","extends":"data2-core-primitives@Block","visibility":"deprecated"},"updatedAt":"2020-10-21T18:17:15.342Z","createdAt":"2020-10-20T14:43:56.921Z"},{"_id":"693aed79da7df2f2d94426c2","component":"data2-core-types@Component","params":{"component":"Preset","package":"data2-presets","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"constructType":{"params":{},"component":"data2-core-types@ComponentParameter"},"params":{"params":{},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2025-12-11T16:12:41.748Z","createdAt":"2025-12-11T16:12:41.748Z"},{"_id":"67ead981f5b5deb2f8ba1f01","component":"data2-core-types@Component","params":{"product":"rush","package":"data2-rush","component":"EmailListener","icon":"envelope","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"handler":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Handler"}},"icon":{"params":{"icon":"fa-play-circle-o"},"component":"data2-core-types@FontAwesomeIcon"},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-flow@Series"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Actions that are executed by the listener. The following parameters are accessible by using Reference: `body`, `headers`, `query` and `method`."}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}}},"component":"data2-core-types@ComponentParameter"},"attachmentsDrive":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-types@DriveReference","key":{"component":"data2-core-primitives@String","params":{"content":"attachmentsDrive"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Attachments Drive"}},"description":{"component":"data2-core-primitives@String","params":{"content":"This parameter is used to save the emails' attachments. It should be auto-populated when the listener is created."}},"visibility":"private","defaultValue":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DriveReference"}},"params":{"reference":{"params":{"portions":[{"component":"data2-core-primitives@String","params":{"content":"d2-rush-email-drive--"}},{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"reference"}}}}]},"component":"data2-core-functions@StringConcat"}}},"component":"data2-core-types@ComponentDefinition"}}},"insertLogsDataSet":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-types@DataSetReference","key":{"component":"data2-core-primitives@String","params":{"content":"insertLogsDataSet"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Insert Logs DataSet"}},"description":{"component":"data2-core-primitives@String","params":{"content":"This parameter is used to save the execution logs. It should be auto-populated when the listener is created."}},"visibility":"private","defaultValue":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetReference"}},"params":{"reference":{"params":{"portions":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"reference"}}}},{"component":"data2-core-primitives@String","params":{"content":"LogInsertDataSet"}}]},"component":"data2-core-functions@StringConcat"}}},"component":"data2-core-types@ComponentDefinition"}}},"readLogsDataSet":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-types@DataSetReference","key":{"component":"data2-core-primitives@String","params":{"content":"readLogsDataSet"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Read Logs DataSet"}},"description":{"component":"data2-core-primitives@String","params":{"content":"This parameter is used by the renderable to show the listener execution logs. It should be auto-populated when the listener is created."}},"visibility":"private","defaultValue":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetReference"}},"params":{"reference":{"params":{"portions":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"reference"}}}},{"component":"data2-core-primitives@String","params":{"content":"LogReadDataSet"}}]},"component":"data2-core-functions@StringConcat"}}},"component":"data2-core-types@ComponentDefinition"}}},"enableExecutionLogs":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Boolean","key":{"component":"data2-core-primitives@String","params":{"content":"enableExecutionLogs"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Enable Execution Logs"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Controls whether the listener will save execution logs."}},"visibility":"public","index":{"component":"data2-core-primitives@Number","params":{"content":1}},"unversioned":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"defaultValue":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}}},"emailAliases":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","key":{"component":"data2-core-primitives@String","params":{"content":"emailAliases"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Email aliases"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Custom email names that route to this handler, like support@yourdomain.data2.email. Must be unique, otherwise conflicts may happen."}},"saveCompiled":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"unversioned":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"fieldValidation":{"disabled":true,"component":"data2-core-functions@Function","params":{}},"visibility":"public"}}}}},"inlineParamsControl":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"renderable":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768,"exactWidth":1366,"exactHeight":768}}}},"updatedAt":"2025-04-03T17:43:37.182Z","createdAt":"2025-03-31T17:59:15.868Z"},{"_id":"69ce863ef957ff92d9be5caf","component":"data2-core-types@Component","params":{"package":"data2-rush","component":"Emit","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"payload":{"params":{"component":"data2-core-types@FieldSet"},"component":"data2-core-types@ComponentParameter"}}}},"title":{"component":"data2-core-primitives@String","params":{"content":"Emit"}},"visibility":"private"},"updatedAt":"2026-04-02T15:06:25.909Z","createdAt":"2026-04-02T15:06:25.909Z"},{"_id":"643d76777d0ae595851a3b3a","component":"data2-core-types@Component","params":{"product":"rush","package":"data2-rush","component":"HTTPListener","icon":"globe","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"handler":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Handler"}},"icon":{"params":{"icon":"fa-play-circle-o"},"component":"data2-core-types@FontAwesomeIcon"},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-flow@Series"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Actions that are executed by the listener. The following parameters are accessible by using Reference: `body`, `headers`, `query` and `method`."}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}}},"component":"data2-core-types@ComponentParameter"},"insertLogsDataSet":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-types@DataSetReference","key":{"component":"data2-core-primitives@String","params":{"content":"insertLogsDataSet"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Insert Logs DataSet"}},"description":{"component":"data2-core-primitives@String","params":{"content":"This parameter is used to save the execution logs. It should be auto-populated when the listener is created."}},"visibility":"private","defaultValue":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetReference"}},"params":{"reference":{"params":{"portions":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"reference"}}}},{"component":"data2-core-primitives@String","params":{"content":"LogInsertDataSet"}}]},"component":"data2-core-functions@StringConcat"}}},"component":"data2-core-types@ComponentDefinition"}}},"readLogsDataSet":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-types@DataSetReference","key":{"component":"data2-core-primitives@String","params":{"content":"readLogsDataSet"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Read Logs DataSet"}},"description":{"component":"data2-core-primitives@String","params":{"content":"This parameter is used by the renderable to show the listener execution logs. It should be auto-populated when the listener is created."}},"visibility":"private","defaultValue":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetReference"}},"params":{"reference":{"params":{"portions":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"reference"}}}},{"component":"data2-core-primitives@String","params":{"content":"LogReadDataSet"}}]},"component":"data2-core-functions@StringConcat"}}},"component":"data2-core-types@ComponentDefinition"}}},"enableExecutionLogs":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Boolean","key":{"component":"data2-core-primitives@String","params":{"content":"enableExecutionLogs"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Enable Execution Logs"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Controls whether the listener will save execution logs."}},"visibility":"public","index":{"component":"data2-core-primitives@Number","params":{"content":1}},"unversioned":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"defaultValue":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}}},"shouldLogRequestBody":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Boolean","key":{"component":"data2-core-primitives@String","params":{"content":"shouldLogRequestBody"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Should Log Request Body"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Controls whether the body will be recorded."}},"visibility":"public","flat":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"shouldShow":{"component":"data2-core-primitives@Boolean","params":{"content":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"enableExecutionLogs"}}},"component":"data2-core-types@Reference"}},"break":true,"preventEvaluation":true},"index":{"component":"data2-core-primitives@Number","params":{"content":10}},"defaultValue":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}}},"shouldLogRequestHeaders":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Boolean","key":{"component":"data2-core-primitives@String","params":{"content":"shouldLogRequestHeaders"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Should Log Request Headers"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Controls whether the request headers will be recorded."}},"visibility":"public","flat":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"shouldShow":{"component":"data2-core-primitives@Boolean","params":{"content":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"enableExecutionLogs"}}},"component":"data2-core-types@Reference"}},"break":true,"preventEvaluation":true},"index":{"component":"data2-core-primitives@Number","params":{"content":20}}}},"omitHeaders":{"component":"data2-core-types@ComponentParameter","params":{"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"component":"data2-core-primitives@String","key":{"component":"data2-core-primitives@String","params":{"content":"omitHeaders"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Omit Headers"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Headers to be omitted from the request when logging. The headers are all lower case"}},"defaultValue":[{"component":"data2-core-primitives@String","params":{"content":"authorization"}}],"index":{"component":"data2-core-primitives@Number","params":{"content":21}},"visibility":"public","shouldShow":{"component":"data2-core-primitives@Boolean","params":{"content":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"shouldLogRequestHeaders"}}},"component":"data2-core-types@Reference"}},"preventEvaluation":true,"break":true}}},"omitBodyKeys":{"component":"data2-core-types@ComponentParameter","params":{"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"component":"data2-core-primitives@String","key":{"component":"data2-core-primitives@String","params":{"content":"omitBodyKeys"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Omit Body Keys"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Keys to be omitted from the request body when logging."}},"index":{"component":"data2-core-primitives@Number","params":{"content":11}},"shouldShow":{"component":"data2-core-primitives@Boolean","params":{"content":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"shouldLogRequestBody"}}},"component":"data2-core-types@Reference"}},"preventEvaluation":true,"break":true},"visibility":"public"}},"policies":{"params":{"component":"data2-core-auth@Policy","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"visibility":"public","index":{"component":"data2-core-primitives@Number","params":{"content":0.1}}},"component":"data2-core-types@ComponentParameter"},"rawResponse":{"params":{"component":"data2-core-primitives@Boolean","visibility":"public","index":{"component":"data2-core-primitives@Number","params":{"content":999}},"description":{"component":"data2-core-primitives@String","params":{"content":"Raw Response HTTP Listeners expects an object with the keys content and headers at the end of the handler.\n\n{\n  \"content\" : \"xxx\",\n  \"headers\": {\n    \"Content-Type\":\"application/json\"\n  }\n}"}}},"component":"data2-core-types@ComponentParameter"}}}},"inlineParamsControl":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"renderable":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768,"exactWidth":1366,"exactHeight":768}}},"interactions":{"params":{"fields":{"invoke":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-functions@Function","description":{"component":"data2-core-primitives@String","params":{"content":"Invokes remote listener"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"params"}},"flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"body":{"params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"body"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"},"headers":{"params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"headers"}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}}},"component":"data2-core-types@ComponentParameter"}}}}],"visibility":"public"}},"invokeWithUpdates":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-functions@Function","description":{"component":"data2-core-primitives@String","params":{"content":"Invokes remote listener with updates"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"params"}},"flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"body":{"params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"body"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"},"headers":{"params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"headers"}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}}},"component":"data2-core-types@ComponentParameter"}},"defaultValue":{"component":"data2-core-types@FieldSet","params":{"fields":{}}}}},{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-functions@Function"}},"title":{"component":"data2-core-primitives@String","params":{"content":"onUpdate"}},"arguments":[{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"title":{"component":"data2-core-primitives@String","params":{"content":"data"}},"defaultValue":{"component":"data2-core-primitives@String","params":{"content":"data"}}},"component":"data2-core-types@ComponentParameter"}],"defaultValue":{"preventEvaluation":true,"disabled":false,"component":"data2-core-functions@Function","params":{"body":{"params":{"actions":[]},"component":"data2-core-flow@Series"},"parameters":[{"component":"data2-core-primitives@String","params":{"content":"data"}}]}}},"component":"data2-core-types@ComponentParameter"}],"visibility":"private"}}}},"component":"data2-core-types@FieldSet"}},"updatedAt":"2026-04-02T20:20:33.295Z","createdAt":"2023-04-17T16:38:44.391Z"},{"_id":"629961b6124771821a084a3f","component":"data2-core-types@Component","params":{"package":"data2-rush","component":"Listener","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"position":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Position"}},"category":"appearance","simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"},"dimensions":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Dimensions"}},"category":"appearance","simple":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}},"defaultValue":{"preventEvaluation":true,"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768}},"visibility":"deprecated"},"component":"data2-core-types@ComponentParameter"}}}},"title":{"component":"data2-core-primitives@String","params":{"content":"Listener"}},"icon":"microphone","visibility":"private","interactions":{"params":{"fields":{"exec":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"icon":{"component":"data2-core-primitives@String","params":{"content":"cart-plus"}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@FieldSet"}},"updatedAt":"2022-07-06T22:40:03.830Z"},{"_id":"6877ef4b8581eedc3b65c764","component":"data2-core-types@Component","params":{"component":"PhoneListener","package":"data2-rush","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"handler":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Handler"}},"icon":{"params":{"icon":"fa-play-circle-o"},"component":"data2-core-types@FontAwesomeIcon"},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-flow@Series"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Actions that are executed by the listener. The following parameters are accessible by using Reference: `body`, `headers`, `query` and `method`."}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}}},"component":"data2-core-types@ComponentParameter"},"attachmentsDrive":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-types@DriveReference","key":{"component":"data2-core-primitives@String","params":{"content":"attachmentsDrive"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Attachments Drive"}},"description":{"component":"data2-core-primitives@String","params":{"content":"This parameter is used to save the emails' attachments. It should be auto-populated when the listener is created."}},"visibility":"private","defaultValue":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DriveReference"}},"params":{"reference":{"params":{"portions":[{"component":"data2-core-primitives@String","params":{"content":"d2-rush-email-drive--"}},{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"reference"}}}}]},"component":"data2-core-functions@StringConcat"}}},"component":"data2-core-types@ComponentDefinition"}}},"insertLogsDataSet":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-types@DataSetReference","key":{"component":"data2-core-primitives@String","params":{"content":"insertLogsDataSet"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Insert Logs DataSet"}},"description":{"component":"data2-core-primitives@String","params":{"content":"This parameter is used to save the execution logs. It should be auto-populated when the listener is created."}},"visibility":"private","defaultValue":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetReference"}},"params":{"reference":{"params":{"portions":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"reference"}}}},{"component":"data2-core-primitives@String","params":{"content":"LogInsertDataSet"}}]},"component":"data2-core-functions@StringConcat"}}},"component":"data2-core-types@ComponentDefinition"}}},"readLogsDataSet":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-types@DataSetReference","key":{"component":"data2-core-primitives@String","params":{"content":"readLogsDataSet"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Read Logs DataSet"}},"description":{"component":"data2-core-primitives@String","params":{"content":"This parameter is used by the renderable to show the listener execution logs. It should be auto-populated when the listener is created."}},"visibility":"private","defaultValue":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetReference"}},"params":{"reference":{"params":{"portions":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"reference"}}}},{"component":"data2-core-primitives@String","params":{"content":"LogReadDataSet"}}]},"component":"data2-core-functions@StringConcat"}}},"component":"data2-core-types@ComponentDefinition"}}},"enableExecutionLogs":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Boolean","key":{"component":"data2-core-primitives@String","params":{"content":"enableExecutionLogs"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Enable Execution Logs"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Controls whether the listener will save execution logs."}},"visibility":"public","index":{"component":"data2-core-primitives@Number","params":{"content":1}},"unversioned":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"defaultValue":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}}},"emailAliases":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","key":{"component":"data2-core-primitives@String","params":{"content":"emailAliases"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Email aliases"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Custom email names that route to this handler, like support@yourdomain.data2.email. Must be unique, otherwise conflicts may happen."}},"saveCompiled":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"unversioned":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"fieldValidation":{"disabled":true,"component":"data2-core-functions@Function","params":{}},"visibility":"public"}}}}},"inlineParamsControl":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"icon":{"component":"data2-core-primitives@String","params":{"content":"phone"}},"product":"rush","renderable":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768,"exactWidth":1366,"exactHeight":768}}},"interactions":{"sendDTMF":{"component":"data2-core-types@ComponentDefinition","params":{"params":{"sequence":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"},"digitInterval":{"params":{"component":"data2-core-primitives@Number"},"component":"data2-core-types@ComponentParameter"},"digitDuration":{"params":{"component":"data2-core-primitives@Number"},"component":"data2-core-types@ComponentParameter"},"method":{"params":{"component":"data2-core-primitives@String","oneOf":[{"params":{"content":"rfc2833"},"component":"data2-core-primitives@String"},{"params":{"content":"audio"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"},"callId":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"}}}},"hangup":{"component":"data2-core-types@ComponentDefinition","params":{"params":{"callId":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"}}}}}},"updatedAt":"2025-08-16T20:16:23.118Z","createdAt":"2025-07-16T18:28:27.757Z"},{"_id":"656518306640ab0923bd8bc7","component":"data2-core-types@Component","params":{"component":"Response","package":"data2-rush","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"statusCode":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Number","key":{"component":"data2-core-primitives@String","params":{"content":"statusCode"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Status Code"}},"description":{"component":"data2-core-primitives@String","params":{"content":"HTTP status code number."}}}},"data":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-types@FieldSet","key":{"component":"data2-core-primitives@String","params":{"content":"data"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Data"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Response body."}}}},"headers":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-types@FieldSet","key":{"component":"data2-core-primitives@String","params":{"content":"headers"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Headers"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Response headers."}}}}}}},"title":"Response","description":{"component":"data2-core-primitives@String","params":{"content":"Response object for usage with Rush HTTP Listener. Can be used for an early response return."}},"visibility":"public"},"updatedAt":"2023-12-12T21:00:03.992Z","createdAt":"2023-11-27T22:29:04.286Z"},{"_id":"63ee67b1316bab28ad81a790","component":"data2-core-types@Component","params":{"package":"data2-rush","component":"Schedule","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"content":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}},"component":"data2-core-types@ComponentParameter"}}}},"title":{"component":"data2-core-primitives@String","params":{"content":"Schedule"}},"icon":"clock-o"},"updatedAt":"2022-07-06T22:40:03.830Z"},{"_id":"65cd210b3ad594d4f1b110db","component":"data2-core-types@Component","params":{"package":"data2-rush","component":"ScheduleTimezone","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"content":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"defaultValue":{"params":{"module":{"params":{"module":{"params":{"module":{"params":{"module":{"params":{},"component":"data2-core-web@Window"},"prop":{"component":"data2-core-primitives@String","params":{"content":"Intl"}}},"component":"data2-core-types@Getter"},"prop":{"component":"data2-core-primitives@String","params":{"content":"DateTimeFormat"}}},"component":"data2-core-types@Getter"},"prop":{"component":"data2-core-primitives@String","params":{"content":"resolvedOptions"}}},"component":"data2-core-types@Getter"},"prop":{"component":"data2-core-primitives@String","params":{"content":"timeZone"}}},"component":"data2-core-types@Getter"}},"component":"data2-core-types@ComponentParameter"}}}},"title":{"component":"data2-core-primitives@String","params":{"content":"ScheduleTimezone"}},"icon":"globe","visibility":"private"},"updatedAt":"2024-02-14T20:46:26.569Z"},{"_id":"64406b957d0ae595855ce209","component":"data2-core-types@Component","params":{"product":"rush","package":"data2-rush","component":"Scheduler","icon":"clock-o","visibility":"public","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"action":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Action"}},"icon":{"params":{"icon":"fa-play-circle-o"},"component":"data2-core-types@FontAwesomeIcon"},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-flow@Series"}},"index":1},"component":"data2-core-types@ComponentParameter"},"enabled":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Enabled"}},"icon":{"params":{"icon":"fa-play-circle-o"},"component":"data2-core-types@FontAwesomeIcon"},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"index":2,"unversioned":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"schedule":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Schedule"}},"icon":{"params":{"icon":"fa-play-circle-o"},"component":"data2-core-types@FontAwesomeIcon"},"component":"data2-rush@Schedule","index":10,"unversioned":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"scheduleTimezone":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Timezone"}},"icon":{"params":{"icon":"fa-play-circle-o"},"component":"data2-core-types@FontAwesomeIcon"},"index":11,"unversioned":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"component":"data2-rush@ScheduleTimezone"},"component":"data2-core-types@ComponentParameter"},"startDate":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Start Date"}},"icon":{"params":{"icon":"fa-play-circle-o"},"component":"data2-core-types@FontAwesomeIcon"},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Date"}},"index":99,"unversioned":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"endDate":{"params":{"title":{"component":"data2-core-primitives@String","params":{"content":"End Date"}},"icon":{"params":{"icon":"fa-play-circle-o"},"component":"data2-core-types@FontAwesomeIcon"},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Date"}},"index":100,"unversioned":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},"insertLogsDataSet":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-types@DataSetReference","key":{"component":"data2-core-primitives@String","params":{"content":"insertLogsDataSet"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Insert Logs DataSet"}},"description":{"component":"data2-core-primitives@String","params":{"content":"This parameter is used to save the execution logs. It should be auto-populated when the listener is created."}},"visibility":"private","defaultValue":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetReference"}},"params":{"reference":{"params":{"portions":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"reference"}}}},{"component":"data2-core-primitives@String","params":{"content":"LogInsertDataSet"}}]},"component":"data2-core-functions@StringConcat"}}},"component":"data2-core-types@ComponentDefinition"}}},"readLogsDataSet":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-types@DataSetReference","key":{"component":"data2-core-primitives@String","params":{"content":"readLogsDataSet"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Read Logs DataSet"}},"description":{"component":"data2-core-primitives@String","params":{"content":"This parameter is used by the renderable to show the listener execution logs. It should be auto-populated when the listener is created."}},"visibility":"private","defaultValue":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetReference"}},"params":{"reference":{"params":{"portions":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"reference"}}}},{"component":"data2-core-primitives@String","params":{"content":"LogReadDataSet"}}]},"component":"data2-core-functions@StringConcat"}}},"component":"data2-core-types@ComponentDefinition"}}},"enableExecutionLogs":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Boolean","key":{"component":"data2-core-primitives@String","params":{"content":"enableExecutionLogs"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Enable Execution Logs"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Controls whether the listener will save execution logs."}},"visibility":"public","index":{"component":"data2-core-primitives@Number","params":{"content":1}},"unversioned":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}}}}},"renderable":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768,"exactWidth":1366,"exactHeight":768}}}},"updatedAt":"2024-08-13T18:41:29.927Z","createdAt":"2023-04-19T22:19:36.197Z"},{"_id":"620c0f218271aa412955e513","component":"data2-core-types@Component","params":{"public":true,"package":"data2-server-services","component":"Mailer","icon":"envelope","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"policies":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-auth@Policy"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"description":{"component":"data2-core-primitives@String","params":{"content":"Controls for allowing or denying access to the data"}}}}}}},"interactions":{"component":"data2-core-types@FieldSet","params":{"fields":{"send":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Sends email."}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Email data"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Email data to be sent"}},"defaultValue":{"artboard":{"component":"data2-core-primitives@String","params":{"content":""}},"from":{"name":{"component":"data2-core-primitives@String","params":{"content":"NoReply"}},"email":{"component":"data2-core-primitives@String","params":{"content":"noreply@data2.email"}}},"subject":{"component":"data2-core-primitives@String","params":{"content":""}},"data":{},"to":[],"message":{"component":"data2-core-primitives@String","params":{"content":""}}}}}]}}}}},"visibility":"public"},"updatedAt":"2022-02-15T20:47:45.459Z"},{"_id":"62aa6c18916b97060b98ffdd","component":"data2-core-types@Component","params":{"component":"x3gqnGyiV_S-AaK4bDwWs","package":"data2-virtuals","title":"getCurrentSystem","visibility":"private","definition":{"params":{"module":{"params":{"_layer":{"component":"data2-core-primitives@String","params":{"content":"HostApplicationLayer"}},"reference":{"component":"data2-core-primitives@String","params":{"content":"SystemsDataSet"}}},"component":"data2-core-types@ProcessReference"},"prop":{"params":{"compare":[{"params":{"reference":"field"},"component":"data2-core-types@Reference"}],"else":{"component":"data2-core-primitives@String","params":{"content":"cursor.current"}},"then":{"params":{"portions":[{"component":"data2-core-primitives@String","params":{"content":"cursor.current."}},{"params":{"reference":"field"},"component":"data2-core-types@Reference"}]},"component":"data2-core-functions@StringConcat"}},"component":"data2-core-flow@If"}},"component":"data2-core-types@Getter"},"parameters":{"params":{"fields":{"field":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@FieldSet"}},"updatedAt":"2022-06-29T17:59:02.832Z","createdAt":"2022-06-15T23:32:40.953Z"},{"_id":"69b302bf32d9ab56cbf7aed6","component":"data2-core-types@Component","params":{"product":"whatsapp","package":"data2-whatsapp","component":"WhatsAppAccount","visibility":"private","title":{"component":"data2-core-primitives@String","params":{"content":"WhatsApp Account"}},"icon":{"params":{"icon":"fa-whatsapp"},"component":"data2-core-types@FontAwesomeIcon"},"renderable":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768,"exactWidth":1366,"exactHeight":768}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"provider":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Provider"}},"description":{"component":"data2-core-primitives@String","params":{"content":"WhatsApp Business API provider."}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"oneOf":[{"component":"data2-core-primitives@String","params":{"content":"meta"}},{"component":"data2-core-primitives@String","params":{"content":"twilio"}}],"defaultValue":{"component":"data2-core-primitives@String","params":{"content":"meta"}}}},"providerAccountId":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Provider Account ID"}},"description":{"component":"data2-core-primitives@String","params":{"content":"WhatsApp Business Account ID (WABA). Populated automatically after Embedded Signup."}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}}}},"keyVault":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-types@InteractiveModuleReference","title":{"component":"data2-core-primitives@String","params":{"content":"Key Vault"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Key Vault that stores the access token. Auto-created when this component is added."}},"visibility":"private","controlSettings":{"componentFilter":[{"component":"data2-core-primitives@String","params":{"content":"data2-core-id@KeyVault"}}]}}},"policies":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-auth@Policy"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"description":{"component":"data2-core-primitives@String","params":{"content":"Controls for allowing or denying access to the data"}}}}}}},"interactions":{"component":"data2-core-types@FieldSet","params":{"fields":{"listTemplates":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Lists message templates from the WhatsApp Business Account."}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"Query params"}}}}]}},"createTemplate":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Creates a new message template."}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"Template definition"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Template object following Meta's Message Template API schema."}}}}]}},"deleteTemplate":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Deletes a message template by name."}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Template name"}}}}]}}}}}}},{"_id":"69b302cf32d9ab56cbf7aeda","component":"data2-core-types@Component","params":{"product":"whatsapp","package":"data2-whatsapp","component":"WhatsAppMessage","visibility":"private","icon":{"params":{"icon":"fa-whatsapp"},"component":"data2-core-types@FontAwesomeIcon"},"title":{"component":"data2-core-primitives@String","params":{"content":"WhatsApp Message"}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"type":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Message Type"}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}},"oneOf":[{"component":"data2-core-primitives@String","params":{"content":"text"}},{"component":"data2-core-primitives@String","params":{"content":"template"}},{"component":"data2-core-primitives@String","params":{"content":"image"}},{"component":"data2-core-primitives@String","params":{"content":"video"}},{"component":"data2-core-primitives@String","params":{"content":"audio"}},{"component":"data2-core-primitives@String","params":{"content":"document"}},{"component":"data2-core-primitives@String","params":{"content":"location"}},{"component":"data2-core-primitives@String","params":{"content":"contacts"}},{"component":"data2-core-primitives@String","params":{"content":"reaction"}},{"component":"data2-core-primitives@String","params":{"content":"interactive"}}],"defaultValue":{"component":"data2-core-primitives@String","params":{"content":"text"}}}},"to":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"To"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Recipient phone number in international format (e.g. 5511999998888)."}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}}},"text":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Text"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Message body text. Used when type is 'text'."}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}},"shouldShow":{"component":"data2-core-primitives@Boolean","params":{"content":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"type"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"text"}}},"component":"data2-core-comparison-operators@Equal"}},"break":true,"preventEvaluation":true}}},"template":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"Template"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Template definition. Used when type is 'template'."}},"index":{"component":"data2-core-primitives@Number","params":{"content":3}},"flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"name":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Template name"}}}},"language":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Language code"}},"defaultValue":{"component":"data2-core-primitives@String","params":{"content":"en_US"}}}},"components":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"title":{"component":"data2-core-primitives@String","params":{"content":"Template components"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Variable components for header, body, and button parameters."}}}}},"shouldShow":{"component":"data2-core-primitives@Boolean","params":{"content":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"type"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"template"}}},"component":"data2-core-comparison-operators@Equal"}},"break":true,"preventEvaluation":true}}},"image":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"Image"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Image payload. Provide a link or media id, and optional caption."}},"index":{"component":"data2-core-primitives@Number","params":{"content":4}},"flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"link":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Link"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Public URL of the image."}}}},"id":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Media ID"}},"description":{"component":"data2-core-primitives@String","params":{"content":"WhatsApp media ID."}}}},"caption":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Caption"}}}}},"shouldShow":{"component":"data2-core-primitives@Boolean","params":{"content":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"type"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"image"}}},"component":"data2-core-comparison-operators@Equal"}},"break":true,"preventEvaluation":true}}},"video":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"Video"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Video payload. Provide a link or media id, and optional caption."}},"index":{"component":"data2-core-primitives@Number","params":{"content":5}},"flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"link":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Link"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Public URL of the video."}}}},"id":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Media ID"}},"description":{"component":"data2-core-primitives@String","params":{"content":"WhatsApp media ID."}}}},"caption":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Caption"}}}}},"shouldShow":{"component":"data2-core-primitives@Boolean","params":{"content":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"type"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"video"}}},"component":"data2-core-comparison-operators@Equal"}},"break":true,"preventEvaluation":true}}},"audio":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"Audio"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Audio payload. Provide a link or media id."}},"index":{"component":"data2-core-primitives@Number","params":{"content":6}},"flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"link":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Link"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Public URL of the audio file."}}}},"id":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Media ID"}},"description":{"component":"data2-core-primitives@String","params":{"content":"WhatsApp media ID."}}}}},"shouldShow":{"component":"data2-core-primitives@Boolean","params":{"content":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"type"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"audio"}}},"component":"data2-core-comparison-operators@Equal"}},"break":true,"preventEvaluation":true}}},"document":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"Document"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Document payload. Provide a link or media id, and optional caption/filename."}},"index":{"component":"data2-core-primitives@Number","params":{"content":7}},"flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"link":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Link"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Public URL of the document."}}}},"id":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Media ID"}},"description":{"component":"data2-core-primitives@String","params":{"content":"WhatsApp media ID."}}}},"caption":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Caption"}}}},"filename":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Filename"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Filename displayed to the recipient."}}}}},"shouldShow":{"component":"data2-core-primitives@Boolean","params":{"content":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"type"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"document"}}},"component":"data2-core-comparison-operators@Equal"}},"break":true,"preventEvaluation":true}}},"location":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"Location"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Location payload with coordinates and optional name/address."}},"index":{"component":"data2-core-primitives@Number","params":{"content":8}},"flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"latitude":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Number","title":{"component":"data2-core-primitives@String","params":{"content":"Latitude"}}}},"longitude":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Number","title":{"component":"data2-core-primitives@String","params":{"content":"Longitude"}}}},"name":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Name"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Name of the location."}}}},"address":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Address"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Address of the location."}}}}},"shouldShow":{"component":"data2-core-primitives@Boolean","params":{"content":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"type"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"location"}}},"component":"data2-core-comparison-operators@Equal"}},"break":true,"preventEvaluation":true}}},"contacts":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"Contacts"}},"description":{"component":"data2-core-primitives@String","params":{"content":"List of contact objects following the WhatsApp contacts format."}},"index":{"component":"data2-core-primitives@Number","params":{"content":9}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"shouldShow":{"component":"data2-core-primitives@Boolean","params":{"content":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"type"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"contacts"}}},"component":"data2-core-comparison-operators@Equal"}},"break":true,"preventEvaluation":true}}},"reaction":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"Reaction"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Reaction payload with message_id and emoji."}},"index":{"component":"data2-core-primitives@Number","params":{"content":10}},"flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"message_id":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Message ID"}},"description":{"component":"data2-core-primitives@String","params":{"content":"The wamid of the message to react to."}}}},"emoji":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Emoji"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Emoji to react with. Empty string removes the reaction."}}}}},"shouldShow":{"component":"data2-core-primitives@Boolean","params":{"content":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"type"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"reaction"}}},"component":"data2-core-comparison-operators@Equal"}},"break":true,"preventEvaluation":true}}},"interactive":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"Interactive"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Interactive message payload (buttons, lists, etc). Free-form object matching the WhatsApp interactive message format."}},"index":{"component":"data2-core-primitives@Number","params":{"content":11}},"shouldShow":{"component":"data2-core-primitives@Boolean","params":{"content":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"type"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"interactive"}}},"component":"data2-core-comparison-operators@Equal"}},"break":true,"preventEvaluation":true}}}}}}}},{"_id":"69b302c832d9ab56cbf7aed8","component":"data2-core-types@Component","params":{"product":"whatsapp","package":"data2-whatsapp","component":"WhatsAppNumber","visibility":"private","title":{"component":"data2-core-primitives@String","params":{"content":"WhatsApp Number"}},"icon":{"params":{"icon":"fa-whatsapp"},"component":"data2-core-types@FontAwesomeIcon"},"renderable":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768,"exactWidth":1366,"exactHeight":768}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"whatsAppAccount":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-types@InteractiveModuleReference","title":{"component":"data2-core-primitives@String","params":{"content":"WhatsApp Account"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Reference to the WhatsAppAccount that owns this number."}},"index":{"component":"data2-core-primitives@Number","params":{"content":0.5}},"controlSettings":{"componentFilter":[{"component":"data2-core-primitives@String","params":{"content":"data2-whatsapp@WhatsAppAccount"}}]}}},"providerNumberId":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Provider Number ID"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Phone Number ID from Meta. Populated automatically after Embedded Signup."}},"index":{"component":"data2-core-primitives@Number","params":{"content":0.6}},"saveCompiled":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"visibility":"private"}},"phoneNumber":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Phone Number"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Phone number in raw digit format (e.g. 5511939208891). Populated automatically after Embedded Signup."}},"index":{"component":"data2-core-primitives@Number","params":{"content":0.7}},"saveCompiled":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"visibility":"private"}},"drive":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-types@InteractiveModuleReference","title":{"component":"data2-core-primitives@String","params":{"content":"Drive"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Drive for media file storage. Auto-created when this component is added."}},"visibility":"private","controlSettings":{"componentFilter":[{"component":"data2-core-primitives@String","params":{"content":"data2-core@Drive"}}]}}},"enableExecutionLogs":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Boolean","key":{"component":"data2-core-primitives@String","params":{"content":"enableExecutionLogs"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Enable Execution Logs"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Controls whether the listener will save execution logs."}},"visibility":"public","index":{"component":"data2-core-primitives@Number","params":{"content":1}},"unversioned":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"defaultValue":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}}},"insertLogsDataSet":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-types@DataSetReference","key":{"component":"data2-core-primitives@String","params":{"content":"insertLogsDataSet"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Insert Logs DataSet"}},"description":{"component":"data2-core-primitives@String","params":{"content":"DataSet used to save execution logs. Auto-populated when the number is created."}},"visibility":"private","defaultValue":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetReference"}},"params":{"reference":{"params":{"portions":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"reference"}}}},{"component":"data2-core-primitives@String","params":{"content":"LogInsertDataSet"}}]},"component":"data2-core-functions@StringConcat"}}},"component":"data2-core-types@ComponentDefinition"}}},"readLogsDataSet":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-types@DataSetReference","key":{"component":"data2-core-primitives@String","params":{"content":"readLogsDataSet"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Read Logs DataSet"}},"description":{"component":"data2-core-primitives@String","params":{"content":"DataSet used to display execution logs. Auto-populated when the number is created."}},"visibility":"private","defaultValue":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@DataSetReference"}},"params":{"reference":{"params":{"portions":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"reference"}}}},{"component":"data2-core-primitives@String","params":{"content":"LogReadDataSet"}}]},"component":"data2-core-functions@StringConcat"}}},"component":"data2-core-types@ComponentDefinition"}}},"onMessage":{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"onMessage"}},"icon":{"params":{"icon":"fa-play-circle-o"},"component":"data2-core-types@FontAwesomeIcon"},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-flow@Series"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Actions executed when a WhatsApp message is received. The following parameters are accessible by using Reference: `message`, `from`, `timestamp`."}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}}}},"onStatus":{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"onStatus"}},"icon":{"params":{"icon":"fa-play-circle-o"},"component":"data2-core-types@FontAwesomeIcon"},"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-flow@Series"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Actions executed when a WhatsApp message is received. The following parameters are accessible by using Reference: `status`, `from`, `timestamp`."}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}}}},"registrationStatus":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Registration Status"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Registration status: active or deregistered"}},"index":{"component":"data2-core-primitives@Number","params":{"content":0.8}},"saveCompiled":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"visibility":"private"}},"registrationPin":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Registration Pin"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Registration pin: 6-digit pin"}},"index":{"component":"data2-core-primitives@Number","params":{"content":0.81}},"saveCompiled":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"visibility":"private"}},"policies":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-auth@Policy"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"description":{"component":"data2-core-primitives@String","params":{"content":"Controls for allowing or denying access to the data"}}}}}}},"interactions":{"component":"data2-core-types@FieldSet","params":{"fields":{"sendMessage":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Sends a WhatsApp message (text, image, video, audio, document, location, contacts, reaction, interactive, template)."}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-whatsapp@WhatsAppMessage","title":{"component":"data2-core-primitives@String","params":{"content":"Message"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Message payload. Use a WhatsAppMessage component or provide { to, type, text/template/image/video/audio/document/location/contacts/reaction/interactive }."}}}}]}},"sendText":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Sends a text message. Shortcut for sendMessage({ type: 'text', to, text })."}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"To"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Recipient phone number."}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Text"}},"description":{"component":"data2-core-primitives@String","params":{"content":"The text message body."}}}}]}},"sendImage":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Sends an image message. Provide { link } or { id } and optionally { caption }."}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"To"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Recipient phone number."}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"Image"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Image object with link or id, and optional caption."}},"parameters":{"link":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Link"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Public URL of the image."}}}},"id":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"ID"}},"description":{"component":"data2-core-primitives@String","params":{"content":"WhatsApp media ID."}}}},"caption":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Caption"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Optional caption for the image."}}}}}}}]}},"sendVideo":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Sends a video message. Provide { link } or { id } and optionally { caption }."}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"To"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Recipient phone number."}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"Video"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Video object with link or id, and optional caption."}},"parameters":{"link":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Link"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Public URL of the video."}}}},"id":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"ID"}},"description":{"component":"data2-core-primitives@String","params":{"content":"WhatsApp media ID."}}}},"caption":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Caption"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Optional caption for the video."}}}}}}}]}},"sendAudio":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Sends an audio message. Provide { link } or { id }."}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"To"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Recipient phone number."}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"Audio"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Audio object with link or id."}},"parameters":{"link":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Link"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Public URL of the audio file."}}}},"id":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"ID"}},"description":{"component":"data2-core-primitives@String","params":{"content":"WhatsApp media ID."}}}}}}}]}},"sendDocument":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Sends a document message. Provide { link } or { id } and optionally { caption, filename }."}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"To"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Recipient phone number."}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"Document"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Document object with link or id, and optional caption/filename."}},"parameters":{"link":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Link"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Public URL of the document."}}}},"id":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"ID"}},"description":{"component":"data2-core-primitives@String","params":{"content":"WhatsApp media ID."}}}},"caption":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Caption"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Optional caption for the document."}}}},"filename":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Filename"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Filename displayed to the recipient."}}}}}}}]}},"sendLocation":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Sends a location message with coordinates and optional name/address."}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"To"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Recipient phone number."}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"Location"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Location with latitude, longitude, and optional name/address."}},"parameters":{"latitude":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Number","title":{"component":"data2-core-primitives@String","params":{"content":"Latitude"}}}},"longitude":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Number","title":{"component":"data2-core-primitives@String","params":{"content":"Longitude"}}}},"name":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Name"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Name of the location."}}}},"address":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Address"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Address of the location."}}}}}}}]}},"sendContacts":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Sends a contacts message with a list of vCard-like contact objects."}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"To"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Recipient phone number."}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","title":{"component":"data2-core-primitives@String","params":{"content":"Contacts"}},"description":{"component":"data2-core-primitives@String","params":{"content":"List of contact objects following the WhatsApp contacts format."}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}}]}},"sendReaction":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Sends a reaction (emoji) to an existing message."}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"To"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Recipient phone number."}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Message ID"}},"description":{"component":"data2-core-primitives@String","params":{"content":"The wamid of the message to react to."}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"Emoji"}},"description":{"component":"data2-core-primitives@String","params":{"content":"The emoji to react with. Send empty string to remove reaction."}}}}]}},"getStatus":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Fetches the number's status from the provider, including quality rating, messaging limit tier, and webhook subscription state."}},"visibility":"private","arguments":[]}},"resubscribeWebhook":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Re-subscribes the WABA to receive webhooks. Use this if incoming messages stop arriving."}},"visibility":"private","arguments":[]}}}}}},"updatedAt":"2026-03-19T04:50:44.696Z"},{"_id":"5ed98f092c78cc536dcb3ab2","component":"data2-core-types@Component","params":{"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition"},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"state":"Boolean"}}},"component":"Led","package":"data3-core-primitives","public":false,"visibility":"deprecated"},"updatedAt":"2022-03-22T14:28:14.106Z"},{"_id":"5ec5491a3888745c0d571545","component":"data2-core-types@Component","params":{"definition":{"component":"data2-core-types@Definition"},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"src":"String"}}},"public":false,"component":"img","package":"html","visibility":"deprecated"},"updatedAt":"2022-03-22T14:22:38.202Z"},{"_id":"5e9f5e05e6bac0d98aa5d6b5","component":"data2-core-types@Component","params":{"package":"html","component":"input","public":false,"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"style":{"component":"data2-core-types@StyleSheet"},"onClick":{"component":"data2-core-types@Interaction"},"onChange":{"component":"data2-core-types@DataLinkSetter"},"type":"String","value":"String"}}},"visibility":"deprecated"},"updatedAt":"2022-03-22T14:22:06.761Z"},{"_id":"5ec571ca993f46254ea5281f","component":"data2-core-types@Component","params":{"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"children":"String","style":{"component":"data2-core-types@StyleSheet"},"behavior":"String"}}},"public":false,"component":"marquee","package":"html","visibility":"deprecated"},"updatedAt":"2022-03-22T14:23:04.911Z"},{"_id":"635712dfc06fa8444e98ad5d","component":"data2-core-types@Component","params":{"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"command":{"component":"String"}}}},"component":"CurlParser","package":"http"}},{"_id":"614df5ca33fad3ebebb9879b","component":"data2-core-types@Component","params":{"product":"connect","icon":"table","public":true,"package":"http","component":"CustomHTTPDataSource","extends":"data2-core@DataSource","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"find":{"component":"http@Request"},"countKey":{"component":"data2-core-primitives@String"},"recordsKey":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":-1}}},"component":"data2-core-types@ComponentParameter"},"patch":{"component":"http@Request"},"create":{"component":"http@Request"},"remove":{"component":"http@Request"},"useSchema":{"params":{"visibility":"private","component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"title":{"component":"data2-core-primitives@String","params":{"content":"useSchema"}}},"component":"data2-core-types@ComponentParameter"},"schema":{"params":{"visibility":"public","component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Field"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Schema"}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}}}},"title":{"component":"data2-core-primitives@String","params":{"content":"CustomHTTPDataSource"}},"visibility":"public","definition":{"params":{},"component":"data2-core-types@Definition"},"renderable":{"dimensions":{"disabled":false,"component":"data2-core-types@Dimensions","params":{"width":1366,"exactWidth":false,"exactHeight":false,"height":768}}}},"updatedAt":"2025-07-24T16:15:11.590Z"},{"_id":"6384f992e920c80b07437910","component":"data2-core-types@Component","params":{"package":"http","component":"FormData","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"data":{"params":{"component":"data2-core-primitives@Object"},"component":"data2-core-types@ComponentParameter"},"dataList":{"params":{"component":"data2-core-primitives@Object","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"key":{"params":{"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"},"value":{"params":{"index":{"component":"data2-core-primitives@Number","params":{"content":2}},"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"},"options":{"params":{"index":{"component":"data2-core-primitives@Number","params":{"content":3}},"component":"data2-core-primitives@Object","parameters":{"filename":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"},"contentType":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":2}}},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2025-06-06T18:46:31.766Z"},{"_id":"62a7303a6ebde0060a10aef2","component":"data2-core-types@Component","params":{"component":"GraphQLQuery","package":"http","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{}}},"title":"GraphQLQuery","icon":{"params":{"icon":"fa-connectdevelop"},"component":"data2-core-types@FontAwesomeIcon"},"visibility":"public","returnPrimitiveTypes":"data2-core-primitives@Object"},"updatedAt":"2022-11-11T18:37:05.713Z","createdAt":"2022-06-13T12:40:26.050Z"},{"_id":"612506ab92425036c3fd6cce","component":"data2-core-types@Component","params":{"package":"http","component":"Request","visibility":"private","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"data":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"index":{"component":"data2-core-primitives@Number","params":{"content":3}}},"component":"data2-core-types@ComponentParameter"},"headers":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"},"method":{"params":{"oneOf":["POST","GET","PUT","DELETE","PATCH"],"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Request Method"}},"index":{"component":"data2-core-primitives@Number","params":{"content":0.5}}},"component":"data2-core-types@ComponentParameter"},"url":{"component":"data2-core-primitives@String"},"useProxy":{"params":{"component":"data2-core-primitives@Boolean","key":{"component":"data2-core-primitives@String","params":{"content":"useProxy"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Use Proxy"}},"defaultValue":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-types@ComponentParameter"},"testRequest":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-tools@RequestTest"}},"index":{"component":"data2-core-primitives@Number","params":{"content":0}}},"component":"data2-core-types@ComponentParameter"},"responseType":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"oneOf":[{"params":{"content":"arraybuffer"},"component":"data2-core-primitives@String"},{"params":{"content":"document"},"component":"data2-core-primitives@String"},{"params":{"content":"json"},"component":"data2-core-primitives@String"},{"params":{"content":"text"},"component":"data2-core-primitives@String"},{"params":{"content":"stream"},"component":"data2-core-primitives@String"},{"params":{"content":"blob"},"component":"data2-core-primitives@String"},{"params":{"content":"blob-url"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"},"rawResponse":{"component":"data2-core-primitives@Boolean"},"responseHeaderPrefix":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","shouldShow":{"component":"data2-core-primitives@Boolean","params":{"content":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"rawResponse"}}}}},"break":true}}},"maxRedirects":{"params":{"index":{"component":"data2-core-primitives@Number","params":{"content":1}},"component":"data2-core-primitives@Number"},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2024-11-03T00:24:50.163Z"},{"_id":"63d7b5fecca41e063525ae8b","component":"data2-core-types@Component","params":{"component":"RequestDefinition","package":"http","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{}}},"title":"RequestDefinition"},"updatedAt":"2023-01-30T12:20:14.295Z","createdAt":"2023-01-30T12:20:14.295Z"},{"_id":"6426b3ccafeb670636eaa344","component":"data2-core-types@Component","params":{"component":"S3FileUpload","package":"http","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"file":{"params":{},"component":"data2-core-types@ComponentParameter"},"uploadUrl":{"params":{},"component":"data2-core-types@ComponentParameter"}}}}},"updatedAt":"2023-03-31T10:19:56.412Z","createdAt":"2023-03-31T10:19:56.412Z"},{"_id":"63d273738eefdf063478d61e","component":"data2-core-types@Component","params":{"component":"UrlEncodedFormData","package":"http","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"data":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}}},"component":"data2-core-types@ComponentParameter"}}}},"title":"UrlEncodedFormData"},"updatedAt":"2023-01-26T12:45:19.712Z","createdAt":"2023-01-26T12:34:59.989Z"},{"_id":"6a5f1ae1951c23b007767476","component":"data2-core-types@Component","system":"6a57cfe9673eb7e3c5e57784","params":{"extends":"data2-core-primitives@Block","package":"natura-geomarketing","component":"k1ctDNtMYQklApCji4N76","title":"HubSideBar","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-core-types@ComponentInstanceReference","params":{"component":"data2-core-primitives@Artboard","reference":"k1ctDNtMYQklApCji4N76"}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"componentState":{"component":"data2-core-primitives@String","oneOf":{"component":"data2-core-functions@ArrayMap","params":{"array":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@ArtboardReference","params":{"reference":"Hub-SideBar","preventEvaluation":true}},"prop":"params.componentStates"}},"mapper":"params.state"}}}}}}},"updatedAt":"2026-07-24T23:24:13.620Z","createdAt":"2026-07-21T07:08:48.844Z"},{"_id":"6a5f8f938bb72493616fc1a2","component":"data2-core-types@Component","system":"6a57cfe9673eb7e3c5e57784","params":{"extends":"data2-core-primitives@Block","package":"natura-geomarketing","component":"cdiDE26p-BvVcPlXaCtSC","title":"HubSideBarShortcut","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-core-types@ComponentInstanceReference","params":{"component":"data2-core-primitives@Artboard","reference":"cdiDE26p-BvVcPlXaCtSC"}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"componentState":{"component":"data2-core-primitives@String","oneOf":{"component":"data2-core-functions@ArrayMap","params":{"array":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@ArtboardReference","params":{"reference":"HubSideBarShortcut","preventEvaluation":true}},"prop":"params.componentStates"}},"mapper":"params.state"}}},"type":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}}}}}}},"updatedAt":"2026-07-21T15:36:25.574Z","createdAt":"2026-07-21T15:26:42.912Z"},{"_id":"6a5f9f15a5529ef885ca969b","component":"data2-core-types@Component","system":"6a57cfe9673eb7e3c5e57784","params":{"extends":"data2-core-primitives@Block","package":"natura-geomarketing","component":"0CZ7pC6NULlDQhV3hv-0G","title":"HubTextItem","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-core-types@ComponentInstanceReference","params":{"component":"data2-core-primitives@Artboard","reference":"0CZ7pC6NULlDQhV3hv-0G"}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"componentState":{"component":"data2-core-primitives@String","oneOf":{"component":"data2-core-functions@ArrayMap","params":{"array":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@ArtboardReference","params":{"reference":"HubTextItem","preventEvaluation":true}},"prop":"params.componentStates"}},"mapper":"params.state"}}},"label":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}}},"onClick":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Interaction"}},"index":{"component":"data2-core-primitives@Number","params":{"content":2}}}}}}}},"updatedAt":"2026-07-21T16:35:14.166Z","createdAt":"2026-07-21T16:32:52.585Z"},{"_id":"6a5fa7e074f960d571569087","component":"data2-core-types@Component","system":"6a57cfe9673eb7e3c5e57784","params":{"extends":"data2-core-primitives@Block","package":"natura-geomarketing","component":"4hvch1V6MXqBr9rL-nvAu","title":"HubPageHeader","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-core-types@ComponentInstanceReference","params":{"component":"data2-core-primitives@Artboard","reference":"4hvch1V6MXqBr9rL-nvAu"}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"componentState":{"component":"data2-core-primitives@String","oneOf":{"component":"data2-core-functions@ArrayMap","params":{"array":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@ArtboardReference","params":{"reference":"HubPageHeader","preventEvaluation":true}},"prop":"params.componentStates"}},"mapper":"params.state"}}}}}}},"updatedAt":"2026-07-21T17:10:22.905Z","createdAt":"2026-07-21T17:10:22.756Z"},{"_id":"6a6228660ff5a8d431e8cedd","component":"data2-core-types@Component","system":"6a57cfe9673eb7e3c5e57784","params":{"extends":"data2-core-primitives@Block","package":"natura-geomarketing","component":"O4-zOAoAC9BwIp-XZ0ekO","title":"HubSimulatorModeSelect","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-core-types@ComponentInstanceReference","params":{"component":"data2-core-primitives@Artboard","reference":"O4-zOAoAC9BwIp-XZ0ekO"}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"componentState":{"component":"data2-core-primitives@String","oneOf":{"component":"data2-core-functions@ArrayMap","params":{"array":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@ArtboardReference","params":{"reference":"HubSimulatorModeSelect","preventEvaluation":true}},"prop":"params.componentStates"}},"mapper":"params.state"}}}}}}},"updatedAt":"2026-07-23T14:43:21.752Z","createdAt":"2026-07-23T14:43:21.614Z"},{"_id":"6a62286b0ff5a8d431e8cede","component":"data2-core-types@Component","system":"6a57cfe9673eb7e3c5e57784","params":{"extends":"data2-core-primitives@Block","package":"natura-geomarketing","component":"ONebofT7KQiRJeb0mlziC","title":"HubSimulatorModelButtons","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-core-types@ComponentInstanceReference","params":{"component":"data2-core-primitives@Artboard","reference":"ONebofT7KQiRJeb0mlziC"}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"componentState":{"component":"data2-core-primitives@String","oneOf":{"component":"data2-core-functions@ArrayMap","params":{"array":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@ArtboardReference","params":{"reference":"HubSimulatorModelButtons","preventEvaluation":true}},"prop":"params.componentStates"}},"mapper":"params.state"}}}}}}},"updatedAt":"2026-07-23T14:43:26.656Z","createdAt":"2026-07-23T14:43:26.275Z"},{"_id":"6a62286f0ff5a8d431e8cedf","component":"data2-core-types@Component","system":"6a57cfe9673eb7e3c5e57784","params":{"extends":"data2-core-primitives@Block","package":"natura-geomarketing","component":"gm34nI8iHui1SSuwobYTT","title":"HubSimulatorStats","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-core-types@ComponentInstanceReference","params":{"component":"data2-core-primitives@Artboard","reference":"gm34nI8iHui1SSuwobYTT"}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"componentState":{"component":"data2-core-primitives@String","oneOf":{"component":"data2-core-functions@ArrayMap","params":{"array":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@ArtboardReference","params":{"reference":"HubSimulatorStats","preventEvaluation":true}},"prop":"params.componentStates"}},"mapper":"params.state"}}}}}}},"updatedAt":"2026-07-23T14:43:30.273Z","createdAt":"2026-07-23T14:43:30.096Z"},{"_id":"6a6228730ff5a8d431e8cee0","component":"data2-core-types@Component","system":"6a57cfe9673eb7e3c5e57784","params":{"extends":"data2-core-primitives@Block","package":"natura-geomarketing","component":"PCOvC0KQdskFojBsWZBfd","title":"HubSimulatorSpanPerSector","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-core-types@ComponentInstanceReference","params":{"component":"data2-core-primitives@Artboard","reference":"PCOvC0KQdskFojBsWZBfd"}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"componentState":{"component":"data2-core-primitives@String","oneOf":{"component":"data2-core-functions@ArrayMap","params":{"array":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@ArtboardReference","params":{"reference":"HubSimulatorSpanPerSector","preventEvaluation":true}},"prop":"params.componentStates"}},"mapper":"params.state"}}}}}}},"updatedAt":"2026-07-23T14:43:34.308Z","createdAt":"2026-07-23T14:43:34.168Z"},{"_id":"6a6228770ff5a8d431e8cee1","component":"data2-core-types@Component","system":"6a57cfe9673eb7e3c5e57784","params":{"extends":"data2-core-primitives@Block","package":"natura-geomarketing","component":"ScMFTr5OoTTcfjDdfP0uw","title":"HubSimulatorMap","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-core-types@ComponentInstanceReference","params":{"component":"data2-core-primitives@Artboard","reference":"ScMFTr5OoTTcfjDdfP0uw"}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"componentState":{"component":"data2-core-primitives@String","oneOf":{"component":"data2-core-functions@ArrayMap","params":{"array":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@ArtboardReference","params":{"reference":"HubSimulatorMap","preventEvaluation":true}},"prop":"params.componentStates"}},"mapper":"params.state"}}}}}}},"updatedAt":"2026-07-23T14:43:37.868Z","createdAt":"2026-07-23T14:43:37.728Z"},{"_id":"6a62287d0ff5a8d431e8cee2","component":"data2-core-types@Component","system":"6a57cfe9673eb7e3c5e57784","params":{"extends":"data2-core-primitives@Block","package":"natura-geomarketing","component":"1S_fB3hvzwUro47iuZ55p","title":"HubSimulatorInfoModeHeader","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-core-types@ComponentInstanceReference","params":{"component":"data2-core-primitives@Artboard","reference":"1S_fB3hvzwUro47iuZ55p"}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"componentState":{"component":"data2-core-primitives@String","oneOf":{"component":"data2-core-functions@ArrayMap","params":{"array":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@ArtboardReference","params":{"reference":"HubSimulatorInfoModeHeader","preventEvaluation":true}},"prop":"params.componentStates"}},"mapper":"params.state"}}}}}}},"updatedAt":"2026-07-23T14:43:44.435Z","createdAt":"2026-07-23T14:43:44.277Z"},{"_id":"6a6228810ff5a8d431e8cee3","component":"data2-core-types@Component","system":"6a57cfe9673eb7e3c5e57784","params":{"extends":"data2-core-primitives@Block","package":"natura-geomarketing","component":"L--dVhugwB17-_W00pA7S","title":"HubSimulatorMatrixAsIs","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-core-types@ComponentInstanceReference","params":{"component":"data2-core-primitives@Artboard","reference":"L--dVhugwB17-_W00pA7S"}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"componentState":{"component":"data2-core-primitives@String","oneOf":{"component":"data2-core-functions@ArrayMap","params":{"array":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@ArtboardReference","params":{"reference":"HubSimulatorMatrixAsIs","preventEvaluation":true}},"prop":"params.componentStates"}},"mapper":"params.state"}}}}}}},"updatedAt":"2026-07-23T14:43:48.452Z","createdAt":"2026-07-23T14:43:48.298Z"},{"_id":"6a626d2d61501108689e9732","component":"data2-core-types@Component","system":"6a57cfe9673eb7e3c5e57784","params":{"extends":"data2-core-primitives@Block","package":"natura-geomarketing","component":"_3BHHDtVc0ZK0wlfcnLM3","title":"HubSimulatorAdditionalInfo","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-core-types@ComponentInstanceReference","params":{"component":"data2-core-primitives@Artboard","reference":"_3BHHDtVc0ZK0wlfcnLM3"}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"componentState":{"component":"data2-core-primitives@String","oneOf":{"component":"data2-core-functions@ArrayMap","params":{"array":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@ArtboardReference","params":{"reference":"HubSimulatorAdditionalInfo","preventEvaluation":true}},"prop":"params.componentStates"}},"mapper":"params.state"}}}}}}},"updatedAt":"2026-07-23T19:36:46.801Z","createdAt":"2026-07-23T19:36:46.404Z"},{"_id":"6a62715961501108689e973a","component":"data2-core-types@Component","system":"6a57cfe9673eb7e3c5e57784","params":{"extends":"data2-core-primitives@Block","package":"natura-geomarketing","component":"XaKyb6x3qMpZupICoqsnY","title":"HubSimulatorGraphBeforeAfter","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-core-types@ComponentInstanceReference","params":{"component":"data2-core-primitives@Artboard","reference":"XaKyb6x3qMpZupICoqsnY"}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"componentState":{"component":"data2-core-primitives@String","oneOf":{"component":"data2-core-functions@ArrayMap","params":{"array":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@ArtboardReference","params":{"reference":"HubSimulatorGraphBeforeAfter","preventEvaluation":true}},"prop":"params.componentStates"}},"mapper":"params.state"}}}}}}},"updatedAt":"2026-07-23T19:54:34.729Z","createdAt":"2026-07-23T19:54:34.609Z"},{"_id":"6a62728a61501108689e9743","component":"data2-core-types@Component","system":"6a57cfe9673eb7e3c5e57784","params":{"extends":"data2-core-primitives@Block","package":"natura-geomarketing","component":"iW3NufyoQGjGAwhmVZ3ow","title":"HubSimulatorSetorDestino","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-core-types@ComponentInstanceReference","params":{"component":"data2-core-primitives@Artboard","reference":"iW3NufyoQGjGAwhmVZ3ow"}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"componentState":{"component":"data2-core-primitives@String","oneOf":{"component":"data2-core-functions@ArrayMap","params":{"array":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@ArtboardReference","params":{"reference":"HubSimulatorSpanPerSector","preventEvaluation":true}},"prop":"params.componentStates"}},"mapper":"params.state"}}}}}}},"updatedAt":"2026-07-23T20:00:00.185Z","createdAt":"2026-07-23T20:00:00.185Z"},{"_id":"6a6357c99642efac858afb15","component":"data2-core-types@Component","system":"6a57cfe9673eb7e3c5e57784","params":{"extends":"data2-core-primitives@Block","package":"natura-geomarketing","component":"gfyeGJI77tJzdwSZTKCnV","title":"HubSimulatorSectorsInfo","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-core-types@ComponentInstanceReference","params":{"component":"data2-core-primitives@Artboard","reference":"gfyeGJI77tJzdwSZTKCnV"}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"componentState":{"component":"data2-core-primitives@String","oneOf":{"component":"data2-core-functions@ArrayMap","params":{"array":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@ArtboardReference","params":{"reference":"HubSimulatorSectorsInfo","preventEvaluation":true}},"prop":"params.componentStates"}},"mapper":"params.state"}}}}}}},"updatedAt":"2026-07-24T12:17:51.497Z","createdAt":"2026-07-24T12:17:51.359Z"},{"_id":"6a643d1370fbd195b8e6a9cd","component":"data2-core-types@Component","system":"6a57cfe9673eb7e3c5e57784","params":{"extends":"data2-core-primitives@Block","package":"natura-geomarketing","component":"n-E3kblbz0EwqfdH7YVjX","title":"HubTopBar","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-core-types@ComponentInstanceReference","params":{"component":"data2-core-primitives@Artboard","reference":"n-E3kblbz0EwqfdH7YVjX"}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"componentState":{"component":"data2-core-primitives@String","oneOf":{"component":"data2-core-functions@ArrayMap","params":{"array":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@ArtboardReference","params":{"reference":"HubTopBar","preventEvaluation":true}},"prop":"params.componentStates"}},"mapper":"params.state"}}}}}}},"updatedAt":"2026-07-25T04:36:09.096Z","createdAt":"2026-07-25T04:36:08.931Z"},{"_id":"6a666322607e9bc66b1bae82","component":"data2-core-types@Component","system":"6a57cfe9673eb7e3c5e57784","params":{"extends":"data2-core-primitives@Block","package":"natura-geomarketing","component":"f2_yWxSf4RxX4sceM8HEg","title":"HubTopBarShortcut","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-core-types@ComponentInstanceReference","params":{"component":"data2-core-primitives@Artboard","reference":"f2_yWxSf4RxX4sceM8HEg"}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"componentState":{"component":"data2-core-primitives@String","oneOf":{"component":"data2-core-functions@ArrayMap","params":{"array":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@ArtboardReference","params":{"reference":"HubTopBarShortcut","preventEvaluation":true}},"prop":"params.componentStates"}},"mapper":"params.state"}}}}}}},"updatedAt":"2026-07-26T19:43:05.644Z","createdAt":"2026-07-26T19:43:05.464Z"},{"_id":"6a6993dccc0e5e3e8140fd68","component":"data2-core-types@Component","system":"6a57cfe9673eb7e3c5e57784","params":{"component":"3EIFSsdsdy7iTIJ5HZ6fY","package":"natura-geomarketing","title":"get-neighbors-pure","parameters":{"features":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Array"}},"municipio":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String"}}},"definition":{"component":"data2-core-flow@Series","params":{"actions":[{"component":"data2-core-flow@Step","params":{"action":{"component":"data2-core-functions@ArrayMap","params":{"array":{"component":"data2-core-types@Reference","params":{"reference":"features"}},"mapper":{"component":"data2-core-functions@Function","params":{"parameters":["f"],"body":{"name":{"component":"data2-core-types@Reference","params":{"reference":"f.properties.name"}},"normName":{"component":"data2-core-functions@StringTrim","params":{"string":{"component":"data2-core-functions@Replace","params":{"haystack":{"component":"data2-core-functions@toUpperCase","params":{"string":{"component":"data2-core-functions@Replace","params":{"haystack":{"component":"data2-core-functions@Replace","params":{"haystack":{"component":"data2-core-functions@Replace","params":{"haystack":{"component":"data2-core-functions@Replace","params":{"haystack":{"component":"data2-core-functions@Replace","params":{"haystack":{"component":"data2-core-functions@Replace","params":{"haystack":{"component":"data2-core-functions@Replace","params":{"haystack":{"component":"data2-core-types@Reference","params":{"reference":"f.properties.name"}},"needle":{"component":"data2-core-types@Regex","params":{"pattern":"[àáâãäåÀÁÂÃÄÅ]","flags":"g"}},"patch":"a"}},"needle":{"component":"data2-core-types@Regex","params":{"pattern":"[èéêëÈÉÊË]","flags":"g"}},"patch":"e"}},"needle":{"component":"data2-core-types@Regex","params":{"pattern":"[ìíîïÌÍÎÏ]","flags":"g"}},"patch":"i"}},"needle":{"component":"data2-core-types@Regex","params":{"pattern":"[òóôõöÒÓÔÕÖ]","flags":"g"}},"patch":"o"}},"needle":{"component":"data2-core-types@Regex","params":{"pattern":"[ùúûüÙÚÛÜ]","flags":"g"}},"patch":"u"}},"needle":{"component":"data2-core-types@Regex","params":{"pattern":"[çÇ]","flags":"g"}},"patch":"c"}},"needle":{"component":"data2-core-types@Regex","params":{"pattern":"[ñÑ]","flags":"g"}},"patch":"n"}}}},"needle":{"component":"data2-core-types@Regex","params":{"pattern":"[^A-Z0-9]+","flags":"g"}},"patch":" "}}}},"keys":{"component":"data2-core-functions@Uniq","params":{"array":{"component":"data2-core-functions@ArrayMap","params":{"array":{"component":"data2-core-functions@Reduce","params":{"array":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Equal","params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@Reference","params":{"reference":"f.geometry"}},"prop":"type"}},"comparisonSubject":"MultiPolygon"}}],"then":{"component":"data2-core-functions@Reduce","params":{"array":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@Reference","params":{"reference":"f.geometry"}},"prop":"coordinates"}},"reducer":{"component":"data2-core-functions@Function","params":{"parameters":["acc","poly"],"body":{"component":"data2-core-functions@ArrayConcat","params":{"arrays":[{"component":"data2-core-types@Reference","params":{"reference":"acc"}},{"component":"data2-core-types@Reference","params":{"reference":"poly"}}]}}}},"initialValue":[]}},"else":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@Reference","params":{"reference":"f.geometry"}},"prop":"coordinates"}}}},"reducer":{"component":"data2-core-functions@Function","params":{"parameters":["acc","ring"],"body":{"component":"data2-core-functions@ArrayConcat","params":{"arrays":[{"component":"data2-core-types@Reference","params":{"reference":"acc"}},{"component":"data2-core-types@Reference","params":{"reference":"ring"}}]}}}},"initialValue":[]}},"mapper":{"component":"data2-core-functions@Function","params":{"parameters":["p"],"body":{"component":"data2-core-functions@StringConcat","params":{"portions":["",{"component":"data2-core-numerical-operators@Divide","params":{"components":[{"component":"data2-core-functions@Round","params":{"value":{"component":"data2-core-numerical-operators@Multiply","params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":"p.0"}},1000]}}}},1000]}},"_",{"component":"data2-core-numerical-operators@Divide","params":{"components":[{"component":"data2-core-functions@Round","params":{"value":{"component":"data2-core-numerical-operators@Multiply","params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":"p.1"}},1000]}}}},1000]}}]}}}}}}}}}}}}},"resultName":"withKeys"}},{"component":"data2-core-flow@Step","params":{"action":{"component":"data2-core-functions@ArrayFilter","params":{"array":{"component":"data2-core-functions@ArrayMap","params":{"array":{"component":"data2-core-functions@Split","params":{"haystack":{"component":"data2-core-types@Reference","params":{"reference":"municipio"}},"needle":","}},"mapper":{"component":"data2-core-functions@Function","params":{"parameters":["t"],"body":{"component":"data2-core-functions@StringTrim","params":{"string":{"component":"data2-core-types@Reference","params":{"reference":"t"}}}}}}}},"filter":{"component":"data2-core-functions@Function","params":{"parameters":["t"],"body":{"component":"data2-core-comparison-operators@Different","params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":"t"}},"comparisonSubject":""}}}}}},"resultName":"targetsRaw"}},{"component":"data2-core-flow@Step","params":{"action":{"component":"data2-core-functions@ArrayMap","params":{"array":{"component":"data2-core-types@Reference","params":{"reference":"targetsRaw"}},"mapper":{"component":"data2-core-functions@Function","params":{"parameters":["t"],"body":{"component":"data2-core-functions@StringTrim","params":{"string":{"component":"data2-core-functions@Replace","params":{"haystack":{"component":"data2-core-functions@toUpperCase","params":{"string":{"component":"data2-core-functions@Replace","params":{"haystack":{"component":"data2-core-functions@Replace","params":{"haystack":{"component":"data2-core-functions@Replace","params":{"haystack":{"component":"data2-core-functions@Replace","params":{"haystack":{"component":"data2-core-functions@Replace","params":{"haystack":{"component":"data2-core-functions@Replace","params":{"haystack":{"component":"data2-core-functions@Replace","params":{"haystack":{"component":"data2-core-types@Reference","params":{"reference":"t"}},"needle":{"component":"data2-core-types@Regex","params":{"pattern":"[àáâãäåÀÁÂÃÄÅ]","flags":"g"}},"patch":"a"}},"needle":{"component":"data2-core-types@Regex","params":{"pattern":"[èéêëÈÉÊË]","flags":"g"}},"patch":"e"}},"needle":{"component":"data2-core-types@Regex","params":{"pattern":"[ìíîïÌÍÎÏ]","flags":"g"}},"patch":"i"}},"needle":{"component":"data2-core-types@Regex","params":{"pattern":"[òóôõöÒÓÔÕÖ]","flags":"g"}},"patch":"o"}},"needle":{"component":"data2-core-types@Regex","params":{"pattern":"[ùúûüÙÚÛÜ]","flags":"g"}},"patch":"u"}},"needle":{"component":"data2-core-types@Regex","params":{"pattern":"[çÇ]","flags":"g"}},"patch":"c"}},"needle":{"component":"data2-core-types@Regex","params":{"pattern":"[ñÑ]","flags":"g"}},"patch":"n"}}}},"needle":{"component":"data2-core-types@Regex","params":{"pattern":"[^A-Z0-9]+","flags":"g"}},"patch":" "}}}}}}}},"resultName":"targetsNorm"}},{"component":"data2-core-flow@Step","params":{"action":{"component":"data2-core-functions@ArrayFilter","params":{"array":{"component":"data2-core-types@Reference","params":{"reference":"withKeys"}},"filter":{"component":"data2-core-functions@Function","params":{"parameters":["f"],"body":{"component":"data2-core-functions@Includes","params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":"targetsNorm"}},"pattern":{"component":"data2-core-types@Reference","params":{"reference":"f.normName"}}}}}}}},"resultName":"targets"}},{"component":"data2-core-flow@Step","params":{"action":{"component":"data2-core-functions@ArrayFilter","params":{"array":{"component":"data2-core-types@Reference","params":{"reference":"withKeys"}},"filter":{"component":"data2-core-functions@Function","params":{"parameters":["f"],"body":{"component":"data2-core-logical-operators@And","params":{"components":[{"component":"data2-core-logical-operators@Not","params":{"subject":{"component":"data2-core-functions@Includes","params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":"targetsNorm"}},"pattern":{"component":"data2-core-types@Reference","params":{"reference":"f.normName"}}}}}},{"component":"data2-core-comparison-operators@GreaterThan","params":{"subject":{"component":"data2-core-functions@Count","params":{"subject":{"component":"data2-core-functions@ArrayFilter","params":{"array":{"component":"data2-core-types@Reference","params":{"reference":"targets"}},"filter":{"component":"data2-core-functions@Function","params":{"parameters":["t"],"body":{"component":"data2-core-comparison-operators@EqualOrGreaterThan","params":{"subject":{"component":"data2-core-functions@Count","params":{"subject":{"component":"data2-core-functions@ArrayFilter","params":{"array":{"component":"data2-core-types@Reference","params":{"reference":"f.keys"}},"filter":{"component":"data2-core-functions@Function","params":{"parameters":["k"],"body":{"component":"data2-core-functions@Includes","params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":"t.keys"}},"pattern":{"component":"data2-core-types@Reference","params":{"reference":"k"}}}}}}}}}},"comparisonSubject":2}}}}}}}},"comparisonSubject":0}}]}}}}}},"resultName":"neighbors"}},{"component":"data2-core-functions@ArrayMap","params":{"array":{"component":"data2-core-types@Reference","params":{"reference":"neighbors"}},"mapper":{"component":"data2-core-functions@Function","params":{"parameters":["f"],"body":{"component":"data2-core-types@Reference","params":{"reference":"f.name"}}}}}}]}}},"updatedAt":"2026-07-29T05:50:25.973Z","createdAt":"2026-07-29T05:47:08.448Z"},{"_id":"6a6994a1049cd0da321f270c","component":"data2-core-types@Component","system":"6a57cfe9673eb7e3c5e57784","params":{"component":"4vQ1HUOSYMGvZGCOV2GYd","package":"natura-geomarketing","title":"get-neighbor-municipios","parameters":{"params":{"fields":{"uf":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"},"municipio":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@FieldSet"},"definition":{"component":"data2-core-flow@Series","params":{"actions":[{"component":"data2-core-flow@Step","params":{"action":{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"N15zEWu4GvXztmPPTjOBt"}},"prop":"sendRequest","args":[{"request":{"component":"data2-core-types@InstanceReference","params":{"component":"data2-core-connect@HttpRequest","reference":"gh_MFH1HrDf2o2JrlseD0"}},"requestParameters":{"uf":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"uf"}}},"component":"data2-core-types@Reference"}}}]}},"resultName":"resp"}},{"params":{"features":{"component":"data2-core-types@Reference","params":{"reference":"resp.data.features"}},"municipio":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"municipio"}}},"component":"data2-core-types@Reference"}},"component":"natura-geomarketing@3EIFSsdsdy7iTIJ5HZ6fY"}]}}},"updatedAt":"2026-07-29T05:53:44.874Z","createdAt":"2026-07-29T05:50:25.809Z"},{"_id":"6a6997e39279f4a770dce0a0","component":"data2-core-types@Component","system":"6a57cfe9673eb7e3c5e57784","params":{"component":"yJwIwtjYNeYGoGF68aYQM","package":"natura-geomarketing","title":"Interactive Sales Group Map","extends":"data2-core-primitives@Block","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"assignments":{"component":"data2-core-primitives@Object"},"colors":{"component":"data2-core-primitives@Object"},"groups":{"component":"data2-core-primitives@Array"},"municipio":{"component":"data2-core-primitives@String"},"neighborUfs":{"component":"data2-core-primitives@String"},"onChange":{"component":"data2-core-types@Interaction"},"store":{"component":"data2-core-types@InteractiveModuleReference"},"ufs":{"component":"data2-core-primitives@String"},"prop":{"component":"data2-core-primitives@String"}}}},"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"const UF_CODE={RO:'11',AC:'12',AM:'13',RR:'14',PA:'15',AP:'16',TO:'17',MA:'21',PI:'22',CE:'23',RN:'24',PB:'25',PE:'26',AL:'27',SE:'28',BA:'29',MG:'31',ES:'32',RJ:'33',SP:'35',PR:'41',SC:'42',RS:'43',MS:'50',MT:'51',GO:'52',DF:'53'};\nconst UF_BORDERS={AC:['AM','RO'],AL:['BA','PE','SE'],AM:['AC','RO','RR','PA','MT'],AP:['PA'],\n BA:['AL','SE','PE','PI','TO','GO','MG','ES'],CE:['PI','PB','PE','RN'],DF:['GO','MG'],\n ES:['BA','MG','RJ'],GO:['DF','MT','MS','MG','BA','TO'],MA:['PA','TO','PI'],\n MG:['BA','GO','DF','MS','SP','RJ','ES'],MS:['MT','GO','MG','SP','PR'],MT:['RO','AM','PA','TO','GO','MS'],\n PA:['AP','AM','MT','TO','MA','RR'],PB:['RN','CE','PE'],PE:['PB','CE','PI','BA','AL'],\n PI:['MA','TO','BA','PE','CE'],PR:['SP','MS','SC'],RJ:['ES','MG','SP'],RN:['CE','PB'],\n RO:['AC','AM','MT'],RR:['AM','PA'],RS:['SC'],SC:['PR','RS'],SE:['BA','AL'],\n SP:['MG','RJ','PR','MS'],TO:['PA','MA','PI','BA','GO','MT']};\nconst PALETTE=['#8b7fd6','#d1b048','#67bd5b','#5aa9d6','#d67fa8','#c98a4b'];\n\nexport default {\n  css: `\n    :host{display:block;width:100%;height:100%;box-sizing:border-box}\n    .wrap{position:relative;height:100%;display:flex;flex-direction:column;font:12px -apple-system,BlinkMacSystemFont,\"Segoe UI\",Inter,sans-serif;background:#f4f4f8}\n    .stage{flex:1;min-height:0;position:relative;cursor:grab}\n    .stage:active{cursor:grabbing}\n    svg{width:100%;height:100%;display:block}\n    .muni{stroke:#0b0d12;stroke-width:1.1;transition:filter .1s}\n    .muni.ctx{cursor:default}\n    .muni:not(.ctx){cursor:pointer}\n    .muni:not(.ctx):hover{filter:brightness(1.25)}\n    .wedge{cursor:pointer;stroke:#fff;stroke-width:0.6;transition:filter .1s}\n    .wedge:hover{filter:brightness(1.25)}\n    .bg{fill:#ffffff;stroke:#1a1a1a;stroke-width:.5;opacity:.5}\n    .mlabel{fill:#1a1a1a;font-size:9px;font-weight:700;pointer-events:none;user-select:none;text-anchor:middle;paint-order:stroke;stroke:rgba(255,255,255,.6);stroke-width:0.5px}\n    .legend{display:flex;gap:10px;flex-wrap:wrap;padding:8px 10px;border-top:1px solid #e7e7ef;background:#fff}\n    .legend span{display:inline-flex;align-items:center;gap:5px}\n    .legend b{width:10px;height:10px;border-radius:3px;display:inline-block}\n    .load{position:absolute;inset:0;background:rgba(244,244,248,.92);display:flex;align-items:center;justify-content:center;z-index:5;color:#71717f;text-align:center;padding:16px;cursor:default}\n    .load.err{cursor:pointer;text-decoration:underline;color:#c8104e}\n    .load.hidden{display:none}\n    .tip{position:fixed;pointer-events:none;background:#000;color:#fff;border-radius:7px;padding:6px 8px;font-size:11px;opacity:0;transition:opacity .1s;z-index:9;max-width:220px}\n  `,\n  render(){\n    return `<div class=\"wrap\">\n      <div class=\"stage\"><svg id=\"map\" viewBox=\"0 0 700 500\" preserveAspectRatio=\"xMidYMid meet\"></svg></div>\n      <div class=\"legend\" id=\"legend\"></div>\n      <div class=\"tip\" id=\"tip\"></div>\n      <div class=\"load\" id=\"loader\">carregando malhas…</div>\n    </div>`;\n  },\n  mounted(d2, root){\n\n    const $ = s => root.querySelector(s);\n    const NS = 'http://www.w3.org/2000/svg';\n    const norm = s => (s||'').normalize('NFKD').replace(/[̀-ͯ]/g,'').toUpperCase().replace(/[^A-Z0-9]+/g,' ').trim();\n    const esc = s => (s==null?'':String(s)).replace(/[&<>]/g, c => ({'&':'&amp;','<':'&lt;','>':'&gt;'}[c]));\n    const splitUfs = s => (s||'').split(',').map(x=>x.trim().toUpperCase()).filter(Boolean);\n\n    async function geoUF(uf){\n      const code = UF_CODE[uf] || uf;\n      const r = await fetch('https://raw.githubusercontent.com/tbrugz/geodata-br/master/geojson/geojs-'+code+'-mun.json');\n      if (!r.ok) throw new Error('geo ' + uf);\n      return r.json();\n    }\n    function buildAdj(features){\n      const pts = f => {\n        const g=f.geometry, ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates], s=new Set();\n        ps.forEach(poly=>poly.forEach(ring=>ring.forEach(p=>s.add(Math.round(p[0]*1000)/1000+','+Math.round(p[1]*1000)/1000))));\n        return s;\n      };\n      const feat = {}, idx = {};\n      features.forEach(f => { const nm = norm(f.properties.name || f.properties.NOME || f.properties.nome); feat[nm] = { f, pts: pts(f) }; });\n      for (const nm in feat) feat[nm].pts.forEach(p => (idx[p] = idx[p] || []).push(nm));\n      const nbrs = nm => {\n        const c = {};\n        feat[nm].pts.forEach(p => idx[p].forEach(o => { if (o !== nm) c[o] = (c[o] || 0) + 1; }));\n        return Object.entries(c).filter(([, n]) => n >= 2).map(([o]) => o);\n      };\n      return { feat, nbrs };\n    }\n    function project(feats){\n      let mnx=1/0,mny=1/0,mxx=-1/0,mxy=-1/0;\n      const each = cb => feats.forEach(f=>{const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];ps.forEach(p=>p.forEach(r=>r.forEach(cb)));});\n      each(p=>{mnx=Math.min(mnx,p[0]);mxx=Math.max(mxx,p[0]);mny=Math.min(mny,p[1]);mxy=Math.max(mxy,p[1]);});\n      const mlat=(mny+mxy)/2, kx=Math.cos(mlat*Math.PI/180), W=700,H=500,pad=22;\n      const gw=(mxx-mnx)*kx, gh=(mxy-mny), sc=Math.min((W-2*pad)/gw,(H-2*pad)/gh);\n      const ox=(W-gw*sc)/2, oy=(H-gh*sc)/2;\n      const pr = p=>[ox+(p[0]-mnx)*kx*sc, oy+(mxy-p[1])*sc];\n      pr.scale = sc;\n      return pr;\n    }\n    function pathFor(f,pr){\n      const g=f.geometry, ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];\n      return ps.map(poly=>poly.map(r=>'M'+r.map(p=>{const q=pr(p);return q[0].toFixed(1)+','+q[1].toFixed(1);}).join('L')+'Z').join('')).join('');\n    }\n    function cxy(f,pr){\n      let x=0,y=0,n=0; const g=f.geometry, ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];\n      ps.forEach(poly=>poly[0].forEach(p=>{const q=pr(p);x+=q[0];y+=q[1];n++;}));\n      return [x/n, y/n];\n    }\n    // Clips a projected ring (screen-space [x,y] points) against a single straight half-plane\n    // (side(x,y) >= 0 is kept) via Sutherland-Hodgman. Unlike a wedge radiating from one apex —\n    // which only covers a shape the apex can \"see\" the whole border of — a straight-line cut is\n    // exact for ANY simple polygon, convex or concave, so stacking these never leaves a gap.\n    function clipHalfPlane(ring, side){\n      const out = [];\n      const n = ring.length;\n      for (let i = 0; i < n; i++){\n        const curr = ring[i], prev = ring[(i - 1 + n) % n];\n        const sCurr = side(curr[0], curr[1]);\n        const sPrev = side(prev[0], prev[1]);\n        const currIn = sCurr >= -1e-9;\n        const prevIn = sPrev >= -1e-9;\n        if (currIn) {\n          if (!prevIn) out.push(intersectHalfPlane(prev, curr, side));\n          out.push(curr);\n        } else if (prevIn) {\n          out.push(intersectHalfPlane(prev, curr, side));\n        }\n      }\n      return out;\n    }\n    function intersectHalfPlane(p1, p2, side){\n      const s1 = side(p1[0], p1[1]), s2 = side(p2[0], p2[1]);\n      const t = s1 / (s1 - s2);\n      return [p1[0] + t * (p2[0] - p1[0]), p1[1] + t * (p2[1] - p1[1])];\n    }\n    // Full projected bounding box of a município — used to lay bands across its ENTIRE geometry\n    // (all MultiPolygon parts included), so the bands always tile the whole shape, islands too.\n    function bboxOf(f, pr){\n      let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n      const g = f.geometry, ps = g.type === 'MultiPolygon' ? g.coordinates : [g.coordinates];\n      ps.forEach(poly => poly.forEach(ring => ring.forEach(p => {\n        const q = pr(p);\n        minX = Math.min(minX, q[0]); maxX = Math.max(maxX, q[0]);\n        minY = Math.min(minY, q[1]); maxY = Math.max(maxY, q[1]);\n      })));\n      return [minX, minY, maxX, maxY];\n    }\n    // A vertical band [x0,x1) of the município, clipped against its REAL border on both sides.\n    function stripeClipPath(f, pr, x0, x1){\n      const g = f.geometry, ps = g.type === 'MultiPolygon' ? g.coordinates : [g.coordinates];\n      let d = '';\n      ps.forEach(poly => poly.forEach(ring => {\n        let pts = ring.map(p => pr(p));\n        pts = clipHalfPlane(pts, (x) => x - x0);\n        if (pts.length) pts = clipHalfPlane(pts, (x) => x1 - x);\n        if (pts.length >= 3) d += 'M' + pts.map(q => q[0].toFixed(1) + ',' + q[1].toFixed(1)).join('L') + 'Z';\n      }));\n      return d;\n    }\n    const loader = (on, t, isErr) => {\n      const l = $('#loader');\n      l.classList.toggle('hidden', !on);\n      l.classList.toggle('err', !!isErr);\n      if (t != null) l.textContent = t;\n    };\n\n    let S = { assign: { ...(d2.param('assignments', {}) || {}) }, targets: new Set(), clickable: new Set(), closeFeats: {}, nbrFeats: [], labels: {}, pr: null, view: { scale: 1, tx: 0, ty: 0 }, groupAssign: {} };\n    let dragStart = null, dragMoved = false;\n\n    // Live sector for a município: the Store (if bound) is the source of truth —\n    // reads are tracked, so an external change to the Store re-renders this map.\n    // `S.assign` is only the bootstrap default (from `assignments`) before the\n    // Store has an entry, or the fallback when no `store` param is bound at all.\n    function getAssign(key){\n      const storeRef = d2.param('store');\n      if (!storeRef) return S.assign[key];\n      const prop = d2.param('prop');\n      if (prop) {\n        const obj = d2.store(storeRef).get(prop, {}) || {};\n        return key in obj ? obj[key] : S.assign[key];\n      }\n      return d2.store(storeRef).get(key, S.assign[key]);\n    }\n\n    // Writes back through the same `prop` indirection as getAssign(): when `prop` is set,\n    // values land on store[prop][key] (a nested object) instead of store[key] directly —\n    // the same shape a Setter targeting `@Store.prop` would produce.\n    function setAssign(key, value){\n      S.assign[key] = value;\n      const storeRef = d2.param('store');\n      if (!storeRef) return;\n      const prop = d2.param('prop');\n      if (prop) {\n        const obj = { ...(d2.store(storeRef).get(prop, {}) || {}) };\n        obj[key] = value;\n        d2.store(storeRef).set(prop, obj);\n      } else {\n        d2.store(storeRef).set(key, value);\n      }\n    }\n\n    // A município can hold MULTIPLE sectors at once — stored as an array instead of\n    // a single string. cycleAt() advances just one slot of that array (one pie wedge)\n    // through `groups`, padding the array if the clicked index didn't exist yet.\n    // `groups` is now an array of { sector, municipio } — sector is the value cycled\n    // through on click; municipio (comma-separated) statically pins that sector's color\n    // onto municípios that aren't part of the interactive store-backed assignment.\n    function sectorNames(){\n      return (d2.param('groups', []) || []).map(g => g.sector);\n    }\n\n    function cycleAt(key, idx, arrLen){\n      const gs = sectorNames();\n      if (!gs.length) return null;\n      let arr = getAssign(key);\n      arr = Array.isArray(arr) ? [...arr] : [];\n      while (arr.length < arrLen) arr.push('');\n      const next = gs[(gs.indexOf(arr[idx]) + 1) % gs.length];\n      arr[idx] = next;\n      setAssign(key, arr);\n      return next;\n    }\n\n    function svgPoint(evt){\n      const svg = $('#map');\n      const pt = svg.createSVGPoint();\n      pt.x = evt.clientX; pt.y = evt.clientY;\n      const ctm = svg.getScreenCTM();\n      if (!ctm) return { x: 0, y: 0 };\n      const p = pt.matrixTransform(ctm.inverse());\n      return { x: p.x, y: p.y };\n    }\n    function applyTransform(){\n      const g = $('#viewport');\n      if (g) g.setAttribute('transform', `translate(${S.view.tx} ${S.view.ty}) scale(${S.view.scale})`);\n    }\n    d2.on('.stage', 'wheel', e => {\n      e.preventDefault();\n      const p = svgPoint(e);\n      const factor = e.deltaY < 0 ? 1.15 : 1 / 1.15;\n      const next = Math.min(8, Math.max(0.15, S.view.scale * factor));\n      const k = next / S.view.scale;\n      S.view.tx = p.x - k * (p.x - S.view.tx);\n      S.view.ty = p.y - k * (p.y - S.view.ty);\n      S.view.scale = next;\n      applyTransform();\n    });\n    d2.on('.stage', 'mousedown', e => {\n      if (e.button !== 0) return;\n      const p = svgPoint(e);\n      dragStart = { x: p.x, y: p.y, tx: S.view.tx, ty: S.view.ty };\n      dragMoved = false;\n    });\n    d2.on(window, 'mousemove', e => {\n      if (!dragStart) return;\n      const p = svgPoint(e);\n      const dx = p.x - dragStart.x, dy = p.y - dragStart.y;\n      if (Math.abs(dx) > 0.5 || Math.abs(dy) > 0.5) dragMoved = true;\n      S.view.tx = dragStart.tx + dx;\n      S.view.ty = dragStart.ty + dy;\n      applyTransform();\n    });\n    d2.on(window, 'mouseup', () => { dragStart = null; });\n\n    // This component paints imperatively (mounted-driven SVG, not the reactive\n    // render() string), so a Store read here isn't auto-tracked the way it would\n    // be inside render(). Poll the bound Store's sector values every frame and\n    // redraw when any of them changed — this is what makes an EXTERNAL write to\n    // the Store (not just this map's own clicks) show up on the map.\n    let lastAssignSnapshot = {};\n    d2.raf(() => {\n      const storeRef = d2.param('store');\n      if (!storeRef) return;\n      let changed = false;\n      Object.keys(S.closeFeats).forEach(key => {\n        const v = getAssign(key);\n        // Arrays (multi-sector municípios) are compared by a joined signature, not by\n        // reference — a store that clones on read would otherwise look \"changed\" every frame.\n        const sig = Array.isArray(v) ? v.join('\u0001') : v;\n        if (lastAssignSnapshot[key] !== sig) { changed = true; lastAssignSnapshot[key] = sig; }\n      });\n      if (changed) drawMap();\n    });\n\n    function drawMap(){\n      const svg = $('#map'); svg.innerHTML = '';\n      const viewport = document.createElementNS(NS, 'g');\n      viewport.setAttribute('id', 'viewport');\n      svg.appendChild(viewport);\n      applyTransform();\n      const groupDefs = d2.param('groups', []) || [];\n      const sectors = groupDefs.map(g => g.sector);\n      const colors = d2.param('colors', {});\n      const colorFor = g => colors[g] || PALETTE[sectors.indexOf(g) % PALETTE.length] || '#94a3b8';\n      // Base label size tracks the projection's own fit scale, so labels stay proportionate\n      // to the shapes whether the auto-fit is tight (one neighborhood) or wide (distant targets).\n      const labelFontSize = Math.max(4, Math.min(14, 9 * ((S.pr.scale || 1000) / 1000)));\n\n      S.nbrFeats.forEach(f => {\n        const p = document.createElementNS(NS, 'path');\n        p.setAttribute('d', pathFor(f, S.pr));\n        p.setAttribute('class', 'bg');\n        p.setAttribute('data-key', 'bg-' + (f.properties.name || f.properties.NOME || f.properties.nome || ''));\n        viewport.appendChild(p);\n      });\n\n      Object.entries(S.closeFeats).forEach(([key, f]) => {\n        const clickable = S.clickable.has(key);\n        const groupSectors = !clickable ? S.groupAssign[key] : null;\n        const groupSector = groupSectors ? groupSectors[0] : null;\n        const currentVal = getAssign(key);\n        const arrVal = Array.isArray(currentVal) ? currentVal : null;\n        const isPie = !!(arrVal && arrVal.length >= 2 && clickable);\n        // Static group pins can also stack more than one sector onto the same município\n        // (e.g. two `groups[]` entries both listing it) — split those into a pie too.\n        const isGroupPie = !!(groupSectors && groupSectors.length >= 2);\n        const soloSector = arrVal ? arrVal[0] : currentVal;\n        const p = document.createElementNS(NS, 'path');\n        p.setAttribute('d', pathFor(f, S.pr));\n        p.setAttribute('data-key', key);\n        p.setAttribute('class', ['muni', clickable ? '' : 'ctx'].filter(Boolean).join(' '));\n\n        if (isPie || isGroupPie) {\n          // Multiple sectors share this município — the shape itself is a neutral\n          // safety-net backdrop; the wedges below (clipped to the REAL border, one per\n          // array entry) carry the actual colors and fully cover the município's area.\n          const pieSectors = isPie ? arrVal : groupSectors;\n          p.setAttribute('fill', '#eef0f5');\n          p.onmousemove = e => {\n            const tip = $('#tip');\n            tip.style.opacity = 1; tip.style.left = (e.clientX + 12) + 'px'; tip.style.top = (e.clientY + 12) + 'px';\n            const names = pieSectors.map(v => v || 'sem destino').join(', ');\n            tip.innerHTML = `<b>${esc(S.labels[key] || key)}</b><br>${pieSectors.length} setores: ${esc(names)}`;\n          };\n          p.onmouseleave = () => { $('#tip').style.opacity = 0; };\n        } else {\n          if (groupSector) {\n            p.setAttribute('fill', colorFor(groupSector));\n            p.setAttribute('fill-opacity', '0.3');\n          } else {\n            p.setAttribute('fill', soloSector ? colorFor(soloSector) : (clickable ? '#94a3b8' : '#dcdfe8'));\n          }\n          if (clickable) {\n            p.onclick = () => {\n              if (dragMoved) { dragMoved = false; return; }\n              let next;\n              if (arrVal) {\n                next = cycleAt(key, 0, arrVal.length || 1);\n              } else {\n                const gs = sectorNames();\n                if (!gs.length) return;\n                next = gs[(gs.indexOf(getAssign(key)) + 1) % gs.length];\n                setAssign(key, next);\n              }\n              drawMap();\n              d2.emit('onChange', arrVal ? { municipio: key, sectorIndex: 0, setor: next } : { municipio: key, setor: next });\n            };\n          }\n          p.onmousemove = e => {\n            const tip = $('#tip');\n            tip.style.opacity = 1; tip.style.left = (e.clientX + 12) + 'px'; tip.style.top = (e.clientY + 12) + 'px';\n            const label = groupSector || soloSector || (clickable ? 'sem destino' : 'apenas contexto');\n            tip.innerHTML = `<b>${esc(S.labels[key] || key)}</b><br>${esc(label)}`;\n          };\n          p.onmouseleave = () => { $('#tip').style.opacity = 0; };\n        }\n        viewport.appendChild(p);\n\n        const [cx, cy] = cxy(f, S.pr);\n\n        if (isPie || isGroupPie) {\n          const wedgeSectors = isPie ? arrVal : groupSectors;\n          const n = wedgeSectors.length;\n          // Bands across the FULL bounding box of this município, not wedges around a center —\n          // a center point can't always \"see\" a concave shape's whole border, which used to leave\n          // slivers uncovered; straight parallel cuts always tile the entire shape exactly.\n          const [bx0, , bx1] = bboxOf(f, S.pr);\n          const stripeW = (bx1 - bx0) / n;\n          wedgeSectors.forEach((sector, i) => {\n            const d = stripeClipPath(f, S.pr, bx0 + i * stripeW, bx0 + (i + 1) * stripeW);\n            if (!d) return;\n            const wedge = document.createElementNS(NS, 'path');\n            wedge.setAttribute('d', d);\n            wedge.setAttribute('class', 'wedge');\n            wedge.setAttribute('fill', sector ? colorFor(sector) : '#94a3b8');\n            // Static group pins (`groups[]`) aren't interactable — keep them at ~30% opacity so\n            // they read as context, distinct from a real Store-backed sector assignment.\n            wedge.setAttribute('fill-opacity', isPie ? '1' : '0.3');\n            wedge.style.cursor = isPie ? 'pointer' : 'default';\n            if (isPie) {\n              wedge.onclick = () => {\n                if (dragMoved) { dragMoved = false; return; }\n                const next = cycleAt(key, i, n);\n                drawMap();\n                d2.emit('onChange', { municipio: key, sectorIndex: i, setor: next });\n              };\n            }\n            wedge.onmousemove = e => {\n              const tip = $('#tip');\n              tip.style.opacity = 1; tip.style.left = (e.clientX + 12) + 'px'; tip.style.top = (e.clientY + 12) + 'px';\n              tip.innerHTML = `<b>${esc(S.labels[key] || key)}</b> — setor ${i + 1}/${n}<br>${esc(sector || 'sem destino')}`;\n            };\n            wedge.onmouseleave = () => { $('#tip').style.opacity = 0; };\n            viewport.appendChild(wedge);\n          });\n        }\n\n        const t = document.createElementNS(NS, 'text');\n        t.setAttribute('class', 'mlabel'); t.setAttribute('x', cx); t.setAttribute('y', cy);\n        t.style.fontSize = labelFontSize + 'px';\n        t.textContent = (S.labels[key] || key).slice(0, 13);\n        viewport.appendChild(t);\n      });\n\n      $('#legend').innerHTML = sectors.map(g => `<span><b style=\"background:${colorFor(g)}\"></b>${esc(g)}</span>`).join('');\n    }\n\n    async function load(){\n      loader(true, 'carregando malhas…', false);\n      try {\n        const ufs = splitUfs(d2.param('ufs', 'PR'));\n        if (!ufs.length) throw new Error('informe ao menos uma UF em \"ufs\"');\n        const manualNbr = splitUfs(d2.param('neighborUfs', ''));\n        const autoNbr = ufs.flatMap(u => UF_BORDERS[u] || []);\n        const nbrUfs = [...new Set(manualNbr.length ? manualNbr : autoNbr)].filter(u => !ufs.includes(u));\n        const allUfs = [...new Set([...ufs, ...nbrUfs])];\n        const geos = await Promise.all(allUfs.map(u => geoUF(u).catch(() => null)));\n\n        const closeUfSet = new Set(ufs);\n        const allFeats = [];\n        const stateNames = [];\n        allUfs.forEach((u, i) => {\n          const g = geos[i]; if (!g) return;\n          const inClose = closeUfSet.has(u);\n          g.features.forEach(f => {\n            allFeats.push(f);\n            if (inClose) stateNames.push(norm(f.properties.name || f.properties.NOME || f.properties.nome || ''));\n          });\n        });\n        if (!allFeats.length) throw new Error('nenhuma malha carregada para essas UFs');\n\n        const adj = buildAdj(allFeats);\n\n        const targetsRaw = (d2.param('municipio', '') || '').split(',').map(x => x.trim()).filter(Boolean);\n        const targetNames = targetsRaw.map(norm);\n        const foundTargets = targetNames.filter(t => adj.feat[t]);\n        if (targetNames.length && !foundTargets.length) throw new Error('município(s) não encontrado(s) na(s) UF(s) informada(s): ' + targetsRaw.join(', '));\n        S.targets = new Set(foundTargets);\n\n        // Interactive scope (\"close\"): each target município (comma-separated in `municipio`)\n        // + its direct neighbors — NOT the whole state. Falls back to the whole state when no\n        // `municipio` is set.\n        const neighborhoodNames = foundTargets.length\n          ? [...new Set(foundTargets.flatMap(t => [t, ...adj.nbrs(t)]))]\n          : stateNames;\n\n        // Statically pins a sector's color onto whatever municípios are listed in that\n        // group's `municipio` field — these are display-only, not interactively assignable.\n        // A município can be listed by more than one group (e.g. Astorga under both Setor A\n        // and Setor B) — keep every sector that claims it so drawMap() can split it into a pie.\n        const groupAssign = {};\n        (d2.param('groups', []) || []).forEach(g => {\n          (g.municipio || '').split(',').map(x => x.trim()).filter(Boolean).forEach(n => {\n            const key = norm(n);\n            (groupAssign[key] = groupAssign[key] || []).push(g.sector);\n          });\n        });\n\n        // A município already carrying a sector assignment joins the interactive set even when\n        // it's not adjacent to the target — this is what `neighborUfs` is for: letting a sector\n        // reach into a município from a bordering state, as long as that UF was loaded.\n        const assignedSet = new Set(Object.keys(S.assign).map(norm));\n        const assignedLoaded = [...assignedSet].filter(n => adj.feat[n]);\n        const groupLoaded = Object.keys(groupAssign).filter(n => adj.feat[n]);\n        const closingNames = [...new Set([...neighborhoodNames, ...assignedLoaded, ...groupLoaded])];\n        const closingSet = new Set(closingNames);\n\n        S.closeFeats = {}; S.labels = {};\n        closingNames.forEach(n => { if (adj.feat[n]) { S.closeFeats[n] = adj.feat[n].f; S.labels[n] = adj.feat[n].f.properties.name || n; } });\n\n        S.clickable = new Set(closingNames.filter(n => assignedSet.has(n)));\n        S.groupAssign = groupAssign;\n\n        // Everything else loaded (rest of the state / neighbor states) is faint background context.\n        const restNames = new Set();\n        allFeats.forEach(f => {\n          const n = norm(f.properties.name || f.properties.NOME || f.properties.nome || '');\n          if (adj.feat[n] && !closingSet.has(n)) restNames.add(n);\n        });\n        S.nbrFeats = [...restNames].map(n => adj.feat[n].f);\n\n        const zoomFeats = Object.values(S.closeFeats);\n        S.pr = project(zoomFeats.length ? zoomFeats : allFeats);\n        S.view = { scale: 1, tx: 0, ty: 0 };\n        drawMap();\n        loader(false);\n      } catch (e) {\n        loader(true, 'erro: ' + e.message + ' (clique p/ tentar de novo)', true);\n      }\n    }\n\n    $('#loader').onclick = () => {\n      if (!$('#loader').classList.contains('err')) return;\n      S.closeFeats = {}; S.nbrFeats = []; S.labels = {};\n      load();\n    };\n\n    load();\n  },\n};"}},"assignments":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"assignments"}}}},"colors":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"colors"}}}},"groups":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"groups"}}}},"municipio":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"municipio"}}}},"neighborUfs":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"neighborUfs"}}}},"onChange":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"onChange"}}}},"store":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"store"}}}},"ufs":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"ufs"}}}},"prop":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"prop"}}}}}}}},"__d2PrevCode":{"code":"const UF_CODE={RO:'11',AC:'12',AM:'13',RR:'14',PA:'15',AP:'16',TO:'17',MA:'21',PI:'22',CE:'23',RN:'24',PB:'25',PE:'26',AL:'27',SE:'28',BA:'29',MG:'31',ES:'32',RJ:'33',SP:'35',PR:'41',SC:'42',RS:'43',MS:'50',MT:'51',GO:'52',DF:'53'};\nconst UF_BORDERS={AC:['AM','RO'],AL:['BA','PE','SE'],AM:['AC','RO','RR','PA','MT'],AP:['PA'],\n BA:['AL','SE','PE','PI','TO','GO','MG','ES'],CE:['PI','PB','PE','RN'],DF:['GO','MG'],\n ES:['BA','MG','RJ'],GO:['DF','MT','MS','MG','BA','TO'],MA:['PA','TO','PI'],\n MG:['BA','GO','DF','MS','SP','RJ','ES'],MS:['MT','GO','MG','SP','PR'],MT:['RO','AM','PA','TO','GO','MS'],\n PA:['AP','AM','MT','TO','MA','RR'],PB:['RN','CE','PE'],PE:['PB','CE','PI','BA','AL'],\n PI:['MA','TO','BA','PE','CE'],PR:['SP','MS','SC'],RJ:['ES','MG','SP'],RN:['CE','PB'],\n RO:['AC','AM','MT'],RR:['AM','PA'],RS:['SC'],SC:['PR','RS'],SE:['BA','AL'],\n SP:['MG','RJ','PR','MS'],TO:['PA','MA','PI','BA','GO','MT']};\nconst PALETTE=['#8b7fd6','#d1b048','#67bd5b','#5aa9d6','#d67fa8','#c98a4b'];\n\nexport default {\n  css: `\n    :host{display:block;width:100%;height:100%;box-sizing:border-box}\n    .wrap{position:relative;height:100%;display:flex;flex-direction:column;font:12px -apple-system,BlinkMacSystemFont,\"Segoe UI\",Inter,sans-serif;background:#f4f4f8}\n    .stage{flex:1;min-height:0;position:relative;cursor:grab}\n    .stage:active{cursor:grabbing}\n    svg{width:100%;height:100%;display:block}\n    .muni{stroke:#0b0d12;stroke-width:1.1;transition:filter .1s}\n    .muni.ctx{cursor:default}\n    .muni:not(.ctx){cursor:pointer}\n    .muni:not(.ctx):hover{filter:brightness(1.25)}\n    .wedge{cursor:pointer;stroke:#fff;stroke-width:0.6;transition:filter .1s}\n    .wedge:hover{filter:brightness(1.25)}\n    .bg{fill:#ffffff;stroke:#1a1a1a;stroke-width:.5;opacity:.5}\n    .mlabel{fill:#1a1a1a;font-size:9px;font-weight:700;pointer-events:none;user-select:none;text-anchor:middle;paint-order:stroke;stroke:rgba(255,255,255,.6);stroke-width:0.5px}\n    .legend{display:flex;gap:10px;flex-wrap:wrap;padding:8px 10px;border-top:1px solid #e7e7ef;background:#fff}\n    .legend span{display:inline-flex;align-items:center;gap:5px}\n    .legend b{width:10px;height:10px;border-radius:3px;display:inline-block}\n    .load{position:absolute;inset:0;background:rgba(244,244,248,.92);display:flex;align-items:center;justify-content:center;z-index:5;color:#71717f;text-align:center;padding:16px;cursor:default}\n    .load.err{cursor:pointer;text-decoration:underline;color:#c8104e}\n    .load.hidden{display:none}\n    .tip{position:fixed;pointer-events:none;background:#000;color:#fff;border-radius:7px;padding:6px 8px;font-size:11px;opacity:0;transition:opacity .1s;z-index:9;max-width:220px}\n  `,\n  render(){\n    return `<div class=\"wrap\">\n      <div class=\"stage\"><svg id=\"map\" viewBox=\"0 0 700 500\" preserveAspectRatio=\"xMidYMid meet\"></svg></div>\n      <div class=\"legend\" id=\"legend\"></div>\n      <div class=\"tip\" id=\"tip\"></div>\n      <div class=\"load\" id=\"loader\">carregando malhas…</div>\n    </div>`;\n  },\n  mounted(d2, root){\n\n    const $ = s => root.querySelector(s);\n    const NS = 'http://www.w3.org/2000/svg';\n    const norm = s => (s||'').normalize('NFKD').replace(/[̀-ͯ]/g,'').toUpperCase().replace(/[^A-Z0-9]+/g,' ').trim();\n    const esc = s => (s==null?'':String(s)).replace(/[&<>]/g, c => ({'&':'&amp;','<':'&lt;','>':'&gt;'}[c]));\n    const splitUfs = s => (s||'').split(',').map(x=>x.trim().toUpperCase()).filter(Boolean);\n\n    async function geoUF(uf){\n      const code = UF_CODE[uf] || uf;\n      const r = await fetch('https://raw.githubusercontent.com/tbrugz/geodata-br/master/geojson/geojs-'+code+'-mun.json');\n      if (!r.ok) throw new Error('geo ' + uf);\n      return r.json();\n    }\n    function buildAdj(features){\n      const pts = f => {\n        const g=f.geometry, ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates], s=new Set();\n        ps.forEach(poly=>poly.forEach(ring=>ring.forEach(p=>s.add(Math.round(p[0]*1000)/1000+','+Math.round(p[1]*1000)/1000))));\n        return s;\n      };\n      const feat = {}, idx = {};\n      features.forEach(f => { const nm = norm(f.properties.name || f.properties.NOME || f.properties.nome); feat[nm] = { f, pts: pts(f) }; });\n      for (const nm in feat) feat[nm].pts.forEach(p => (idx[p] = idx[p] || []).push(nm));\n      const nbrs = nm => {\n        const c = {};\n        feat[nm].pts.forEach(p => idx[p].forEach(o => { if (o !== nm) c[o] = (c[o] || 0) + 1; }));\n        return Object.entries(c).filter(([, n]) => n >= 2).map(([o]) => o);\n      };\n      return { feat, nbrs };\n    }\n    function project(feats){\n      let mnx=1/0,mny=1/0,mxx=-1/0,mxy=-1/0;\n      const each = cb => feats.forEach(f=>{const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];ps.forEach(p=>p.forEach(r=>r.forEach(cb)));});\n      each(p=>{mnx=Math.min(mnx,p[0]);mxx=Math.max(mxx,p[0]);mny=Math.min(mny,p[1]);mxy=Math.max(mxy,p[1]);});\n      const mlat=(mny+mxy)/2, kx=Math.cos(mlat*Math.PI/180), W=700,H=500,pad=22;\n      const gw=(mxx-mnx)*kx, gh=(mxy-mny), sc=Math.min((W-2*pad)/gw,(H-2*pad)/gh);\n      const ox=(W-gw*sc)/2, oy=(H-gh*sc)/2;\n      const pr = p=>[ox+(p[0]-mnx)*kx*sc, oy+(mxy-p[1])*sc];\n      pr.scale = sc;\n      return pr;\n    }\n    function pathFor(f,pr){\n      const g=f.geometry, ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];\n      return ps.map(poly=>poly.map(r=>'M'+r.map(p=>{const q=pr(p);return q[0].toFixed(1)+','+q[1].toFixed(1);}).join('L')+'Z').join('')).join('');\n    }\n    function cxy(f,pr){\n      let x=0,y=0,n=0; const g=f.geometry, ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];\n      ps.forEach(poly=>poly[0].forEach(p=>{const q=pr(p);x+=q[0];y+=q[1];n++;}));\n      return [x/n, y/n];\n    }\n    // Clips a projected ring (screen-space [x,y] points) to the angular wedge between\n    // a0/a1 (apex cx,cy) via two Sutherland-Hodgman half-plane cuts — this is what makes\n    // a sector's slice follow the município's REAL border instead of sitting in a circle.\n    function intersectLine(p1, p2, cx, cy, dx, dy){\n      const ex = p2[0]-p1[0], ey = p2[1]-p1[1];\n      const denom = ey*dx - ex*dy;\n      if (Math.abs(denom) < 1e-9) return p1;\n      const s = (dy*(p1[0]-cx) - dx*(p1[1]-cy)) / denom;\n      return [p1[0] + s*ex, p1[1] + s*ey];\n    }\n    function clipRingWedge(ring, cx, cy, a0, a1){\n      const side = (angle, x, y) => Math.cos(angle)*(y-cy) - Math.sin(angle)*(x-cx);\n      const mid = (a0 + a1) / 2;\n      const refX = cx + Math.cos(mid), refY = cy + Math.sin(mid);\n      const sign0 = side(a0, refX, refY) >= 0 ? 1 : -1;\n      const sign1 = side(a1, refX, refY) >= 0 ? 1 : -1;\n      function clipEdge(points, angle, keepSign){\n        const dx = Math.cos(angle), dy = Math.sin(angle);\n        const out = [];\n        const n = points.length;\n        for (let i = 0; i < n; i++){\n          const curr = points[i], prev = points[(i - 1 + n) % n];\n          const sCurr = side(angle, curr[0], curr[1]);\n          const sPrev = side(angle, prev[0], prev[1]);\n          const currIn = keepSign >= 0 ? sCurr >= -1e-9 : sCurr <= 1e-9;\n          const prevIn = keepSign >= 0 ? sPrev >= -1e-9 : sPrev <= 1e-9;\n          if (currIn) {\n            if (!prevIn) out.push(intersectLine(prev, curr, cx, cy, dx, dy));\n            out.push(curr);\n          } else if (prevIn) {\n            out.push(intersectLine(prev, curr, cx, cy, dx, dy));\n          }\n        }\n        return out;\n      }\n      let pts = clipEdge(ring, a0, sign0);\n      if (pts.length) pts = clipEdge(pts, a1, sign1);\n      return pts;\n    }\n    function wedgeClipPath(f, pr, cx, cy, a0, a1){\n      const g = f.geometry, ps = g.type === 'MultiPolygon' ? g.coordinates : [g.coordinates];\n      let d = '';\n      ps.forEach(poly => poly.forEach(ring => {\n        const projected = ring.map(p => pr(p));\n        const clipped = clipRingWedge(projected, cx, cy, a0, a1);\n        if (clipped.length >= 3) d += 'M' + clipped.map(q => q[0].toFixed(1) + ',' + q[1].toFixed(1)).join('L') + 'Z';\n      }));\n      return d;\n    }\n    const loader = (on, t, isErr) => {\n      const l = $('#loader');\n      l.classList.toggle('hidden', !on);\n      l.classList.toggle('err', !!isErr);\n      if (t != null) l.textContent = t;\n    };\n\n    let S = { assign: { ...(d2.param('assignments', {}) || {}) }, targets: new Set(), clickable: new Set(), closeFeats: {}, nbrFeats: [], labels: {}, pr: null, view: { scale: 1, tx: 0, ty: 0 }, groupAssign: {} };\n    let dragStart = null, dragMoved = false;\n\n    // Live sector for a município: the Store (if bound) is the source of truth —\n    // reads are tracked, so an external change to the Store re-renders this map.\n    // `S.assign` is only the bootstrap default (from `assignments`) before the\n    // Store has an entry, or the fallback when no `store` param is bound at all.\n    function getAssign(key){\n      const storeRef = d2.param('store');\n      if (!storeRef) return S.assign[key];\n      const prop = d2.param('prop');\n      if (prop) {\n        const obj = d2.store(storeRef).get(prop, {}) || {};\n        return key in obj ? obj[key] : S.assign[key];\n      }\n      return d2.store(storeRef).get(key, S.assign[key]);\n    }\n\n    // Writes back through the same `prop` indirection as getAssign(): when `prop` is set,\n    // values land on store[prop][key] (a nested object) instead of store[key] directly —\n    // the same shape a Setter targeting `@Store.prop` would produce.\n    function setAssign(key, value){\n      S.assign[key] = value;\n      const storeRef = d2.param('store');\n      if (!storeRef) return;\n      const prop = d2.param('prop');\n      if (prop) {\n        const obj = { ...(d2.store(storeRef).get(prop, {}) || {}) };\n        obj[key] = value;\n        d2.store(storeRef).set(prop, obj);\n      } else {\n        d2.store(storeRef).set(key, value);\n      }\n    }\n\n    // A município can hold MULTIPLE sectors at once — stored as an array instead of\n    // a single string. cycleAt() advances just one slot of that array (one pie wedge)\n    // through `groups`, padding the array if the clicked index didn't exist yet.\n    // `groups` is now an array of { sector, municipio } — sector is the value cycled\n    // through on click; municipio (comma-separated) statically pins that sector's color\n    // onto municípios that aren't part of the interactive store-backed assignment.\n    function sectorNames(){\n      return (d2.param('groups', []) || []).map(g => g.sector);\n    }\n\n    function cycleAt(key, idx, arrLen){\n      const gs = sectorNames();\n      if (!gs.length) return null;\n      let arr = getAssign(key);\n      arr = Array.isArray(arr) ? [...arr] : [];\n      while (arr.length < arrLen) arr.push('');\n      const next = gs[(gs.indexOf(arr[idx]) + 1) % gs.length];\n      arr[idx] = next;\n      setAssign(key, arr);\n      return next;\n    }\n\n    function svgPoint(evt){\n      const svg = $('#map');\n      const pt = svg.createSVGPoint();\n      pt.x = evt.clientX; pt.y = evt.clientY;\n      const ctm = svg.getScreenCTM();\n      if (!ctm) return { x: 0, y: 0 };\n      const p = pt.matrixTransform(ctm.inverse());\n      return { x: p.x, y: p.y };\n    }\n    function applyTransform(){\n      const g = $('#viewport');\n      if (g) g.setAttribute('transform', `translate(${S.view.tx} ${S.view.ty}) scale(${S.view.scale})`);\n    }\n    d2.on('.stage', 'wheel', e => {\n      e.preventDefault();\n      const p = svgPoint(e);\n      const factor = e.deltaY < 0 ? 1.15 : 1 / 1.15;\n      const next = Math.min(8, Math.max(0.15, S.view.scale * factor));\n      const k = next / S.view.scale;\n      S.view.tx = p.x - k * (p.x - S.view.tx);\n      S.view.ty = p.y - k * (p.y - S.view.ty);\n      S.view.scale = next;\n      applyTransform();\n    });\n    d2.on('.stage', 'mousedown', e => {\n      if (e.button !== 0) return;\n      const p = svgPoint(e);\n      dragStart = { x: p.x, y: p.y, tx: S.view.tx, ty: S.view.ty };\n      dragMoved = false;\n    });\n    d2.on(window, 'mousemove', e => {\n      if (!dragStart) return;\n      const p = svgPoint(e);\n      const dx = p.x - dragStart.x, dy = p.y - dragStart.y;\n      if (Math.abs(dx) > 0.5 || Math.abs(dy) > 0.5) dragMoved = true;\n      S.view.tx = dragStart.tx + dx;\n      S.view.ty = dragStart.ty + dy;\n      applyTransform();\n    });\n    d2.on(window, 'mouseup', () => { dragStart = null; });\n\n    // This component paints imperatively (mounted-driven SVG, not the reactive\n    // render() string), so a Store read here isn't auto-tracked the way it would\n    // be inside render(). Poll the bound Store's sector values every frame and\n    // redraw when any of them changed — this is what makes an EXTERNAL write to\n    // the Store (not just this map's own clicks) show up on the map.\n    let lastAssignSnapshot = {};\n    d2.raf(() => {\n      const storeRef = d2.param('store');\n      if (!storeRef) return;\n      let changed = false;\n      Object.keys(S.closeFeats).forEach(key => {\n        const v = getAssign(key);\n        // Arrays (multi-sector municípios) are compared by a joined signature, not by\n        // reference — a store that clones on read would otherwise look \"changed\" every frame.\n        const sig = Array.isArray(v) ? v.join('\u0001') : v;\n        if (lastAssignSnapshot[key] !== sig) { changed = true; lastAssignSnapshot[key] = sig; }\n      });\n      if (changed) drawMap();\n    });\n\n    function drawMap(){\n      const svg = $('#map'); svg.innerHTML = '';\n      const viewport = document.createElementNS(NS, 'g');\n      viewport.setAttribute('id', 'viewport');\n      svg.appendChild(viewport);\n      applyTransform();\n      const groupDefs = d2.param('groups', []) || [];\n      const sectors = groupDefs.map(g => g.sector);\n      const colors = d2.param('colors', {});\n      const colorFor = g => colors[g] || PALETTE[sectors.indexOf(g) % PALETTE.length] || '#94a3b8';\n      // Base label size tracks the projection's own fit scale, so labels stay proportionate\n      // to the shapes whether the auto-fit is tight (one neighborhood) or wide (distant targets).\n      const labelFontSize = Math.max(4, Math.min(14, 9 * ((S.pr.scale || 1000) / 1000)));\n\n      S.nbrFeats.forEach(f => {\n        const p = document.createElementNS(NS, 'path');\n        p.setAttribute('d', pathFor(f, S.pr));\n        p.setAttribute('class', 'bg');\n        p.setAttribute('data-key', 'bg-' + (f.properties.name || f.properties.NOME || f.properties.nome || ''));\n        viewport.appendChild(p);\n      });\n\n      Object.entries(S.closeFeats).forEach(([key, f]) => {\n        const clickable = S.clickable.has(key);\n        const groupSectors = !clickable ? S.groupAssign[key] : null;\n        const groupSector = groupSectors ? groupSectors[0] : null;\n        const currentVal = getAssign(key);\n        const arrVal = Array.isArray(currentVal) ? currentVal : null;\n        const isPie = !!(arrVal && arrVal.length >= 2 && clickable);\n        // Static group pins can also stack more than one sector onto the same município\n        // (e.g. two `groups[]` entries both listing it) — split those into a pie too.\n        const isGroupPie = !!(groupSectors && groupSectors.length >= 2);\n        const soloSector = arrVal ? arrVal[0] : currentVal;\n        const p = document.createElementNS(NS, 'path');\n        p.setAttribute('d', pathFor(f, S.pr));\n        p.setAttribute('data-key', key);\n        p.setAttribute('class', ['muni', clickable ? '' : 'ctx'].filter(Boolean).join(' '));\n\n        if (isPie || isGroupPie) {\n          // Multiple sectors share this município — the shape itself is a neutral\n          // safety-net backdrop; the wedges below (clipped to the REAL border, one per\n          // array entry) carry the actual colors and fully cover the município's area.\n          const pieSectors = isPie ? arrVal : groupSectors;\n          p.setAttribute('fill', '#eef0f5');\n          p.onmousemove = e => {\n            const tip = $('#tip');\n            tip.style.opacity = 1; tip.style.left = (e.clientX + 12) + 'px'; tip.style.top = (e.clientY + 12) + 'px';\n            const names = pieSectors.map(v => v || 'sem destino').join(', ');\n            tip.innerHTML = `<b>${esc(S.labels[key] || key)}</b><br>${pieSectors.length} setores: ${esc(names)}`;\n          };\n          p.onmouseleave = () => { $('#tip').style.opacity = 0; };\n        } else {\n          if (groupSector) {\n            p.setAttribute('fill', colorFor(groupSector));\n            p.setAttribute('fill-opacity', '0.3');\n          } else {\n            p.setAttribute('fill', soloSector ? colorFor(soloSector) : (clickable ? '#94a3b8' : '#dcdfe8'));\n          }\n          if (clickable) {\n            p.onclick = () => {\n              if (dragMoved) { dragMoved = false; return; }\n              let next;\n              if (arrVal) {\n                next = cycleAt(key, 0, arrVal.length || 1);\n              } else {\n                const gs = sectorNames();\n                if (!gs.length) return;\n                next = gs[(gs.indexOf(getAssign(key)) + 1) % gs.length];\n                setAssign(key, next);\n              }\n              drawMap();\n              d2.emit('onChange', arrVal ? { municipio: key, sectorIndex: 0, setor: next } : { municipio: key, setor: next });\n            };\n          }\n          p.onmousemove = e => {\n            const tip = $('#tip');\n            tip.style.opacity = 1; tip.style.left = (e.clientX + 12) + 'px'; tip.style.top = (e.clientY + 12) + 'px';\n            const label = groupSector || soloSector || (clickable ? 'sem destino' : 'apenas contexto');\n            tip.innerHTML = `<b>${esc(S.labels[key] || key)}</b><br>${esc(label)}`;\n          };\n          p.onmouseleave = () => { $('#tip').style.opacity = 0; };\n        }\n        viewport.appendChild(p);\n\n        const [cx, cy] = cxy(f, S.pr);\n\n        if (isPie || isGroupPie) {\n          const wedgeSectors = isPie ? arrVal : groupSectors;\n          const n = wedgeSectors.length;\n          wedgeSectors.forEach((sector, i) => {\n            const a0 = -Math.PI / 2 + i * (2 * Math.PI / n);\n            const a1 = -Math.PI / 2 + (i + 1) * (2 * Math.PI / n);\n            const d = wedgeClipPath(f, S.pr, cx, cy, a0, a1);\n            if (!d) return;\n            const wedge = document.createElementNS(NS, 'path');\n            wedge.setAttribute('d', d);\n            wedge.setAttribute('class', 'wedge');\n            wedge.setAttribute('fill', sector ? colorFor(sector) : '#94a3b8');\n            // Static group pins (`groups[]`) aren't interactable — keep them at ~30% opacity so\n            // they read as context, distinct from a real Store-backed sector assignment.\n            wedge.setAttribute('fill-opacity', isPie ? '1' : '0.3');\n            wedge.style.cursor = isPie ? 'pointer' : 'default';\n            if (isPie) {\n              wedge.onclick = () => {\n                if (dragMoved) { dragMoved = false; return; }\n                const next = cycleAt(key, i, n);\n                drawMap();\n                d2.emit('onChange', { municipio: key, sectorIndex: i, setor: next });\n              };\n            }\n            wedge.onmousemove = e => {\n              const tip = $('#tip');\n              tip.style.opacity = 1; tip.style.left = (e.clientX + 12) + 'px'; tip.style.top = (e.clientY + 12) + 'px';\n              tip.innerHTML = `<b>${esc(S.labels[key] || key)}</b> — setor ${i + 1}/${n}<br>${esc(sector || 'sem destino')}`;\n            };\n            wedge.onmouseleave = () => { $('#tip').style.opacity = 0; };\n            viewport.appendChild(wedge);\n          });\n        }\n\n        const t = document.createElementNS(NS, 'text');\n        t.setAttribute('class', 'mlabel'); t.setAttribute('x', cx); t.setAttribute('y', cy);\n        t.style.fontSize = labelFontSize + 'px';\n        t.textContent = (S.labels[key] || key).slice(0, 13);\n        viewport.appendChild(t);\n      });\n\n      $('#legend').innerHTML = sectors.map(g => `<span><b style=\"background:${colorFor(g)}\"></b>${esc(g)}</span>`).join('');\n    }\n\n    async function load(){\n      loader(true, 'carregando malhas…', false);\n      try {\n        const ufs = splitUfs(d2.param('ufs', 'PR'));\n        if (!ufs.length) throw new Error('informe ao menos uma UF em \"ufs\"');\n        const manualNbr = splitUfs(d2.param('neighborUfs', ''));\n        const autoNbr = ufs.flatMap(u => UF_BORDERS[u] || []);\n        const nbrUfs = [...new Set(manualNbr.length ? manualNbr : autoNbr)].filter(u => !ufs.includes(u));\n        const allUfs = [...new Set([...ufs, ...nbrUfs])];\n        const geos = await Promise.all(allUfs.map(u => geoUF(u).catch(() => null)));\n\n        const closeUfSet = new Set(ufs);\n        const allFeats = [];\n        const stateNames = [];\n        allUfs.forEach((u, i) => {\n          const g = geos[i]; if (!g) return;\n          const inClose = closeUfSet.has(u);\n          g.features.forEach(f => {\n            allFeats.push(f);\n            if (inClose) stateNames.push(norm(f.properties.name || f.properties.NOME || f.properties.nome || ''));\n          });\n        });\n        if (!allFeats.length) throw new Error('nenhuma malha carregada para essas UFs');\n\n        const adj = buildAdj(allFeats);\n\n        const targetsRaw = (d2.param('municipio', '') || '').split(',').map(x => x.trim()).filter(Boolean);\n        const targetNames = targetsRaw.map(norm);\n        const foundTargets = targetNames.filter(t => adj.feat[t]);\n        if (targetNames.length && !foundTargets.length) throw new Error('município(s) não encontrado(s) na(s) UF(s) informada(s): ' + targetsRaw.join(', '));\n        S.targets = new Set(foundTargets);\n\n        // Interactive scope (\"close\"): each target município (comma-separated in `municipio`)\n        // + its direct neighbors — NOT the whole state. Falls back to the whole state when no\n        // `municipio` is set.\n        const neighborhoodNames = foundTargets.length\n          ? [...new Set(foundTargets.flatMap(t => [t, ...adj.nbrs(t)]))]\n          : stateNames;\n\n        // Statically pins a sector's color onto whatever municípios are listed in that\n        // group's `municipio` field — these are display-only, not interactively assignable.\n        // A município can be listed by more than one group (e.g. Astorga under both Setor A\n        // and Setor B) — keep every sector that claims it so drawMap() can split it into a pie.\n        const groupAssign = {};\n        (d2.param('groups', []) || []).forEach(g => {\n          (g.municipio || '').split(',').map(x => x.trim()).filter(Boolean).forEach(n => {\n            const key = norm(n);\n            (groupAssign[key] = groupAssign[key] || []).push(g.sector);\n          });\n        });\n\n        // A município already carrying a sector assignment joins the interactive set even when\n        // it's not adjacent to the target — this is what `neighborUfs` is for: letting a sector\n        // reach into a município from a bordering state, as long as that UF was loaded.\n        const assignedSet = new Set(Object.keys(S.assign).map(norm));\n        const assignedLoaded = [...assignedSet].filter(n => adj.feat[n]);\n        const groupLoaded = Object.keys(groupAssign).filter(n => adj.feat[n]);\n        const closingNames = [...new Set([...neighborhoodNames, ...assignedLoaded, ...groupLoaded])];\n        const closingSet = new Set(closingNames);\n\n        S.closeFeats = {}; S.labels = {};\n        closingNames.forEach(n => { if (adj.feat[n]) { S.closeFeats[n] = adj.feat[n].f; S.labels[n] = adj.feat[n].f.properties.name || n; } });\n\n        S.clickable = new Set(closingNames.filter(n => assignedSet.has(n)));\n        S.groupAssign = groupAssign;\n\n        // Everything else loaded (rest of the state / neighbor states) is faint background context.\n        const restNames = new Set();\n        allFeats.forEach(f => {\n          const n = norm(f.properties.name || f.properties.NOME || f.properties.nome || '');\n          if (adj.feat[n] && !closingSet.has(n)) restNames.add(n);\n        });\n        S.nbrFeats = [...restNames].map(n => adj.feat[n].f);\n\n        const zoomFeats = Object.values(S.closeFeats);\n        S.pr = project(zoomFeats.length ? zoomFeats : allFeats);\n        S.view = { scale: 1, tx: 0, ty: 0 };\n        drawMap();\n        loader(false);\n      } catch (e) {\n        loader(true, 'erro: ' + e.message + ' (clique p/ tentar de novo)', true);\n      }\n    }\n\n    $('#loader').onclick = () => {\n      if (!$('#loader').classList.contains('err')) return;\n      S.closeFeats = {}; S.nbrFeats = []; S.labels = {};\n      load();\n    };\n\n    load();\n  },\n};","at":"2026-07-30T22:59:10.568Z"}},"updatedAt":"2026-07-30T23:02:48.653Z","createdAt":"2026-07-29T06:04:19.119Z"},{"_id":"6a69a173253cab7975060043","component":"data2-core-types@Component","system":"6a57cfe9673eb7e3c5e57784","params":{"component":"nGePVjqDWdX2KQL8ahh-w","package":"natura-geomarketing","title":"Log","parameters":{"params":{"fields":{"message":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":0}}},"component":"data2-core-types@ComponentParameter"},"data":{"params":{"component":"data2-core-primitives@Object","index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@FieldSet"},"definition":{"params":{"actions":[{"params":{"actions":[{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"prevResult"}}},"component":"data2-core-types@Reference"},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__LoggerService"}},"prop":"log","args":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"message"}}}},{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"data"}}}}]}}]},"component":"data2-core-flow@Parallel"},{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"prevResult.0"}}}}]},"component":"data2-core-flow@Series"}},"updatedAt":"2026-07-29T06:45:12.754Z","createdAt":"2026-07-29T06:45:07.664Z"},{"_id":"6a69b10fece2da0d644e73a8","component":"data2-core-types@Component","system":"6a57cfe9673eb7e3c5e57784","params":{"component":"gA5O7o100HVWfKwEEPNyM","package":"natura-geomarketing","title":"stringNormalize","parameters":{"text":{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String"}}},"definition":{"component":"data2-core-flow@Series","params":{"actions":[{"component":"data2-core-flow@Step","params":{"action":{"component":"data2-core-functions@Replace","params":{"haystack":{"component":"data2-core-types@Reference","params":{"reference":"text"}},"needle":{"component":"data2-core-types@Regex","params":{"pattern":"[àáâãäåÀÁÂÃÄÅ]","flags":"g"}},"patch":"a"}},"resultName":"n1"}},{"component":"data2-core-flow@Step","params":{"action":{"component":"data2-core-functions@Replace","params":{"haystack":{"component":"data2-core-types@Reference","params":{"reference":"n1"}},"needle":{"component":"data2-core-types@Regex","params":{"pattern":"[èéêëÈÉÊË]","flags":"g"}},"patch":"e"}},"resultName":"n2"}},{"component":"data2-core-flow@Step","params":{"action":{"component":"data2-core-functions@Replace","params":{"haystack":{"component":"data2-core-types@Reference","params":{"reference":"n2"}},"needle":{"component":"data2-core-types@Regex","params":{"pattern":"[ìíîïÌÍÎÏ]","flags":"g"}},"patch":"i"}},"resultName":"n3"}},{"component":"data2-core-flow@Step","params":{"action":{"component":"data2-core-functions@Replace","params":{"haystack":{"component":"data2-core-types@Reference","params":{"reference":"n3"}},"needle":{"component":"data2-core-types@Regex","params":{"pattern":"[òóôõöÒÓÔÕÖ]","flags":"g"}},"patch":"o"}},"resultName":"n4"}},{"component":"data2-core-flow@Step","params":{"action":{"component":"data2-core-functions@Replace","params":{"haystack":{"component":"data2-core-types@Reference","params":{"reference":"n4"}},"needle":{"component":"data2-core-types@Regex","params":{"pattern":"[ùúûüÙÚÛÜ]","flags":"g"}},"patch":"u"}},"resultName":"n5"}},{"component":"data2-core-flow@Step","params":{"action":{"component":"data2-core-functions@Replace","params":{"haystack":{"component":"data2-core-types@Reference","params":{"reference":"n5"}},"needle":{"component":"data2-core-types@Regex","params":{"pattern":"[çÇ]","flags":"g"}},"patch":"c"}},"resultName":"n6"}},{"component":"data2-core-flow@Step","params":{"action":{"component":"data2-core-functions@Replace","params":{"haystack":{"component":"data2-core-types@Reference","params":{"reference":"n6"}},"needle":{"component":"data2-core-types@Regex","params":{"pattern":"[ñÑ]","flags":"g"}},"patch":"n"}},"resultName":"n7"}},{"component":"data2-core-flow@Step","params":{"action":{"component":"data2-core-functions@toUpperCase","params":{"string":{"component":"data2-core-types@Reference","params":{"reference":"n7"}}}},"resultName":"n8"}},{"component":"data2-core-flow@Step","params":{"action":{"component":"data2-core-functions@Replace","params":{"haystack":{"component":"data2-core-types@Reference","params":{"reference":"n8"}},"needle":{"component":"data2-core-types@Regex","params":{"pattern":"[^A-Z0-9]+","flags":"g"}},"patch":" "}},"resultName":"n9"}},{"component":"data2-core-functions@StringTrim","params":{"string":{"component":"data2-core-types@Reference","params":{"reference":"n9"}}}}]}}},"updatedAt":"2026-07-29T07:51:46.849Z","createdAt":"2026-07-29T07:51:43.443Z"},{"_id":"6a6c3111b1994f0f4b08f439","component":"data2-core-types@Component","system":"6a57cfe9673eb7e3c5e57784","params":{"component":"Y-BartZI5BwXJmLbhFG_3","package":"natura-geomarketing","title":"Fechar setor","parameters":{"params":{"fields":{"setor":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@FieldSet"},"definition":{"params":{"actions":[{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"ziIl3zJpxF2x8qsRQy10a"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.setor"}},"value":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"setor"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-types@Setter"},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"7rq4WNBhLtN4x9qy-262L"}},"prop":"filter","args":[{"params":{"fields":{"CD_SETOR":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"setor"}}},"component":"data2-core-types@Reference"}}},"component":"data2-core-types@FieldSet"}]}},{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"ziIl3zJpxF2x8qsRQy10a"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.UF"}},"value":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"7rq4WNBhLtN4x9qy-262L"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records.0.UF"}}}}},"component":"data2-core-types@Setter"},{"params":{"actions":{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"7rq4WNBhLtN4x9qy-262L"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"mapper":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"m"}}],"body":{"params":{"actions":[{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"ziIl3zJpxF2x8qsRQy10a"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.municipios"}},"value":{"params":{"array":{"params":{"components":[{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"ziIl3zJpxF2x8qsRQy10a"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.municipios"}}},"component":"data2-core-types@Getter"},[]]},"component":"data2-core-logical-operators@Or"},"item":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m.MUNICIPIO"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-functions@ArrayPush"}},"component":"data2-core-types@Setter"},{"params":{"municipio":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m.MUNICIPIO"}}},"component":"data2-core-types@Reference"},"uf":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m.UF"}}},"component":"data2-core-types@Reference"}},"component":"natura-geomarketing@4vQ1HUOSYMGvZGCOV2GYd"},{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"ziIl3zJpxF2x8qsRQy10a"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.neighboring_municipios"}},"value":{"params":{"arrays":[{"params":{"components":[{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"ziIl3zJpxF2x8qsRQy10a"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.neighboring_municipios"}}},"component":"data2-core-types@Getter"},[]]},"component":"data2-core-logical-operators@Or"},{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"prevResult"}}},"component":"data2-core-types@Reference"}]},"component":"data2-core-functions@ArrayConcat"}},"component":"data2-core-types@Setter"},{"params":{"text":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m.MUNICIPIO"}}},"component":"data2-core-types@Reference"}},"component":"natura-geomarketing@gA5O7o100HVWfKwEEPNyM"},{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"ziIl3zJpxF2x8qsRQy10a"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.municipios_normalized"}},"value":{"params":{"array":{"params":{"components":[{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"ziIl3zJpxF2x8qsRQy10a"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.municipios_normalized"}}},"component":"data2-core-types@Getter"},[]]},"component":"data2-core-logical-operators@Or"},"item":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"prevResult"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-functions@ArrayPush"}},"component":"data2-core-types@Setter"}]},"component":"data2-core-flow@Series"}}}},"component":"data2-core-functions@ArrayMap"}},"component":"data2-core-flow@Parallel"},{"params":{"resultName":{"component":"data2-core-primitives@String","params":{"content":"municipios"}},"action":{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"7rq4WNBhLtN4x9qy-262L"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"mapper":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"m"}}],"body":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m.MUNICIPIO"}}},"component":"data2-core-types@Reference"}}}},"component":"data2-core-functions@ArrayMap"}},"component":"data2-core-flow@Step"},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"umJZo_TTyw0E3lOwBNmk2"}},"prop":"filter","args":[{"params":{"fields":{"a":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"ziIl3zJpxF2x8qsRQy10a"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.setor"}}}},"b":{"params":{"arrays":[{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"ziIl3zJpxF2x8qsRQy10a"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.municipios"}}},"component":"data2-core-types@Getter"},{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"ziIl3zJpxF2x8qsRQy10a"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.neighboring_municipios"}}},"component":"data2-core-types@Getter"}]},"component":"data2-core-functions@ArrayConcat"}}},"component":"data2-core-types@FieldSet"}]}},{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"ziIl3zJpxF2x8qsRQy10a"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.setores_destino"}},"value":{"params":{"array":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"umJZo_TTyw0E3lOwBNmk2"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}}},"mapper":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"m"}}],"body":{"sector":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m.CD_SETOR"}}},"component":"data2-core-types@Reference"},"municipio":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m.MUNICIPIO"}}},"component":"data2-core-types@Reference"}}}}},"component":"data2-core-functions@ArrayMap"}},"component":"data2-core-types@Setter"}]},"component":"data2-core-flow@Series"}},"updatedAt":"2026-07-31T06:20:31.140Z","createdAt":"2026-07-31T05:22:25.177Z"},{"_id":"6a71ddb4a9d7cf0ea99224f1","component":"data2-core-types@Component","system":"6a57cfe9673eb7e3c5e57784","params":{"component":"FjpgPxu84sgMMjMKJhyUm","package":"natura-geomarketing","title":"Interactive sales group map v2","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"country_list":{"params":{"component":"data2-core-primitives@Object","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"location_id":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"},"location_label":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"},"location_colors":{"params":{"component":"data2-core-primitives@Object","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"color":{"params":{"component":"data2-core-types@Color"},"component":"data2-core-types@ComponentParameter"},"color_id":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"},"color_label":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"},"onClick":{"params":{"component":"data2-core-types@Interaction"},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@ComponentParameter"},"region_list":{"params":{"component":"data2-core-primitives@Object","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"location_id":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"},"location_label":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"},"location_colors":{"params":{"component":"data2-core-primitives@Object","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"color":{"params":{"component":"data2-core-types@Color"},"component":"data2-core-types@ComponentParameter"},"color_id":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"},"color_label":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"},"onClick":{"params":{"component":"data2-core-types@Interaction"},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@ComponentParameter"},"state_list":{"params":{"component":"data2-core-primitives@Object","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"location_id":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"},"location_label":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"},"location_colors":{"params":{"component":"data2-core-primitives@Object","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"color":{"params":{"component":"data2-core-types@Color"},"component":"data2-core-types@ComponentParameter"},"color_id":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"},"color_label":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"},"onClick":{"params":{"component":"data2-core-types@Interaction"},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@ComponentParameter"},"city_list":{"params":{"component":"data2-core-primitives@Object","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"location_id":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"},"location_label":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"},"location_colors":{"params":{"component":"data2-core-primitives@Object","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"color":{"params":{"component":"data2-core-types@Color"},"component":"data2-core-types@ComponentParameter"},"color_id":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"},"color_label":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"},"onClick":{"params":{"component":"data2-core-types@Interaction"},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@ComponentParameter"},"municipality_list":{"params":{"component":"data2-core-primitives@Object","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"location_id":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"},"location_label":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"},"location_colors":{"params":{"component":"data2-core-primitives@Object","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"color":{"params":{"component":"data2-core-types@Color"},"component":"data2-core-types@ComponentParameter"},"color_id":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"},"color_label":{"params":{"component":"data2-core-primitives@String"},"component":"data2-core-types@ComponentParameter"},"onClick":{"params":{"component":"data2-core-types@Interaction"},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@ComponentParameter"},"should_render_neighbors":{"component":"data2-core-primitives@Boolean"},"touch_controls":{"component":"data2-core-primitives@Boolean"}}}},"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"const UF_CODE={RO:'11',AC:'12',AM:'13',RR:'14',PA:'15',AP:'16',TO:'17',MA:'21',PI:'22',CE:'23',RN:'24',PB:'25',PE:'26',AL:'27',SE:'28',BA:'29',MG:'31',ES:'32',RJ:'33',SP:'35',PR:'41',SC:'42',RS:'43',MS:'50',MT:'51',GO:'52',DF:'53'};\nconst UF_BORDERS={AC:['AM','RO'],AL:['BA','PE','SE'],AM:['AC','RO','RR','PA','MT'],AP:['PA'],\n BA:['AL','SE','PE','PI','TO','GO','MG','ES'],CE:['PI','PB','PE','RN'],DF:['GO','MG'],\n ES:['BA','MG','RJ'],GO:['DF','MT','MS','MG','BA','TO'],MA:['PA','TO','PI'],\n MG:['BA','GO','DF','MS','SP','RJ','ES'],MS:['MT','GO','MG','SP','PR'],MT:['RO','AM','PA','TO','GO','MS'],\n PA:['AP','AM','MT','TO','MA','RR'],PB:['RN','CE','PE'],PE:['PB','CE','PI','BA','AL'],\n PI:['MA','TO','BA','PE','CE'],PR:['SP','MS','SC'],RJ:['ES','MG','SP'],RN:['CE','PB'],\n RO:['AC','AM','MT'],RR:['AM','PA'],RS:['SC'],SC:['PR','RS'],SE:['BA','AL'],\n SP:['MG','RJ','PR','MS'],TO:['PA','MA','PI','BA','GO','MT']};\nconst UF_NAMES={RO:'Rondônia',AC:'Acre',AM:'Amazonas',RR:'Roraima',PA:'Pará',AP:'Amapá',TO:'Tocantins',\n MA:'Maranhão',PI:'Piauí',CE:'Ceará',RN:'Rio Grande do Norte',PB:'Paraíba',PE:'Pernambuco',AL:'Alagoas',\n SE:'Sergipe',BA:'Bahia',MG:'Minas Gerais',ES:'Espírito Santo',RJ:'Rio de Janeiro',SP:'São Paulo',\n PR:'Paraná',SC:'Santa Catarina',RS:'Rio Grande do Sul',MS:'Mato Grosso do Sul',MT:'Mato Grosso',\n GO:'Goiás',DF:'Distrito Federal'};\nconst REGION_UFS={N:['RO','AC','AM','RR','PA','AP','TO'],NE:['MA','PI','CE','RN','PB','PE','AL','SE','BA'],\n CO:['MS','MT','GO','DF'],SE:['MG','ES','RJ','SP'],S:['PR','SC','RS']};\nconst REGION_NAMES={N:'Norte',NE:'Nordeste',CO:'Centro-Oeste',SE:'Sudeste',S:'Sul'};\nconst PALETTE=['#8b7fd6','#d1b048','#67bd5b','#5aa9d6','#d67fa8','#c98a4b'];\n\nexport default {\n  css: `\n    :host{display:block;width:100%;height:100%;box-sizing:border-box}\n    .wrap{position:relative;height:100%;display:flex;flex-direction:column;font:13px -apple-system,BlinkMacSystemFont,\"SF Pro Text\",Inter,sans-serif;background:transparent;overflow:hidden;border-radius:0px;border:0px solid rgba(0,0,0,.08);box-shadow:0 6px 20px rgba(0,0,0,.12)}\n    .stage{flex:1;min-height:0;position:relative;cursor:grab;touch-action:none}\n    .stage:active{cursor:grabbing}\n    svg{width:100%;height:100%;display:block}\n    .area{stroke:rgba(255,255,255,.2);stroke-width:.85;stroke-linejoin:round;stroke-linecap:round}\n    .wedge{stroke:rgba(255,255,255,.7);stroke-width:.5;stroke-linejoin:round;cursor:pointer;transition:filter .15s ease}\n    .wedge:hover{filter:brightness(1.16)}\n    .wedge.touchy{stroke-width:.9}\n    .lbl{fill:#1D1D1F;font-size:9px;font-weight:600;pointer-events:none;user-select:none;text-anchor:middle;paint-order:stroke;stroke:rgba(255,255,255,.7);stroke-width:.6px}\n    .legend{display:none!important;position:absolute;left:10px;bottom:10px;max-width:64%;max-height:70%;overflow:auto;flex-direction:column;gap:8px;padding:10px 12px;border-radius:12px;background:rgba(255,255,255,.78);-webkit-backdrop-filter:blur(30px) saturate(180%);backdrop-filter:blur(30px) saturate(180%);border:1px solid rgba(0,0,0,.08);font-size:11px;box-shadow:0 8px 24px rgba(0,0,0,.20)}\n    .legend .grp{display:flex;flex-direction:column;gap:3px}\n    .legend .grpname{font-weight:700;color:rgba(0,0,0,.5);font-size:10px;text-transform:uppercase;letter-spacing:.06em}\n    .legend .row{display:flex;align-items:center;gap:6px;color:#1D1D1F}\n    .legend b{width:10px;height:10px;border-radius:3px;display:inline-block;flex:0 0 auto;box-shadow:inset 0 0 0 1px rgba(0,0,0,.1)}\n    .tip{display:none!important;position:fixed;pointer-events:none;background:rgba(255,255,252,.95);-webkit-backdrop-filter:blur(20px) saturate(150%);backdrop-filter:blur(20px) saturate(150%);color:#1D1D1F;border:1px solid rgba(0,0,0,.08);border-radius:6px;padding:6px 9px;font-size:11px;opacity:0;transition:opacity .12s ease;box-shadow:0 2px 8px rgba(0,0,0,.15);z-index:9;max-width:220px}\n    .infobar{display:none!important;position:absolute;left:0;right:0;bottom:0;background:rgba(246,246,247,.85);-webkit-backdrop-filter:blur(20px) saturate(180%);backdrop-filter:blur(20px) saturate(180%);border-top:1px solid rgba(0,0,0,.1);color:#1D1D1F;padding:10px 14px;font-size:13px;display:flex;justify-content:space-between;align-items:center;gap:10px;transform:translateY(100%);transition:transform .18s ease;z-index:8}\n    .infobar.show{transform:translateY(0)}\n    .infobar .x{opacity:.5;cursor:pointer;padding:2px 7px;border-radius:5px;transition:background .12s ease,opacity .12s ease}\n    .infobar .x:hover{opacity:.9;background:rgba(0,0,0,.06)}\n    .load{position:absolute;inset:0;background:rgba(236,236,236,.94);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);display:flex;align-items:center;justify-content:center;z-index:5;color:rgba(0,0,0,.5);text-align:center;padding:16px;cursor:default;font-size:13px}\n    .load.err{cursor:pointer;text-decoration:underline;color:#FF3B30}\n    .empty{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;color:rgba(0,0,0,.5);text-align:center;padding:24px;font-size:13px}\n    .hidden{display:none}\n  `,\n  render(){\n    return `<div class=\"wrap\">\n      <div class=\"stage\"><svg id=\"map\" viewBox=\"0 0 700 500\" preserveAspectRatio=\"xMidYMid meet\"></svg></div>\n      <div class=\"legend hidden\" id=\"legend\"></div>\n      <div class=\"tip\" id=\"tip\"></div>\n      <div class=\"infobar\" id=\"infobar\"><span id=\"infobarText\"></span><span class=\"x\" id=\"infobarClose\">✕</span></div>\n      <div class=\"load\" id=\"loader\">carregando malhas do Brasil…</div>\n      <div class=\"empty hidden\" id=\"empty\">Nenhuma localização declarada — informe country_list, region_list, state_list, city_list ou municipality_list.</div>\n    </div>`;\n  },\n  mounted(d2, root){\n\n    const $ = s => root.querySelector(s);\n    const NS = 'http://www.w3.org/2000/svg';\n    const norm = s => (s||'').normalize('NFKD').replace(/[̀-ͯ]/g,'').toUpperCase().replace(/[^A-Z0-9]+/g,' ').trim();\n    const esc = s => (s==null?'':String(s)).replace(/[&<>]/g, c => ({'&':'&amp;','<':'&lt;','>':'&gt;'}[c]));\n    const toArr = v => Array.isArray(v) ? v : [];\n\n    function matchUf(idOrName){\n      if(!idOrName) return null;\n      const up = String(idOrName).trim().toUpperCase();\n      if (UF_CODE[up]) return up;\n      const n = norm(idOrName);\n      const hit = Object.keys(UF_NAMES).find(code => norm(UF_NAMES[code]) === n);\n      return hit || null;\n    }\n    function matchRegion(idOrName){\n      if(!idOrName) return null;\n      const up = String(idOrName).trim().toUpperCase();\n      if (REGION_UFS[up]) return up;\n      const n = norm(idOrName);\n      const hit = Object.keys(REGION_NAMES).find(code => norm(REGION_NAMES[code]) === n);\n      return hit || null;\n    }\n\n    async function geoUF(uf){\n      const code = UF_CODE[uf] || uf;\n      const r = await fetch('https://raw.githubusercontent.com/tbrugz/geodata-br/master/geojson/geojs-'+code+'-mun.json');\n      if (!r.ok) throw new Error('geo ' + uf);\n      return r.json();\n    }\n    function ptsOf(f){\n      const g=f.geometry, ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates], s=new Set();\n      ps.forEach(poly=>poly.forEach(ring=>ring.forEach(p=>s.add(Math.round(p[0]*1000)/1000+','+Math.round(p[1]*1000)/1000))));\n      return s;\n    }\n    function buildIndex(features){\n      const recs = features.map(f => ({\n        name: norm(f.properties.name || f.properties.NOME || f.properties.nome || ''),\n        label: f.properties.name || f.properties.NOME || f.properties.nome || '',\n        uf: f.__uf, f, pts: ptsOf(f)\n      }));\n      const ptIdx = {};\n      recs.forEach((r,i) => r.pts.forEach(p => (ptIdx[p]=ptIdx[p]||[]).push(i)));\n      const nbrsOf = i => {\n        const c={};\n        recs[i].pts.forEach(p => ptIdx[p].forEach(j => { if (j!==i) c[j]=(c[j]||0)+1; }));\n        return Object.entries(c).filter(([,n])=>n>=2).map(([j])=>+j);\n      };\n      const byUfName = {};\n      recs.forEach((r,i) => { byUfName[r.uf]=byUfName[r.uf]||{}; byUfName[r.uf][r.name]=i; });\n      const anyName = {};\n      recs.forEach((r,i) => { (anyName[r.name]=anyName[r.name]||[]).push(i); });\n      return { recs, nbrsOf, byUfName, anyName };\n    }\n    function project(feats){\n      let mnx=1/0,mny=1/0,mxx=-1/0,mxy=-1/0;\n      const each = cb => feats.forEach(f=>{const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];ps.forEach(p=>p.forEach(r=>r.forEach(cb)));});\n      each(p=>{mnx=Math.min(mnx,p[0]);mxx=Math.max(mxx,p[0]);mny=Math.min(mny,p[1]);mxy=Math.max(mxy,p[1]);});\n      const mlat=(mny+mxy)/2, kx=Math.cos(mlat*Math.PI/180), W=700,H=500,pad=22;\n      const gw=(mxx-mnx)*kx, gh=(mxy-mny), sc=Math.min((W-2*pad)/gw,(H-2*pad)/gh);\n      const ox=(W-gw*sc)/2, oy=(H-gh*sc)/2;\n      const pr = p=>[ox+(p[0]-mnx)*kx*sc, oy+(mxy-p[1])*sc];\n      pr.scale = sc;\n      return pr;\n    }\n    function pathFor(f,pr){\n      const g=f.geometry, ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];\n      return ps.map(poly=>poly.map(r=>'M'+r.map(p=>{const q=pr(p);return q[0].toFixed(1)+','+q[1].toFixed(1);}).join('L')+'Z').join('')).join('');\n    }\n    function cxy(f,pr){\n      let x=0,y=0,n=0; const g=f.geometry, ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];\n      ps.forEach(poly=>poly[0].forEach(p=>{const q=pr(p);x+=q[0];y+=q[1];n++;}));\n      return [x/n, y/n];\n    }\n    function ringsOf(f){\n      const g = f.geometry, ps = g.type==='MultiPolygon' ? g.coordinates : [g.coordinates];\n      const rings = [];\n      ps.forEach(poly => poly.forEach(ring => rings.push(ring)));\n      return rings;\n    }\n    const quant = p => [Math.round(p[0]*1000)/1000, Math.round(p[1]*1000)/1000];\n    const keyOf = p => p[0] + ',' + p[1];\n    // Dissolves the municipio polygons in `idxs` into their outer boundary (+ any real holes)\n    // by cancelling every edge shared by two included polygons — the border between two\n    // adjacent included municipios disappears, leaving only the union's true edge. Exact for\n    // this dataset because neighboring municipio files share literal boundary coordinates (the\n    // same tolerance ptsOf already relies on for adjacency).\n    function dissolveRings(idxs, recs){\n      if (idxs.length === 1) return ringsOf(recs[idxs[0]].f);\n      const edgeCount = new Map(), edges = [];\n      idxs.forEach(i => {\n        ringsOf(recs[i].f).forEach(ring => {\n          const q = ring.map(quant);\n          for (let k = 0; k < q.length - 1; k++){\n            const a = q[k], b = q[k+1], ka = keyOf(a), kb = keyOf(b);\n            if (ka === kb) continue;\n            const uk = ka < kb ? ka+'|'+kb : kb+'|'+ka;\n            edgeCount.set(uk, (edgeCount.get(uk)||0) + 1);\n            edges.push({ a, b, ka, kb, uk });\n          }\n        });\n      });\n      const kept = edges.filter(e => edgeCount.get(e.uk) === 1);\n      const byStart = new Map();\n      kept.forEach(e => {\n        if (!byStart.has(e.ka)) byStart.set(e.ka, []);\n        byStart.get(e.ka).push(e);\n      });\n      const used = new Set(), rings = [];\n      kept.forEach(seed => {\n        if (used.has(seed)) return;\n        const ring = [seed.a];\n        let cur = seed, guard = 0;\n        while (guard++ < 50000) {\n          used.add(cur);\n          ring.push(cur.b);\n          if (cur.kb === seed.ka) break;\n          const next = (byStart.get(cur.kb) || []).find(e => !used.has(e));\n          if (!next) break;\n          cur = next;\n        }\n        if (ring.length >= 4 && keyOf(ring[0]) === keyOf(ring[ring.length-1])) rings.push(ring);\n      });\n      return rings;\n    }\n    function pathFromRings(rings, pr){\n      return rings.map(ring => 'M'+ring.map(p=>{const q=pr(p);return q[0].toFixed(1)+','+q[1].toFixed(1);}).join('L')+'Z').join('');\n    }\n    function stripeClipRings(rings, pr, x0, x1){\n      let d = '';\n      rings.forEach(ring => {\n        let pts = ring.map(p => pr(p));\n        pts = clipHalfPlane(pts, (x) => x - x0);\n        if (pts.length) pts = clipHalfPlane(pts, (x) => x1 - x);\n        if (pts.length >= 3) d += 'M' + pts.map(q => q[0].toFixed(1) + ',' + q[1].toFixed(1)).join('L') + 'Z';\n      });\n      return d;\n    }\n    function mergeCentroid(idxs, pr, recs){\n      let x=0,y=0,n=0;\n      idxs.forEach(i=>{ const [cx,cy]=cxy(recs[i].f,pr); x+=cx; y+=cy; n++; });\n      return n ? [x/n, y/n] : [0,0];\n    }\n    function mergedBbox(idxs, pr, recs){\n      let minX=Infinity,minY=Infinity,maxX=-Infinity,maxY=-Infinity;\n      idxs.forEach(i => {\n        const g=recs[i].f.geometry, ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];\n        ps.forEach(poly=>poly.forEach(ring=>ring.forEach(p=>{\n          const q=pr(p);\n          minX=Math.min(minX,q[0]); maxX=Math.max(maxX,q[0]);\n          minY=Math.min(minY,q[1]); maxY=Math.max(maxY,q[1]);\n        })));\n      });\n      return [minX,minY,maxX,maxY];\n    }\n    // Sutherland-Hodgman clip against a straight half-plane (side(x,y)>=0 kept). A straight-line\n    // cut is exact for ANY simple polygon, convex or concave, so stacking bands never leaves a gap\n    // — unlike an angular wedge radiating from one apex, which can't \"see\" a concave shape's whole border.\n    function clipHalfPlane(ring, side){\n      const out = [];\n      const n = ring.length;\n      for (let i = 0; i < n; i++){\n        const curr = ring[i], prev = ring[(i - 1 + n) % n];\n        const sCurr = side(curr[0], curr[1]);\n        const sPrev = side(prev[0], prev[1]);\n        const currIn = sCurr >= -1e-9;\n        const prevIn = sPrev >= -1e-9;\n        if (currIn) {\n          if (!prevIn) out.push(intersectHalfPlane(prev, curr, side));\n          out.push(curr);\n        } else if (prevIn) {\n          out.push(intersectHalfPlane(prev, curr, side));\n        }\n      }\n      return out;\n    }\n    function intersectHalfPlane(p1, p2, side){\n      const s1 = side(p1[0], p1[1]), s2 = side(p2[0], p2[1]);\n      const t = s1 / (s1 - s2);\n      return [p1[0] + t * (p2[0] - p1[0]), p1[1] + t * (p2[1] - p1[1])];\n    }\n\n    const loader = (on, t, isErr) => {\n      const l = $('#loader');\n      l.classList.toggle('hidden', !on);\n      l.classList.toggle('err', !!isErr);\n      if (t != null) l.textContent = t;\n    };\n\n    let IDX = null;\n    let S = { pr: null, view: { scale: 1, tx: 0, ty: 0 }, focus: [], ctx: [] };\n    let dragStart = null, dragMoved = false;\n    let pointers = new Map();\n    let pinchDist = null;\n\n    function svgPoint(evt){\n      const svg = $('#map');\n      const pt = svg.createSVGPoint();\n      pt.x = evt.clientX; pt.y = evt.clientY;\n      const ctm = svg.getScreenCTM();\n      if (!ctm) return { x: 0, y: 0 };\n      const p = pt.matrixTransform(ctm.inverse());\n      return { x: p.x, y: p.y };\n    }\n    function applyTransform(){\n      const g = $('#viewport');\n      if (g) g.setAttribute('transform', `translate(${S.view.tx} ${S.view.ty}) scale(${S.view.scale})`);\n    }\n    function zoomAt(p, factor){\n      const next = Math.min(8, Math.max(0.15, S.view.scale * factor));\n      const k = next / S.view.scale;\n      S.view.tx = p.x - k * (p.x - S.view.tx);\n      S.view.ty = p.y - k * (p.y - S.view.ty);\n      S.view.scale = next;\n      applyTransform();\n    }\n    d2.on('.stage', 'wheel', e => { e.preventDefault(); zoomAt(svgPoint(e), e.deltaY < 0 ? 1.15 : 1/1.15); });\n    d2.on('.stage', 'pointerdown', (e, el) => {\n      pointers.set(e.pointerId, { x: e.clientX, y: e.clientY });\n      if (pointers.size === 1) {\n        const p = svgPoint(e);\n        dragStart = { x: p.x, y: p.y, tx: S.view.tx, ty: S.view.ty, pointerId: e.pointerId, el, sx: e.clientX, sy: e.clientY };\n        dragMoved = false;\n      } else {\n        dragStart = null;\n        pinchDist = null;\n      }\n    });\n    d2.on(window, 'pointermove', e => {\n      if (!pointers.has(e.pointerId)) return;\n      pointers.set(e.pointerId, { x: e.clientX, y: e.clientY });\n      if (pointers.size === 2) {\n        const pts = [...pointers.values()];\n        const dist = Math.hypot(pts[0].x - pts[1].x, pts[0].y - pts[1].y);\n        if (pinchDist) {\n          const mid = { clientX: (pts[0].x + pts[1].x) / 2, clientY: (pts[0].y + pts[1].y) / 2 };\n          zoomAt(svgPoint(mid), dist / pinchDist);\n          dragMoved = true;\n        }\n        pinchDist = dist;\n        return;\n      }\n      if (!dragStart) return;\n      const p = svgPoint(e);\n      const dx = p.x - dragStart.x, dy = p.y - dragStart.y;\n      // Capture the pointer only once real drag movement is detected. Capturing eagerly on\n      // every pointerdown (the previous behavior) redirects the native `click` event's target\n      // to the capturing element (a browser click-synthesis quirk with setPointerCapture), so a\n      // plain tap on a color wedge never reached its own onclick. Deferring capture until the\n      // gesture crosses the drag threshold lets a no-movement click hit-test normally.\n      //\n      // The threshold is measured in SCREEN pixels (clientX/clientY), not viewBox units: a mouse\n      // cursor is sub-pixel precise, but a real finger tap naturally drifts several pixels, and\n      // the old 0.5-viewBox-unit threshold (~0.6 screen px, shrinking further when zoomed in)\n      // misread almost every touch tap as a drag — silently swallowing the color's onClick.\n      // Only widen the tolerance when the instance opts into touch_controls — that param is\n      // already the explicit signal this instance is being driven by touch, so gate on it\n      // instead of sniffing e.pointerType (unreliable on hybrid/stylus devices anyway).\n      if (!dragMoved) {\n        const sdx = e.clientX - dragStart.sx, sdy = e.clientY - dragStart.sy;\n        const touchMode = !!d2.param('touch_controls', false);\n        const threshold = touchMode ? 10 : 4;\n        if (Math.hypot(sdx, sdy) > threshold) {\n          dragMoved = true;\n          try { dragStart.el.setPointerCapture?.(dragStart.pointerId); } catch (_) {}\n        }\n      }\n      if (dragMoved) {\n        S.view.tx = dragStart.tx + dx; S.view.ty = dragStart.ty + dy;\n        applyTransform();\n      }\n    });\n    d2.on(window, 'pointerup', e => { pointers.delete(e.pointerId); pinchDist = null; if (!pointers.size) dragStart = null; });\n    d2.on(window, 'pointercancel', e => { pointers.delete(e.pointerId); pinchDist = null; dragStart = null; });\n\n    function showInfo(desc, evt){\n      const touch = !!d2.param('touch_controls', false);\n      const sub = desc.color ? esc(desc.color.color_label || desc.color.color_id) : 'apenas contexto';\n      if (touch) {\n        $('#infobarText').textContent = `${desc.label}${desc.color ? ' · ' + sub : ''}`;\n        $('#infobar').classList.add('show');\n      } else {\n        const tip = $('#tip');\n        if (evt) { tip.style.left = (evt.clientX + 12) + 'px'; tip.style.top = (evt.clientY + 12) + 'px'; }\n        tip.innerHTML = `<b>${esc(desc.label)}</b>${desc.color ? '<br>' + sub : ''}`;\n        tip.style.opacity = 1;\n      }\n    }\n    function hideInfo(){ $('#tip').style.opacity = 0; }\n    $('#infobarClose').onclick = () => $('#infobar').classList.remove('show');\n\n    function addCountry(list, focus, usedUfs){\n      list.forEach((entry, ei) => {\n        if (!entry) return;\n        if (String(entry.location_id||'').trim().toUpperCase() !== 'BR') {\n          d2.log('multiescala: country_list só suporta BR por enquanto (' + entry.location_id + ')');\n          return;\n        }\n        const ufs = Object.keys(UF_CODE);\n        ufs.forEach(u => usedUfs.add(u));\n        const idxs = ufs.flatMap(u => IDX.byUfName[u] ? Object.values(IDX.byUfName[u]) : []);\n        if (!idxs.length) return;\n        focus.push({ key: `country-${ei}`, idxs, level: 'country', entry, label: entry.location_label || 'Brasil', colors: toArr(entry.location_colors) });\n      });\n    }\n    function addRegion(list, focus, usedUfs, usedRegions){\n      list.forEach((entry, ei) => {\n        if (!entry) return;\n        const rc = matchRegion(entry.location_id);\n        if (!rc) { d2.log('multiescala: region_list id não reconhecido (' + entry.location_id + ')'); return; }\n        usedRegions.add(rc);\n        REGION_UFS[rc].forEach(u => usedUfs.add(u));\n        const idxs = REGION_UFS[rc].flatMap(u => IDX.byUfName[u] ? Object.values(IDX.byUfName[u]) : []);\n        if (!idxs.length) return;\n        focus.push({ key: `region-${ei}`, idxs, level: 'region', entry, label: entry.location_label || REGION_NAMES[rc], colors: toArr(entry.location_colors) });\n      });\n    }\n    function addState(list, focus, usedUfs){\n      list.forEach((entry, ei) => {\n        if (!entry) return;\n        const uf = matchUf(entry.location_id);\n        if (!uf) { d2.log('multiescala: state_list id não reconhecido (' + entry.location_id + ')'); return; }\n        usedUfs.add(uf);\n        const idxs = IDX.byUfName[uf] ? Object.values(IDX.byUfName[uf]) : [];\n        if (!idxs.length) return;\n        focus.push({ key: `state-${ei}`, idxs, level: 'state', entry, label: entry.location_label || UF_NAMES[uf] || uf, colors: toArr(entry.location_colors) });\n      });\n    }\n    function addLeaf(list, level, focus, usedUfs){\n      list.forEach((entry, ei) => {\n        if (!entry) return;\n        const n = norm(entry.location_id);\n        const matches = IDX.anyName[n];\n        if (!matches || !matches.length) { d2.log('multiescala: ' + level + ' não encontrado (' + entry.location_id + ')'); return; }\n        const i = matches[0];\n        usedUfs.add(IDX.recs[i].uf);\n        focus.push({ key: `${level}-${ei}`, idxs: [i], level, entry, label: entry.location_label || IDX.recs[i].label, colors: toArr(entry.location_colors) });\n      });\n    }\n\n    function buildScene(){\n      const countryList = toArr(d2.param('country_list', []));\n      const regionList = toArr(d2.param('region_list', []));\n      const stateList = toArr(d2.param('state_list', []));\n      const cityList = toArr(d2.param('city_list', []));\n      const muniList = toArr(d2.param('municipality_list', []));\n      const wantNeighbors = !!d2.param('should_render_neighbors', false);\n\n      const focus = [];\n      const usedUfs = new Set();\n      const usedRegions = new Set();\n      const lowest = (cityList.length || muniList.length) ? 'leaf'\n        : stateList.length ? 'state'\n        : regionList.length ? 'region'\n        : countryList.length ? 'country' : null;\n\n      addCountry(countryList, focus, usedUfs);\n      addRegion(regionList, focus, usedUfs, usedRegions);\n      addState(stateList, focus, usedUfs);\n      addLeaf(cityList, 'city', focus, usedUfs);\n      addLeaf(muniList, 'municipality', focus, usedUfs);\n\n      const ctx = [];\n      const focusIdxSet = new Set(focus.flatMap(s => s.idxs));\n      if (wantNeighbors && lowest) {\n        if (lowest === 'leaf') {\n          const nbrIdx = new Set();\n          focus.filter(s => s.level === 'municipality' || s.level === 'city')\n            .forEach(s => IDX.nbrsOf(s.idxs[0]).forEach(j => { if (!focusIdxSet.has(j)) nbrIdx.add(j); }));\n          if (nbrIdx.size) ctx.push({ idxs: [...nbrIdx] });\n        } else if (lowest === 'state') {\n          const nbrUfs = new Set([...usedUfs].flatMap(u => UF_BORDERS[u] || []).filter(u => !usedUfs.has(u)));\n          nbrUfs.forEach(u => { if (IDX.byUfName[u]) ctx.push({ idxs: Object.values(IDX.byUfName[u]) }); });\n        } else if (lowest === 'region') {\n          const nbrRegions = new Set();\n          [...usedUfs].forEach(u => (UF_BORDERS[u] || []).forEach(b => {\n            const br = Object.keys(REGION_UFS).find(r => REGION_UFS[r].includes(b));\n            if (br && !usedRegions.has(br)) nbrRegions.add(br);\n          }));\n          nbrRegions.forEach(r => {\n            const idxs = REGION_UFS[r].flatMap(u => IDX.byUfName[u] ? Object.values(IDX.byUfName[u]) : []);\n            if (idxs.length) ctx.push({ idxs });\n          });\n        }\n      }\n\n      S.focus = focus; S.ctx = ctx;\n\n      if (!focus.length && !ctx.length) {\n        $('#empty').classList.remove('hidden');\n        $('#legend').classList.add('hidden');\n        $('#map').innerHTML = '';\n        return;\n      }\n      $('#empty').classList.add('hidden');\n\n      const zoomIdxs = focus.length ? focus.flatMap(s => s.idxs) : ctx.flatMap(s => s.idxs);\n      S.pr = project(zoomIdxs.map(i => IDX.recs[i].f));\n      S.view = { scale: 1, tx: 100, ty: 0 };\n      drawMap();\n    }\n\n    function drawMap(){\n      const svg = $('#map'); svg.innerHTML = '';\n      const viewport = document.createElementNS(NS, 'g');\n      viewport.setAttribute('id', 'viewport');\n      svg.appendChild(viewport);\n      applyTransform();\n      const touch = !!d2.param('touch_controls', false);\n      const labelFontSize = Math.max(4, Math.min(14, 9 * ((S.pr && S.pr.scale || 1000) / 1000)));\n\n      S.ctx.forEach((c, i) => {\n        const p = document.createElementNS(NS, 'path');\n        p.setAttribute('d', pathFromRings(dissolveRings(c.idxs, IDX.recs), S.pr));\n        p.setAttribute('data-key', 'ctx-' + i);\n        p.setAttribute('class', 'area');\n        p.setAttribute('fill', '#dcdfe8');\n        p.setAttribute('opacity', '.55');\n        viewport.appendChild(p);\n      });\n\n      const legendGroups = [];\n      S.focus.forEach(item => {\n        const rings = dissolveRings(item.idxs, IDX.recs);\n        const dFull = pathFromRings(rings, S.pr);\n        const base = document.createElementNS(NS, 'path');\n        base.setAttribute('d', dFull);\n        base.setAttribute('data-key', item.key + '-base');\n        base.setAttribute('class', 'area');\n        base.setAttribute('fill', item.colors.length ? '#eef0f5' : '#94a3b8');\n        base.onmousemove = e => showInfo({ label: item.label, color: null }, e);\n        base.onmouseleave = hideInfo;\n        viewport.appendChild(base);\n\n        if (item.colors.length) {\n          const [bx0, , bx1] = mergedBbox(item.idxs, S.pr, IDX.recs);\n          const n = item.colors.length;\n          const stripeW = (bx1 - bx0) / n;\n          item.colors.forEach((c, ci) => {\n            const d = stripeClipRings(rings, S.pr, bx0 + ci * stripeW, bx0 + (ci + 1) * stripeW);\n            if (!d) return;\n            const wedge = document.createElementNS(NS, 'path');\n            wedge.setAttribute('d', d);\n            wedge.setAttribute('data-key', item.key + '-w' + ci);\n            wedge.setAttribute('class', 'wedge' + (touch ? ' touchy' : ''));\n            wedge.setAttribute('fill', c.color || PALETTE[ci % PALETTE.length]);\n            wedge.onclick = (e) => {\n              if (dragMoved) { dragMoved = false; return; }\n              if (touch) showInfo({ label: item.label, color: c });\n              // The ONLY click entry point — a color with no `onClick` just isn't actionable.\n              // Augment the REAL click event (not a bare payload object) so APIs that need a\n              // genuine DOM event as their first arg (e.g. @__DialogsService, which walks\n              // $event.parentElement to find the modal mount point) still work, while\n              // `$event.color_id` etc. remain readable.\n              if (typeof c.onClick === 'function') {\n                c.onClick(Object.assign(e, {\n                  level: item.level,\n                  location_id: item.entry.location_id,\n                  location_label: item.entry.location_label,\n                  color_id: c.color_id,\n                  color_label: c.color_label,\n                  color: c.color,\n                }));\n              }\n            };\n            if (!touch) {\n              wedge.onmousemove = e => showInfo({ label: item.label, color: c }, e);\n              wedge.onmouseleave = hideInfo;\n            }\n            viewport.appendChild(wedge);\n          });\n        }\n\n        const [cx, cy] = item.idxs.length > 1 ? mergeCentroid(item.idxs, S.pr, IDX.recs) : cxy(IDX.recs[item.idxs[0]].f, S.pr);\n        const t = document.createElementNS(NS, 'text');\n        t.setAttribute('class', 'lbl'); t.setAttribute('x', cx); t.setAttribute('y', cy);\n        t.style.fontSize = labelFontSize + 'px';\n        t.textContent = (item.label || '').slice(0, 16);\n        viewport.appendChild(t);\n\n        if (item.colors.length) legendGroups.push({ entry: item.entry, items: item.colors });\n      });\n\n      renderLegend(legendGroups);\n    }\n    function renderLegend(groups){\n      const el = $('#legend');\n      if (!groups.length) { el.classList.add('hidden'); return; }\n      el.classList.remove('hidden');\n      el.innerHTML = groups.map(g => {\n        const rows = g.items.map(c => `<div class=\"row\"><b style=\"background:${esc(c.color)}\"></b>${esc(c.color_label || c.color_id)}</div>`).join('');\n        return `<div class=\"grp\"><div class=\"grpname\">${esc(g.entry.location_label || g.entry.location_id || '')}</div>${rows}</div>`;\n      }).join('');\n    }\n\n    async function load(){\n      loader(true, 'carregando malhas do Brasil (27 UFs)…', false);\n      try {\n        const ufs = Object.keys(UF_CODE);\n        const geos = await Promise.all(ufs.map(u => geoUF(u).catch(() => null)));\n        const allFeat = [];\n        ufs.forEach((u, i) => { const g = geos[i]; if (!g) return; g.features.forEach(f => { f.__uf = u; allFeat.push(f); }); });\n        if (!allFeat.length) throw new Error('nenhuma malha carregada');\n        IDX = buildIndex(allFeat);\n        buildScene();\n        loader(false);\n      } catch (e) {\n        loader(true, 'erro: ' + e.message + ' (clique p/ tentar de novo)', true);\n      }\n    }\n    $('#loader').onclick = () => { if (!$('#loader').classList.contains('err')) return; IDX = null; load(); };\n\n    load();\n  },\n};"}},"country_list":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"country_list"}}}},"region_list":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"region_list"}}}},"state_list":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"state_list"}}}},"city_list":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"city_list"}}}},"municipality_list":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"municipality_list"}}}},"should_render_neighbors":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"should_render_neighbors"}}}},"touch_controls":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"touch_controls"}}}}}}}},"__d2PrevCode":{"code":{"component":"data2-core-primitives@String","params":{"content":"const UF_CODE={RO:'11',AC:'12',AM:'13',RR:'14',PA:'15',AP:'16',TO:'17',MA:'21',PI:'22',CE:'23',RN:'24',PB:'25',PE:'26',AL:'27',SE:'28',BA:'29',MG:'31',ES:'32',RJ:'33',SP:'35',PR:'41',SC:'42',RS:'43',MS:'50',MT:'51',GO:'52',DF:'53'};\nconst UF_BORDERS={AC:['AM','RO'],AL:['BA','PE','SE'],AM:['AC','RO','RR','PA','MT'],AP:['PA'],\n BA:['AL','SE','PE','PI','TO','GO','MG','ES'],CE:['PI','PB','PE','RN'],DF:['GO','MG'],\n ES:['BA','MG','RJ'],GO:['DF','MT','MS','MG','BA','TO'],MA:['PA','TO','PI'],\n MG:['BA','GO','DF','MS','SP','RJ','ES'],MS:['MT','GO','MG','SP','PR'],MT:['RO','AM','PA','TO','GO','MS'],\n PA:['AP','AM','MT','TO','MA','RR'],PB:['RN','CE','PE'],PE:['PB','CE','PI','BA','AL'],\n PI:['MA','TO','BA','PE','CE'],PR:['SP','MS','SC'],RJ:['ES','MG','SP'],RN:['CE','PB'],\n RO:['AC','AM','MT'],RR:['AM','PA'],RS:['SC'],SC:['PR','RS'],SE:['BA','AL'],\n SP:['MG','RJ','PR','MS'],TO:['PA','MA','PI','BA','GO','MT']};\nconst UF_NAMES={RO:'Rondônia',AC:'Acre',AM:'Amazonas',RR:'Roraima',PA:'Pará',AP:'Amapá',TO:'Tocantins',\n MA:'Maranhão',PI:'Piauí',CE:'Ceará',RN:'Rio Grande do Norte',PB:'Paraíba',PE:'Pernambuco',AL:'Alagoas',\n SE:'Sergipe',BA:'Bahia',MG:'Minas Gerais',ES:'Espírito Santo',RJ:'Rio de Janeiro',SP:'São Paulo',\n PR:'Paraná',SC:'Santa Catarina',RS:'Rio Grande do Sul',MS:'Mato Grosso do Sul',MT:'Mato Grosso',\n GO:'Goiás',DF:'Distrito Federal'};\nconst REGION_UFS={N:['RO','AC','AM','RR','PA','AP','TO'],NE:['MA','PI','CE','RN','PB','PE','AL','SE','BA'],\n CO:['MS','MT','GO','DF'],SE:['MG','ES','RJ','SP'],S:['PR','SC','RS']};\nconst REGION_NAMES={N:'Norte',NE:'Nordeste',CO:'Centro-Oeste',SE:'Sudeste',S:'Sul'};\nconst PALETTE=['#8b7fd6','#d1b048','#67bd5b','#5aa9d6','#d67fa8','#c98a4b'];\n\nexport default {\n  css: `\n    :host{display:block;width:100%;height:100%;box-sizing:border-box}\n    .wrap{position:relative;height:100%;display:flex;flex-direction:column;font:13px -apple-system,BlinkMacSystemFont,\"SF Pro Text\",Inter,sans-serif;background:transparent;overflow:hidden;border-radius:0px;border:0px solid rgba(0,0,0,.08);box-shadow:0 6px 20px rgba(0,0,0,.12)}\n    .stage{flex:1;min-height:0;position:relative;cursor:grab;touch-action:none}\n    .stage:active{cursor:grabbing}\n    svg{width:100%;height:100%;display:block}\n    .area{stroke:rgba(255,255,255,.2);stroke-width:.85;stroke-linejoin:round;stroke-linecap:round}\n    .wedge{stroke:rgba(255,255,255,.7);stroke-width:.5;stroke-linejoin:round;cursor:pointer;transition:filter .15s ease}\n    .wedge:hover{filter:brightness(1.16)}\n    .wedge.touchy{stroke-width:.9}\n    .lbl{fill:#1D1D1F;font-size:9px;font-weight:600;pointer-events:none;user-select:none;text-anchor:middle;paint-order:stroke;stroke:rgba(255,255,255,.7);stroke-width:.6px}\n    .legend{display:none!important;position:absolute;left:10px;bottom:10px;max-width:64%;max-height:70%;overflow:auto;flex-direction:column;gap:8px;padding:10px 12px;border-radius:12px;background:rgba(255,255,255,.78);-webkit-backdrop-filter:blur(30px) saturate(180%);backdrop-filter:blur(30px) saturate(180%);border:1px solid rgba(0,0,0,.08);font-size:11px;box-shadow:0 8px 24px rgba(0,0,0,.20)}\n    .legend .grp{display:flex;flex-direction:column;gap:3px}\n    .legend .grpname{font-weight:700;color:rgba(0,0,0,.5);font-size:10px;text-transform:uppercase;letter-spacing:.06em}\n    .legend .row{display:flex;align-items:center;gap:6px;color:#1D1D1F}\n    .legend b{width:10px;height:10px;border-radius:3px;display:inline-block;flex:0 0 auto;box-shadow:inset 0 0 0 1px rgba(0,0,0,.1)}\n    .tip{display:none!important;position:fixed;pointer-events:none;background:rgba(255,255,252,.95);-webkit-backdrop-filter:blur(20px) saturate(150%);backdrop-filter:blur(20px) saturate(150%);color:#1D1D1F;border:1px solid rgba(0,0,0,.08);border-radius:6px;padding:6px 9px;font-size:11px;opacity:0;transition:opacity .12s ease;box-shadow:0 2px 8px rgba(0,0,0,.15);z-index:9;max-width:220px}\n    .infobar{display:none!important;position:absolute;left:0;right:0;bottom:0;background:rgba(246,246,247,.85);-webkit-backdrop-filter:blur(20px) saturate(180%);backdrop-filter:blur(20px) saturate(180%);border-top:1px solid rgba(0,0,0,.1);color:#1D1D1F;padding:10px 14px;font-size:13px;display:flex;justify-content:space-between;align-items:center;gap:10px;transform:translateY(100%);transition:transform .18s ease;z-index:8}\n    .infobar.show{transform:translateY(0)}\n    .infobar .x{opacity:.5;cursor:pointer;padding:2px 7px;border-radius:5px;transition:background .12s ease,opacity .12s ease}\n    .infobar .x:hover{opacity:.9;background:rgba(0,0,0,.06)}\n    .load{position:absolute;inset:0;background:rgba(236,236,236,.94);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);display:flex;align-items:center;justify-content:center;z-index:5;color:rgba(0,0,0,.5);text-align:center;padding:16px;cursor:default;font-size:13px}\n    .load.err{cursor:pointer;text-decoration:underline;color:#FF3B30}\n    .empty{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;color:rgba(0,0,0,.5);text-align:center;padding:24px;font-size:13px}\n    .hidden{display:none}\n  `,\n  render(){\n    return `<div class=\"wrap\">\n      <div class=\"stage\"><svg id=\"map\" viewBox=\"0 0 700 500\" preserveAspectRatio=\"xMidYMid meet\"></svg></div>\n      <div class=\"legend hidden\" id=\"legend\"></div>\n      <div class=\"tip\" id=\"tip\"></div>\n      <div class=\"infobar\" id=\"infobar\"><span id=\"infobarText\"></span><span class=\"x\" id=\"infobarClose\">✕</span></div>\n      <div class=\"load\" id=\"loader\">carregando malhas do Brasil…</div>\n      <div class=\"empty hidden\" id=\"empty\">Nenhuma localização declarada — informe country_list, region_list, state_list, city_list ou municipality_list.</div>\n    </div>`;\n  },\n  mounted(d2, root){\n\n    const $ = s => root.querySelector(s);\n    const NS = 'http://www.w3.org/2000/svg';\n    const norm = s => (s||'').normalize('NFKD').replace(/[̀-ͯ]/g,'').toUpperCase().replace(/[^A-Z0-9]+/g,' ').trim();\n    const esc = s => (s==null?'':String(s)).replace(/[&<>]/g, c => ({'&':'&amp;','<':'&lt;','>':'&gt;'}[c]));\n    const toArr = v => Array.isArray(v) ? v : [];\n\n    function matchUf(idOrName){\n      if(!idOrName) return null;\n      const up = String(idOrName).trim().toUpperCase();\n      if (UF_CODE[up]) return up;\n      const n = norm(idOrName);\n      const hit = Object.keys(UF_NAMES).find(code => norm(UF_NAMES[code]) === n);\n      return hit || null;\n    }\n    function matchRegion(idOrName){\n      if(!idOrName) return null;\n      const up = String(idOrName).trim().toUpperCase();\n      if (REGION_UFS[up]) return up;\n      const n = norm(idOrName);\n      const hit = Object.keys(REGION_NAMES).find(code => norm(REGION_NAMES[code]) === n);\n      return hit || null;\n    }\n\n    async function geoUF(uf){\n      const code = UF_CODE[uf] || uf;\n      const r = await fetch('https://raw.githubusercontent.com/tbrugz/geodata-br/master/geojson/geojs-'+code+'-mun.json');\n      if (!r.ok) throw new Error('geo ' + uf);\n      return r.json();\n    }\n    function ptsOf(f){\n      const g=f.geometry, ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates], s=new Set();\n      ps.forEach(poly=>poly.forEach(ring=>ring.forEach(p=>s.add(Math.round(p[0]*1000)/1000+','+Math.round(p[1]*1000)/1000))));\n      return s;\n    }\n    function buildIndex(features){\n      const recs = features.map(f => ({\n        name: norm(f.properties.name || f.properties.NOME || f.properties.nome || ''),\n        label: f.properties.name || f.properties.NOME || f.properties.nome || '',\n        uf: f.__uf, f, pts: ptsOf(f)\n      }));\n      const ptIdx = {};\n      recs.forEach((r,i) => r.pts.forEach(p => (ptIdx[p]=ptIdx[p]||[]).push(i)));\n      const nbrsOf = i => {\n        const c={};\n        recs[i].pts.forEach(p => ptIdx[p].forEach(j => { if (j!==i) c[j]=(c[j]||0)+1; }));\n        return Object.entries(c).filter(([,n])=>n>=2).map(([j])=>+j);\n      };\n      const byUfName = {};\n      recs.forEach((r,i) => { byUfName[r.uf]=byUfName[r.uf]||{}; byUfName[r.uf][r.name]=i; });\n      const anyName = {};\n      recs.forEach((r,i) => { (anyName[r.name]=anyName[r.name]||[]).push(i); });\n      return { recs, nbrsOf, byUfName, anyName };\n    }\n    function project(feats){\n      let mnx=1/0,mny=1/0,mxx=-1/0,mxy=-1/0;\n      const each = cb => feats.forEach(f=>{const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];ps.forEach(p=>p.forEach(r=>r.forEach(cb)));});\n      each(p=>{mnx=Math.min(mnx,p[0]);mxx=Math.max(mxx,p[0]);mny=Math.min(mny,p[1]);mxy=Math.max(mxy,p[1]);});\n      const mlat=(mny+mxy)/2, kx=Math.cos(mlat*Math.PI/180), W=700,H=500,pad=22;\n      const gw=(mxx-mnx)*kx, gh=(mxy-mny), sc=Math.min((W-2*pad)/gw,(H-2*pad)/gh);\n      const ox=(W-gw*sc)/2, oy=(H-gh*sc)/2;\n      const pr = p=>[ox+(p[0]-mnx)*kx*sc, oy+(mxy-p[1])*sc];\n      pr.scale = sc;\n      return pr;\n    }\n    function pathFor(f,pr){\n      const g=f.geometry, ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];\n      return ps.map(poly=>poly.map(r=>'M'+r.map(p=>{const q=pr(p);return q[0].toFixed(1)+','+q[1].toFixed(1);}).join('L')+'Z').join('')).join('');\n    }\n    function cxy(f,pr){\n      let x=0,y=0,n=0; const g=f.geometry, ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];\n      ps.forEach(poly=>poly[0].forEach(p=>{const q=pr(p);x+=q[0];y+=q[1];n++;}));\n      return [x/n, y/n];\n    }\n    function ringsOf(f){\n      const g = f.geometry, ps = g.type==='MultiPolygon' ? g.coordinates : [g.coordinates];\n      const rings = [];\n      ps.forEach(poly => poly.forEach(ring => rings.push(ring)));\n      return rings;\n    }\n    const quant = p => [Math.round(p[0]*1000)/1000, Math.round(p[1]*1000)/1000];\n    const keyOf = p => p[0] + ',' + p[1];\n    // Dissolves the municipio polygons in `idxs` into their outer boundary (+ any real holes)\n    // by cancelling every edge shared by two included polygons — the border between two\n    // adjacent included municipios disappears, leaving only the union's true edge. Exact for\n    // this dataset because neighboring municipio files share literal boundary coordinates (the\n    // same tolerance ptsOf already relies on for adjacency).\n    function dissolveRings(idxs, recs){\n      if (idxs.length === 1) return ringsOf(recs[idxs[0]].f);\n      const edgeCount = new Map(), edges = [];\n      idxs.forEach(i => {\n        ringsOf(recs[i].f).forEach(ring => {\n          const q = ring.map(quant);\n          for (let k = 0; k < q.length - 1; k++){\n            const a = q[k], b = q[k+1], ka = keyOf(a), kb = keyOf(b);\n            if (ka === kb) continue;\n            const uk = ka < kb ? ka+'|'+kb : kb+'|'+ka;\n            edgeCount.set(uk, (edgeCount.get(uk)||0) + 1);\n            edges.push({ a, b, ka, kb, uk });\n          }\n        });\n      });\n      const kept = edges.filter(e => edgeCount.get(e.uk) === 1);\n      const byStart = new Map();\n      kept.forEach(e => {\n        if (!byStart.has(e.ka)) byStart.set(e.ka, []);\n        byStart.get(e.ka).push(e);\n      });\n      const used = new Set(), rings = [];\n      kept.forEach(seed => {\n        if (used.has(seed)) return;\n        const ring = [seed.a];\n        let cur = seed, guard = 0;\n        while (guard++ < 50000) {\n          used.add(cur);\n          ring.push(cur.b);\n          if (cur.kb === seed.ka) break;\n          const next = (byStart.get(cur.kb) || []).find(e => !used.has(e));\n          if (!next) break;\n          cur = next;\n        }\n        if (ring.length >= 4 && keyOf(ring[0]) === keyOf(ring[ring.length-1])) rings.push(ring);\n      });\n      return rings;\n    }\n    function pathFromRings(rings, pr){\n      return rings.map(ring => 'M'+ring.map(p=>{const q=pr(p);return q[0].toFixed(1)+','+q[1].toFixed(1);}).join('L')+'Z').join('');\n    }\n    function stripeClipRings(rings, pr, x0, x1){\n      let d = '';\n      rings.forEach(ring => {\n        let pts = ring.map(p => pr(p));\n        pts = clipHalfPlane(pts, (x) => x - x0);\n        if (pts.length) pts = clipHalfPlane(pts, (x) => x1 - x);\n        if (pts.length >= 3) d += 'M' + pts.map(q => q[0].toFixed(1) + ',' + q[1].toFixed(1)).join('L') + 'Z';\n      });\n      return d;\n    }\n    function mergeCentroid(idxs, pr, recs){\n      let x=0,y=0,n=0;\n      idxs.forEach(i=>{ const [cx,cy]=cxy(recs[i].f,pr); x+=cx; y+=cy; n++; });\n      return n ? [x/n, y/n] : [0,0];\n    }\n    function mergedBbox(idxs, pr, recs){\n      let minX=Infinity,minY=Infinity,maxX=-Infinity,maxY=-Infinity;\n      idxs.forEach(i => {\n        const g=recs[i].f.geometry, ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];\n        ps.forEach(poly=>poly.forEach(ring=>ring.forEach(p=>{\n          const q=pr(p);\n          minX=Math.min(minX,q[0]); maxX=Math.max(maxX,q[0]);\n          minY=Math.min(minY,q[1]); maxY=Math.max(maxY,q[1]);\n        })));\n      });\n      return [minX,minY,maxX,maxY];\n    }\n    // Sutherland-Hodgman clip against a straight half-plane (side(x,y)>=0 kept). A straight-line\n    // cut is exact for ANY simple polygon, convex or concave, so stacking bands never leaves a gap\n    // — unlike an angular wedge radiating from one apex, which can't \"see\" a concave shape's whole border.\n    function clipHalfPlane(ring, side){\n      const out = [];\n      const n = ring.length;\n      for (let i = 0; i < n; i++){\n        const curr = ring[i], prev = ring[(i - 1 + n) % n];\n        const sCurr = side(curr[0], curr[1]);\n        const sPrev = side(prev[0], prev[1]);\n        const currIn = sCurr >= -1e-9;\n        const prevIn = sPrev >= -1e-9;\n        if (currIn) {\n          if (!prevIn) out.push(intersectHalfPlane(prev, curr, side));\n          out.push(curr);\n        } else if (prevIn) {\n          out.push(intersectHalfPlane(prev, curr, side));\n        }\n      }\n      return out;\n    }\n    function intersectHalfPlane(p1, p2, side){\n      const s1 = side(p1[0], p1[1]), s2 = side(p2[0], p2[1]);\n      const t = s1 / (s1 - s2);\n      return [p1[0] + t * (p2[0] - p1[0]), p1[1] + t * (p2[1] - p1[1])];\n    }\n\n    const loader = (on, t, isErr) => {\n      const l = $('#loader');\n      l.classList.toggle('hidden', !on);\n      l.classList.toggle('err', !!isErr);\n      if (t != null) l.textContent = t;\n    };\n\n    let IDX = null;\n    let S = { pr: null, view: { scale: 1, tx: 0, ty: 0 }, focus: [], ctx: [] };\n    let dragStart = null, dragMoved = false;\n    let pointers = new Map();\n    let pinchDist = null;\n\n    function svgPoint(evt){\n      const svg = $('#map');\n      const pt = svg.createSVGPoint();\n      pt.x = evt.clientX; pt.y = evt.clientY;\n      const ctm = svg.getScreenCTM();\n      if (!ctm) return { x: 0, y: 0 };\n      const p = pt.matrixTransform(ctm.inverse());\n      return { x: p.x, y: p.y };\n    }\n    function applyTransform(){\n      const g = $('#viewport');\n      if (g) g.setAttribute('transform', `translate(${S.view.tx} ${S.view.ty}) scale(${S.view.scale})`);\n    }\n    function zoomAt(p, factor){\n      const next = Math.min(8, Math.max(0.15, S.view.scale * factor));\n      const k = next / S.view.scale;\n      S.view.tx = p.x - k * (p.x - S.view.tx);\n      S.view.ty = p.y - k * (p.y - S.view.ty);\n      S.view.scale = next;\n      applyTransform();\n    }\n    d2.on('.stage', 'wheel', e => { e.preventDefault(); zoomAt(svgPoint(e), e.deltaY < 0 ? 1.15 : 1/1.15); });\n    d2.on('.stage', 'pointerdown', (e, el) => {\n      pointers.set(e.pointerId, { x: e.clientX, y: e.clientY });\n      if (pointers.size === 1) {\n        const p = svgPoint(e);\n        dragStart = { x: p.x, y: p.y, tx: S.view.tx, ty: S.view.ty, pointerId: e.pointerId, el, sx: e.clientX, sy: e.clientY };\n        dragMoved = false;\n      } else {\n        dragStart = null;\n        pinchDist = null;\n      }\n    });\n    d2.on(window, 'pointermove', e => {\n      if (!pointers.has(e.pointerId)) return;\n      pointers.set(e.pointerId, { x: e.clientX, y: e.clientY });\n      if (pointers.size === 2) {\n        const pts = [...pointers.values()];\n        const dist = Math.hypot(pts[0].x - pts[1].x, pts[0].y - pts[1].y);\n        if (pinchDist) {\n          const mid = { clientX: (pts[0].x + pts[1].x) / 2, clientY: (pts[0].y + pts[1].y) / 2 };\n          zoomAt(svgPoint(mid), dist / pinchDist);\n          dragMoved = true;\n        }\n        pinchDist = dist;\n        return;\n      }\n      if (!dragStart) return;\n      const p = svgPoint(e);\n      const dx = p.x - dragStart.x, dy = p.y - dragStart.y;\n      // Capture the pointer only once real drag movement is detected. Capturing eagerly on\n      // every pointerdown (the previous behavior) redirects the native `click` event's target\n      // to the capturing element (a browser click-synthesis quirk with setPointerCapture), so a\n      // plain tap on a color wedge never reached its own onclick. Deferring capture until the\n      // gesture crosses the drag threshold lets a no-movement click hit-test normally.\n      //\n      // The threshold is measured in SCREEN pixels (clientX/clientY), not viewBox units: a mouse\n      // cursor is sub-pixel precise, but a real finger tap naturally drifts several pixels, and\n      // the old 0.5-viewBox-unit threshold (~0.6 screen px, shrinking further when zoomed in)\n      // misread almost every touch tap as a drag — silently swallowing the color's onClick.\n      // Only widen the tolerance when the instance opts into touch_controls — that param is\n      // already the explicit signal this instance is being driven by touch, so gate on it\n      // instead of sniffing e.pointerType (unreliable on hybrid/stylus devices anyway).\n      if (!dragMoved) {\n        const sdx = e.clientX - dragStart.sx, sdy = e.clientY - dragStart.sy;\n        const touchMode = !!d2.param('touch_controls', false);\n        const threshold = touchMode ? 10 : 4;\n        if (Math.hypot(sdx, sdy) > threshold) {\n          dragMoved = true;\n          try { dragStart.el.setPointerCapture?.(dragStart.pointerId); } catch (_) {}\n        }\n      }\n      if (dragMoved) {\n        S.view.tx = dragStart.tx + dx; S.view.ty = dragStart.ty + dy;\n        applyTransform();\n      }\n    });\n    d2.on(window, 'pointerup', e => { pointers.delete(e.pointerId); pinchDist = null; if (!pointers.size) dragStart = null; });\n    d2.on(window, 'pointercancel', e => { pointers.delete(e.pointerId); pinchDist = null; dragStart = null; });\n\n    function showInfo(desc, evt){\n      const touch = !!d2.param('touch_controls', false);\n      const sub = desc.color ? esc(desc.color.color_label || desc.color.color_id) : 'apenas contexto';\n      if (touch) {\n        $('#infobarText').textContent = `${desc.label}${desc.color ? ' · ' + sub : ''}`;\n        $('#infobar').classList.add('show');\n      } else {\n        const tip = $('#tip');\n        if (evt) { tip.style.left = (evt.clientX + 12) + 'px'; tip.style.top = (evt.clientY + 12) + 'px'; }\n        tip.innerHTML = `<b>${esc(desc.label)}</b>${desc.color ? '<br>' + sub : ''}`;\n        tip.style.opacity = 1;\n      }\n    }\n    function hideInfo(){ $('#tip').style.opacity = 0; }\n    $('#infobarClose').onclick = () => $('#infobar').classList.remove('show');\n\n    function addCountry(list, focus, usedUfs){\n      list.forEach((entry, ei) => {\n        if (!entry) return;\n        if (String(entry.location_id||'').trim().toUpperCase() !== 'BR') {\n          d2.log('multiescala: country_list só suporta BR por enquanto (' + entry.location_id + ')');\n          return;\n        }\n        const ufs = Object.keys(UF_CODE);\n        ufs.forEach(u => usedUfs.add(u));\n        const idxs = ufs.flatMap(u => IDX.byUfName[u] ? Object.values(IDX.byUfName[u]) : []);\n        if (!idxs.length) return;\n        focus.push({ key: `country-${ei}`, idxs, level: 'country', entry, label: entry.location_label || 'Brasil', colors: toArr(entry.location_colors) });\n      });\n    }\n    function addRegion(list, focus, usedUfs, usedRegions){\n      list.forEach((entry, ei) => {\n        if (!entry) return;\n        const rc = matchRegion(entry.location_id);\n        if (!rc) { d2.log('multiescala: region_list id não reconhecido (' + entry.location_id + ')'); return; }\n        usedRegions.add(rc);\n        REGION_UFS[rc].forEach(u => usedUfs.add(u));\n        const idxs = REGION_UFS[rc].flatMap(u => IDX.byUfName[u] ? Object.values(IDX.byUfName[u]) : []);\n        if (!idxs.length) return;\n        focus.push({ key: `region-${ei}`, idxs, level: 'region', entry, label: entry.location_label || REGION_NAMES[rc], colors: toArr(entry.location_colors) });\n      });\n    }\n    function addState(list, focus, usedUfs){\n      list.forEach((entry, ei) => {\n        if (!entry) return;\n        const uf = matchUf(entry.location_id);\n        if (!uf) { d2.log('multiescala: state_list id não reconhecido (' + entry.location_id + ')'); return; }\n        usedUfs.add(uf);\n        const idxs = IDX.byUfName[uf] ? Object.values(IDX.byUfName[uf]) : [];\n        if (!idxs.length) return;\n        focus.push({ key: `state-${ei}`, idxs, level: 'state', entry, label: entry.location_label || UF_NAMES[uf] || uf, colors: toArr(entry.location_colors) });\n      });\n    }\n    function addLeaf(list, level, focus, usedUfs){\n      list.forEach((entry, ei) => {\n        if (!entry) return;\n        const n = norm(entry.location_id);\n        const matches = IDX.anyName[n];\n        if (!matches || !matches.length) { d2.log('multiescala: ' + level + ' não encontrado (' + entry.location_id + ')'); return; }\n        const i = matches[0];\n        usedUfs.add(IDX.recs[i].uf);\n        focus.push({ key: `${level}-${ei}`, idxs: [i], level, entry, label: entry.location_label || IDX.recs[i].label, colors: toArr(entry.location_colors) });\n      });\n    }\n\n    function buildScene(){\n      const countryList = toArr(d2.param('country_list', []));\n      const regionList = toArr(d2.param('region_list', []));\n      const stateList = toArr(d2.param('state_list', []));\n      const cityList = toArr(d2.param('city_list', []));\n      const muniList = toArr(d2.param('municipality_list', []));\n      const wantNeighbors = !!d2.param('should_render_neighbors', false);\n\n      const focus = [];\n      const usedUfs = new Set();\n      const usedRegions = new Set();\n      const lowest = (cityList.length || muniList.length) ? 'leaf'\n        : stateList.length ? 'state'\n        : regionList.length ? 'region'\n        : countryList.length ? 'country' : null;\n\n      addCountry(countryList, focus, usedUfs);\n      addRegion(regionList, focus, usedUfs, usedRegions);\n      addState(stateList, focus, usedUfs);\n      addLeaf(cityList, 'city', focus, usedUfs);\n      addLeaf(muniList, 'municipality', focus, usedUfs);\n\n      const ctx = [];\n      const focusIdxSet = new Set(focus.flatMap(s => s.idxs));\n      if (wantNeighbors && lowest) {\n        if (lowest === 'leaf') {\n          const nbrIdx = new Set();\n          focus.filter(s => s.level === 'municipality' || s.level === 'city')\n            .forEach(s => IDX.nbrsOf(s.idxs[0]).forEach(j => { if (!focusIdxSet.has(j)) nbrIdx.add(j); }));\n          if (nbrIdx.size) ctx.push({ idxs: [...nbrIdx] });\n        } else if (lowest === 'state') {\n          const nbrUfs = new Set([...usedUfs].flatMap(u => UF_BORDERS[u] || []).filter(u => !usedUfs.has(u)));\n          nbrUfs.forEach(u => { if (IDX.byUfName[u]) ctx.push({ idxs: Object.values(IDX.byUfName[u]) }); });\n        } else if (lowest === 'region') {\n          const nbrRegions = new Set();\n          [...usedUfs].forEach(u => (UF_BORDERS[u] || []).forEach(b => {\n            const br = Object.keys(REGION_UFS).find(r => REGION_UFS[r].includes(b));\n            if (br && !usedRegions.has(br)) nbrRegions.add(br);\n          }));\n          nbrRegions.forEach(r => {\n            const idxs = REGION_UFS[r].flatMap(u => IDX.byUfName[u] ? Object.values(IDX.byUfName[u]) : []);\n            if (idxs.length) ctx.push({ idxs });\n          });\n        }\n      }\n\n      S.focus = focus; S.ctx = ctx;\n\n      if (!focus.length && !ctx.length) {\n        $('#empty').classList.remove('hidden');\n        $('#legend').classList.add('hidden');\n        $('#map').innerHTML = '';\n        return;\n      }\n      $('#empty').classList.add('hidden');\n\n      const zoomIdxs = focus.length ? focus.flatMap(s => s.idxs) : ctx.flatMap(s => s.idxs);\n      S.pr = project(zoomIdxs.map(i => IDX.recs[i].f));\n      S.view = { scale: 1, tx: 100, ty: 0 };\n      drawMap();\n    }\n\n    function drawMap(){\n      const svg = $('#map'); svg.innerHTML = '';\n      const viewport = document.createElementNS(NS, 'g');\n      viewport.setAttribute('id', 'viewport');\n      svg.appendChild(viewport);\n      applyTransform();\n      const touch = !!d2.param('touch_controls', false);\n      const labelFontSize = Math.max(4, Math.min(14, 9 * ((S.pr && S.pr.scale || 1000) / 1000)));\n\n      S.ctx.forEach((c, i) => {\n        const p = document.createElementNS(NS, 'path');\n        p.setAttribute('d', pathFromRings(dissolveRings(c.idxs, IDX.recs), S.pr));\n        p.setAttribute('data-key', 'ctx-' + i);\n        p.setAttribute('class', 'area');\n        p.setAttribute('fill', '#dcdfe8');\n        p.setAttribute('opacity', '.55');\n        viewport.appendChild(p);\n      });\n\n      const legendGroups = [];\n      S.focus.forEach(item => {\n        const rings = dissolveRings(item.idxs, IDX.recs);\n        const dFull = pathFromRings(rings, S.pr);\n        const base = document.createElementNS(NS, 'path');\n        base.setAttribute('d', dFull);\n        base.setAttribute('data-key', item.key + '-base');\n        base.setAttribute('class', 'area');\n        base.setAttribute('fill', item.colors.length ? '#eef0f5' : '#94a3b8');\n        base.onmousemove = e => showInfo({ label: item.label, color: null }, e);\n        base.onmouseleave = hideInfo;\n        viewport.appendChild(base);\n\n        if (item.colors.length) {\n          const [bx0, , bx1] = mergedBbox(item.idxs, S.pr, IDX.recs);\n          const n = item.colors.length;\n          const stripeW = (bx1 - bx0) / n;\n          item.colors.forEach((c, ci) => {\n            const d = stripeClipRings(rings, S.pr, bx0 + ci * stripeW, bx0 + (ci + 1) * stripeW);\n            if (!d) return;\n            const wedge = document.createElementNS(NS, 'path');\n            wedge.setAttribute('d', d);\n            wedge.setAttribute('data-key', item.key + '-w' + ci);\n            wedge.setAttribute('class', 'wedge' + (touch ? ' touchy' : ''));\n            wedge.setAttribute('fill', c.color || PALETTE[ci % PALETTE.length]);\n            wedge.onclick = (e) => {\n              if (dragMoved) { dragMoved = false; return; }\n              if (touch) showInfo({ label: item.label, color: c });\n              // The ONLY click entry point — a color with no `onClick` just isn't actionable.\n              // Augment the REAL click event (not a bare payload object) so APIs that need a\n              // genuine DOM event as their first arg (e.g. @__DialogsService, which walks\n              // $event.parentElement to find the modal mount point) still work, while\n              // `$event.color_id` etc. remain readable.\n              if (typeof c.onClick === 'function') {\n                c.onClick(Object.assign(e, {\n                  level: item.level,\n                  location_id: item.entry.location_id,\n                  location_label: item.entry.location_label,\n                  color_id: c.color_id,\n                  color_label: c.color_label,\n                  color: c.color,\n                }));\n              }\n            };\n            if (!touch) {\n              wedge.onmousemove = e => showInfo({ label: item.label, color: c }, e);\n              wedge.onmouseleave = hideInfo;\n            }\n            viewport.appendChild(wedge);\n          });\n        }\n\n        const [cx, cy] = item.idxs.length > 1 ? mergeCentroid(item.idxs, S.pr, IDX.recs) : cxy(IDX.recs[item.idxs[0]].f, S.pr);\n        const t = document.createElementNS(NS, 'text');\n        t.setAttribute('class', 'lbl'); t.setAttribute('x', cx); t.setAttribute('y', cy);\n        t.style.fontSize = labelFontSize + 'px';\n        t.textContent = (item.label || '').slice(0, 16);\n        viewport.appendChild(t);\n\n        if (item.colors.length) legendGroups.push({ entry: item.entry, items: item.colors });\n      });\n\n      renderLegend(legendGroups);\n    }\n    function renderLegend(groups){\n      const el = $('#legend');\n      if (!groups.length) { el.classList.add('hidden'); return; }\n      el.classList.remove('hidden');\n      el.innerHTML = groups.map(g => {\n        const rows = g.items.map(c => `<div class=\"row\"><b style=\"background:${esc(c.color)}\"></b>${esc(c.color_label || c.color_id)}</div>`).join('');\n        return `<div class=\"grp\"><div class=\"grpname\">${esc(g.entry.location_label || g.entry.location_id || '')}</div>${rows}</div>`;\n      }).join('');\n    }\n\n    async function load(){\n      loader(true, 'carregando malhas do Brasil (27 UFs)…', false);\n      try {\n        const ufs = Object.keys(UF_CODE);\n        const geos = await Promise.all(ufs.map(u => geoUF(u).catch(() => null)));\n        const allFeat = [];\n        ufs.forEach((u, i) => { const g = geos[i]; if (!g) return; g.features.forEach(f => { f.__uf = u; allFeat.push(f); }); });\n        if (!allFeat.length) throw new Error('nenhuma malha carregada');\n        IDX = buildIndex(allFeat);\n        buildScene();\n        loader(false);\n      } catch (e) {\n        loader(true, 'erro: ' + e.message + ' (clique p/ tentar de novo)', true);\n      }\n    }\n    $('#loader').onclick = () => { if (!$('#loader').classList.contains('err')) return; IDX = null; load(); };\n\n    load();\n  },\n};"}},"at":"2026-08-04T04:34:04.775Z"},"extends":"data2-core-primitives@Block"},"updatedAt":"2026-08-04T17:49:16.648Z","createdAt":"2026-08-04T12:40:20.879Z"},{"_id":"6a7381e544b23b3f85949815","component":"data2-core-types@Component","system":"6a57cfe9673eb7e3c5e57784","params":{"component":"syKO63JC71F1tqr5T_HJx","package":"natura-geomarketing","title":"original - poc","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"export default {\n  css: `\n  :host{display:block;height:100%;--bg:#f4f4f8;--panel:#ffffff;--panel2:#f7f7fb;--line:#e7e7ef;--ink:#1c1c2b;--mut:#71717f;--acc:#c8104e; --closing:#c8104e;--ok:#1f9d57;--grad:linear-gradient(100deg,#c8104e,#8f0b39)}\n  *{box-sizing:border-box}\n  .simroot{position:relative;height:100%;overflow:auto;font:13.5px/1.45 -apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,sans-serif;background:var(--bg);color:var(--ink)}\n  header{padding:14px 20px;background:var(--grad);color:#fff;display:flex;align-items:center;gap:12px;flex-wrap:wrap;box-shadow:0 2px 14px rgba(140,11,57,.25)}\n  header h1{font-size:16px;margin:0;font-weight:700;letter-spacing:.2px}\n  header select,header input{background:rgba(255,255,255,.16);border-color:rgba(255,255,255,.3);color:#fff}\n  header select option{color:#1c1c2b}\n  header .status{color:rgba(255,255,255,.85)}\n  .howto{padding:9px 20px;background:#fff;border-bottom:1px solid var(--line);display:flex;gap:16px;flex-wrap:wrap;font-size:12px;color:var(--mut);align-items:center}\n  .howto b{color:var(--ink)} .howto span{max-width:340px}\n  .pill{font-size:11px;padding:3px 9px;border-radius:99px;border:1px solid rgba(255,255,255,.35);color:rgba(255,255,255,.92);background:rgba(255,255,255,.12)}\n  .pill.live{color:#fff}.pill.ro{color:#fff}\n  header button.act{background:#fff;color:var(--acc)}\n  header button.ghost{background:rgba(255,255,255,.14);color:#fff;border-color:rgba(255,255,255,.3)}\n  .status{font-size:11px;color:var(--mut)}.status.err{color:var(--closing)}\n  select,input,textarea,button{font:inherit}\n  select,input{background:var(--panel2);border:1px solid var(--line);color:var(--ink);border-radius:7px;padding:6px 8px}\n  button.act{background:var(--acc);color:#fff;border:0;border-radius:8px;padding:7px 12px;font-weight:700;cursor:pointer}\n  button.ghost{background:transparent;color:var(--ink);border:1px solid var(--line);border-radius:8px;padding:6px 11px;cursor:pointer}\n  button.ghost.on{border-color:var(--acc);color:var(--acc)}\n  .wrap{display:grid;grid-template-columns:minmax(360px,1fr) 430px;gap:14px;padding:14px 18px;align-items:start}\n  @media(max-width:1150px){.wrap{grid-template-columns:1fr}}\n  .card{background:var(--panel);border:1px solid var(--line);border-radius:14px;padding:14px 16px;margin-bottom:14px;box-shadow:0 1px 3px rgba(20,20,40,.05),0 6px 20px rgba(20,20,40,.04)}\n  .card h2{font-size:11.5px;text-transform:uppercase;letter-spacing:.5px;color:var(--mut);margin:0 0 9px;font-weight:700}\n  svg{width:100%;height:auto;display:block}\n  .muni{stroke:#0b0d12;stroke-width:1.1;cursor:pointer;transition:filter .1s}.muni:hover{filter:brightness(1.28)}\n  .muni.sel{stroke:#fff;stroke-width:2.3}\n  .nbr{fill:#e6e6ee;stroke:#cfcfda;stroke-width:.8;opacity:.95}\n  .mlabel{fill:#0d0f14;font-size:10px;font-weight:700;pointer-events:none;text-anchor:middle;paint-order:stroke;stroke:rgba(255,255,255,.55);stroke-width:2.4px}\n  .nlabel{fill:#6b7183;font-size:8.5px;pointer-events:none;text-anchor:middle}\n  .legend{display:flex;gap:12px;flex-wrap:wrap;margin-top:8px;font-size:12px}\n  .legend b{display:inline-block;width:11px;height:11px;border-radius:3px;margin-right:5px;vertical-align:-1px}\n  .kpis{display:grid;grid-template-columns:1fr 1fr;gap:9px;margin-bottom:12px}\n  .kpi{background:var(--panel2);border:1px solid var(--line);border-radius:10px;padding:9px 11px}\n  .kpi .n{font-size:20px;font-weight:700}.kpi .l{font-size:10.5px;color:var(--mut);margin-top:2px}\n  .kpi.warn{border-color:#f0c2cb}.kpi.warn .n{color:var(--closing)}.kpi.ok{border-color:#bfe6cd}.kpi.ok .n{color:var(--ok)}\n  .bar-row{display:flex;align-items:center;gap:8px;margin:6px 0}\n  .bar-row .tag{width:42px;font-weight:700;font-size:12px}\n  .bar-track{flex:1;height:19px;background:var(--panel2);border-radius:5px;overflow:hidden;display:flex}\n  .bar-base{height:100%;opacity:.4}.bar-inc{height:100%}\n  .bar-val{width:132px;text-align:right;font-size:11px;color:var(--mut);font-variant-numeric:tabular-nums}\n  table{border-collapse:collapse;width:100%;font-size:11.5px}\n  th,td{padding:5px 6px;text-align:right;border-bottom:1px solid var(--line);font-variant-numeric:tabular-nums}\n  th:first-child,td:first-child{text-align:left}\n  thead th{color:var(--mut);font-weight:600;font-size:10.5px;position:sticky;top:0;background:var(--panel)}\n  .home{display:inline-block;width:9px;height:9px;border-radius:2px;margin-right:4px}\n  .muni-item{display:flex;align-items:center;gap:8px;background:var(--panel2);border:1px solid var(--line);border-radius:8px;padding:5px 8px;margin-bottom:6px}\n  .muni-item .nm{flex:1;font-weight:600;font-size:12px}.muni-item .ct{color:var(--mut);font-size:11px}\n  .seg{display:flex;border:1px solid var(--line);border-radius:7px;overflow:hidden}\n  .seg button{border:0;background:transparent;color:var(--mut);padding:4px 8px;font-size:11px;font-weight:700;cursor:pointer}\n  .seg button.on{color:#fff}\n  .toolbar{display:flex;gap:8px;align-items:center;flex-wrap:wrap}\n  .toggle{display:flex;border:1px solid var(--line);border-radius:8px;overflow:hidden;font-size:12px}\n  .toggle button{background:transparent;border:0;color:var(--mut);padding:6px 10px;cursor:pointer;font-weight:600}\n  .toggle button.on{background:var(--panel2);color:var(--ink)}\n  .note{color:var(--mut);font-size:10.5px;margin-top:7px;line-height:1.5}\n  .cell{font-variant-numeric:tabular-nums}\n  .scroll{max-height:240px;overflow:auto}\n  .tip{position:fixed;pointer-events:none;background:#000;color:#fff;border-radius:8px;padding:7px 9px;font-size:11px;opacity:0;transition:opacity .1s;z-index:9;max-width:230px}\n  .spark{display:flex;align-items:flex-end;gap:3px;height:44px}\n  .spark .b{flex:1;background:var(--acc);border-radius:2px 2px 0 0;min-height:2px;opacity:.85}\n  .delta{font-size:10px}.delta.up{color:var(--ok)}.delta.dn{color:var(--closing)}\n  .tabs{display:flex;gap:6px;margin-bottom:10px}\n  .tabs button{background:transparent;border:1px solid var(--line);border-radius:8px;color:var(--mut);padding:6px 12px;cursor:pointer;font-weight:600}\n  .tabs button.on{background:var(--panel2);color:var(--ink);border-color:var(--acc)}\n  .hidden{display:none}\n  .sqlbox{width:100%;height:60px;font-family:ui-monospace,Menlo,monospace;font-size:11px;resize:vertical}\n  .load{position:absolute;inset:0;background:rgba(248,248,251,.85);display:flex;align-items:center;justify-content:center;z-index:20;font-size:14px;color:var(--acc);font-weight:600}\n  .load.hidden{display:none}\n  .badge{font-size:10px;padding:1px 6px;border-radius:5px;background:var(--panel2);border:1px solid var(--line);color:var(--mut)}\n`,\n  render(d2){\n    return `<div class=\"simroot\"><header>\n  <h1>Simulador de Realocação de Setores</h1>\n  <select id=\"sectorPick\" style=\"min-width:230px\"></select>\n  <button class=\"ghost\" id=\"rand\">🎲 aleatório</button>\n  <button class=\"act\" id=\"go\">Fechar setor ▶</button>\n  <span class=\"pill live\" id=\"liveState\">● dado ao vivo</span>\n  <span class=\"pill ro\">read-only · nunca escreve</span>\n  <span class=\"status\" id=\"ds\"></span>\n</header>\n\n<div class=\"howto\">\n  <b>Como usar &nbsp;→&nbsp;</b>\n  <span><b>1.</b> Escolha um setor pra <b>fechar</b> (ou 🎲).</span>\n  <span><b>2.</b> O simulador puxa o dado real, acha os <b>setores vizinhos</b> (geografia, cruzando estados) e sugere o destino de cada município.</span>\n  <span><b>3.</b> Clique <b style=\"color:var(--acc)\">★ Modelo ÓTIMO</b> p/ minimizar quebra de relação, ou ajuste no <b>mapa</b>/botões.</span>\n  <span><b>4.</b> Veja o impacto <b>antes → depois</b> no relatório.</span>\n</div>\n<div class=\"wrap\">\n  <div>\n    <div class=\"card\">\n      <div style=\"display:flex;justify-content:space-between;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:9px\">\n        <h2 id=\"mapTitle\" style=\"margin:0\">Mapa — clique num município p/ trocar o setor destino</h2>\n        <div class=\"toggle\" id=\"viewToggle\" title=\"ASIS = estrutura atual (setor inteiro) · TOBE = após a redistribuição\">\n          <button data-v=\"asis\">◧ ASIS (hoje)</button>\n          <button data-v=\"tobe\" class=\"on\">◨ TOBE (simulação)</button>\n        </div>\n      </div>\n      <svg id=\"map\" viewBox=\"0 0 700 500\" preserveAspectRatio=\"xMidYMid meet\"></svg>\n      <div class=\"legend\" id=\"legend\"></div>\n      <div class=\"note\">Coloridos = municípios do setor fechado (cor = destino). Cinza = vizinhos (contexto). Shapes reais IBGE/tbrugz.</div>\n    </div>\n    <div class=\"card\">\n      <div class=\"tabs\">\n        <button data-tab=\"matrix\" class=\"on\">Matriz ASIS</button>\n        <button data-tab=\"report\">Relatório de impacto (6 ciclos · antes/depois)</button>\n        <button data-tab=\"sql\">Console SQL</button>\n      </div>\n      <div id=\"tab-matrix\"><div class=\"scroll\"><table id=\"matrix\"></table></div></div>\n      <div id=\"tab-report\" class=\"hidden\"></div>\n      <div id=\"tab-sql\" class=\"hidden\">\n        <textarea class=\"sqlbox\" id=\"sqlIn\">SELECT DS_MUNICIPIO, COUNT(DISTINCT CD_CONSULTORA) qtd FROM product.perfil_cb.crm_perfil_cb_diaria_historico WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR=3504 AND DT_HISTORICO=(SELECT MAX(DT_HISTORICO) FROM product.perfil_cb.crm_perfil_cb_diaria_historico WHERE CD_PAIS=1) GROUP BY DS_MUNICIPIO ORDER BY qtd DESC</textarea>\n        <div class=\"toolbar\" style=\"margin:8px 0\"><button class=\"act\" id=\"runSql\">▶ Rodar</button><span class=\"status\" id=\"sqlStatus\"></span></div>\n        <div class=\"scroll\"><table id=\"sqlOut\"></table></div>\n      </div>\n    </div>\n  </div>\n\n  <div>\n    <div class=\"card\">\n      <div class=\"toolbar\" style=\"margin-bottom:11px\">\n        <button class=\"ghost\" id=\"optim\" title=\"testa todas alocações contíguas e escolhe a que equilibra a carga entre setores + minimiza a quebra (evita empilhar tudo num setor)\">★ Modelo ÓTIMO (equilíbrio + quebra)</button>\n        <button class=\"ghost\" id=\"autoTobe\" title=\"preenche cada município pelo setor vizinho mais próximo (geografia)\">TOBE por adjacência</button>\n        <span class=\"badge\" id=\"optBadge\"></span>\n      </div>\n      <div class=\"note\" style=\"margin:-4px 0 10px\"><b style=\"color:var(--ink)\">★ ÓTIMO</b> = equilibra a carga entre os setores <b>e</b> minimiza a quebra (contíguo; não empilha tudo num setor). <b style=\"color:var(--ink)\">TOBE</b> = sugestão por vizinhança. Indicadores atualizam ao vivo.</div>\n      <div class=\"kpis\" id=\"kpis\"></div>\n      <div id=\"contig\"></div>\n      <h2>Span por setor (CBs) — base + entrantes</h2>\n      <div id=\"spans\"></div>\n      <div style=\"display:flex;justify-content:space-between;align-items:center;margin:14px 0 7px\">\n        <h2 style=\"margin:0\">CBs deslocadas</h2>\n        <div class=\"toggle\" id=\"policy\">\n          <button data-p=\"fora\" class=\"on\">= fora do setor</button>\n          <button data-p=\"quebra\">= quebra de relação</button>\n        </div>\n      </div>\n      <div class=\"note\" id=\"policyNote\"></div>\n    </div>\n\n    <div class=\"card\">\n      <h2>Municípios → setor destino</h2>\n      <div class=\"note\" style=\"margin:-4px 0 9px\">Clique no <b>código do setor</b> pra mandar o município <b>inteiro</b> pra lá (regra de negócio). A cor acompanha o mapa.</div>\n      <div id=\"muniList\"></div>\n    </div>\n\n    <div class=\"card\">\n      <h2>Líderes — destino e CBs deslocadas</h2>\n      <div class=\"note\" style=\"margin:-4px 0 9px\"><b>Home</b> = setor que ficou com a maioria das CBs da líder. <b style=\"color:var(--closing)\">Deslocadas</b> = CBs dela que caíram noutro setor (viram “fora do setor” ou “quebra de relação”).</div>\n      <div class=\"scroll\"><table id=\"leaders\"></table></div>\n    </div>\n\n    <div class=\"card\">\n      <div class=\"toolbar\" style=\"justify-content:space-between\">\n        <h2 style=\"margin:0\">Plano de migração</h2>\n        <div><button class=\"ghost\" id=\"copyPlan\">Copiar</button> <button class=\"ghost\" id=\"csvPlan\">CSV</button></div>\n      </div>\n      <div id=\"plan\" class=\"note\"></div>\n    </div>\n  </div>\n</div>\n\n<div class=\"tip\" id=\"tip\"></div>\n<div class=\"load hidden\" id=\"loader\">carregando…</div></div>`;\n  },\n  mounted(d2, root){\n\nconst T='product.perfil_cb.crm_perfil_cb_diaria_historico';\nconst ELO='product.elo_modelo_combinado.commercial_consultant_index';\nconst SNAP=`(SELECT MAX(DT_HISTORICO) FROM ${T} WHERE CD_PAIS=1)`;\nconst PALETTE=['#8b7fd6','#d1b048','#67bd5b','#5aa9d6','#d67fa8','#c98a4b'];\nconst CLOSE_COLOR='#475569';\nconst UF_CODE={RO:'11',AC:'12',AM:'13',RR:'14',PA:'15',AP:'16',TO:'17',MA:'21',PI:'22',CE:'23',RN:'24',PB:'25',PE:'26',AL:'27',SE:'28',BA:'29',MG:'31',ES:'32',RJ:'33',SP:'35',PR:'41',SC:'42',RS:'43',MS:'50',MT:'51',GO:'52',DF:'53'};\nconst UF_BORDERS={AC:['AM','RO'],AL:['BA','PE','SE'],AM:['AC','RO','RR','PA','MT'],AP:['PA'],\n BA:['AL','SE','PE','PI','TO','GO','MG','ES'],CE:['PI','PB','PE','RN'],DF:['GO','MG'],\n ES:['BA','MG','RJ'],GO:['DF','MT','MS','MG','BA','TO'],MA:['PA','TO','PI'],\n MG:['BA','GO','DF','MS','SP','RJ','ES'],MS:['MT','GO','MG','SP','PR'],MT:['RO','AM','PA','TO','GO','MS'],\n PA:['AP','AM','MT','TO','MA','RR'],PB:['RN','CE','PE'],PE:['PB','CE','PI','BA','AL'],\n PI:['MA','TO','BA','PE','CE'],PR:['SP','MS','SC'],RJ:['ES','MG','SP'],RN:['CE','PB'],\n RO:['AC','AM','MT'],RR:['AM','PA'],RS:['SC'],SC:['PR','RS'],SE:['BA','AL'],\n SP:['MG','RJ','PR','MS'],TO:['PA','MA','PI','BA','GO','MT']};\nconst $=s=>root.querySelector(s);\nconst fmt=n=>n==null?'–':Math.round(+n).toLocaleString('pt-BR');\nconst money=n=>{n=+n||0;return n>=1e6?'R$'+(n/1e6).toFixed(1)+'M':n>=1e3?'R$'+(n/1e3).toFixed(0)+'k':'R$'+Math.round(n)};\nconst norm=s=>(s||'').normalize('NFKD').replace(/[̀-ͯ]/g,'').toUpperCase().replace(/[^A-Z0-9]+/g,' ').trim();\nconst NIVEIS=['Bronze','Cristal','Prata','Ouro','Diamante','Diamante+'];\n\nlet S={sector:null, matrix:[], munis:{}, leaders:[], color:{}, dest:[], assign:{}, allowed:{},\n       geoFeat:{}, nbrFeat:[], baseMetrics:{}, closingMetrics:{}, trend:[], levels:[], policy:'fora', selected:null, sectorsList:[], view:'tobe'};\nconst closingCbs=()=>Object.entries(S.munis).filter(([m])=>m!=='__OUTROS__').reduce((a,[,o])=>a+o.cbs,0);\n\nasync function q(sql){ return await d2.rush('A0kvMekKfk4Yk0da7NLET').invoke({sql, skip_monitoring:true, country:'BR'}); }\nfunction rows(resp){const c=(resp.manifest?.schema?.columns||[]).map(x=>x.name);\n  return (resp.result?.data_array||[]).map(a=>Object.fromEntries(c.map((k,i)=>[k,a[i]])));}\nasync function geoUF(uf){const code=UF_CODE[uf]||uf;const r=await fetch('https://raw.githubusercontent.com/tbrugz/geodata-br/master/geojson/geojs-'+code+'-mun.json');if(!r.ok)throw new Error('geo '+uf);return r.json();}\nconst loader=(on,t)=>{const l=$('#loader');l.classList.toggle('hidden',!on);if(t)l.textContent=t;};\n\nfunction buildAdj(features){\n  const pts=f=>{const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates],s=new Set();\n    ps.forEach(poly=>poly.forEach(ring=>ring.forEach(p=>s.add(Math.round(p[0]*1000)/1000+','+Math.round(p[1]*1000)/1000))));return s;};\n  const feat={},idx={};\n  features.forEach(f=>{const nm=norm(f.properties.name||f.properties.NOME||f.properties.nome);feat[nm]={f,pts:pts(f)};});\n  for(const nm in feat) feat[nm].pts.forEach(p=>(idx[p]=idx[p]||[]).push(nm));\n  const nbrs=nm=>{const c={};feat[nm].pts.forEach(p=>idx[p].forEach(o=>{if(o!==nm)c[o]=(c[o]||0)+1;}));\n    return Object.entries(c).filter(([,n])=>n>=2).map(([o,n])=>({o,w:n}));};\n  return {feat,nbrs};\n}\nfunction centroidLL(f){let x=0,y=0,n=0;const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];\n  ps.forEach(poly=>poly[0].forEach(p=>{x+=p[0];y+=p[1];n++;}));return[x/n,y/n];}\n\nasync function closeSector(sec){\n  loader(true,'fechando setor '+sec+' — puxando dado real…');\n  $('#liveState').textContent='● consultando';$('#ds').classList.remove('err');\n  try{\n    S.sector=sec;\n    const mSQL=`SELECT DS_MUNICIPIO municipio, CD_GRUPO grupo, MAX(DS_LEADER_NAME) lider,\n       COUNT(DISTINCT CD_CONSULTORA) cbs, ROUND(SUM(VL_PEDIDOS_CICLO),0) receita,\n       ROUND(SUM(VL_PEDIDOS_NATURA_CICLO),0) rec_nat, ROUND(SUM(VL_PEDIDOS_AVON_CICLO),0) rec_avon,\n       ROUND(SUM(QT_PONTOS_CICLO),0) pontos, ROUND(SUM(QT_PEDIDOS_CICLO),0) pedidos,\n       SUM(CASE WHEN ST_FEZ_PED_CICLO_ATUAL THEN 1 ELSE 0 END) ativas\n      FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR=${sec} AND DT_HISTORICO=${SNAP}\n      GROUP BY DS_MUNICIPIO, CD_GRUPO`;\n    const ufSQL=`SELECT DS_ESTADO uf, COUNT(*) n FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR=${sec} AND DT_HISTORICO=${SNAP} GROUP BY DS_ESTADO ORDER BY n DESC`;\n    const trendSQL=`SELECT operational_cycle ciclo, COUNT(DISTINCT person_code) cbs,\n       COUNT(DISTINCT CASE WHEN registered_bc_ind=1 THEN person_code END) ativas,\n       ROUND(SUM(revenue_nat_ss_amt),0) receita, ROUND(SUM(points_nat_ss_amt),0) pontos\n      FROM ${ELO} WHERE country_code=1 AND sector_code=${sec} GROUP BY operational_cycle ORDER BY operational_cycle DESC LIMIT 8`;\n    const lvlSQL=`SELECT DS_NVL_PLAN_CRESC nivel, COUNT(DISTINCT CD_CONSULTORA) cbs,\n       ROUND(SUM(VL_PEDIDOS_NATURA_CICLO),0) rec_nat, ROUND(SUM(VL_PEDIDOS_AVON_CICLO),0) rec_avon\n      FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR=${sec} AND DS_NVL_PLAN_CRESC IS NOT NULL AND DT_HISTORICO=${SNAP} GROUP BY DS_NVL_PLAN_CRESC ORDER BY cbs DESC`;\n    const lvlMuniSQL=`SELECT DS_MUNICIPIO municipio, DS_NVL_PLAN_CRESC nivel, COUNT(DISTINCT CD_CONSULTORA) cbs\n      FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR=${sec} AND DS_NVL_PLAN_CRESC IS NOT NULL AND DT_HISTORICO=${SNAP} GROUP BY DS_MUNICIPIO, DS_NVL_PLAN_CRESC`;\n    const [mR,ufR,tR,lR,lmR]=await Promise.all([q(mSQL),q(ufSQL),q(trendSQL),q(lvlSQL),q(lvlMuniSQL)]);\n    S.matrix=rows(mR).filter(r=>+r.cbs>0);\n    S.levelByMuni={}; rows(lmR).forEach(r=>{const k=norm(r.municipio);(S.levelByMuni[k]=S.levelByMuni[k]||{})[r.nivel]=+r.cbs;});\n    S.trend=rows(tR).map(r=>({...r,cbs:+r.cbs,ativas:+r.ativas,receita:+r.receita,pontos:+r.pontos})).filter(r=>r.cbs>10).reverse();\n    S.levels=rows(lR);\n    const ufList=rows(ufR).map(r=>r.uf).filter(Boolean);\n    const domUF=ufList[0]||'PR';\n\n    const ufs=[domUF,...(UF_BORDERS[domUF]||[])];\n    loader(true,'malhas '+ufs.join('/')+' + adjacência…');\n    const geos=await Promise.all(ufs.map(u=>geoUF(u).catch(()=>null)));\n    const allFeat=geos.filter(Boolean).flatMap(g=>g.features);\n    const adj=buildAdj(allFeat);\n    const totBy={}; S.matrix.forEach(r=>{const n=norm(r.municipio);totBy[n]=(totBy[n]||0)+ +r.cbs;});\n    const totalSec=Object.values(totBy).reduce((a,b)=>a+b,0);\n    const floor=Math.max(10, totalSec*0.008);\n    const footprint=new Set(Object.entries(totBy).filter(([,c])=>c>=floor).sort((a,b)=>b[1]-a[1]).slice(0,15).map(([m])=>m));\n    const closingNames=[...footprint].filter(n=>adj.feat[n]);\n    const closingSet=new Set(closingNames);\n    S.geoFeat={};closingNames.forEach(n=>S.geoFeat[n]=adj.feat[n].f);\n    const extVotes={}; const nbrNames=new Set();\n    closingNames.forEach(n=>{adj.nbrs(n).forEach(({o,w})=>{ if(!closingSet.has(o)){ nbrNames.add(o); (extVotes[n]=extVotes[n]||[]).push({o,w}); } });});\n    S.nbrFeat=[...nbrNames].map(n=>adj.feat[n].f);\n    let neigh=[];\n    if(nbrNames.size){\n      const inList=[...nbrNames].map(n=>`'${n.replace(/'/g,\"''\")}'`).join(',');\n      const nSQL=`SELECT DS_MUNICIPIO municipio, CD_SETOR setor, COUNT(DISTINCT CD_CONSULTORA) cbs\n        FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR<>${sec} AND CD_SETOR>0 AND DT_HISTORICO=${SNAP} AND DS_MUNICIPIO IN (${inList}) GROUP BY DS_MUNICIPIO, CD_SETOR`;\n      neigh=rows(await q(nSQL));\n    }\n    const domSecOf={};\n    const byM={}; neigh.forEach(r=>{const m=norm(r.municipio);(byM[m]=byM[m]||[]).push(r);});\n    Object.entries(byM).forEach(([m,rs])=>{rs.sort((a,b)=>+b.cbs-+a.cbs);domSecOf[m]=String(rs[0].setor);});\n    S.allowed={}; const secWeight={};\n    closingNames.forEach(n=>{const v={};(extVotes[n]||[]).forEach(({o,w})=>{const s=domSecOf[o];if(s){v[s]=(v[s]||0)+w;secWeight[s]=(secWeight[s]||0)+w;}});S.allowed[n]=v;});\n    S.dest=Object.keys(secWeight).sort((a,b)=>secWeight[b]-secWeight[a]).slice(0,6);\n    if(!S.dest.length){\n      S.dest=[...new Set(Object.values(domSecOf))].slice(0,6);\n      closingNames.forEach(n=>{if(!Object.keys(S.allowed[n]).length){S.dest.forEach(s=>S.allowed[n][s]=1);}});\n    }\n    S.color={};S.dest.forEach((s,i)=>S.color[s]=PALETTE[i%PALETTE.length]);\n    const acc={};Object.entries(domSecOf).forEach(([nb,s])=>{if(!S.dest.includes(s))return;const f=adj.feat[nb]?.f;if(!f)return;const c=centroidLL(f);acc[s]=acc[s]||[0,0,0];acc[s][0]+=c[0];acc[s][1]+=c[1];acc[s][2]++;});\n    S.secCentroid={};S.dest.forEach(s=>{if(acc[s])S.secCentroid[s]=[acc[s][0]/acc[s][2],acc[s][1]/acc[s][2]];});\n    S.muniCentroid={};closingNames.forEach(n=>{S.muniCentroid[n]=centroidLL(adj.feat[n].f);});\n    S.closeAdj={};closingNames.forEach(n=>{S.closeAdj[n]=adj.nbrs(n).filter(({o})=>closingSet.has(o)).map(({o})=>o);});\n    const comp={};let ci=0;closingNames.forEach(n=>{if(comp[n]!=null)return;const st=[n];comp[n]=ci;while(st.length){const x=st.pop();(S.closeAdj[x]||[]).forEach(o=>{if(comp[o]==null){comp[o]=ci;st.push(o);}});}ci++;});\n    const compAllowed={};closingNames.forEach(n=>{const cid=comp[n];(compAllowed[cid]=compAllowed[cid]||new Set());Object.keys(S.allowed[n]||{}).forEach(s=>compAllowed[cid].add(s));});\n    S.reachable={};closingNames.forEach(n=>{S.reachable[n]=[...(compAllowed[comp[n]]||[])].filter(s=>S.dest.includes(s));});\n\n    loader(true,'métricas base dos setores receptores…');\n    const rList=S.dest.join(',');\n    const bSQL=`SELECT CD_SETOR setor, COUNT(DISTINCT CD_CONSULTORA) cbs,\n       SUM(CASE WHEN ST_FEZ_PED_CICLO_ATUAL THEN 1 ELSE 0 END) ativas,\n       ROUND(SUM(VL_PEDIDOS_CICLO),0) receita, ROUND(SUM(VL_PEDIDOS_NATURA_CICLO),0) rec_nat,\n       ROUND(SUM(VL_PEDIDOS_AVON_CICLO),0) rec_avon, ROUND(SUM(QT_PONTOS_CICLO),0) pontos, ROUND(SUM(QT_PEDIDOS_CICLO),0) pedidos\n      FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR IN (${rList}) AND DT_HISTORICO=${SNAP} GROUP BY CD_SETOR`;\n    const blSQL=`SELECT CD_SETOR setor, DS_NVL_PLAN_CRESC nivel, COUNT(DISTINCT CD_CONSULTORA) cbs\n      FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR IN (${rList}) AND DS_NVL_PLAN_CRESC IS NOT NULL AND DT_HISTORICO=${SNAP} GROUP BY CD_SETOR, DS_NVL_PLAN_CRESC`;\n    const [bR,blR]=await Promise.all([q(bSQL),q(blSQL)]);\n    S.baseMetrics={};rows(bR).forEach(r=>S.baseMetrics[String(r.setor)]=r);\n    S.baseLevel={};rows(blR).forEach(r=>{const s=String(r.setor);(S.baseLevel[s]=S.baseLevel[s]||{})[r.nivel]=+r.cbs;});\n\n    aggregate();\n    S.assign=optimize();\n    S.selected=null;\n    const dt=new Date().toLocaleTimeString('pt-BR');\n    $('#ds').textContent=`setor ${sec} · UF ${domUF} · ${closingNames.length} munic. · atualizado ${dt}`;\n    $('#liveState').textContent='● dado ao vivo';\n    $('#mapTitle').textContent=`Fechando setor ${sec} — clique num município p/ trocar destino`;\n    renderAll();\n  }catch(e){ $('#ds').textContent='erro: '+e.message; $('#ds').classList.add('err'); $('#liveState').textContent='● erro'; }\n  finally{ loader(false); }\n}\n\nfunction aggregate(){\n  const munis={}, leaders={};\n  const acc=(o,r)=>{o.cbs+=+r.cbs;o.receita+=+r.receita||0;o.rec_nat+=+r.rec_nat||0;o.rec_avon+=+r.rec_avon||0;o.pontos+=+r.pontos||0;o.pedidos+=+r.pedidos||0;o.ativas+=+r.ativas||0;};\n  const blank=()=>({cbs:0,receita:0,rec_nat:0,rec_avon:0,pontos:0,pedidos:0,ativas:0});\n  S.matrix.forEach(r=>{\n    const m=norm(r.municipio); if(!S.geoFeat[m]) {r._out=true;}\n    const mm=r._out?'__OUTROS__':m;\n    munis[mm]=munis[mm]||{...blank(),name:mm}; acc(munis[mm],r);\n    const g=String(r.grupo); leaders[g]=leaders[g]||{grupo:g,lider:r.lider,total:0,byMuni:{}};\n    leaders[g].total+=+r.cbs; leaders[g].byMuni[mm]=(leaders[g].byMuni[mm]||0)+ +r.cbs;\n  });\n  S.munis=munis; S.leaders=Object.values(leaders).sort((a,b)=>b.total-a.total);\n}\nfunction autoAssign(){\n  const a={};\n  Object.keys(S.munis).forEach(m=>{ if(m==='__OUTROS__')return;\n    const v=S.allowed[m]||{}; const votes=Object.keys(v);\n    if(votes.length){ let best=votes[0],bw=-1; for(const s of votes) if(v[s]>bw){bw=v[s];best=s;} a[m]=best; }\n    else { const c=S.muniCentroid[m]; let best=S.dest[0],bd=Infinity;\n      for(const s of S.dest){ const sc=S.secCentroid[s]; if(!sc)continue; const d=(c[0]-sc[0])**2+(c[1]-sc[1])**2; if(d<bd){bd=d;best=s;} }\n      a[m]=best; }\n  });\n  return a;\n}\nfunction deslocFor(assign){\n  let d=0;\n  S.leaders.forEach(L=>{const byS={};let tot=0;\n    for(const [m,c] of Object.entries(L.byMuni)){if(m==='__OUTROS__')continue;const s=assign[m];if(s){byS[s]=(byS[s]||0)+c;tot+=c;}}\n    const home=S.dest.reduce((a,s)=>(byS[s]||0)>(byS[a]||0)?s:a,S.dest[0]);\n    d+=tot-(byS[home]||0);});\n  return d;\n}\nfunction spanSpread(assign){\n  const inc={};S.dest.forEach(s=>inc[s]=0);\n  Object.entries(S.munis).forEach(([m,o])=>{if(m==='__OUTROS__')return;if(assign[m])inc[assign[m]]+=o.cbs;});\n  const sp=S.dest.map(s=>(+ (S.baseMetrics[s]?.cbs||0))+inc[s]);\n  return Math.max(...sp)-Math.min(...sp);\n}\nfunction contigBad(assign){\n  const bySec={}; for(const m in assign){(bySec[assign[m]]=bySec[assign[m]]||[]).push(m);}\n  const bad=[];\n  for(const s in bySec){const grp=bySec[s],inGrp=new Set(grp);\n    const seeds=grp.filter(m=>(S.allowed[m]||{})[s]);\n    if(!seeds.length){bad.push(s);continue;}\n    const seen=new Set(seeds),st=[...seeds];\n    while(st.length){const m=st.pop();(S.closeAdj[m]||[]).forEach(o=>{if(inGrp.has(o)&&!seen.has(o)){seen.add(o);st.push(o);}});}\n    if(seen.size!==grp.length)bad.push(s);}\n  return bad;\n}\nfunction maxSpanOf(a){const inc={};S.dest.forEach(s=>inc[s]=0);Object.entries(S.munis).forEach(([m,o])=>{if(m==='__OUTROS__')return;if(a[m])inc[a[m]]+=o.cbs;});return Math.max(...S.dest.map(s=>(+ (S.baseMetrics[s]?.cbs||0))+inc[s]));}\nconst OPT_K=1.5;\nfunction optScore(a){return maxSpanOf(a)+OPT_K*deslocFor(a);}\nfunction optimize(){\n  const ms=Object.keys(S.munis).filter(m=>m!=='__OUTROS__');\n  const opts=ms.map(m=>{const al=(S.reachable[m]&&S.reachable[m].length)?S.reachable[m]:S.dest.slice();return al;});\n  const combos=opts.reduce((a,o)=>a*o.length,1);\n  if(combos>300000){ $('#optBadge').textContent='espaço grande ('+fmt(combos)+') — heurística'; return greedy(ms,opts); }\n  let best=null,bestSc=Infinity,bestD=Infinity,valid=0;\n  const rec=(i,cur)=>{ if(i===ms.length){ if(contigBad(cur).length) return; valid++; const sc=optScore(cur),d=deslocFor(cur); if(sc<bestSc||(sc===bestSc&&d<bestD)){bestSc=sc;bestD=d;best={...cur};}return;}\n    for(const s of opts[i]){cur[ms[i]]=s;rec(i+1,cur);} };\n  rec(0,{});\n  if(!best){ $('#optBadge').textContent='sem solução contígua — heurística'; return greedy(ms,opts); }\n  $('#optBadge').textContent=`ótimo · pico ${fmt(maxSpanOf(best))} CBs · quebra ${fmt(bestD)} · ${fmt(valid)}/${fmt(combos)} contíguas`;\n  return best;\n}\nfunction greedy(ms,opts){const a={};ms.forEach((m,i)=>{let best=opts[i][0],bd=Infinity;for(const s of opts[i]){a[m]=s;const d=optScore(a)+(contigBad(a).length?1e9:0);if(d<bd){bd=d;best=s;}}a[m]=best;});return a;}\n\nfunction compute(){\n  const inc={},gained={};S.dest.forEach(s=>{inc[s]=0;gained[s]=0;});\n  Object.entries(S.munis).forEach(([m,o])=>{if(m==='__OUTROS__')return;const s=S.assign[m];if(s)inc[s]+=o.cbs;});\n  let desloc=0;\n  const L2=S.leaders.map(L=>{const byS={};S.dest.forEach(s=>byS[s]=0);let tot=0;\n    for(const [m,c] of Object.entries(L.byMuni)){if(m==='__OUTROS__')continue;const s=S.assign[m];if(s){byS[s]+=c;tot+=c;}}\n    const home=S.dest.reduce((a,s)=>byS[s]>byS[a]?s:a,S.dest[0]);const dl=tot-byS[home];desloc+=dl;gained[home]++;\n    return {...L,byS,home,desloc:dl,assignedTotal:tot};});\n  const span={};S.dest.forEach(s=>span[s]=(+ (S.baseMetrics[s]?.cbs||0))+inc[s]);\n  return {inc,gained,desloc,leaders:L2,span};\n}\nfunction renderAll(){drawMap();renderKpis();renderContig();renderSpans();renderMuni();renderLeaders();renderMatrix();renderPolicy();renderReport();renderPlan();}\nfunction renderContig(){const el=$('#contig');if(!el)return;\n  if(S.view==='asis'){el.innerHTML='';return;}\n  const bad=contigBad(S.assign);\n  el.innerHTML=bad.length\n    ?`<div class=\"note\" style=\"color:var(--closing);font-weight:600;margin:-2px 0 6px\">⚠ Contiguidade quebrada em ${bad.join(', ')} — município(s) desconectado(s) do território do setor. Use ★ ÓTIMO ou reassocie no mapa.</div>`\n    :`<div class=\"note\" style=\"color:var(--ok);margin:-2px 0 6px\">✓ Contíguo — cada setor forma uma região conectada.</div>`;\n}\nfunction renderKpis(){const c=compute();\n  if(S.view==='asis'){const mc=Object.keys(S.munis).filter(m=>m!=='__OUTROS__').length;\n    $('#kpis').innerHTML=[\n      {n:fmt(closingCbs()),l:`CBs no setor ${S.sector}`,t:'Total de CBs cadastradas no setor hoje (estrutura atual).'},\n      {n:fmt(mc),l:'Municípios do setor',t:'Municípios que compõem o território do setor hoje.'},\n      {n:fmt(S.leaders.length),l:'Líderes (grupos)',t:'Líderes ativas dentro do setor hoje.'},\n      {n:fmt(S.dest.length),l:'Setores adjacentes',t:'Setores vizinhos que poderiam receber os municípios se o setor fechar.'},\n    ].map(k=>`<div class=\"kpi\" title=\"${k.t}\"><div class=\"n\">${k.n}</div><div class=\"l\">${k.l}</div></div>`).join('');\n    return;}\n  const sv=S.dest.map(s=>c.span[s]);const spread=Math.max(...sv)-Math.min(...sv);\n  const zero=S.dest.filter(s=>c.gained[s]===0);const totCbs=Object.entries(S.munis).filter(([m])=>m!=='__OUTROS__').reduce((a,[,o])=>a+o.cbs,0);\n  $('#kpis').innerHTML=[\n    {n:fmt(c.desloc),l:S.policy==='fora'?'CBs fora do setor':'CBs c/ quebra de relação',cls:'warn',t:'CBs cuja líder acabou noutro setor. Menor = menos ruptura. É o custo humano da migração.'},\n    {n:fmt(spread),l:'Desequilíbrio (máx−mín CBs)',cls:spread>800?'warn':'ok',t:'Diferença de tamanho entre o maior e o menor setor depois. Menor = carga mais equilibrada entre as GNs.'},\n    {n:fmt(totCbs),l:'CBs realocadas',cls:'',t:`Total de CBs do setor ${S.sector} sendo redistribuídas para os setores vizinhos.`},\n    {n:zero.length?zero.join(', '):'nenhum',l:'Setor sem líder herdada',cls:zero.length?'warn':'ok',t:'Setor que recebe município(s) mas nenhuma líder — as CBs de lá terão que se ligar a uma líder pré-existente do setor.'},\n  ].map(k=>`<div class=\"kpi ${k.cls}\" title=\"${k.t}\"><div class=\"n\">${k.n}</div><div class=\"l\">${k.l}</div></div>`).join('');\n}\nfunction renderSpans(){const c=compute();\n  if(S.view==='asis'){const items=[{s:S.sector,val:closingCbs(),color:CLOSE_COLOR}].concat(S.dest.map(s=>({s,val:+(S.baseMetrics[s]?.cbs||0),color:S.color[s]})));\n    const max=Math.max(...items.map(x=>x.val),1);\n    $('#spans').innerHTML=items.map(x=>`<div class=\"bar-row\"><div class=\"tag\" style=\"color:${x.color}\">${x.s}</div><div class=\"bar-track\">\n      <div class=\"bar-inc\" style=\"width:${x.val/max*100}%;background:${x.color}\"></div></div>\n      <div class=\"bar-val\">${fmt(x.val)}</div></div>`).join('')\n      +`<div class=\"note\">Estrutura atual — o setor <b>${S.sector}</b> ainda existe. Alterne pra <b>TOBE</b> pra ver a redistribuição.</div>`;\n    return;}\n  const max=Math.max(...S.dest.map(s=>c.span[s]),1);\n  $('#spans').innerHTML=S.dest.map(s=>{const base=+(S.baseMetrics[s]?.cbs||0),i=c.inc[s];\n    return `<div class=\"bar-row\"><div class=\"tag\" style=\"color:${S.color[s]}\">${s}</div><div class=\"bar-track\">\n      <div class=\"bar-base\" style=\"width:${base/max*100}%;background:${S.color[s]}\"></div>\n      <div class=\"bar-inc\" style=\"width:${i/max*100}%;background:${S.color[s]}\"></div></div>\n      <div class=\"bar-val\">${fmt(c.span[s])} <span style=\"opacity:.6\">(+${fmt(i)})</span></div></div>`;}).join('')\n    +`<div class=\"note\">Claro = base atual · cheio = CBs entrantes do ${S.sector}.</div>`;\n}\nfunction renderMuni(){const c=compute();const ms=Object.keys(S.munis).filter(m=>m!=='__OUTROS__').sort((a,b)=>S.munis[b].cbs-S.munis[a].cbs);\n  if(S.view==='asis'){$('#muniList').innerHTML=ms.map(m=>`<div class=\"muni-item\"><div class=\"nm\">${m}</div><div class=\"ct\">${fmt(S.munis[m].cbs)} CBs</div><span class=\"badge\" style=\"background:${CLOSE_COLOR};color:#fff;border-color:${CLOSE_COLOR}\">setor ${S.sector}</span></div>`).join('')\n      +`<div class=\"note\">Hoje todos pertencem ao setor <b>${S.sector}</b>. No <b>TOBE</b> cada um vira botões de destino.</div>`;return;}\n  $('#muniList').innerHTML=ms.map(m=>`<div class=\"muni-item\"><div class=\"nm\">${m}</div><div class=\"ct\">${fmt(S.munis[m].cbs)} CBs</div>\n    <div class=\"seg\" data-m=\"${m}\">${S.dest.map(s=>`<button data-s=\"${s}\" class=\"${S.assign[m]===s?'on':''}\" style=\"${S.assign[m]===s?'background:'+S.color[s]:''}\">${s}</button>`).join('')}</div></div>`).join('')\n    +(S.munis.__OUTROS__?`<div class=\"note\">+ ${fmt(S.munis.__OUTROS__.cbs)} CBs em municípios sem shape na UF (tratar à parte).</div>`:'');\n  $('#muniList').querySelectorAll('.seg button').forEach(b=>b.onclick=()=>{S.assign[b.parentElement.dataset.m]=b.dataset.s;renderAll();});\n}\nfunction renderLeaders(){const c=compute();\n  if(S.view==='asis'){$('#leaders').innerHTML=`<thead><tr><th>Líder</th><th>Grupo</th><th>CBs</th><th>Setor</th></tr></thead><tbody>`\n    +S.leaders.map(L=>`<tr><td>${(L.lider||'').split(' ').slice(0,2).join(' ')}</td><td>${L.grupo}</td><td>${fmt(L.total)}</td><td><span class=\"home\" style=\"background:${CLOSE_COLOR}\"></span>${S.sector}</td></tr>`).join('')\n    +`<tr style=\"font-weight:700\"><td>TOTAL</td><td></td><td>${fmt(S.leaders.reduce((a,L)=>a+L.total,0))}</td><td></td></tr></tbody>`;return;}\n  $('#leaders').innerHTML=`<thead><tr><th>Líder</th><th>CBs</th><th>Home</th>${S.dest.map(s=>`<th>${s}</th>`).join('')}<th>Desloc.</th></tr></thead><tbody>`\n   +c.leaders.map(L=>`<tr><td>${(L.lider||'').split(' ').slice(0,2).join(' ')}</td><td>${fmt(L.total)}</td>\n     <td><span class=\"home\" style=\"background:${S.color[L.home]}\"></span>${L.home}</td>\n     ${S.dest.map(s=>`<td class=\"cell\" style=\"${s===L.home?'color:'+S.color[s]+';font-weight:700':''}\">${L.byS[s]||'·'}</td>`).join('')}\n     <td style=\"color:${L.desloc?'var(--closing)':'var(--mut)'};font-weight:${L.desloc?700:400}\">${L.desloc||'0'}</td></tr>`).join('')\n   +`<tr style=\"font-weight:700\"><td>TOTAL</td><td>${fmt(c.leaders.reduce((a,L)=>a+L.total,0))}</td><td></td>${S.dest.map(s=>`<td>${fmt(c.leaders.reduce((a,L)=>a+L.byS[s],0))}</td>`).join('')}<td style=\"color:var(--closing)\">${fmt(c.desloc)}</td></tr></tbody>`;\n}\nfunction renderMatrix(){const c=compute();const ms=Object.keys(S.munis).filter(m=>m!=='__OUTROS__').sort((a,b)=>S.munis[b].cbs-S.munis[a].cbs);\n  const cell=(m,g)=>{const r=S.matrix.find(x=>(x._out?'__OUTROS__':norm(x.municipio))===m&&String(x.grupo)===g);return r?+r.cbs:0;};\n  const mx=Math.max(...ms.flatMap(m=>S.leaders.map(L=>cell(m,L.grupo))),1);\n  $('#matrix').innerHTML=`<thead><tr><th>Município</th><th>→</th>${S.leaders.map(L=>`<th title=\"${L.lider}\">${L.grupo}</th>`).join('')}<th>Tot</th></tr></thead><tbody>`\n   +ms.map(m=>`<tr><td>${m}</td><td><span class=\"home\" style=\"background:${S.color[S.assign[m]]}\"></span>${S.assign[m]||'–'}</td>`\n     +S.leaders.map(L=>{const v=cell(m,L.grupo);return `<td class=\"cell\" style=\"${v?`background:rgba(229,181,63,${.08+v/mx*.5})`:''}\">${v||'·'}</td>`;}).join('')\n     +`<td style=\"font-weight:700\">${fmt(S.munis[m].cbs)}</td></tr>`).join('')+`</tbody>`;\n}\nfunction renderPolicy(){const c=compute();\n  $('#policyNote').innerHTML=S.policy==='fora'\n    ?`<b style=\"color:var(--acc)\">Mantendo vínculo:</b> ${fmt(c.desloc)} CBs seguem com a líder mas ficam <b>fisicamente noutro setor</b>. Preserva relação; suja geografia.`\n    :`<b style=\"color:var(--acc)\">Quebrando vínculo:</b> ${fmt(c.desloc)} CBs <b>re-vinculam a uma líder do setor destino</b>. Geografia limpa; rompe relação.`;\n}\nfunction renderPlan(){const c=compute();const ms=Object.keys(S.munis).filter(m=>m!=='__OUTROS__').sort((a,b)=>a.localeCompare(b));\n  S._plan=ms.map(m=>({municipio:m,cbs:S.munis[m].cbs,destino:S.assign[m]}));\n  $('#plan').innerHTML=`Setor <b>${S.sector}</b> → ${ms.map(m=>`${m}→<b style=\"color:${S.color[S.assign[m]]}\">${S.assign[m]}</b>`).join(' · ')}<br>\n   Política: <b>${S.policy==='fora'?'manter vínculo (CBs fora do setor)':'quebrar relação'}</b> · ${fmt(c.desloc)} CBs impactadas.`;\n}\nfunction renderReport(){const c=compute();\n  S.metric=S.metric||'cbs';\n  const metrics=[['cbs','CBs'],['ativas','Ativas'],['pedidos','Pedidos'],['pontos','Pontos'],['receita','Receita','$'],['rec_nat','Rec. Natura','$'],['rec_avon','Rec. Avon','$']];\n  const KEYS=metrics.map(m=>m[0]);\n  const incBy={};S.dest.forEach(s=>incBy[s]=Object.fromEntries(KEYS.map(k=>[k,0])));\n  Object.entries(S.munis).forEach(([m,o])=>{if(m==='__OUTROS__')return;const s=S.assign[m];if(!s)return;KEYS.forEach(k=>incBy[s][k]+=o[k]||0);});\n  const closeTot={};KEYS.forEach(k=>closeTot[k]=Object.entries(S.munis).filter(([m])=>m!=='__OUTROS__').reduce((a,[,o])=>a+(o[k]||0),0));\n  const trend=S.trend.slice(-6);\n  const chartHTML=mk=>{\n    const isM=['receita','rec_nat','rec_avon'].includes(mk); const fN=isM?money:fmt;\n    const data=S.dest.map(s=>({label:s,color:S.color[s],antes:+(S.baseMetrics[s]?.[mk]||0),depois:+(S.baseMetrics[s]?.[mk]||0)+(incBy[s]?.[mk]||0)}));\n    data.push({label:S.sector+'✕',color:'#c8104e',antes:closeTot[mk]||0,depois:0});\n    const max=Math.max(...data.flatMap(d=>[d.antes,d.depois]),1);\n    const W=720,H=290,base=238,top=42,maxH=base-top,n=data.length,gw=(W-16)/n;\n    let g='';\n    data.forEach((d,i)=>{const cx=8+gw*i+gw/2,bw=Math.min(30,gw*0.30);\n      const ah=d.antes/max*maxH,dh=d.depois/max*maxH,ax=cx-bw-2,dx=cx+2;\n      g+=`<rect x=\"${ax.toFixed(1)}\" y=\"${(base-ah).toFixed(1)}\" width=\"${bw.toFixed(1)}\" height=\"${ah.toFixed(1)}\" rx=\"2.5\" fill=\"${d.color}\" opacity=\"0.35\"/>`;\n      g+=`<rect x=\"${dx.toFixed(1)}\" y=\"${(base-dh).toFixed(1)}\" width=\"${bw.toFixed(1)}\" height=\"${dh.toFixed(1)}\" rx=\"2.5\" fill=\"${d.color}\"/>`;\n      g+=`<text x=\"${(ax+bw/2).toFixed(1)}\" y=\"${(base-ah-4).toFixed(1)}\" text-anchor=\"middle\" font-size=\"9\" fill=\"#9a9aa8\">${fN(d.antes)}</text>`;\n      g+=`<text x=\"${(dx+bw/2).toFixed(1)}\" y=\"${(base-dh-4).toFixed(1)}\" text-anchor=\"middle\" font-size=\"9.5\" font-weight=\"700\" fill=\"${d.color}\">${fN(d.depois)}</text>`;\n      const dp=d.antes?((d.depois-d.antes)/d.antes*100):(d.depois?100:0);\n      g+=`<text x=\"${cx.toFixed(1)}\" y=\"16\" text-anchor=\"middle\" font-size=\"10.5\" font-weight=\"700\" fill=\"${dp>=0?'#1f9d57':'#c8104e'}\">${dp>0?'+':''}${dp.toFixed(0)}%</text>`;\n      g+=`<text x=\"${cx.toFixed(1)}\" y=\"${base+16}\" text-anchor=\"middle\" font-size=\"10.5\" font-weight=\"700\" fill=\"#1c1c2b\">${d.label}</text>`;});\n    return `<svg viewBox=\"0 0 ${W} ${H}\" style=\"width:100%\"><line x1=\"8\" y1=\"${base}\" x2=\"${W-8}\" y2=\"${base}\" stroke=\"#e7e7ef\"/>${g}</svg>`;\n  };\n  let h=`<div style=\"display:flex;justify-content:space-between;align-items:center;gap:10px;flex-wrap:wrap\">\n      <h2 style=\"margin:0\">Impacto antes → depois por setor</h2>\n      <select id=\"metricSel\">${metrics.map(m=>`<option value=\"${m[0]}\" ${m[0]===S.metric?'selected':''}>${m[1]}</option>`).join('')}</select></div>\n    <div class=\"note\" style=\"margin:2px 0 4px\">Barra clara = <b>antes</b> · barra cheia = <b>depois</b> (base + entrantes do ${S.sector}) · <b style=\"color:var(--acc)\">${S.sector}✕</b> = setor que fecha · % = variação</div>\n    ${chartHTML(S.metric)}`;\n  h+=`<h2 style=\"margin-top:16px\">Antes → Depois por setor receptor (snapshot atual)</h2>\n    <div class=\"scroll\"><table><thead><tr><th>Setor</th>${metrics.map(m=>`<th>${m[1]}</th>`).join('')}</tr></thead><tbody>`;\n  S.dest.forEach(s=>{const b=S.baseMetrics[s]||{};const inc=incBy[s];\n    h+=`<tr><td><span class=\"home\" style=\"background:${S.color[s]}\"></span>${s}</td>`+\n      metrics.map(([k])=>{const bv=+b[k]||0,av=bv+ (inc[k]||0);const d=bv?((av-bv)/bv*100):0;const f=metrics.find(x=>x[0]===k)[2]==='$'?money:fmt;\n        return `<td>${f(av)}<div class=\"delta ${d>=0?'up':'dn'}\">${d>0?'+':''}${d.toFixed(0)}%</div></td>`;}).join('')+`</tr>`;});\n  h+=`<tr style=\"opacity:.8\"><td>${S.sector} (sai)</td>`+metrics.map(([k,,t])=>`<td>${(t==='$'?money:fmt)(closeTot[k]||0)}</td>`).join('')+`</tr>`;\n  h+=`</tbody></table></div>`;\n  const incLvl={};S.dest.forEach(s=>incLvl[s]={});\n  Object.keys(S.munis).forEach(m=>{if(m==='__OUTROS__')return;const s=S.assign[m];if(!s)return;const lv=S.levelByMuni[m]||{};for(const nv in lv)incLvl[s][nv]=(incLvl[s][nv]||0)+lv[nv];});\n  h+=`<h2 style=\"margin-top:18px\">Consultoras por nível — antes → depois por setor receptor</h2>\n    <div class=\"scroll\"><table><thead><tr><th>Setor</th>${NIVEIS.map(n=>`<th>${n}</th>`).join('')}<th>Total</th></tr></thead><tbody>`;\n  S.dest.forEach(s=>{const base=S.baseLevel[s]||{},inc=incLvl[s]||{};let tb=0,ta=0;\n    h+=`<tr><td><span class=\"home\" style=\"background:${S.color[s]}\"></span>${s}</td>`+\n      NIVEIS.map(nv=>{const b=base[nv]||0,i=inc[nv]||0,a=b+i;tb+=b;ta+=a;\n        return `<td>${a?fmt(a):'·'}${i?`<div class=\"delta up\">+${fmt(i)}</div>`:''}</td>`;}).join('')+\n      `<td style=\"font-weight:700\">${fmt(ta)}${ta-tb?`<div class=\"delta up\">+${fmt(ta-tb)}</div>`:''}</td></tr>`;});\n  h+=`</tbody></table></div><div class=\"note\">Número = CBs por nível <b>depois</b> da migração · <span style=\"color:var(--ok)\">+N</span> = entrantes do ${S.sector}. Base + entrantes por nível.</div>`;\n  const spk=(key)=>{const vals=trend.map(t=>+t[key]||0);const mx=Math.max(...vals,1);\n    return `<div class=\"spark\">${vals.map(v=>`<div class=\"b\" style=\"height:${(v/mx*100).toFixed(0)}%\" title=\"${fmt(v)}\"></div>`).join('')}</div>\n      <div class=\"note\">${trend.map(t=>String(t.ciclo).slice(-2)).join(' · ')}</div>`;};\n  h+=`<h2 style=\"margin-top:18px\">Setor ${S.sector} — últimos ${trend.length} ciclos (tendência)</h2>\n    <div class=\"note\" style=\"margin:-4px 0 8px\">Como o setor que fecha vinha performando — pra dimensionar o que está sendo redistribuído.</div>\n    <div style=\"display:grid;grid-template-columns:repeat(4,1fr);gap:10px\">\n    ${[['cbs','CBs'],['ativas','Ativas'],['receita','Receita'],['pontos','Pontos']].map(([k,l])=>`<div><div class=\"note\" style=\"margin:0 0 3px;font-weight:600;color:var(--ink)\">${l}</div>${spk(k)}</div>`).join('')}</div>`;\n  $('#tab-report').innerHTML=h;\n  const sel=$('#metricSel'); if(sel) sel.onchange=()=>{S.metric=sel.value; renderReport();};\n}\nfunction project(feats){let mnx=1/0,mny=1/0,mxx=-1/0,mxy=-1/0;\n  const each=cb=>feats.forEach(f=>{const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];ps.forEach(p=>p.forEach(r=>r.forEach(cb)));});\n  each(p=>{mnx=Math.min(mnx,p[0]);mxx=Math.max(mxx,p[0]);mny=Math.min(mny,p[1]);mxy=Math.max(mxy,p[1]);});\n  const mlat=(mny+mxy)/2,kx=Math.cos(mlat*Math.PI/180),W=700,H=500,pad=22;\n  const gw=(mxx-mnx)*kx,gh=(mxy-mny),sc=Math.min((W-2*pad)/gw,(H-2*pad)/gh);\n  const ox=(W-gw*sc)/2,oy=(H-gh*sc)/2;\n  return p=>[ox+(p[0]-mnx)*kx*sc, oy+(mxy-p[1])*sc];\n}\nfunction pathFor(f,pr){const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];\n  return ps.map(poly=>poly.map(r=>'M'+r.map(p=>{const q=pr(p);return q[0].toFixed(1)+','+q[1].toFixed(1);}).join('L')+'Z').join('')).join('');}\nfunction cxy(f,pr){let x=0,y=0,n=0;const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];ps.forEach(poly=>poly[0].forEach(p=>{const q=pr(p);x+=q[0];y+=q[1];n++;}));return[x/n,y/n];}\nfunction drawMap(){const c=compute();const NS='http://www.w3.org/2000/svg';const svg=$('#map');svg.innerHTML='';\n  const feats=[...S.nbrFeat,...Object.values(S.geoFeat)];if(!feats.length)return;const pr=project(feats);\n  S.nbrFeat.forEach(f=>{const p=document.createElementNS(NS,'path');p.setAttribute('d',pathFor(f,pr));p.setAttribute('class','nbr');svg.appendChild(p);\n    const ct=cxy(f,pr);const t=document.createElementNS(NS,'text');t.setAttribute('class','nlabel');t.setAttribute('x',ct[0]);t.setAttribute('y',ct[1]);t.textContent=(f.properties.name||'').slice(0,14);svg.appendChild(t);});\n  const asis=S.view==='asis';\n  Object.entries(S.geoFeat).forEach(([m,f])=>{const p=document.createElementNS(NS,'path');p.setAttribute('d',pathFor(f,pr));\n    p.setAttribute('class','muni'+(S.selected===m?' sel':''));p.setAttribute('fill',asis?CLOSE_COLOR:(S.color[S.assign[m]]||'#444'));\n    if(!asis) p.onclick=()=>{const i=S.dest.indexOf(S.assign[m]);S.assign[m]=S.dest[(i+1)%S.dest.length];S.selected=m;renderAll();};\n    p.style.cursor=asis?'default':'pointer';\n    p.onmousemove=e=>{const t=$('#tip');t.style.opacity=1;t.style.left=(e.clientX+12)+'px';t.style.top=(e.clientY+12)+'px';\n      t.innerHTML=asis?`<b>${m}</b><br>${fmt(S.munis[m]?.cbs||0)} CBs · setor ${S.sector}`:`<b>${m}</b><br>${fmt(S.munis[m]?.cbs||0)} CBs → ${S.assign[m]}<br><span style=\"color:var(--mut)\">clique p/ trocar</span>`;};\n    p.onmouseleave=()=>$('#tip').style.opacity=0;svg.appendChild(p);\n    const ct=cxy(f,pr);const t=document.createElementNS(NS,'text');t.setAttribute('class','mlabel');t.setAttribute('x',ct[0]);t.setAttribute('y',ct[1]);\n    t.innerHTML=`${m.slice(0,13)}<tspan x=\"${ct[0]}\" dy=\"11\" font-size=\"8.5\">${fmt(S.munis[m]?.cbs||0)}${asis?'':'·'+S.assign[m]}</tspan>`;svg.appendChild(t);});\n  $('#legend').innerHTML=asis\n    ?`<span><b style=\"background:${CLOSE_COLOR}\"></b>Setor ${S.sector} (estrutura atual — ${Object.keys(S.geoFeat).length} municípios)</span>`\n    :S.dest.map(s=>`<span><b style=\"background:${S.color[s]}\"></b>Setor ${s} — ${c.gained[s]} líder(es)</span>`).join('');\n}\nasync function runSql(){const sql=$('#sqlIn').value.trim();$('#sqlStatus').textContent='rodando…';$('#sqlStatus').classList.remove('err');\n  try{const resp=await q(sql);const rs=rows(resp);const cols=(resp.manifest?.schema?.columns||[]).map(c=>c.name);\n    $('#sqlOut').innerHTML=`<thead><tr>${cols.map(c=>`<th>${c}</th>`).join('')}</tr></thead><tbody>`+rs.slice(0,200).map(r=>`<tr>${cols.map(c=>`<td>${r[c]??'·'}</td>`).join('')}</tr>`).join('')+`</tbody>`;\n    $('#sqlStatus').textContent=rs.length+' linha(s)';}\n  catch(e){$('#sqlStatus').textContent='bloqueado/erro: '+e.message;$('#sqlStatus').classList.add('err');}\n}\nasync function loadSectors(){\n  const sql=`SELECT CD_SETOR setor, MAX(DS_ESTADO) uf, COUNT(DISTINCT CD_CONSULTORA) cbs, COUNT(DISTINCT DS_MUNICIPIO) munis\n    FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR>0 AND DT_HISTORICO=${SNAP} GROUP BY CD_SETOR ORDER BY CD_SETOR`;\n  S.sectorsList=rows(await q(sql)).map(r=>({setor:String(r.setor),uf:r.uf,cbs:+r.cbs,munis:+r.munis}));\n  const sel=$('#sectorPick');sel.innerHTML=S.sectorsList.map(s=>`<option value=\"${s.setor}\">${s.setor} · ${s.uf||'?'} · ${fmt(s.cbs)} CBs · ${s.munis} munic.</option>`).join('');\n  sel.value='3504';\n}\n$('#go').onclick=()=>closeSector($('#sectorPick').value);\n$('#rand').onclick=()=>{const cand=S.sectorsList.filter(s=>s.munis>=3&&s.munis<=10&&s.cbs>300);const pick=(cand.length?cand:S.sectorsList)[Math.floor(Math.random()*(cand.length?cand.length:S.sectorsList.length))];$('#sectorPick').value=pick.setor;closeSector(pick.setor);};\n$('#optim').onclick=()=>{S.assign=optimize();renderAll();};\n$('#autoTobe').onclick=()=>{S.assign=autoAssign();$('#optBadge').textContent='TOBE por adjacência';renderAll();};\n$('#viewToggle').querySelectorAll('button').forEach(b=>b.onclick=()=>{S.view=b.dataset.v;$('#viewToggle').querySelectorAll('button').forEach(x=>x.classList.toggle('on',x===b));renderAll();});\n$('#policy').querySelectorAll('button').forEach(b=>b.onclick=()=>{S.policy=b.dataset.p;$('#policy').querySelectorAll('button').forEach(x=>x.classList.toggle('on',x===b));renderKpis();renderPolicy();renderPlan();});\nroot.querySelectorAll('.tabs button').forEach(b=>b.onclick=()=>{root.querySelectorAll('.tabs button').forEach(x=>x.classList.toggle('on',x===b));\n  ['matrix','report','sql'].forEach(t=>$('#tab-'+t).classList.toggle('hidden',t!==b.dataset.tab));});\n$('#runSql').onclick=runSql;\n$('#copyPlan').onclick=()=>{navigator.clipboard.writeText(JSON.stringify({setor:S.sector,politica:S.policy,plano:S._plan},null,2));$('#copyPlan').textContent='copiado ✓';setTimeout(()=>$('#copyPlan').textContent='Copiar',1500);};\n$('#csvPlan').onclick=()=>{const csv='municipio,cbs,setor_destino\\n'+S._plan.map(p=>`${p.municipio},${p.cbs},${p.destino}`).join('\\n');\n  const a=document.createElement('a');a.href=URL.createObjectURL(new Blob([csv],{type:'text/csv'}));a.download=`plano_migracao_setor_${S.sector}.csv`;a.click();};\n\n(async()=>{loader(true,'carregando setores…');try{await loadSectors();await closeSector('3504');}catch(e){$('#ds').textContent='erro init: '+e.message;}loader(false);})();\n\n  }\n}"}}}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{}}},"extends":"data2-core-primitives@Block"},"updatedAt":"2026-08-05T18:33:27.811Z","createdAt":"2026-08-05T18:33:09.104Z"},{"_id":"6a74ae9d8bf67595bba6de82","component":"data2-core-types@Component","system":"6a57cfe9673eb7e3c5e57784","params":{"extends":"data2-core-primitives@Block","component":"timeline-sim-login","package":"natura-geomarketing","title":"Login — Timeline Simulator","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"const AUTH='timelineSimAuthFinal';\n// SSP origin is derived at runtime from a known listener's resolved URL; this is only the fallback.\nconst SSP_FALLBACK='https://natura-geomarketing.data2apis.com';\nconst RUSH_REF='AwW_11Nkg-dKksP7ic8V8';\nconst ROUTER='timelineSimRouter';\n\nexport default {\n  css: `\n  :host{display:block;height:100%}\n  *{box-sizing:border-box}\n  .lroot{--bg:#f5f5f7;--panel:#ffffff;--panel2:#f2f2f7;--line:#e5e5ea;--ink:#1c1c1e;--mut:#6e6e73;--acc:#007aff;--acc2:#0060df;--closing:#ff3b30;--ok:#34c759;\n    min-height:100%;display:flex;align-items:center;justify-content:center;padding:36px 20px;background:var(--bg);\n    font:13px/1.45 -apple-system,BlinkMacSystemFont,\"SF Pro Text\",\"Segoe UI\",Roboto,sans-serif;color:var(--ink);-webkit-font-smoothing:antialiased}\n  .card{width:100%;max-width:400px;background:var(--panel);border:1px solid var(--line);border-radius:14px;\n    box-shadow:0 12px 34px rgba(0,0,0,.07),0 1px 2px rgba(0,0,0,.04);padding:26px 26px 22px}\n  .pill{display:inline-block;font-size:10.5px;padding:2.5px 9px;border-radius:99px;border:1px solid var(--line);color:var(--mut);background:var(--panel2)}\n  h1{font-size:17px;font-weight:600;letter-spacing:-.25px;margin:13px 0 5px}\n  .sub{font-size:12px;color:var(--mut);margin:0 0 20px;line-height:1.5}\n  .fl{display:block;font-size:11px;text-transform:uppercase;letter-spacing:.4px;color:var(--mut);font-weight:600;margin:0 0 5px}\n  .inp{width:100%;background:var(--panel);border:1px solid var(--line);color:var(--ink);border-radius:8px;padding:9px 11px;font:inherit;font-size:13px}\n  .inp:focus{outline:2px solid rgba(0,122,255,.32);outline-offset:0;border-color:var(--acc)}\n  .inp:disabled{opacity:.55}\n  .row{margin-bottom:14px}\n  .act{width:100%;background:var(--acc);color:#fff;border:1px solid transparent;border-radius:8px;padding:10px 14px;font:inherit;font-size:13px;font-weight:600;cursor:pointer;box-shadow:0 1px 1px rgba(0,0,0,.08);margin-top:4px}\n  .act:hover{background:var(--acc2)}\n  .act:disabled{opacity:.5;cursor:not-allowed}\n  .ghost{width:100%;background:var(--panel);color:var(--ink);border:1px solid var(--line);border-radius:8px;padding:9px 12px;font:inherit;font-size:12.5px;cursor:pointer;margin-top:8px}\n  .ghost:hover{background:var(--panel2)}\n  .okbox{margin:12px 0 0;padding:8px 10px;border-radius:8px;background:#eefaf0;border:1px solid #bdeecb;color:#1c7c33;font-size:11.5px;font-weight:600}\n  .err{margin:12px 0 0;padding:8px 10px;border-radius:8px;background:#fff1f0;border:1px solid #ffd1cc;color:var(--closing);font-size:11.5px;font-weight:600}\n  .who{font-size:12px;color:var(--mut);margin:0 0 16px}\n  .who b{color:var(--ink)}\n  .foot{margin-top:18px;padding-top:14px;border-top:1px solid var(--line);font-size:10.5px;color:var(--mut);line-height:1.55}\n`,\n  render(d2){\n    const esc=s=>(s==null?'':String(s)).replace(/[&<>\"]/g,c=>({'&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;'}[c]));\n    const busy=!!d2.state.busy;\n    const err=d2.state.error||'';\n    const a=d2.auth(AUTH);\n    if(!a){\n      return `<div class=\"lroot\"><div class=\"card\">\n        <span class=\"pill\">configuração</span>\n        <h1>Estratégia de autenticação não encontrada</h1>\n        <p class=\"sub\">Não foi possível resolver <b>${esc(AUTH)}</b>. Confirme a referência da AuthenticationStrategy do sistema.</p>\n      </div></div>`;\n    }\n    // Deliberately NOT branching on a.isAuthed. The Router renders this artboard ONLY from its\n    // `login` slot, i.e. only when the route policy rejected the caller — so anyone looking at it\n    // is unauthenticated by construction. isAuthed also reads TRUE under a builder token, which\n    // would show an \"already signed in\" card that bounces to / , gets rejected, and loops.\n    return `<div class=\"lroot\"><div class=\"card\">\n      <span class=\"pill\">acesso restrito</span>\n      <h1>Simulador de Timeline de Fechamentos</h1>\n      <p class=\"sub\">Entre com suas credenciais pra abrir a timeline de fechamentos de setores.</p>\n      <div class=\"row\">\n        <label class=\"fl\" for=\"em\">E-mail</label>\n        <input class=\"inp\" id=\"em\" type=\"email\" autocomplete=\"username\" autocapitalize=\"off\" autocorrect=\"off\" spellcheck=\"false\" placeholder=\"voce@natura.com.br\"${busy?' disabled':''}>\n      </div>\n      <div class=\"row\">\n        <label class=\"fl\" for=\"pw\">Senha</label>\n        <input class=\"inp\" id=\"pw\" type=\"password\" autocomplete=\"current-password\" placeholder=\"••••••••\"${busy?' disabled':''}>\n      </div>\n      <button class=\"act\" id=\"go\"${busy?' disabled':''}>${busy?'Entrando…':'Entrar'}</button>\n      ${err?`<div class=\"err\">⚠ ${esc(err)}</div>`:''}\n      ${d2.state.ok?`<div class=\"okbox\">✓ Autenticado. No app publicado o redirecionamento é automático.</div>`:''}\n      <div class=\"foot\">Geomarketing · Natura. O simulador é read-only sobre o Databricks — cada sessão salva fica presa ao snapshot congelado da simulação.</div>\n    </div></div>`;\n  },\n  mounted(d2, root){\n    // The router re-runs its policy hook when the session changes, so a successful login normally\n    // swaps the gated content on its own. If it does not (same path), reload as a last resort —\n    // cancelled on unmount, so the reload only ever fires when the swap did NOT happen.\n    // Login now runs through the strategy, so the runtime DOES hold the session in memory and the\n    // route policy would re-evaluate on its own. The hard navigation is kept deliberately: it is\n    // the one path that cannot land on stale client state. In the builder there is no app root to\n    // go to, so we just report success instead of navigating out of /preview/<ref>. [agent:ad78d19d]\n    const enter=()=>{\n      if(d2.context.isBuilder){ d2.setState({busy:false,error:'',ok:true}); return; }\n      try{ window.location.replace('/'); }\n      catch(e){ try{ window.location.reload(); }catch(e2){} }\n    };\n    // pt-BR (ABNT2) keyboards put ^ ~ ´ ¨ on DEAD keys: pressing one before a character that cannot\n    // take the accent (like @) emits the bare mark, or leaves a combining codepoint behind. Either\n    // way it must never reach /id/ln, so strip it plus zero-width paste junk and any whitespace.\n    // The PASSWORD is deliberately left untouched — these characters are legitimate in a password.\n    const cleanEmail=s=>String(s==null?'':s)\n      .normalize('NFKC')\n      .replace(/[̀-ͯ]/g,'')\n      .replace(/[​-‍﻿]/g,'')\n      .replace(/[\\^~´¨`]/g,'')\n      .replace(/\\s+/g,'');\n    // A failed login must NEVER navigate or reload: keep the card, keep what was typed (the morph\n    // patches in place so input values survive), show the error and put the cursor back in the\n    // password so it can be corrected immediately.\n    const failWith=msg=>{\n      d2.setState({busy:false,ok:false,error:msg});\n      setTimeout(()=>{ const p=d2.$('#pw'); if(p){ try{ p.focus(); p.select(); }catch(e){} } },0);\n    };\n    const submit=async()=>{\n      if(d2.state.busy) return;\n      const rawEm=(d2.$('#em')||{}).value||'';\n      const em=cleanEmail(rawEm);\n      if(em!==rawEm && d2.$('#em')) d2.$('#em').value=em;   // show the cleaned address back to the user\n      const pw=((d2.$('#pw')||{}).value||'');\n      if(!em||!pw){ failWith('Preencha e-mail e senha.'); return; }\n      d2.setState({busy:true,error:'',ok:false});\n      try{\n        // Direct interaction with the AuthenticationStrategy — no hand-rolled fetch. The runtime\n        // owns the session envelope, so IT attaches `authorization: Bearer <jwt>` (and the session\n        // cookie) to the login POST. The previous hand-rolled fetch could not: it derived the jwt\n        // from document.cookie on the APP origin while the cookie lives on the SSP origin, so the\n        // header was silently dropped on every attempt — the 401 in devtools. [agent:ad78d19d]\n        // ⚠️ `credentials` MUST stay NESTED — a flat {email,password} authenticates nobody and\n        // fails as an UNCATCHABLE 400/403 (no exception, no rejected promise).\n        // ⚠️ A rejected login is NOT an exception either — after the promise settles, read\n        // `isAuthed`. Do not gate the error UI on catch().\n        const a=d2.auth(AUTH);\n        if(!a){ failWith('Estratégia de autenticação não encontrada ('+AUTH+').'); return; }\n        await a.login({credentials:{email:em,password:pw}});\n        if(a.isAuthed){ enter(); return; }\n        failWith('E-mail ou senha inválidos.');\n      }catch(e){\n        failWith('Falha ao autenticar: '+((e&&e.message)||'erro desconhecido'));\n      }\n    };\n    d2.on('#go','click',submit);\n    d2.on('.inp','keydown',e=>{ if(e.key==='Enter'){ e.preventDefault(); submit(); } });\n  }\n}"}}}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{}}},"__d2PrevCode":{"code":"const AUTH='timelineSimAuthFinal';\n// SSP origin is derived at runtime from a known listener's resolved URL; this is only the fallback.\nconst SSP_FALLBACK='https://natura-geomarketing.data2apis.com';\nconst RUSH_REF='AwW_11Nkg-dKksP7ic8V8';\nconst ROUTER='timelineSimRouter';\n\nexport default {\n  css: `\n  :host{display:block;height:100%}\n  *{box-sizing:border-box}\n  .lroot{--bg:#f5f5f7;--panel:#ffffff;--panel2:#f2f2f7;--line:#e5e5ea;--ink:#1c1c1e;--mut:#6e6e73;--acc:#007aff;--acc2:#0060df;--closing:#ff3b30;--ok:#34c759;\n    min-height:100%;display:flex;align-items:center;justify-content:center;padding:36px 20px;background:var(--bg);\n    font:13px/1.45 -apple-system,BlinkMacSystemFont,\"SF Pro Text\",\"Segoe UI\",Roboto,sans-serif;color:var(--ink);-webkit-font-smoothing:antialiased}\n  .card{width:100%;max-width:400px;background:var(--panel);border:1px solid var(--line);border-radius:14px;\n    box-shadow:0 12px 34px rgba(0,0,0,.07),0 1px 2px rgba(0,0,0,.04);padding:26px 26px 22px}\n  .pill{display:inline-block;font-size:10.5px;padding:2.5px 9px;border-radius:99px;border:1px solid var(--line);color:var(--mut);background:var(--panel2)}\n  h1{font-size:17px;font-weight:600;letter-spacing:-.25px;margin:13px 0 5px}\n  .sub{font-size:12px;color:var(--mut);margin:0 0 20px;line-height:1.5}\n  .fl{display:block;font-size:11px;text-transform:uppercase;letter-spacing:.4px;color:var(--mut);font-weight:600;margin:0 0 5px}\n  .inp{width:100%;background:var(--panel);border:1px solid var(--line);color:var(--ink);border-radius:8px;padding:9px 11px;font:inherit;font-size:13px}\n  .inp:focus{outline:2px solid rgba(0,122,255,.32);outline-offset:0;border-color:var(--acc)}\n  .inp:disabled{opacity:.55}\n  .row{margin-bottom:14px}\n  .act{width:100%;background:var(--acc);color:#fff;border:1px solid transparent;border-radius:8px;padding:10px 14px;font:inherit;font-size:13px;font-weight:600;cursor:pointer;box-shadow:0 1px 1px rgba(0,0,0,.08);margin-top:4px}\n  .act:hover{background:var(--acc2)}\n  .act:disabled{opacity:.5;cursor:not-allowed}\n  .ghost{width:100%;background:var(--panel);color:var(--ink);border:1px solid var(--line);border-radius:8px;padding:9px 12px;font:inherit;font-size:12.5px;cursor:pointer;margin-top:8px}\n  .ghost:hover{background:var(--panel2)}\n  .okbox{margin:12px 0 0;padding:8px 10px;border-radius:8px;background:#eefaf0;border:1px solid #bdeecb;color:#1c7c33;font-size:11.5px;font-weight:600}\n  .err{margin:12px 0 0;padding:8px 10px;border-radius:8px;background:#fff1f0;border:1px solid #ffd1cc;color:var(--closing);font-size:11.5px;font-weight:600}\n  .who{font-size:12px;color:var(--mut);margin:0 0 16px}\n  .who b{color:var(--ink)}\n  .foot{margin-top:18px;padding-top:14px;border-top:1px solid var(--line);font-size:10.5px;color:var(--mut);line-height:1.55}\n`,\n  render(d2){\n    const esc=s=>(s==null?'':String(s)).replace(/[&<>\"]/g,c=>({'&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;'}[c]));\n    const busy=!!d2.state.busy;\n    const err=d2.state.error||'';\n    const a=d2.auth(AUTH);\n    if(!a){\n      return `<div class=\"lroot\"><div class=\"card\">\n        <span class=\"pill\">configuração</span>\n        <h1>Estratégia de autenticação não encontrada</h1>\n        <p class=\"sub\">Não foi possível resolver <b>${esc(AUTH)}</b>. Confirme a referência da AuthenticationStrategy do sistema.</p>\n      </div></div>`;\n    }\n    // Deliberately NOT branching on a.isAuthed. The Router renders this artboard ONLY from its\n    // `login` slot, i.e. only when the route policy rejected the caller — so anyone looking at it\n    // is unauthenticated by construction. isAuthed also reads TRUE under a builder token, which\n    // would show an \"already signed in\" card that bounces to / , gets rejected, and loops.\n    return `<div class=\"lroot\"><div class=\"card\">\n      <span class=\"pill\">acesso restrito</span>\n      <h1>Simulador de Timeline de Fechamentos</h1>\n      <p class=\"sub\">Entre com suas credenciais pra abrir a timeline de fechamentos de setores.</p>\n      <div class=\"row\">\n        <label class=\"fl\" for=\"em\">E-mail</label>\n        <input class=\"inp\" id=\"em\" type=\"email\" autocomplete=\"username\" autocapitalize=\"off\" autocorrect=\"off\" spellcheck=\"false\" placeholder=\"voce@natura.com.br\"${busy?' disabled':''}>\n      </div>\n      <div class=\"row\">\n        <label class=\"fl\" for=\"pw\">Senha</label>\n        <input class=\"inp\" id=\"pw\" type=\"password\" autocomplete=\"current-password\" placeholder=\"••••••••\"${busy?' disabled':''}>\n      </div>\n      <button class=\"act\" id=\"go\"${busy?' disabled':''}>${busy?'Entrando…':'Entrar'}</button>\n      ${err?`<div class=\"err\">⚠ ${esc(err)}</div>`:''}\n      ${d2.state.ok?`<div class=\"okbox\">✓ Autenticado. No app publicado o redirecionamento é automático.</div>`:''}\n      <div class=\"foot\">Geomarketing · Natura. O simulador é read-only sobre o Databricks — cada sessão salva fica presa ao snapshot congelado da simulação.</div>\n    </div></div>`;\n  },\n  mounted(d2, root){\n    // The router re-runs its policy hook when the session changes, so a successful login normally\n    // swaps the gated content on its own. If it does not (same path), reload as a last resort —\n    // cancelled on unmount, so the reload only ever fires when the swap did NOT happen.\n    // The direct POST sets the session COOKIE; the in-memory runtime never saw it, so a HARD\n    // navigation is required here — d2.router().goTo() would keep the stale client state and the\n    // route policy would reject again. In the builder there is no app root to go to, so we just\n    // report success instead of navigating out of /preview/<ref>.\n    const enter=()=>{\n      if(d2.context.isBuilder){ d2.setState({busy:false,error:'',ok:true}); return; }\n      try{ window.location.replace('/'); }\n      catch(e){ try{ window.location.reload(); }catch(e2){} }\n    };\n    // pt-BR (ABNT2) keyboards put ^ ~ ´ ¨ on DEAD keys: pressing one before a character that cannot\n    // take the accent (like @) emits the bare mark, or leaves a combining codepoint behind. Either\n    // way it must never reach /id/ln, so strip it plus zero-width paste junk and any whitespace.\n    // The PASSWORD is deliberately left untouched — these characters are legitimate in a password.\n    const cleanEmail=s=>String(s==null?'':s)\n      .normalize('NFKC')\n      .replace(/[̀-ͯ]/g,'')\n      .replace(/[​-‍﻿]/g,'')\n      .replace(/[\\^~´¨`]/g,'')\n      .replace(/\\s+/g,'');\n    // A failed login must NEVER navigate or reload: keep the card, keep what was typed (the morph\n    // patches in place so input values survive), show the error and put the cursor back in the\n    // password so it can be corrected immediately.\n    const failWith=msg=>{\n      d2.setState({busy:false,ok:false,error:msg});\n      setTimeout(()=>{ const p=d2.$('#pw'); if(p){ try{ p.focus(); p.select(); }catch(e){} } },0);\n    };\n    const submit=async()=>{\n      if(d2.state.busy) return;\n      const rawEm=(d2.$('#em')||{}).value||'';\n      const em=cleanEmail(rawEm);\n      if(em!==rawEm && d2.$('#em')) d2.$('#em').value=em;   // show the cleaned address back to the user\n      const pw=((d2.$('#pw')||{}).value||'');\n      if(!em||!pw){ failWith('Preencha e-mail e senha.'); return; }\n      d2.setState({busy:true,error:'',ok:false});\n      try{\n        // Direct interaction with the AuthenticationStrategy — no hand-rolled fetch. The runtime\n        // owns the session envelope, so IT attaches `authorization: Bearer <jwt>` (and the session\n        // cookie) to the login POST. The previous hand-rolled fetch could not: it derived the jwt\n        // from document.cookie on the APP origin while the cookie lives on the SSP origin, so the\n        // header was silently dropped on every attempt — the 401 in devtools. [agent:ad78d19d]\n        // ⚠️ `credentials` MUST stay NESTED — a flat {email,password} authenticates nobody and\n        // fails as an UNCATCHABLE 400/403 (no exception, no rejected promise).\n        // ⚠️ A rejected login is NOT an exception either — after the promise settles, read\n        // `isAuthed`. Do not gate the error UI on catch().\n        const a=d2.auth(AUTH);\n        if(!a){ failWith('Estratégia de autenticação não encontrada ('+AUTH+').'); return; }\n        await a.login({credentials:{email:em,password:pw}});\n        if(a.isAuthed){ enter(); return; }\n        failWith('E-mail ou senha inválidos.');\n      }catch(e){\n        failWith('Falha ao autenticar: '+((e&&e.message)||'erro desconhecido'));\n      }\n    };\n    d2.on('#go','click',submit);\n    d2.on('.inp','keydown',e=>{ if(e.key==='Enter'){ e.preventDefault(); submit(); } });\n  }\n}","at":"2026-08-06T19:07:41.976Z"}},"updatedAt":"2026-08-06T19:07:42.081Z","createdAt":"2026-08-06T15:56:13.295Z"},{"_id":"6a74b62bdad5912765098ff0","component":"data2-core-types@Component","system":"6a57cfe9673eb7e3c5e57784","params":{"extends":"data2-core-primitives@Block","component":"timeline_sim_session_read","package":"natura-geomarketing","title":"Session Read — Timeline Simulator","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"const NIVEIS=['Bronze','Cristal','Prata','Ouro','Diamante','Diamante+'];\n\nexport default {\n  css: `\n  :host{display:block;height:100%}\n  *{box-sizing:border-box}\n  .rroot{--bg:#f5f5f7;--panel:#ffffff;--panel2:#f2f2f7;--line:#e5e5ea;--ink:#1c1c1e;--mut:#6e6e73;--acc:#007aff;--closing:#ff3b30;--ok:#34c759;--warn:#ff9500;\n    height:100%;overflow:auto;background:var(--bg);color:var(--ink);\n    font:13px/1.5 -apple-system,BlinkMacSystemFont,\"SF Pro Text\",\"Segoe UI\",Roboto,sans-serif;-webkit-font-smoothing:antialiased}\n  .shell{max-width:1080px;margin:0 auto;padding:26px 22px 70px}\n  header.top{margin-bottom:20px}\n  .eyebrow{font-size:11px;text-transform:uppercase;letter-spacing:.5px;color:var(--mut);font-weight:600}\n  h1{font-size:25px;font-weight:600;letter-spacing:-.5px;margin:7px 0 10px}\n  .pills{display:flex;gap:7px;flex-wrap:wrap;align-items:center}\n  .pill{font-size:10.5px;padding:3px 9px;border-radius:99px;border:1px solid var(--line);color:var(--mut);background:var(--panel)}\n  .pill b{color:var(--ink);font-weight:600}\n  .pill.go{cursor:pointer;border-color:var(--acc);color:var(--acc);background:#eaf3ff;font-weight:600}\n  .pill.go:hover{background:#dbe9ff}\n  .goact{margin-top:15px;background:var(--acc);color:#fff;border:1px solid transparent;border-radius:8px;\n    padding:9px 16px;font:inherit;font-size:12.5px;font-weight:600;cursor:pointer}\n  .goact:hover{background:#0060df}\n  .strip{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:10px;margin:18px 0 22px}\n  .st{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:12px 14px;box-shadow:0 1px 2px rgba(0,0,0,.04)}\n  .st .n{font-size:23px;font-weight:700;letter-spacing:-.5px}\n  .st .l{font-size:10.5px;color:var(--mut);margin-top:3px;line-height:1.4}\n  .st.warn .n{color:var(--closing)}\n  .stepper{position:sticky;top:0;z-index:5;display:flex;gap:7px;overflow-x:auto;padding:11px 0;margin-bottom:6px;\n    background:rgba(245,245,247,.9);backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);border-bottom:1px solid var(--line)}\n  .sc{flex:0 0 auto;display:flex;align-items:center;gap:7px;background:var(--panel);border:1px solid var(--line);\n    border-radius:99px;padding:5px 12px 5px 6px;cursor:pointer;font-size:12px}\n  .sc:hover{border-color:var(--acc)}\n  .sc .k{width:19px;height:19px;border-radius:99px;background:var(--ink);color:#fff;font-size:10px;font-weight:700;\n    display:flex;align-items:center;justify-content:center}\n  .sc .arrow{color:var(--mut)}\n  .card{background:var(--panel);border:1px solid var(--line);border-radius:14px;padding:20px;margin-bottom:16px;box-shadow:0 1px 2px rgba(0,0,0,.04)}\n  .card > h2{font-size:15px;font-weight:600;letter-spacing:-.2px;margin:0 0 3px}\n  .card .sub{font-size:11.5px;color:var(--mut);margin:0 0 15px}\n  h3{font-size:11px;text-transform:uppercase;letter-spacing:.4px;color:var(--mut);margin:20px 0 9px;font-weight:600}\n  h3:first-of-type{margin-top:0}\n  .split{display:grid;grid-template-columns:minmax(0,1.15fr) minmax(0,1fr);gap:20px;align-items:start}\n  @media(max-width:820px){.split{grid-template-columns:1fr}}\n  svg.map{width:100%;height:auto;display:block;background:var(--panel2);border-radius:10px;border:1px solid var(--line);cursor:grab;touch-action:none}\n  svg.map.dragging{cursor:grabbing}\n  .map-wrap{position:relative}\n  .zoom-pill{position:absolute;left:10px;bottom:10px;display:flex;align-items:stretch;background:var(--panel);border:1px solid var(--line);border-radius:99px;box-shadow:0 2px 8px rgba(0,0,0,.14);overflow:hidden;z-index:3}\n  .zoom-pill button{width:30px;height:30px;border:0;background:transparent;color:var(--ink);font:16px/1 -apple-system,BlinkMacSystemFont,sans-serif;font-weight:600;cursor:pointer;display:flex;align-items:center;justify-content:center}\n  .zoom-pill button:hover{background:var(--panel2)}\n  .zoom-pill button:active{background:#e5e5ea}\n  .zoom-pill .zoom-div{width:1px;background:var(--line)}\n  .muni{stroke:#fff;stroke-width:1.1}\n  .nbr{fill:#e8e8ec;stroke:#d4d4d9;stroke-width:.7}\n  .exc{fill:#f7e7d0;stroke:var(--warn);stroke-width:.9;stroke-dasharray:2 2}\n  .mlabel{fill:#1c1c1e;font-size:9.5px;font-weight:600;text-anchor:middle;paint-order:stroke;stroke:rgba(255,255,255,.7);stroke-width:2.4px}\n  .nlabel{fill:#9a9aa0;font-size:7.5px;text-anchor:middle}\n  .legend{display:flex;gap:11px;flex-wrap:wrap;margin-top:9px;font-size:11px;color:var(--mut)}\n  .legend i{display:inline-block;width:10px;height:10px;border-radius:3px;margin-right:5px;vertical-align:-1px}\n  .bar{display:flex;align-items:center;gap:9px;margin:7px 0}\n  .bar .tag{width:46px;font-weight:600;font-size:12px}\n  .bar .track{flex:1;height:17px;background:var(--panel2);border-radius:5px;overflow:hidden;display:flex}\n  .bar .b1{height:100%;opacity:.38}.bar .b2{height:100%}.bar .b3{height:100%;opacity:.7}\n  .bar .v{width:120px;text-align:right;font-size:11px;color:var(--mut);font-variant-numeric:tabular-nums}\n  .mrow{display:flex;align-items:center;gap:9px;background:var(--panel2);border:1px solid var(--line);border-radius:9px;padding:6px 10px;margin-bottom:5px}\n  .mrow .nm{flex:1;font-weight:600;font-size:12px;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n  .mrow .cb{color:var(--mut);font-size:11px;font-variant-numeric:tabular-nums}\n  .chip{font-size:11px;font-weight:700;color:#fff;border-radius:6px;padding:2px 8px}\n  table{border-collapse:collapse;width:100%;font-size:11.5px}\n  th,td{padding:6px 7px;text-align:right;border-bottom:1px solid var(--line);font-variant-numeric:tabular-nums}\n  th:first-child,td:first-child{text-align:left}\n  thead th{color:var(--mut);font-weight:600;font-size:10.5px}\n  .dot{display:inline-block;width:9px;height:9px;border-radius:2px;margin-right:5px}\n  .delta{font-size:10px}.delta.up{color:var(--ok)}.delta.dn{color:var(--closing)}\n  .note{font-size:10.5px;color:var(--mut);line-height:1.55;margin-top:9px}\n  .flag{margin-top:11px;padding:9px 11px;border-radius:9px;font-size:11.5px;line-height:1.55;background:#fff8ef;border:1px solid #ffe0bd;color:#8a5200}\n  .scroll{max-height:300px;overflow:auto}\n  .center{display:flex;align-items:center;justify-content:center;height:100%;padding:40px}\n  .msg{max-width:420px;text-align:center}\n  .msg h2{font-size:17px;font-weight:600;margin:0 0 7px}\n  .msg p{font-size:12.5px;color:var(--mut);margin:0;line-height:1.55}\n`,\n  render(d2){\n    // Hierarquia mercado > GV > setor, espelhando o simulador ao vivo. Tudo pré-computado (label,\n    // minúscula, plural, gênero) pra nunca minusculizar \"GV\" (sigla) virando \"gv\", e pra concordar\n    // gênero certo em cada frase — GV é feminina (a Gerência de Vendas), o resto é masculino.\n    const LVL={\n      setor:{label:'Setor',low:'setor',fem:false, child:'Município',childLow:'município',childPlural:'Municípios',childFem:false, dest:'Setor',destLow:'setor'},\n      gv:{label:'GV',low:'GV',fem:true, child:'Setor',childLow:'setor',childPlural:'Setores',childFem:false, dest:'GV',destLow:'GV'},\n      mercado:{label:'Mercado',low:'mercado',fem:false, child:'GV',childLow:'GV',childPlural:'GVs',childFem:true, dest:'Mercado',destLow:'mercado'},\n    };\n    const lv=s=>LVL[(s&&s.level)||'setor'];\n    const esc=s=>(s==null?'':String(s)).replace(/[&<>\"]/g,c=>({'&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;'}[c]));\n    const fmt=n=>n==null?'–':Math.round(+n).toLocaleString('pt-BR');\n    const money=n=>{n=+n||0;return n>=1e6?'R$'+(n/1e6).toFixed(1)+'M':n>=1e3?'R$'+(n/1e3).toFixed(0)+'k':'R$'+Math.round(n)};\n    const msg=(t,b,act)=>`<div class=\"rroot\"><div class=\"center\"><div class=\"msg\"><h2>${t}</h2><p>${b}</p>${act?`<button class=\"goact\" id=\"goSim\">Abrir o simulador</button>`:''}</div></div></div>`;\n\n    if(d2.state.error) return msg('Não foi possível abrir a sessão',esc(d2.state.error),true);\n    if(!d2.state.ready) return msg('Carregando sessão…','Buscando o registro compartilhado.');\n    const r=d2.state.rec;\n    if(!r) return msg('Sessão não encontrada','O link pode ter expirado ou o registro foi removido. Peça um novo link a quem compartilhou.',true);\n\n    const stages=Array.isArray(r.stages)?r.stages:[];\n    const sm=r.summary||{};\n    const st=r.settings||{};\n    const ruleDest=st.destRule==='dominant'?`destino: dominantes ≥${fmt(st.destMinCbs)} CBs`:'destino: qualquer município';\n    const ruleReal=st.realocRule==='relevant'?`realocação: ≥${fmt(st.realocMinCbs)} CBs`:'realocação: todos';\n    const spanBits=[];\n    if(st.targetSpan)spanBits.push('alvo '+fmt(st.targetSpan));\n    if(st.maxSpan)spanBits.push('máx '+fmt(st.maxSpan));\n    if(st.minSpan)spanBits.push('mín '+fmt(st.minSpan));\n\n    let h=`<div class=\"rroot\"><div class=\"shell\">\n      <header class=\"top\">\n        <div class=\"eyebrow\">Simulador de timeline de fechamentos · sessão compartilhada</div>\n        <h1>${esc(r.label||'Sessão sem nome')}</h1>\n        <div class=\"pills\">\n          <span class=\"pill\">● snapshot congelado · <b>${esc(r.snapshotRaw||'—')}</b></span>\n          <span class=\"pill\">◇ ${esc(ruleReal)}</span>\n          <span class=\"pill\">◈ ${esc(ruleDest)}</span>\n          <span class=\"pill\">◎ span: <b>${spanBits.length?esc(spanBits.join(' · ')):'livre'}</b></span>\n          ${r.sharedBy?`<span class=\"pill\">por <b>${esc(r.sharedBy)}</b></span>`:''}\n          ${r.sharedAt?`<span class=\"pill\">${esc(new Date(r.sharedAt).toLocaleString('pt-BR'))}</span>`:''}\n          <span class=\"pill go\" id=\"goSim\" role=\"button\" tabindex=\"0\" title=\"Ir para o simulador\">↗ abrir o simulador</span>\n        </div>\n      </header>`;\n\n    const sessLevel=(stages[0]&&stages[0].level)||'setor';\n    h+=`<div class=\"strip\">\n      <div class=\"st\"><div class=\"n\">${fmt(stages.length)}</div><div class=\"l\">Etapa(s) de fechamento</div></div>\n      <div class=\"st\"><div class=\"n\">${fmt(sm.totalCbs)}</div><div class=\"l\">CBs realocadas na cadeia</div></div>\n      ${sessLevel==='setor'?`<div class=\"st warn\"><div class=\"n\">${fmt(sm.totalDesloc)}</div><div class=\"l\">CBs deslocadas (quebra de relação)</div></div>`:`<div class=\"st\"><div class=\"n\">${fmt(sm.totalDesloc)}</div><div class=\"l\">CBs com líder dividida entre destinos</div></div>`}\n      <div class=\"st\"><div class=\"n\" style=\"font-size:15px;line-height:1.5;font-weight:600\">${esc((sm.sectors||[]).join(' → ')||'—')}</div><div class=\"l\">Ordem de fechamento</div></div>\n    </div>`;\n\n    if(stages.length>1){\n      h+=`<div class=\"stepper\">`+stages.map((s,i)=>`<div class=\"sc\" data-goto=\"stage-${i}\"><span class=\"k\">${i+1}</span>${lv(s).label} ${esc(s.sector)}<span class=\"arrow\">→</span>${esc((s.dest||[]).join(', ')||'–')}</div>`).join('')+`</div>`;\n    }\n\n    // ---- projection helpers (pure; mirrors the simulator's) ----\n    const project=feats=>{let mnx=1/0,mny=1/0,mxx=-1/0,mxy=-1/0;\n      feats.forEach(f=>{const g=f&&f.geometry;if(!g)return;const ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];\n        ps.forEach(p=>p.forEach(rg=>rg.forEach(pt=>{mnx=Math.min(mnx,pt[0]);mxx=Math.max(mxx,pt[0]);mny=Math.min(mny,pt[1]);mxy=Math.max(mxy,pt[1]);})));});\n      if(!isFinite(mnx)) return null;\n      const mlat=(mny+mxy)/2,kx=Math.cos(mlat*Math.PI/180),W=680,H=440,pad=16;\n      const gw=Math.max((mxx-mnx)*kx,1e-9),gh=Math.max(mxy-mny,1e-9),sc=Math.min((W-2*pad)/gw,(H-2*pad)/gh);\n      const ox=(W-gw*sc)/2,oy=(H-gh*sc)/2;\n      return {W,H,f:pt=>[ox+(pt[0]-mnx)*kx*sc, oy+(mxy-pt[1])*sc]};};\n    const pathFor=(f,pr)=>{const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];\n      return ps.map(poly=>poly.map(rg=>'M'+rg.map(pt=>{const q=pr(pt);return q[0].toFixed(1)+','+q[1].toFixed(1);}).join('L')+'Z').join('')).join('');};\n    const cxy=(f,pr)=>{let x=0,y=0,n=0;const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];\n      ps.forEach(poly=>poly[0].forEach(pt=>{const q=pr(pt);x+=q[0];y+=q[1];n++;}));return n?[x/n,y/n]:[0,0];};\n\n    stages.forEach((s,i)=>{\n      const color=s.color||{};\n      const k=s.kpis||{};\n      const LV=lv(s);\n      h+=`<div class=\"card\" id=\"stage-${i}\" data-key=\"stage-${i}\">\n        <h2>Etapa ${i+1} · ${LV.low} <b>${esc(s.sector)}</b> fechad${LV.fem?'a':'o'}</h2>\n        <p class=\"sub\">Território redistribuído para ${esc((s.dest||[]).join(', ')||'—')}${s.domUF?' · '+esc(s.domUF):''}${s.policy?' · política: '+(s.policy==='fora'?'manter vínculo':'quebrar relação'):''}</p>\n        <div class=\"strip\" style=\"margin:0 0 18px\">\n          <div class=\"st\"><div class=\"n\">${fmt(k.cbsRealocadas)}</div><div class=\"l\">CBs realocadas</div></div>\n          ${LV.label==='Setor'?`<div class=\"st warn\"><div class=\"n\">${fmt(k.desloc)}</div><div class=\"l\">CBs deslocadas</div></div>`:`<div class=\"st\"><div class=\"n\">${fmt(k.desloc)}</div><div class=\"l\">CBs com líder dividida</div></div>`}\n          <div class=\"st\"><div class=\"n\">${fmt(k.municipios)}</div><div class=\"l\">${LV.childPlural} movid${LV.childFem?'as':'os'}</div></div>\n          <div class=\"st\"><div class=\"n\">${fmt(k.lideres)}</div><div class=\"l\">Líderes envolvidas</div></div>\n        </div>\n        <div class=\"split\"><div>`;\n\n      // map\n      const gf=s.geoFeat||{}, nb=Array.isArray(s.nbrFeat)?s.nbrFeat:[], ex=Array.isArray(s.excludedFeat)?s.excludedFeat:[];\n      const all=[...nb,...ex,...Object.values(gf)].filter(Boolean);\n      const P=project(all);\n      const unitOf=m=>LV.label==='Setor'?m:((s.unitOfMuni||{})[m]||m);\n      if(P){\n        let g='';\n        nb.forEach(f=>{ if(!f||!f.geometry)return; g+=`<path class=\"nbr\" d=\"${pathFor(f,P.f)}\"/>`;\n          const c=cxy(f,P.f);const nm=(f.properties&&f.properties.name)||'';\n          if(nm) g+=`<text class=\"nlabel\" data-fs=\"7.5\" x=\"${c[0].toFixed(1)}\" y=\"${c[1].toFixed(1)}\">${esc(nm.slice(0,13))}</text>`; });\n        ex.forEach(f=>{ if(!f||!f.geometry)return; g+=`<path class=\"exc\" d=\"${pathFor(f,P.f)}\"/>`; });\n        if(LV.label==='Setor'){\n          Object.entries(gf).forEach(([m,f])=>{ if(!f||!f.geometry)return;\n            const dest=(s.assign||{})[m];\n            g+=`<path class=\"muni\" d=\"${pathFor(f,P.f)}\" fill=\"${esc(color[dest]||'#8e8e93')}\"/>`;\n            const c=cxy(f,P.f);\n            g+=`<text class=\"mlabel\" data-fs=\"9.5\" data-sw=\"2.4\" x=\"${c[0].toFixed(1)}\" y=\"${c[1].toFixed(1)}\">${esc(m.slice(0,14))}<tspan data-fs=\"8\" x=\"${c[0].toFixed(1)}\" dy=\"10\" font-size=\"8\">${esc(dest||'–')}</tspan></text>`; });\n        } else {\n          // GV/mercado: vários municípios do mesmo setor/GV são UMA unidade só na tela — mesma cor,\n          // mesmo stroke (a costura entre elas some), um rótulo só no centro do grupo em vez de um\n          // por município. Espelha o mapa ao vivo do simulador.\n          const groups={};\n          Object.entries(gf).forEach(([m,f])=>{ if(!f||!f.geometry)return; const u=unitOf(m); (groups[u]=groups[u]||[]).push(f); });\n          Object.entries(groups).forEach(([u,feats])=>{\n            const dest=(s.assign||{})[u]; const col=esc(color[dest]||'#8e8e93');\n            let cx=0,cy=0,n=0;\n            feats.forEach(f=>{ g+=`<path class=\"muni\" d=\"${pathFor(f,P.f)}\" fill=\"${col}\" stroke=\"${col}\"/>`;\n              const c=cxy(f,P.f); cx+=c[0]; cy+=c[1]; n++; });\n            if(n){ cx/=n; cy/=n;\n              g+=`<text class=\"mlabel\" data-fs=\"9.5\" data-sw=\"2.4\" x=\"${cx.toFixed(1)}\" y=\"${cy.toFixed(1)}\">${esc(u)}<tspan data-fs=\"8\" x=\"${cx.toFixed(1)}\" dy=\"10\" font-size=\"8\">${esc(dest||'–')}</tspan></text>`;\n            }\n          });\n        }\n        h+=`<h3>Mapa da redistribuição</h3><div class=\"map-wrap\">\n          <svg class=\"map\" id=\"map-${i}\" data-w=\"${P.W}\" data-h=\"${P.H}\" viewBox=\"0 0 ${P.W} ${P.H}\" preserveAspectRatio=\"xMidYMid meet\">${g}</svg>\n          <div class=\"zoom-pill\"><button type=\"button\" data-zoom=\"out\" data-i=\"${i}\" title=\"Diminuir zoom\">−</button><span class=\"zoom-div\"></span><button type=\"button\" data-zoom=\"in\" data-i=\"${i}\" title=\"Aumentar zoom\">+</button></div>\n          </div>\n          <div class=\"legend\">${(s.dest||[]).map(d=>`<span><i style=\"background:${esc(color[d]||'#8e8e93')}\"></i>${LV.dest} ${esc(d)}</span>`).join('')}\n          <span><i style=\"background:#e8e8ec;border:1px solid #d4d4d9\"></i>vizinhos (contexto)</span>\n          ${ex.length?`<span><i style=\"background:#f7e7d0;border:1px dashed #ff9500\"></i>fora da realocação</span>`:''}</div>`;\n      }\n      h+=`<h3>${LV.childPlural} → ${LV.destLow} destino</h3>`;\n      h+=(s.municipios||[]).map(m=>`<div class=\"mrow\"><span class=\"nm\">${esc(m.nome)}</span><span class=\"cb\">${fmt(m.cbs)} CBs</span>\n        <span class=\"chip\" style=\"background:${esc(color[m.destino]||'#8e8e93')}\">${esc(m.destino||'–')}</span></div>`).join('')||`<div class=\"note\">Nenhum${LV.childFem?'a':''} ${LV.childLow} realocad${LV.childFem?'a':'o'} nesta etapa.</div>`;\n\n      h+=`</div><div>`;\n      // spans\n      const ds=s.destinos||[];\n      const mx=Math.max(...ds.map(d=>+d.span||0),1);\n      h+=`<h3>Tamanho d${LV.fem?'a':'o'} ${LV.destLow} depois da etapa</h3>`;\n      h+=ds.map(d=>{const base=+d.base||0,inc=+d.inc||0,orph=+d.orph||0;\n        return `<div class=\"bar\"><span class=\"tag\" style=\"color:${esc(color[d.s]||'#8e8e93')}\">${esc(d.s)}</span>\n          <span class=\"track\"><span class=\"b1\" style=\"width:${(base/mx*100).toFixed(1)}%;background:${esc(color[d.s]||'#8e8e93')}\"></span><span class=\"b2\" style=\"width:${(inc/mx*100).toFixed(1)}%;background:${esc(color[d.s]||'#8e8e93')}\"></span>${orph?`<span class=\"b3\" style=\"width:${(orph/mx*100).toFixed(1)}%;background:${esc(color[d.s]||'#8e8e93')}\"></span>`:''}</span>\n          <span class=\"v\">${fmt(d.span)} <span style=\"opacity:.6\">(+${fmt(inc+orph)})</span></span></div>`;}).join('')||`<div class=\"note\">Sem ${LV.destLow} destino nesta etapa.</div>`;\n      h+=`<div class=\"note\">Claro = base antes da etapa · cheio = CBs entrantes${(s.orphanTotal?' · faixa final = CBs que seguiram suas líderes':'')}.</div>`;\n\n      // leaders\n      const L=s.lideres||[];\n      if(L.length){\n        const showOrph=L.some(x=>+x.orphan>0);\n        h+=`<h3>Líderes</h3><div class=\"scroll\"><table><thead><tr><th>Líder</th><th>CBs</th><th>${LV.dest} final</th>${showOrph?'<th>Órfãs</th>':''}<th>Desloc.</th></tr></thead><tbody>`\n          +L.map(x=>`<tr><td>${esc(x.lider||'—')}</td><td>${fmt(x.total)}</td>\n            <td>${x.home?`<span class=\"dot\" style=\"background:${esc(color[x.home]||'#8e8e93')}\"></span>${esc(x.home)}`:'–'}</td>\n            ${showOrph?`<td>${x.orphan?fmt(x.orphan):'·'}</td>`:''}\n            <td style=\"color:${+x.desloc?'var(--closing)':'var(--mut)'};font-weight:${+x.desloc?700:400}\">${fmt(x.desloc||0)}</td></tr>`).join('')\n          +`</tbody></table></div>`;\n      }\n      h+=`</div></div>`;\n\n      // antes -> depois\n      const M=s.metricas||[];\n      if(M.length){\n        h+=`<h3>Impacto antes → depois por ${LV.destLow} ${LV.fem?'receptora':'receptor'}</h3><div class=\"scroll\"><table><thead><tr><th>${LV.dest}</th>${M.map(m=>`<th>${esc(m.label)}</th>`).join('')}</tr></thead><tbody>`;\n        (s.dest||[]).forEach(sec=>{\n          h+=`<tr><td><span class=\"dot\" style=\"background:${esc(color[sec]||'#8e8e93')}\"></span>${esc(sec)}</td>`;\n          h+=M.map(m=>{const row=(m.rows||[]).find(x=>String(x.s)===String(sec))||{};\n            const a=+row.antes||0,b=+row.depois||0,d=a?((b-a)/a*100):0;const f=m.money?money:fmt;\n            return `<td>${f(b)}<div class=\"delta ${d>=0?'up':'dn'}\">${d>0?'+':''}${d.toFixed(0)}%</div></td>`;}).join('')+`</tr>`;\n        });\n        h+=`<tr style=\"opacity:.75\"><td>${esc(s.sector)} (sai)</td>`+M.map(m=>`<td>${(m.money?money:fmt)(m.sai||0)}</td>`).join('')+`</tr>`;\n        h+=`</tbody></table></div>`;\n      }\n\n      // caveats\n      const fl=[];\n      if(s.excluidos&&s.excluidos.length) fl.push(`<b>${fmt(s.excluidos.length)} município(s)</b> com poucas CBs ficaram fora da realocação geográfica (quebra de vínculo): ${esc(s.excluidos.slice(0,6).map(x=>x.muni+' ('+x.cbs+')').join(', '))}${s.excluidos.length>6?' +'+(s.excluidos.length-6):''}. As CBs seguiram a líder do seu grupo.`);\n      if(s.orphanStranded) fl.push(`<b>${fmt(s.orphanStranded)} CB(s)</b> sem setor a seguir — a líder não ficou com nenhum município realocado.`);\n      if(s.noShapeCbs) fl.push(`<b>${fmt(s.noShapeCbs)} CB(s)</b> em municípios sem shape na UF, fora do mapa e de qualquer setor destino.`);\n      if(s.optTier===1) fl.push(`O span mínimo não era atingível nesta etapa e foi relaxado pelo modelo.`);\n      if(s.optTier===2) fl.push(`Os limites de span não eram atingíveis nesta etapa e foram relaxados pelo modelo.`);\n      if(s.optTier===-1) fl.push(`Etapa resolvida por heurística (espaço de busca grande) — os limites de span não são garantidos.`);\n      if(s.destRuleFallback) fl.push(`Nenhum município dominante nesta etapa: a regra de destino foi relaxada para \"qualquer município\".`);\n      if(s.realocFallback) fl.push(`Todos os municípios ficariam abaixo do limite: a regra de realocação foi relaxada para \"realocar todos\".`);\n      if(fl.length) h+=`<div class=\"flag\">⚠ ${fl.join('<br>')}</div>`;\n      h+=`</div>`;\n    });\n\n    // cumulative\n    // Este resumo é calculado no rastro de município (world.muniOverride) — hoje só existe pro\n    // fechamento de setor; GV/mercado têm o rastro equivalente (secOverride/gvOverride) mas essa\n    // agregação ainda não foi refeita nesse grão, então avisa em vez de mostrar tabela vazia.\n    const rc=sm.receivers||[];\n    if(!rc.length && sessLevel!=='setor'){\n      h+=`<div class=\"card\"><h2>Impacto acumulado da cadeia</h2>\n        <p class=\"note\" style=\"margin-top:0\">Ainda não disponível pra sessões de ${sessLevel==='gv'?'GV':'mercado'} — veja o relatório de cada etapa acima.</p></div>`;\n    }\n    if(rc.length){\n      h+=`<div class=\"card\"><h2>Impacto acumulado da cadeia</h2>\n        <p class=\"sub\">Efeito de <b>todas</b> as ${fmt(stages.length)} etapa(s) somadas, contra o snapshot congelado sem nenhum fechamento aplicado.</p>\n        <div class=\"scroll\"><table><thead><tr><th>Setor</th><th>Situação</th><th>CBs antes</th><th>CBs depois</th><th>Variação</th></tr></thead><tbody>`\n        +rc.map(x=>{const a=+x.antes||0,b=+x.depois||0,d=a?((b-a)/a*100):0;\n          return `<tr><td>${esc(x.s)}</td><td>${esc(x.situacao||'recebeu território')}</td><td>${fmt(a)}</td><td>${fmt(b)}</td>\n            <td class=\"delta ${d>=0?'up':'dn'}\" style=\"font-size:11.5px\">${d>0?'+':''}${d.toFixed(0)}%</td></tr>`;}).join('')\n        +`</tbody></table></div></div>`;\n    }\n\n    h+=`<div class=\"note\" style=\"text-align:center;margin-top:22px\">Visualização somente leitura de uma simulação congelada. Os números refletem o snapshot <b>${esc(r.snapshotRaw||'—')}</b> e as regras vigentes no momento do compartilhamento — não acompanham o dado ao vivo.</div>`;\n    return h+`</div></div>`;\n  },\n  mounted(d2, root){\n    d2.on('#goSim','click',()=>{\n      try{ (d2.router('timelineSimRouter')||d2.router()).goTo('/'); }catch(e){ try{ d2.router().goTo('/'); }catch(e2){} }\n    });\n    d2.on('.sc','click',e=>{\n      const el=e.target.closest('.sc'); if(!el) return;\n      const t=d2.$('#'+el.dataset.goto); if(t) t.scrollIntoView({behavior:'smooth',block:'start'});\n    });\n    // ---- map zoom/pan (viewBox só — texto e polígonos vivem no mesmo sistema de coordenadas, então\n    // escalam juntos automaticamente ao encolher/esticar o viewBox, sem lógica extra pra fonte).\n    // Delegado em `root` (nunca substituído por re-render) em vez de nos <svg> por id, porque cada\n    // atualização de estado reconstrói o HTML das etapas do zero.\n    const mapViews={};\n    const getMapView=(i,W,H)=>mapViews[i]||(mapViews[i]={x:0,y:0,w:W,h:H});\n    const applyMapView=(svg,i)=>{ const v=mapViews[i]; if(!v) return;\n      svg.setAttribute('viewBox', v.x.toFixed(2)+' '+v.y.toFixed(2)+' '+v.w.toFixed(2)+' '+v.h.toFixed(2));\n      // Rótulo tem tamanho em unidades do viewBox — sem isso ele cresceria junto com o zoom até virar\n      // um borrão. Encolher na mesma proporção que o viewBox encolhe cancela o zoom: o texto fica do\n      // mesmo tamanho na tela em qualquer nível. style.fontSize (não o atributo) porque uma regra de\n      // classe como .mlabel{font-size:...} outrankaria um atributo comum.\n      const W=+svg.dataset.w||700;\n      const fsScale=v.w/W;\n      svg.querySelectorAll('[data-fs]').forEach(t=>{\n        const base=+t.getAttribute('data-fs')||8;\n        t.style.fontSize=(base*fsScale).toFixed(2)+'px';\n      });\n      // Halo do texto (contorno branco que garante legibilidade sobre qualquer cor de fundo) tem\n      // largura de traço fixa em unidades do viewBox — sem reescalar junto, no zoom alto ele vira\n      // uma mancha cobrindo a letra inteira em vez de um contorno fino.\n      svg.querySelectorAll('[data-sw]').forEach(t=>{\n        const base=+t.getAttribute('data-sw')||1;\n        t.style.strokeWidth=(base*fsScale).toFixed(3)+'px';\n      });\n    };\n    const zoomStageMap=(i,factor)=>{\n      const svg=root.querySelector('#map-'+i); if(!svg) return;\n      const W=+svg.dataset.w||700, H=+svg.dataset.h||500;\n      const v=getMapView(i,W,H);\n      const cx=v.x+v.w/2, cy=v.y+v.h/2;\n      let w=v.w/factor, h=v.h/factor;\n      w=Math.min(W, Math.max(W/8, w)); h=Math.min(H, Math.max(H/8, h));\n      let x=cx-w/2, y=cy-h/2;\n      x=Math.min(W-w, Math.max(0,x)); y=Math.min(H-h, Math.max(0,y));\n      mapViews[i]={x,y,w,h};\n      applyMapView(svg,i);\n    };\n    d2.on('.zoom-pill button','click',e=>{\n      const b=e.target.closest('button'); if(!b) return;\n      zoomStageMap(b.dataset.i, b.dataset.zoom==='in'?1.4:1/1.4);\n    });\n    let mapDrag=null;\n    root.addEventListener('pointerdown',e=>{\n      const svg=e.target.closest('svg.map'); if(!svg) return;\n      const i=svg.id.replace('map-',''); const W=+svg.dataset.w||700, H=+svg.dataset.h||500;\n      const v=getMapView(i,W,H);\n      mapDrag={svg,i,W,H,x0:e.clientX,y0:e.clientY,vx0:v.x,vy0:v.y,rect:svg.getBoundingClientRect()};\n      svg.classList.add('dragging');\n    });\n    root.addEventListener('pointermove',e=>{\n      if(!mapDrag||!mapDrag.rect.width||!mapDrag.rect.height) return;\n      const dxPix=e.clientX-mapDrag.x0, dyPix=e.clientY-mapDrag.y0;\n      const v=getMapView(mapDrag.i,mapDrag.W,mapDrag.H);\n      const sx=v.w/mapDrag.rect.width, sy=v.h/mapDrag.rect.height;\n      let x=mapDrag.vx0-dxPix*sx, y=mapDrag.vy0-dyPix*sy;\n      x=Math.min(mapDrag.W-v.w, Math.max(0,x)); y=Math.min(mapDrag.H-v.h, Math.max(0,y));\n      mapViews[mapDrag.i]={...v,x,y};\n      applyMapView(mapDrag.svg,mapDrag.i);\n    });\n    const endMapDrag=()=>{ if(mapDrag){ mapDrag.svg.classList.remove('dragging'); mapDrag=null; } };\n    root.addEventListener('pointerup',endMapDrag);\n    root.addEventListener('pointerleave',endMapDrag);\n    (async()=>{\n      try{\n        // RACE, not a missing dataset. This DataSet is gated by timelineSimAuthFinal, so its\n        // Process is only define()d once the auth session resolves — a Process waits for its\n        // dependencies' setup before its own fires. In the field the auth lookup lands ~200ms\n        // and this DataSet's first fetch ~700-900ms, while mounted() runs immediately. d2.data()\n        // returns null for a module that is not defined YET, so bailing on the first miss threw\n        // \"dataset não disponível\" on every share link even though nothing was wrong.\n        // Poll briefly instead. Two lookups because either may win: the declared `shared` param,\n        // or the global-process path via the reference the instance binds — keep that binding.\n        let dead=false; d2.onUnmount(()=>{ dead=true; });\n        let ds=null;\n        for(let i=0;i<40 && !ds && !dead;i++){\n          ds=d2.data('shared')||d2.data('timeline-shared-sessionsDataSet');\n          if(!ds) await new Promise(r=>setTimeout(r,100));\n        }\n        if(dead) return;\n        if(!ds){ d2.setState({error:'Dataset de sessões compartilhadas não disponível.',ready:true}); return; }\n        // Name the router explicitly. Bare d2.router() looks for the conventional\n        // 'Router'/'MainRouter'; this one is 'timelineSimRouter', so the bare call can hand back a\n        // handle whose .params is empty — which is how a valid /sessions/<id> link ended up\n        // reporting \"o link não traz o identificador\". The goSim handler below already passes the\n        // ref for the same reason.\n        const rt=d2.router('timelineSimRouter')||d2.router();\n        const p=(rt&&rt.params)||{};\n        // ?id= lets the artboard be opened directly, outside the route.\n        let q=null;\n        try{ q=new URLSearchParams(window.location.search).get('id'); }catch(e){}\n        // Last resort, and the only one that cannot fail: the id is sitting in the path. Route\n        // params need the Router handle to resolve AND to have matched by the time mounted() runs\n        // (.params is a reactive getter, read once here); the pathname needs neither. Matches the\n        // current /sessions/:session_id route and the legacy /sessao/:id one.\n        let seg=null;\n        try{ const m=window.location.pathname.match(/\\/sess(?:ions|ao)\\/([^/?#]+)/); seg=m&&m[1]; }catch(e){}\n        const id=p.session_id||p.id||p.sessao||p.session||seg||q;\n        if(!id){ d2.setState({error:'O link não traz o identificador da sessão.',ready:true}); return; }\n        // .query() is a direct read and returns the rows — no refresh/loadAll ordering trap here\n        const rows=await ds.query({_id:id});\n        const rec=Array.isArray(rows)?rows[0]:(rows&&rows.data&&rows.data[0]);\n        d2.setState({rec:rec||null,ready:true,error:''});\n      }catch(err){\n        d2.setState({error:(err&&err.message)||'Falha ao carregar a sessão compartilhada.',ready:true});\n      }\n    })();\n  }\n}"}},"shared":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"shared"}}}}}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"shared":{"component":"data2-core-types@InteractiveModuleReference"}}}},"__d2PrevCode":{"code":"const NIVEIS=['Bronze','Cristal','Prata','Ouro','Diamante','Diamante+'];\n\nexport default {\n  css: `\n  :host{display:block;height:100%}\n  *{box-sizing:border-box}\n  .rroot{--bg:#f5f5f7;--panel:#ffffff;--panel2:#f2f2f7;--line:#e5e5ea;--ink:#1c1c1e;--mut:#6e6e73;--acc:#007aff;--closing:#ff3b30;--ok:#34c759;--warn:#ff9500;\n    height:100%;overflow:auto;background:var(--bg);color:var(--ink);\n    font:13px/1.5 -apple-system,BlinkMacSystemFont,\"SF Pro Text\",\"Segoe UI\",Roboto,sans-serif;-webkit-font-smoothing:antialiased}\n  .shell{max-width:1080px;margin:0 auto;padding:26px 22px 70px}\n  header.top{margin-bottom:20px}\n  .eyebrow{font-size:11px;text-transform:uppercase;letter-spacing:.5px;color:var(--mut);font-weight:600}\n  h1{font-size:25px;font-weight:600;letter-spacing:-.5px;margin:7px 0 10px}\n  .pills{display:flex;gap:7px;flex-wrap:wrap;align-items:center}\n  .pill{font-size:10.5px;padding:3px 9px;border-radius:99px;border:1px solid var(--line);color:var(--mut);background:var(--panel)}\n  .pill b{color:var(--ink);font-weight:600}\n  .pill.go{cursor:pointer;border-color:var(--acc);color:var(--acc);background:#eaf3ff;font-weight:600}\n  .pill.go:hover{background:#dbe9ff}\n  .goact{margin-top:15px;background:var(--acc);color:#fff;border:1px solid transparent;border-radius:8px;\n    padding:9px 16px;font:inherit;font-size:12.5px;font-weight:600;cursor:pointer}\n  .goact:hover{background:#0060df}\n  .strip{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:10px;margin:18px 0 22px}\n  .st{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:12px 14px;box-shadow:0 1px 2px rgba(0,0,0,.04)}\n  .st .n{font-size:23px;font-weight:700;letter-spacing:-.5px}\n  .st .l{font-size:10.5px;color:var(--mut);margin-top:3px;line-height:1.4}\n  .st.warn .n{color:var(--closing)}\n  .stepper{position:sticky;top:0;z-index:5;display:flex;gap:7px;overflow-x:auto;padding:11px 0;margin-bottom:6px;\n    background:rgba(245,245,247,.9);backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);border-bottom:1px solid var(--line)}\n  .sc{flex:0 0 auto;display:flex;align-items:center;gap:7px;background:var(--panel);border:1px solid var(--line);\n    border-radius:99px;padding:5px 12px 5px 6px;cursor:pointer;font-size:12px}\n  .sc:hover{border-color:var(--acc)}\n  .sc .k{width:19px;height:19px;border-radius:99px;background:var(--ink);color:#fff;font-size:10px;font-weight:700;\n    display:flex;align-items:center;justify-content:center}\n  .sc .arrow{color:var(--mut)}\n  .card{background:var(--panel);border:1px solid var(--line);border-radius:14px;padding:20px;margin-bottom:16px;box-shadow:0 1px 2px rgba(0,0,0,.04)}\n  .card > h2{font-size:15px;font-weight:600;letter-spacing:-.2px;margin:0 0 3px}\n  .card .sub{font-size:11.5px;color:var(--mut);margin:0 0 15px}\n  h3{font-size:11px;text-transform:uppercase;letter-spacing:.4px;color:var(--mut);margin:20px 0 9px;font-weight:600}\n  h3:first-of-type{margin-top:0}\n  .split{display:grid;grid-template-columns:minmax(0,1.15fr) minmax(0,1fr);gap:20px;align-items:start}\n  @media(max-width:820px){.split{grid-template-columns:1fr}}\n  svg.map{width:100%;height:auto;display:block;background:var(--panel2);border-radius:10px;border:1px solid var(--line);cursor:grab;touch-action:none}\n  svg.map.dragging{cursor:grabbing}\n  .map-wrap{position:relative}\n  .zoom-pill{position:absolute;left:10px;bottom:10px;display:flex;align-items:stretch;background:var(--panel);border:1px solid var(--line);border-radius:99px;box-shadow:0 2px 8px rgba(0,0,0,.14);overflow:hidden;z-index:3}\n  .zoom-pill button{width:30px;height:30px;border:0;background:transparent;color:var(--ink);font:16px/1 -apple-system,BlinkMacSystemFont,sans-serif;font-weight:600;cursor:pointer;display:flex;align-items:center;justify-content:center}\n  .zoom-pill button:hover{background:var(--panel2)}\n  .zoom-pill button:active{background:#e5e5ea}\n  .zoom-pill .zoom-div{width:1px;background:var(--line)}\n  .muni{stroke:#fff;stroke-width:1.1}\n  .nbr{fill:#e8e8ec;stroke:#d4d4d9;stroke-width:.7}\n  .exc{fill:#f7e7d0;stroke:var(--warn);stroke-width:.9;stroke-dasharray:2 2}\n  .mlabel{fill:#1c1c1e;font-size:9.5px;font-weight:600;text-anchor:middle;paint-order:stroke;stroke:rgba(255,255,255,.7);stroke-width:2.4px}\n  .nlabel{fill:#9a9aa0;font-size:7.5px;text-anchor:middle}\n  .legend{display:flex;gap:11px;flex-wrap:wrap;margin-top:9px;font-size:11px;color:var(--mut)}\n  .legend i{display:inline-block;width:10px;height:10px;border-radius:3px;margin-right:5px;vertical-align:-1px}\n  .bar{display:flex;align-items:center;gap:9px;margin:7px 0}\n  .bar .tag{width:46px;font-weight:600;font-size:12px}\n  .bar .track{flex:1;height:17px;background:var(--panel2);border-radius:5px;overflow:hidden;display:flex}\n  .bar .b1{height:100%;opacity:.38}.bar .b2{height:100%}.bar .b3{height:100%;opacity:.7}\n  .bar .v{width:120px;text-align:right;font-size:11px;color:var(--mut);font-variant-numeric:tabular-nums}\n  .mrow{display:flex;align-items:center;gap:9px;background:var(--panel2);border:1px solid var(--line);border-radius:9px;padding:6px 10px;margin-bottom:5px}\n  .mrow .nm{flex:1;font-weight:600;font-size:12px;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n  .mrow .cb{color:var(--mut);font-size:11px;font-variant-numeric:tabular-nums}\n  .chip{font-size:11px;font-weight:700;color:#fff;border-radius:6px;padding:2px 8px}\n  table{border-collapse:collapse;width:100%;font-size:11.5px}\n  th,td{padding:6px 7px;text-align:right;border-bottom:1px solid var(--line);font-variant-numeric:tabular-nums}\n  th:first-child,td:first-child{text-align:left}\n  thead th{color:var(--mut);font-weight:600;font-size:10.5px}\n  .dot{display:inline-block;width:9px;height:9px;border-radius:2px;margin-right:5px}\n  .delta{font-size:10px}.delta.up{color:var(--ok)}.delta.dn{color:var(--closing)}\n  .note{font-size:10.5px;color:var(--mut);line-height:1.55;margin-top:9px}\n  .flag{margin-top:11px;padding:9px 11px;border-radius:9px;font-size:11.5px;line-height:1.55;background:#fff8ef;border:1px solid #ffe0bd;color:#8a5200}\n  .scroll{max-height:300px;overflow:auto}\n  .center{display:flex;align-items:center;justify-content:center;height:100%;padding:40px}\n  .msg{max-width:420px;text-align:center}\n  .msg h2{font-size:17px;font-weight:600;margin:0 0 7px}\n  .msg p{font-size:12.5px;color:var(--mut);margin:0;line-height:1.55}\n`,\n  render(d2){\n    // Hierarquia mercado > GV > setor, espelhando o simulador ao vivo. Tudo pré-computado (label,\n    // minúscula, plural, gênero) pra nunca minusculizar \"GV\" (sigla) virando \"gv\", e pra concordar\n    // gênero certo em cada frase — GV é feminina (a Gerência de Vendas), o resto é masculino.\n    const LVL={\n      setor:{label:'Setor',low:'setor',fem:false, child:'Município',childLow:'município',childPlural:'Municípios',childFem:false, dest:'Setor',destLow:'setor'},\n      gv:{label:'GV',low:'GV',fem:true, child:'Setor',childLow:'setor',childPlural:'Setores',childFem:false, dest:'GV',destLow:'GV'},\n      mercado:{label:'Mercado',low:'mercado',fem:false, child:'GV',childLow:'GV',childPlural:'GVs',childFem:true, dest:'Mercado',destLow:'mercado'},\n    };\n    const lv=s=>LVL[(s&&s.level)||'setor'];\n    const esc=s=>(s==null?'':String(s)).replace(/[&<>\"]/g,c=>({'&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;'}[c]));\n    const fmt=n=>n==null?'–':Math.round(+n).toLocaleString('pt-BR');\n    const money=n=>{n=+n||0;return n>=1e6?'R$'+(n/1e6).toFixed(1)+'M':n>=1e3?'R$'+(n/1e3).toFixed(0)+'k':'R$'+Math.round(n)};\n    const msg=(t,b,act)=>`<div class=\"rroot\"><div class=\"center\"><div class=\"msg\"><h2>${t}</h2><p>${b}</p>${act?`<button class=\"goact\" id=\"goSim\">Abrir o simulador</button>`:''}</div></div></div>`;\n\n    if(d2.state.error) return msg('Não foi possível abrir a sessão',esc(d2.state.error),true);\n    if(!d2.state.ready) return msg('Carregando sessão…','Buscando o registro compartilhado.');\n    const r=d2.state.rec;\n    if(!r) return msg('Sessão não encontrada','O link pode ter expirado ou o registro foi removido. Peça um novo link a quem compartilhou.',true);\n\n    const stages=Array.isArray(r.stages)?r.stages:[];\n    const sm=r.summary||{};\n    const st=r.settings||{};\n    const ruleDest=st.destRule==='dominant'?`destino: dominantes ≥${fmt(st.destMinCbs)} CBs`:'destino: qualquer município';\n    const ruleReal=st.realocRule==='relevant'?`realocação: ≥${fmt(st.realocMinCbs)} CBs`:'realocação: todos';\n    const spanBits=[];\n    if(st.targetSpan)spanBits.push('alvo '+fmt(st.targetSpan));\n    if(st.maxSpan)spanBits.push('máx '+fmt(st.maxSpan));\n    if(st.minSpan)spanBits.push('mín '+fmt(st.minSpan));\n\n    let h=`<div class=\"rroot\"><div class=\"shell\">\n      <header class=\"top\">\n        <div class=\"eyebrow\">Simulador de timeline de fechamentos · sessão compartilhada</div>\n        <h1>${esc(r.label||'Sessão sem nome')}</h1>\n        <div class=\"pills\">\n          <span class=\"pill\">● snapshot congelado · <b>${esc(r.snapshotRaw||'—')}</b></span>\n          <span class=\"pill\">◇ ${esc(ruleReal)}</span>\n          <span class=\"pill\">◈ ${esc(ruleDest)}</span>\n          <span class=\"pill\">◎ span: <b>${spanBits.length?esc(spanBits.join(' · ')):'livre'}</b></span>\n          ${r.sharedBy?`<span class=\"pill\">por <b>${esc(r.sharedBy)}</b></span>`:''}\n          ${r.sharedAt?`<span class=\"pill\">${esc(new Date(r.sharedAt).toLocaleString('pt-BR'))}</span>`:''}\n          <span class=\"pill go\" id=\"goSim\" role=\"button\" tabindex=\"0\" title=\"Ir para o simulador\">↗ abrir o simulador</span>\n        </div>\n      </header>`;\n\n    const sessLevel=(stages[0]&&stages[0].level)||'setor';\n    h+=`<div class=\"strip\">\n      <div class=\"st\"><div class=\"n\">${fmt(stages.length)}</div><div class=\"l\">Etapa(s) de fechamento</div></div>\n      <div class=\"st\"><div class=\"n\">${fmt(sm.totalCbs)}</div><div class=\"l\">CBs realocadas na cadeia</div></div>\n      ${sessLevel==='setor'?`<div class=\"st warn\"><div class=\"n\">${fmt(sm.totalDesloc)}</div><div class=\"l\">CBs deslocadas (quebra de relação)</div></div>`:`<div class=\"st\"><div class=\"n\">${fmt(sm.totalDesloc)}</div><div class=\"l\">CBs com líder dividida entre destinos</div></div>`}\n      <div class=\"st\"><div class=\"n\" style=\"font-size:15px;line-height:1.5;font-weight:600\">${esc((sm.sectors||[]).join(' → ')||'—')}</div><div class=\"l\">Ordem de fechamento</div></div>\n    </div>`;\n\n    if(stages.length>1){\n      h+=`<div class=\"stepper\">`+stages.map((s,i)=>`<div class=\"sc\" data-goto=\"stage-${i}\"><span class=\"k\">${i+1}</span>${lv(s).label} ${esc(s.sector)}<span class=\"arrow\">→</span>${esc((s.dest||[]).join(', ')||'–')}</div>`).join('')+`</div>`;\n    }\n\n    // ---- projection helpers (pure; mirrors the simulator's) ----\n    const project=feats=>{let mnx=1/0,mny=1/0,mxx=-1/0,mxy=-1/0;\n      feats.forEach(f=>{const g=f&&f.geometry;if(!g)return;const ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];\n        ps.forEach(p=>p.forEach(rg=>rg.forEach(pt=>{mnx=Math.min(mnx,pt[0]);mxx=Math.max(mxx,pt[0]);mny=Math.min(mny,pt[1]);mxy=Math.max(mxy,pt[1]);})));});\n      if(!isFinite(mnx)) return null;\n      const mlat=(mny+mxy)/2,kx=Math.cos(mlat*Math.PI/180),W=680,H=440,pad=16;\n      const gw=Math.max((mxx-mnx)*kx,1e-9),gh=Math.max(mxy-mny,1e-9),sc=Math.min((W-2*pad)/gw,(H-2*pad)/gh);\n      const ox=(W-gw*sc)/2,oy=(H-gh*sc)/2;\n      return {W,H,f:pt=>[ox+(pt[0]-mnx)*kx*sc, oy+(mxy-pt[1])*sc]};};\n    const pathFor=(f,pr)=>{const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];\n      return ps.map(poly=>poly.map(rg=>'M'+rg.map(pt=>{const q=pr(pt);return q[0].toFixed(1)+','+q[1].toFixed(1);}).join('L')+'Z').join('')).join('');};\n    const cxy=(f,pr)=>{let x=0,y=0,n=0;const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];\n      ps.forEach(poly=>poly[0].forEach(pt=>{const q=pr(pt);x+=q[0];y+=q[1];n++;}));return n?[x/n,y/n]:[0,0];};\n\n    stages.forEach((s,i)=>{\n      const color=s.color||{};\n      const k=s.kpis||{};\n      const LV=lv(s);\n      h+=`<div class=\"card\" id=\"stage-${i}\" data-key=\"stage-${i}\">\n        <h2>Etapa ${i+1} · ${LV.low} <b>${esc(s.sector)}</b> fechad${LV.fem?'a':'o'}</h2>\n        <p class=\"sub\">Território redistribuído para ${esc((s.dest||[]).join(', ')||'—')}${s.domUF?' · '+esc(s.domUF):''}${s.policy?' · política: '+(s.policy==='fora'?'manter vínculo':'quebrar relação'):''}</p>\n        <div class=\"strip\" style=\"margin:0 0 18px\">\n          <div class=\"st\"><div class=\"n\">${fmt(k.cbsRealocadas)}</div><div class=\"l\">CBs realocadas</div></div>\n          ${LV.label==='Setor'?`<div class=\"st warn\"><div class=\"n\">${fmt(k.desloc)}</div><div class=\"l\">CBs deslocadas</div></div>`:`<div class=\"st\"><div class=\"n\">${fmt(k.desloc)}</div><div class=\"l\">CBs com líder dividida</div></div>`}\n          <div class=\"st\"><div class=\"n\">${fmt(k.municipios)}</div><div class=\"l\">${LV.childPlural} movid${LV.childFem?'as':'os'}</div></div>\n          <div class=\"st\"><div class=\"n\">${fmt(k.lideres)}</div><div class=\"l\">Líderes envolvidas</div></div>\n        </div>\n        <div class=\"split\"><div>`;\n\n      // map\n      const gf=s.geoFeat||{}, nb=Array.isArray(s.nbrFeat)?s.nbrFeat:[], ex=Array.isArray(s.excludedFeat)?s.excludedFeat:[];\n      const all=[...nb,...ex,...Object.values(gf)].filter(Boolean);\n      const P=project(all);\n      const unitOf=m=>LV.label==='Setor'?m:((s.unitOfMuni||{})[m]||m);\n      if(P){\n        let g='';\n        nb.forEach(f=>{ if(!f||!f.geometry)return; g+=`<path class=\"nbr\" d=\"${pathFor(f,P.f)}\"/>`;\n          const c=cxy(f,P.f);const nm=(f.properties&&f.properties.name)||'';\n          if(nm) g+=`<text class=\"nlabel\" data-fs=\"7.5\" x=\"${c[0].toFixed(1)}\" y=\"${c[1].toFixed(1)}\">${esc(nm.slice(0,13))}</text>`; });\n        ex.forEach(f=>{ if(!f||!f.geometry)return; g+=`<path class=\"exc\" d=\"${pathFor(f,P.f)}\"/>`; });\n        if(LV.label==='Setor'){\n          Object.entries(gf).forEach(([m,f])=>{ if(!f||!f.geometry)return;\n            const dest=(s.assign||{})[m];\n            g+=`<path class=\"muni\" d=\"${pathFor(f,P.f)}\" fill=\"${esc(color[dest]||'#8e8e93')}\"/>`;\n            const c=cxy(f,P.f);\n            g+=`<text class=\"mlabel\" data-fs=\"9.5\" x=\"${c[0].toFixed(1)}\" y=\"${c[1].toFixed(1)}\">${esc(m.slice(0,14))}<tspan data-fs=\"8\" x=\"${c[0].toFixed(1)}\" dy=\"10\" font-size=\"8\">${esc(dest||'–')}</tspan></text>`; });\n        } else {\n          // GV/mercado: vários municípios do mesmo setor/GV são UMA unidade só na tela — mesma cor,\n          // mesmo stroke (a costura entre elas some), um rótulo só no centro do grupo em vez de um\n          // por município. Espelha o mapa ao vivo do simulador.\n          const groups={};\n          Object.entries(gf).forEach(([m,f])=>{ if(!f||!f.geometry)return; const u=unitOf(m); (groups[u]=groups[u]||[]).push(f); });\n          Object.entries(groups).forEach(([u,feats])=>{\n            const dest=(s.assign||{})[u]; const col=esc(color[dest]||'#8e8e93');\n            let cx=0,cy=0,n=0;\n            feats.forEach(f=>{ g+=`<path class=\"muni\" d=\"${pathFor(f,P.f)}\" fill=\"${col}\" stroke=\"${col}\"/>`;\n              const c=cxy(f,P.f); cx+=c[0]; cy+=c[1]; n++; });\n            if(n){ cx/=n; cy/=n;\n              g+=`<text class=\"mlabel\" data-fs=\"9.5\" x=\"${cx.toFixed(1)}\" y=\"${cy.toFixed(1)}\">${esc(u)}<tspan data-fs=\"8\" x=\"${cx.toFixed(1)}\" dy=\"10\" font-size=\"8\">${esc(dest||'–')}</tspan></text>`;\n            }\n          });\n        }\n        h+=`<h3>Mapa da redistribuição</h3><div class=\"map-wrap\">\n          <svg class=\"map\" id=\"map-${i}\" data-w=\"${P.W}\" data-h=\"${P.H}\" viewBox=\"0 0 ${P.W} ${P.H}\" preserveAspectRatio=\"xMidYMid meet\">${g}</svg>\n          <div class=\"zoom-pill\"><button type=\"button\" data-zoom=\"out\" data-i=\"${i}\" title=\"Diminuir zoom\">−</button><span class=\"zoom-div\"></span><button type=\"button\" data-zoom=\"in\" data-i=\"${i}\" title=\"Aumentar zoom\">+</button></div>\n          </div>\n          <div class=\"legend\">${(s.dest||[]).map(d=>`<span><i style=\"background:${esc(color[d]||'#8e8e93')}\"></i>${LV.dest} ${esc(d)}</span>`).join('')}\n          <span><i style=\"background:#e8e8ec;border:1px solid #d4d4d9\"></i>vizinhos (contexto)</span>\n          ${ex.length?`<span><i style=\"background:#f7e7d0;border:1px dashed #ff9500\"></i>fora da realocação</span>`:''}</div>`;\n      }\n      h+=`<h3>${LV.childPlural} → ${LV.destLow} destino</h3>`;\n      h+=(s.municipios||[]).map(m=>`<div class=\"mrow\"><span class=\"nm\">${esc(m.nome)}</span><span class=\"cb\">${fmt(m.cbs)} CBs</span>\n        <span class=\"chip\" style=\"background:${esc(color[m.destino]||'#8e8e93')}\">${esc(m.destino||'–')}</span></div>`).join('')||`<div class=\"note\">Nenhum${LV.childFem?'a':''} ${LV.childLow} realocad${LV.childFem?'a':'o'} nesta etapa.</div>`;\n\n      h+=`</div><div>`;\n      // spans\n      const ds=s.destinos||[];\n      const mx=Math.max(...ds.map(d=>+d.span||0),1);\n      h+=`<h3>Tamanho d${LV.fem?'a':'o'} ${LV.destLow} depois da etapa</h3>`;\n      h+=ds.map(d=>{const base=+d.base||0,inc=+d.inc||0,orph=+d.orph||0;\n        return `<div class=\"bar\"><span class=\"tag\" style=\"color:${esc(color[d.s]||'#8e8e93')}\">${esc(d.s)}</span>\n          <span class=\"track\"><span class=\"b1\" style=\"width:${(base/mx*100).toFixed(1)}%;background:${esc(color[d.s]||'#8e8e93')}\"></span><span class=\"b2\" style=\"width:${(inc/mx*100).toFixed(1)}%;background:${esc(color[d.s]||'#8e8e93')}\"></span>${orph?`<span class=\"b3\" style=\"width:${(orph/mx*100).toFixed(1)}%;background:${esc(color[d.s]||'#8e8e93')}\"></span>`:''}</span>\n          <span class=\"v\">${fmt(d.span)} <span style=\"opacity:.6\">(+${fmt(inc+orph)})</span></span></div>`;}).join('')||`<div class=\"note\">Sem ${LV.destLow} destino nesta etapa.</div>`;\n      h+=`<div class=\"note\">Claro = base antes da etapa · cheio = CBs entrantes${(s.orphanTotal?' · faixa final = CBs que seguiram suas líderes':'')}.</div>`;\n\n      // leaders\n      const L=s.lideres||[];\n      if(L.length){\n        const showOrph=L.some(x=>+x.orphan>0);\n        h+=`<h3>Líderes</h3><div class=\"scroll\"><table><thead><tr><th>Líder</th><th>CBs</th><th>${LV.dest} final</th>${showOrph?'<th>Órfãs</th>':''}<th>Desloc.</th></tr></thead><tbody>`\n          +L.map(x=>`<tr><td>${esc(x.lider||'—')}</td><td>${fmt(x.total)}</td>\n            <td>${x.home?`<span class=\"dot\" style=\"background:${esc(color[x.home]||'#8e8e93')}\"></span>${esc(x.home)}`:'–'}</td>\n            ${showOrph?`<td>${x.orphan?fmt(x.orphan):'·'}</td>`:''}\n            <td style=\"color:${+x.desloc?'var(--closing)':'var(--mut)'};font-weight:${+x.desloc?700:400}\">${fmt(x.desloc||0)}</td></tr>`).join('')\n          +`</tbody></table></div>`;\n      }\n      h+=`</div></div>`;\n\n      // antes -> depois\n      const M=s.metricas||[];\n      if(M.length){\n        h+=`<h3>Impacto antes → depois por ${LV.destLow} ${LV.fem?'receptora':'receptor'}</h3><div class=\"scroll\"><table><thead><tr><th>${LV.dest}</th>${M.map(m=>`<th>${esc(m.label)}</th>`).join('')}</tr></thead><tbody>`;\n        (s.dest||[]).forEach(sec=>{\n          h+=`<tr><td><span class=\"dot\" style=\"background:${esc(color[sec]||'#8e8e93')}\"></span>${esc(sec)}</td>`;\n          h+=M.map(m=>{const row=(m.rows||[]).find(x=>String(x.s)===String(sec))||{};\n            const a=+row.antes||0,b=+row.depois||0,d=a?((b-a)/a*100):0;const f=m.money?money:fmt;\n            return `<td>${f(b)}<div class=\"delta ${d>=0?'up':'dn'}\">${d>0?'+':''}${d.toFixed(0)}%</div></td>`;}).join('')+`</tr>`;\n        });\n        h+=`<tr style=\"opacity:.75\"><td>${esc(s.sector)} (sai)</td>`+M.map(m=>`<td>${(m.money?money:fmt)(m.sai||0)}</td>`).join('')+`</tr>`;\n        h+=`</tbody></table></div>`;\n      }\n\n      // caveats\n      const fl=[];\n      if(s.excluidos&&s.excluidos.length) fl.push(`<b>${fmt(s.excluidos.length)} município(s)</b> com poucas CBs ficaram fora da realocação geográfica (quebra de vínculo): ${esc(s.excluidos.slice(0,6).map(x=>x.muni+' ('+x.cbs+')').join(', '))}${s.excluidos.length>6?' +'+(s.excluidos.length-6):''}. As CBs seguiram a líder do seu grupo.`);\n      if(s.orphanStranded) fl.push(`<b>${fmt(s.orphanStranded)} CB(s)</b> sem setor a seguir — a líder não ficou com nenhum município realocado.`);\n      if(s.noShapeCbs) fl.push(`<b>${fmt(s.noShapeCbs)} CB(s)</b> em municípios sem shape na UF, fora do mapa e de qualquer setor destino.`);\n      if(s.optTier===1) fl.push(`O span mínimo não era atingível nesta etapa e foi relaxado pelo modelo.`);\n      if(s.optTier===2) fl.push(`Os limites de span não eram atingíveis nesta etapa e foram relaxados pelo modelo.`);\n      if(s.optTier===-1) fl.push(`Etapa resolvida por heurística (espaço de busca grande) — os limites de span não são garantidos.`);\n      if(s.destRuleFallback) fl.push(`Nenhum município dominante nesta etapa: a regra de destino foi relaxada para \"qualquer município\".`);\n      if(s.realocFallback) fl.push(`Todos os municípios ficariam abaixo do limite: a regra de realocação foi relaxada para \"realocar todos\".`);\n      if(fl.length) h+=`<div class=\"flag\">⚠ ${fl.join('<br>')}</div>`;\n      h+=`</div>`;\n    });\n\n    // cumulative\n    // Este resumo é calculado no rastro de município (world.muniOverride) — hoje só existe pro\n    // fechamento de setor; GV/mercado têm o rastro equivalente (secOverride/gvOverride) mas essa\n    // agregação ainda não foi refeita nesse grão, então avisa em vez de mostrar tabela vazia.\n    const rc=sm.receivers||[];\n    if(!rc.length && sessLevel!=='setor'){\n      h+=`<div class=\"card\"><h2>Impacto acumulado da cadeia</h2>\n        <p class=\"note\" style=\"margin-top:0\">Ainda não disponível pra sessões de ${sessLevel==='gv'?'GV':'mercado'} — veja o relatório de cada etapa acima.</p></div>`;\n    }\n    if(rc.length){\n      h+=`<div class=\"card\"><h2>Impacto acumulado da cadeia</h2>\n        <p class=\"sub\">Efeito de <b>todas</b> as ${fmt(stages.length)} etapa(s) somadas, contra o snapshot congelado sem nenhum fechamento aplicado.</p>\n        <div class=\"scroll\"><table><thead><tr><th>Setor</th><th>Situação</th><th>CBs antes</th><th>CBs depois</th><th>Variação</th></tr></thead><tbody>`\n        +rc.map(x=>{const a=+x.antes||0,b=+x.depois||0,d=a?((b-a)/a*100):0;\n          return `<tr><td>${esc(x.s)}</td><td>${esc(x.situacao||'recebeu território')}</td><td>${fmt(a)}</td><td>${fmt(b)}</td>\n            <td class=\"delta ${d>=0?'up':'dn'}\" style=\"font-size:11.5px\">${d>0?'+':''}${d.toFixed(0)}%</td></tr>`;}).join('')\n        +`</tbody></table></div></div>`;\n    }\n\n    h+=`<div class=\"note\" style=\"text-align:center;margin-top:22px\">Visualização somente leitura de uma simulação congelada. Os números refletem o snapshot <b>${esc(r.snapshotRaw||'—')}</b> e as regras vigentes no momento do compartilhamento — não acompanham o dado ao vivo.</div>`;\n    return h+`</div></div>`;\n  },\n  mounted(d2, root){\n    d2.on('#goSim','click',()=>{\n      try{ (d2.router('timelineSimRouter')||d2.router()).goTo('/'); }catch(e){ try{ d2.router().goTo('/'); }catch(e2){} }\n    });\n    d2.on('.sc','click',e=>{\n      const el=e.target.closest('.sc'); if(!el) return;\n      const t=d2.$('#'+el.dataset.goto); if(t) t.scrollIntoView({behavior:'smooth',block:'start'});\n    });\n    // ---- map zoom/pan (viewBox só — texto e polígonos vivem no mesmo sistema de coordenadas, então\n    // escalam juntos automaticamente ao encolher/esticar o viewBox, sem lógica extra pra fonte).\n    // Delegado em `root` (nunca substituído por re-render) em vez de nos <svg> por id, porque cada\n    // atualização de estado reconstrói o HTML das etapas do zero.\n    const mapViews={};\n    const getMapView=(i,W,H)=>mapViews[i]||(mapViews[i]={x:0,y:0,w:W,h:H});\n    const applyMapView=(svg,i)=>{ const v=mapViews[i]; if(!v) return;\n      svg.setAttribute('viewBox', v.x.toFixed(2)+' '+v.y.toFixed(2)+' '+v.w.toFixed(2)+' '+v.h.toFixed(2));\n      // Rótulo tem tamanho em unidades do viewBox — sem isso ele cresceria junto com o zoom até virar\n      // um borrão. Encolher na mesma proporção que o viewBox encolhe cancela o zoom: o texto fica do\n      // mesmo tamanho na tela em qualquer nível. style.fontSize (não o atributo) porque uma regra de\n      // classe como .mlabel{font-size:...} outrankaria um atributo comum.\n      const W=+svg.dataset.w||700;\n      const fsScale=v.w/W;\n      svg.querySelectorAll('[data-fs]').forEach(t=>{\n        const base=+t.getAttribute('data-fs')||8;\n        t.style.fontSize=(base*fsScale).toFixed(2)+'px';\n      });\n    };\n    const zoomStageMap=(i,factor)=>{\n      const svg=root.querySelector('#map-'+i); if(!svg) return;\n      const W=+svg.dataset.w||700, H=+svg.dataset.h||500;\n      const v=getMapView(i,W,H);\n      const cx=v.x+v.w/2, cy=v.y+v.h/2;\n      let w=v.w/factor, h=v.h/factor;\n      w=Math.min(W, Math.max(W/8, w)); h=Math.min(H, Math.max(H/8, h));\n      let x=cx-w/2, y=cy-h/2;\n      x=Math.min(W-w, Math.max(0,x)); y=Math.min(H-h, Math.max(0,y));\n      mapViews[i]={x,y,w,h};\n      applyMapView(svg,i);\n    };\n    d2.on('.zoom-pill button','click',e=>{\n      const b=e.target.closest('button'); if(!b) return;\n      zoomStageMap(b.dataset.i, b.dataset.zoom==='in'?1.4:1/1.4);\n    });\n    let mapDrag=null;\n    root.addEventListener('pointerdown',e=>{\n      const svg=e.target.closest('svg.map'); if(!svg) return;\n      const i=svg.id.replace('map-',''); const W=+svg.dataset.w||700, H=+svg.dataset.h||500;\n      const v=getMapView(i,W,H);\n      mapDrag={svg,i,W,H,x0:e.clientX,y0:e.clientY,vx0:v.x,vy0:v.y,rect:svg.getBoundingClientRect()};\n      svg.classList.add('dragging');\n    });\n    root.addEventListener('pointermove',e=>{\n      if(!mapDrag||!mapDrag.rect.width||!mapDrag.rect.height) return;\n      const dxPix=e.clientX-mapDrag.x0, dyPix=e.clientY-mapDrag.y0;\n      const v=getMapView(mapDrag.i,mapDrag.W,mapDrag.H);\n      const sx=v.w/mapDrag.rect.width, sy=v.h/mapDrag.rect.height;\n      let x=mapDrag.vx0-dxPix*sx, y=mapDrag.vy0-dyPix*sy;\n      x=Math.min(mapDrag.W-v.w, Math.max(0,x)); y=Math.min(mapDrag.H-v.h, Math.max(0,y));\n      mapViews[mapDrag.i]={...v,x,y};\n      applyMapView(mapDrag.svg,mapDrag.i);\n    });\n    const endMapDrag=()=>{ if(mapDrag){ mapDrag.svg.classList.remove('dragging'); mapDrag=null; } };\n    root.addEventListener('pointerup',endMapDrag);\n    root.addEventListener('pointerleave',endMapDrag);\n    (async()=>{\n      try{\n        // RACE, not a missing dataset. This DataSet is gated by timelineSimAuthFinal, so its\n        // Process is only define()d once the auth session resolves — a Process waits for its\n        // dependencies' setup before its own fires. In the field the auth lookup lands ~200ms\n        // and this DataSet's first fetch ~700-900ms, while mounted() runs immediately. d2.data()\n        // returns null for a module that is not defined YET, so bailing on the first miss threw\n        // \"dataset não disponível\" on every share link even though nothing was wrong.\n        // Poll briefly instead. Two lookups because either may win: the declared `shared` param,\n        // or the global-process path via the reference the instance binds — keep that binding.\n        let dead=false; d2.onUnmount(()=>{ dead=true; });\n        let ds=null;\n        for(let i=0;i<40 && !ds && !dead;i++){\n          ds=d2.data('shared')||d2.data('timeline-shared-sessionsDataSet');\n          if(!ds) await new Promise(r=>setTimeout(r,100));\n        }\n        if(dead) return;\n        if(!ds){ d2.setState({error:'Dataset de sessões compartilhadas não disponível.',ready:true}); return; }\n        // Name the router explicitly. Bare d2.router() looks for the conventional\n        // 'Router'/'MainRouter'; this one is 'timelineSimRouter', so the bare call can hand back a\n        // handle whose .params is empty — which is how a valid /sessions/<id> link ended up\n        // reporting \"o link não traz o identificador\". The goSim handler below already passes the\n        // ref for the same reason.\n        const rt=d2.router('timelineSimRouter')||d2.router();\n        const p=(rt&&rt.params)||{};\n        // ?id= lets the artboard be opened directly, outside the route.\n        let q=null;\n        try{ q=new URLSearchParams(window.location.search).get('id'); }catch(e){}\n        // Last resort, and the only one that cannot fail: the id is sitting in the path. Route\n        // params need the Router handle to resolve AND to have matched by the time mounted() runs\n        // (.params is a reactive getter, read once here); the pathname needs neither. Matches the\n        // current /sessions/:session_id route and the legacy /sessao/:id one.\n        let seg=null;\n        try{ const m=window.location.pathname.match(/\\/sess(?:ions|ao)\\/([^/?#]+)/); seg=m&&m[1]; }catch(e){}\n        const id=p.session_id||p.id||p.sessao||p.session||seg||q;\n        if(!id){ d2.setState({error:'O link não traz o identificador da sessão.',ready:true}); return; }\n        // .query() is a direct read and returns the rows — no refresh/loadAll ordering trap here\n        const rows=await ds.query({_id:id});\n        const rec=Array.isArray(rows)?rows[0]:(rows&&rows.data&&rows.data[0]);\n        d2.setState({rec:rec||null,ready:true,error:''});\n      }catch(err){\n        d2.setState({error:(err&&err.message)||'Falha ao carregar a sessão compartilhada.',ready:true});\n      }\n    })();\n  }\n}","at":"2026-08-13T14:21:53.099Z"}},"updatedAt":"2026-08-13T14:21:53.212Z","createdAt":"2026-08-06T16:28:27.744Z"},{"_id":"6a75620d9f1ece2343b4d4da","component":"data2-core-types@Component","system":"6a57cfe9673eb7e3c5e57784","params":{"extends":"data2-core-primitives@Block","component":"cb-senso-de-rede","package":"natura-geomarketing","title":"Senso de Rede — CBs","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"// ---------- Senso de rede — afinidades entre consultoras de beleza ----------\n// Cada nó é uma CB; cada laço é uma AFINIDADE DERIVADA do snapshot mais recente, nunca um\n// cadastro de relacionamento — não existe tabela de \"quem conhece quem\". Por isso o peso de\n// cada dimensão é o INVERSO DA SUA FREQUÊNCIA na amostra: dividir a mesma líder diz muito mais\n// sobre duas CBs do que ambas estarem ativas no ciclo, e é o peso que decide a cor, a espessura\n// e quais laços sobrevivem ao corte por nó. Sem isso o grafo vira uma malha uniforme onde tudo\n// se liga a tudo e nada significa nada.\nconst T = 'product.perfil_cb.crm_perfil_cb_diaria_historico';\nconst RUSH_FALLBACK = 'AwW_11Nkg-dKksP7ic8V8';\nconst SNAP = `(SELECT MAX(DT_HISTORICO) FROM ${T} WHERE CD_PAIS=1)`;\n// Paleta = cores de sistema do macOS, as mesmas do simulador de timeline, pra que os dois módulos\n// leiam como um produto só e não como duas ferramentas diferentes coladas.\nconst BG = '#f5f5f7';\n\nconst DIMS = [\n  { k:'origem',     label:'Origem',     color:'#ff9500', hint:'mesmo município' },\n  { k:'territorio', label:'Território', color:'#34c759', hint:'mesmo setor' },\n  { k:'rede',       label:'Rede',       color:'#007aff', hint:'mesma líder' },\n  { k:'trajetoria', label:'Trajetória', color:'#af52de', hint:'mesmo nível do plano' },\n  { k:'ritmo',      label:'Ritmo',      color:'#ff2d55', hint:'pedidos por ciclo parecidos' },\n  { k:'alcance',    label:'Alcance',    color:'#ffcc00', hint:'pontos parecidos' },\n  { k:'porte',      label:'Porte',      color:'#30b0c7', hint:'receita parecida' },\n  { k:'marca',      label:'Marca',      color:'#a2845e', hint:'mix Natura/Avon parecido' },\n  { k:'constancia', label:'Constância', color:'#8e8e93', hint:'ativas no ciclo' },\n];\nconst DIM_BY = {}; DIMS.forEach(d => DIM_BY[d.k] = d);\nconst TINTS = ['#e6f0ff','#e6f7ea','#fff2e0','#f6ecfd','#ffe9ee','#e6f5f9','#f2f2f7'];\n\nconst esc = s => (s == null ? '' : String(s)).replace(/[&<>\"]/g, c => ({'&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;'}[c]));\nconst digits = s => String(s == null ? '' : s).replace(/[^0-9]/g, '');\nconst letters = s => String(s == null ? '' : s).replace(/[^A-Za-zÀ-ÿ]/g, '');\nconst hash = s => { let h = 0; const t = String(s || ''); for (let i = 0; i < t.length; i++) h = (h * 31 + t.charCodeAt(i)) | 0; return Math.abs(h); };\nconst titleCase = s => String(s || '').toLowerCase().replace(/(^|[\\s'-])([a-zà-ÿ])/g, (m, a, b) => a + b.toUpperCase());\n\nfunction rowsOf(resp) {\n  const c = (resp.columns || []).map(x => x.name);\n  return (resp.rows || []).map(a => Object.fromEntries(c.map((k, i) => [k, a[i]])));\n}\nasync function q(sql) {\n  const ref = d2.params.consultaRush || RUSH_FALLBACK;\n  let dbx;\n  try {\n    const res = await d2.rush(ref).invoke({ sql });\n    dbx = res.data.result.data;              // envelope do listener: res.data, depois o payload do Databricks\n  } catch (e) {\n    throw new Error('consulta indisponível (rush ' + ref + '): ' + (e && e.message ? e.message : e));\n  }\n  if (dbx.state && dbx.state !== 'SUCCEEDED') {\n    throw new Error('Databricks ' + dbx.state + ': ' + ((dbx.error && dbx.error.message) || 'erro desconhecido'));\n  }\n  return dbx;\n}\n\nexport default {\n  css: `\n  :host{display:block;height:100%;--bg:#f5f5f7;--panel:#ffffff;--panel2:#f2f2f7;--line:#e5e5ea;--ink:#1c1c1e;--mut:#6e6e73;--acc:#007aff;--closing:#ff3b30}\n  *{box-sizing:border-box}\n  .root{display:flex;flex-direction:column;height:100%;background:var(--bg);color:var(--ink);\n    font:13px/1.45 -apple-system,BlinkMacSystemFont,\"SF Pro Text\",\"Segoe UI\",Roboto,sans-serif;-webkit-font-smoothing:antialiased}\n  header{padding:10px 16px;background:rgba(246,246,248,.85);backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);\n    border-bottom:1px solid var(--line);display:flex;align-items:center;gap:10px;flex-wrap:wrap;flex:0 0 auto}\n  header h1{font-size:14.5px;margin:0;font-weight:600;letter-spacing:-.1px;color:var(--ink)}\n  .spacer{flex:1}\n  .pill{font-size:10.5px;padding:2.5px 9px;border-radius:99px;border:1px solid var(--line);color:var(--mut);background:var(--panel2);white-space:nowrap}\n  .pill b{color:var(--ink);font-weight:600}\n  .status{font-size:11px;color:var(--mut)}\n  .status.err{color:var(--closing)}\n  .btn{font:inherit;font-size:12px;padding:4.5px 11px;border-radius:7px;border:1px solid var(--line);background:var(--panel);color:var(--ink);cursor:pointer}\n  .btn:hover{border-color:#d5d5da;background:#fbfbfd}\n  .btn:active{background:#f0f0f4}\n  .btn:disabled{opacity:.5;cursor:progress}\n  .howto{padding:8px 16px;background:var(--panel);border-bottom:1px solid var(--line);display:flex;gap:16px;flex-wrap:wrap;\n    font-size:11.5px;color:var(--mut);flex:0 0 auto}\n  .howto b{color:var(--ink)} .howto span{max-width:360px}\n  .body{flex:1;display:flex;min-height:0}\n  .stage{flex:1;position:relative;min-width:0}\n  canvas{width:100%;height:100%;display:block}\n  .side{width:334px;flex:0 0 334px;border-left:1px solid var(--line);padding:12px;display:flex;flex-direction:column;gap:12px;overflow:auto}\n  .card{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:12px 13px}\n  .card h2{margin:0 0 9px;font-size:10.5px;letter-spacing:.06em;text-transform:uppercase;color:var(--mut);font-weight:600}\n  .card h3{margin:0 0 2px;font-size:15px;font-weight:600;letter-spacing:-.2px}\n  .card .sub{font-size:11.5px;color:var(--mut);margin-bottom:10px}\n  .facts{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-bottom:10px}\n  .fact{background:var(--panel2);border-radius:8px;padding:6px 8px}\n  .fact b{display:block;font-size:13px;font-weight:600}\n  .fact span{font-size:9.5px;color:var(--mut);letter-spacing:.05em;text-transform:uppercase}\n  .conn{border-top:1px solid var(--line);padding-top:8px}\n  .conn h4{margin:0 0 4px;font-size:10px;letter-spacing:.06em;text-transform:uppercase;color:var(--mut);font-weight:600}\n  .crow{display:flex;align-items:center;gap:8px;padding:5px 6px;margin:0 -6px;cursor:pointer;border-radius:7px}\n  .crow:hover{background:var(--panel2)}\n  .cdot{width:22px;height:22px;border-radius:50%;flex:0 0 22px;display:flex;align-items:center;justify-content:center;\n    font-size:9px;font-weight:600;color:#3a3a3c;border:1px solid rgba(60,60,67,.12)}\n  .cname{flex:1;font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n  .tags{display:flex;gap:3px;flex-wrap:wrap;justify-content:flex-end;max-width:110px}\n  .tag{width:7px;height:7px;border-radius:50%}\n  .hintline{font-size:11.5px;color:var(--mut);line-height:1.5}\n  .hintline b{color:var(--ink)}\n  .legend{display:flex;flex-wrap:wrap;gap:6px}\n  .chip{display:inline-flex;align-items:center;gap:6px;background:var(--panel2);border:1px solid var(--line);border-radius:99px;\n    padding:4px 10px 4px 7px;font:inherit;font-size:11.5px;color:var(--ink);cursor:pointer;user-select:none;\n    transition:opacity .12s,border-color .12s,color .12s}\n  .chip i{width:8px;height:8px;border-radius:50%;flex:0 0 8px}\n  .chip b{font-weight:500;color:var(--mut);font-size:10px}\n  .chip:hover{border-color:var(--acc);color:var(--acc)}\n  .chip:focus-visible{outline:2px solid rgba(0,122,255,.35);outline-offset:1px}\n  .chip.off{opacity:.4}\n  .tip{position:absolute;pointer-events:none;background:rgba(28,28,30,.94);color:#fff;border-radius:8px;padding:6px 9px;\n    font-size:11.5px;line-height:1.35;opacity:0;transition:opacity .1s;max-width:230px;z-index:5;box-shadow:0 8px 24px rgba(0,0,0,.18)}\n  .tip.on{opacity:1}\n  .tip em{font-style:normal;color:#aeaeb2;display:block;font-size:10.5px;margin-top:2px}\n  `,\n\n  // Shell estático de propósito: há um <canvas> aqui, e qualquer leitura reativa dentro de\n  // render() re-executa o render inteiro e devolve o canvas ao default 300x150 (checklist §15).\n  // Tudo que muda — contagem, cards, chips — é escrito por DOM dentro de mounted().\n  render() {\n    const chips = DIMS.map(d =>\n      `<button class=\"chip\" data-k=\"${d.k}\" title=\"${esc(d.hint)}\"><i style=\"background:${d.color}\"></i>${d.label} <b data-n=\"${d.k}\"></b></button>`\n    ).join('');\n    return `<div class=\"root\">\n      <header>\n        <h1>Senso de rede — consultoras</h1>\n        <span class=\"pill\"><b id=\"count\">—</b> pessoas</span>\n        <span class=\"status\" id=\"status\">consultando…</span>\n        <div class=\"spacer\"></div>\n        <button class=\"btn\" id=\"reload\">Recarregar</button>\n      </header>\n      <div class=\"howto\">\n        <span><b>1.</b> Cada nó é uma CB — o tamanho segue os pontos do ciclo, o anel marca quem está ativa.</span>\n        <span><b>2.</b> Cada laço é uma afinidade calculada; as contas no meio contam quantas dimensões as duas dividem.</span>\n        <span><b>3.</b> Clique num nó pra ver quem ele alcança — arraste pra reorganizar.</span>\n        <span><b>4.</b> Ligue e desligue dimensões nas marcações à direita.</span>\n      </div>\n      <div class=\"body\">\n        <div class=\"stage\" data-d2-static>\n          <canvas id=\"net\"></canvas>\n          <div class=\"tip\" id=\"tip\"></div>\n        </div>\n        <aside class=\"side\">\n          <section class=\"card\">\n            <h2>Afinidades</h2>\n            <div class=\"legend\" id=\"legend\">${chips}</div>\n          </section>\n          <section class=\"card\" id=\"detail\"></section>\n        </aside>\n      </div>\n    </div>`;\n  },\n\n  mounted(d2, root) {\n    const $ = s => root.querySelector(s);\n    const cv = $('#net'), ctx = cv.getContext('2d'), tip = $('#tip');\n    const S = {\n      nodes: [], edges: [], adj: new Map(), W: {}, on: {},\n      hover: null, sel: null, drag: null, alpha: 0, w: 0, h: 0\n    };\n    DIMS.forEach(d => S.on[d.k] = true);\n\n    const say = (msg, err) => { const el = $('#status'); el.textContent = msg || ''; el.classList.toggle('err', !!err); };\n\n    // ---------- canvas ----------\n    function resize() {\n      const r = cv.getBoundingClientRect();\n      const dpr = Math.min(window.devicePixelRatio || 1, 2);\n      S.w = r.width; S.h = r.height;\n      cv.width = Math.max(1, Math.round(r.width * dpr));\n      cv.height = Math.max(1, Math.round(r.height * dpr));\n      ctx.setTransform(dpr, 0, 0, dpr, 0, 0);   // o resize zera a matriz — reaplicar sempre\n    }\n    const ro = new ResizeObserver(resize); ro.observe(cv);\n    d2.onUnmount(() => ro.disconnect());\n    resize();\n\n    // ---------- amostra ----------\n    async function nameColumn() {\n      // O nome da CB não está no contrato conhecido da tabela, então em vez de chutar um\n      // DS_NOME que pode não existir (e derrubar a query inteira), descobrimos a coluna.\n      try {\n        const d = await q(`DESCRIBE ${T}`);\n        const cols = rowsOf(d).map(r => String(r.col_name || r.name || '')).filter(Boolean);\n        const cand = cols.filter(c => /NOME|NAME/i.test(c) &&\n          !/LEADER|LIDER|MUNIC|ESTAD|SETOR|GRUPO|CANAL|MARCA|PAIS|REGIA|GV|NVL/i.test(c));\n        cand.sort((a, b) => (/CONSULT|CB|PESSOA/i.test(b) ? 1 : 0) - (/CONSULT|CB|PESSOA/i.test(a) ? 1 : 0));\n        return cand[0] || null;\n      } catch (e) { return null; }\n    }\n    function sqlFor(nomeCol, where, order, lim) {\n      const nome = nomeCol ? `MAX(${nomeCol}) nome,` : '';\n      return `SELECT CD_CONSULTORA cb, ${nome}\n        MAX(DS_MUNICIPIO) municipio, MAX(DS_ESTADO) uf, MAX(CD_SETOR) setor,\n        MAX(CD_GRUPO) grupo, MAX(DS_LEADER_NAME) lider, MAX(DS_NVL_PLAN_CRESC) nivel,\n        SUM(QT_PEDIDOS_CICLO) pedidos, SUM(QT_PONTOS_CICLO) pontos,\n        SUM(VL_PEDIDOS_NATURA_CICLO) rec_nat, SUM(VL_PEDIDOS_AVON_CICLO) rec_avon,\n        MAX(CASE WHEN ST_FEZ_PED_CICLO_ATUAL THEN 1 ELSE 0 END) ativa\n       FROM ${T} WHERE ${where} GROUP BY CD_CONSULTORA ${order} LIMIT ${lim}`;\n    }\n\n    // Faixas relativas à AMOSTRA, não absolutas: \"ritmo parecido\" só quer dizer alguma coisa\n    // comparado com as outras CBs desta consulta.\n    function bucketer(vals) {\n      const v = vals.filter(x => isFinite(x)).sort((a, b) => a - b);\n      if (!v.length) return () => 0;\n      const at = p => v[Math.min(v.length - 1, Math.floor(p * v.length))];\n      const q1 = at(.25), q2 = at(.5), q3 = at(.75);\n      return x => (x <= q1 ? 0 : x <= q2 ? 1 : x <= q3 ? 2 : 3);\n    }\n\n    // Amostra sintética — existe para revisar layout/física sem sessão do simulador (o listener do\n    // Databricks é gated). Nunca é o default e se anuncia na tela: um grafo bonito com gente que não\n    // existe é pior do que um erro honesto.\n    function demoRows(n) {\n      const NOMES = ['Ana Ribeiro','Marta Souza','Cláudia Lima','Rita Alves','Vera Nunes','Sônia Braga','Ivone Castro','Lúcia Prado','Neide Rocha','Tânia Melo','Dora Pires','Elis Faria','Bruna Antunes','Carla Moraes','Selma Dutra','Joana Bastos','Regina Paiva','Marli Cardoso','Fátima Goulart','Simone Teles'];\n      const MUN = ['Brasília','Formosa','Buritis','Unaí','Paracatu','Arinos','Riachinho','Bonfinópolis','Chapada Gaúcha','Urucuia'];\n      const NIV = ['Bronze','Cristal','Prata','Ouro','Diamante'];\n      const out = [];\n      for (let i = 0; i < n; i++) {\n        const h = hash('cb' + i);\n        const mun = MUN[h % MUN.length];\n        const setor = 3200 + ((h >> 3) % 6) * 7;\n        const grupo = 100 + ((h >> 5) % 14);\n        const escala = .25 + ((h >> 7) % 100) / 100 * 1.8;\n        out.push({\n          cb: 900000 + i,\n          nome: NOMES[h % NOMES.length] + ' ' + String.fromCharCode(65 + (h >> 11) % 26) + '.',\n          municipio: mun, uf: mun === 'Chapada Gaúcha' || mun === 'Urucuia' ? 'MG' : 'GO',\n          setor: setor, grupo: grupo, lider: 'Líder ' + grupo,\n          nivel: NIV[(h >> 13) % NIV.length],\n          pedidos: Math.round(4 + escala * 22), pontos: Math.round(120 + escala * 900),\n          rec_nat: Math.round(escala * 3200), rec_avon: Math.round(escala * 3200 * (((h >> 17) % 100) / 100)),\n          ativa: (h >> 19) % 10 > 2 ? 1 : 0\n        });\n      }\n      return out;\n    }\n\n    async function load() {\n      say('consultando o snapshot mais recente…');\n      const lim = Math.max(12, Math.min(400, +d2.param('limite', 82) || 82));\n      const setor = digits(d2.param('setor', ''));\n      const uf = letters(d2.param('uf', '')).toUpperCase();\n      const aleat = String(d2.param('amostra', 'top') || 'top').toLowerCase().indexOf('aleat') === 0;\n      let where = `CD_PAIS=1 AND CD_GRUPO>0 AND DT_HISTORICO=${SNAP}`;\n      if (setor) where += ` AND CD_SETOR=${setor}`;\n      if (uf) where += ` AND UPPER(DS_ESTADO)='${uf}'`;\n      const order = aleat ? 'ORDER BY RAND()' : 'ORDER BY pontos DESC';\n\n      // `amostra: \"demo\"` em vez de um param novo — a declaração já existe e o modo fica visível\n      // no mesmo lugar onde se escolhe top/aleatória, não escondido num booleano à parte.\n      const demo = String(d2.param('amostra', 'top') || '').toLowerCase().indexOf('demo') === 0;\n      let raw;\n      if (demo) {\n        raw = demoRows(lim);\n      } else {\n        const nc = await nameColumn();\n        const attempts = nc ? [nc, null] : [null];\n        let data = null, lastErr = null;\n        for (const col of attempts) {\n          try { data = await q(sqlFor(col, where, order, lim)); break; }\n          catch (e) { lastErr = e; }\n        }\n        if (!data) throw lastErr || new Error('sem resposta da consulta');\n        raw = rowsOf(data);\n      }\n      if (!raw.length) throw new Error('nenhuma CB encontrada com esses filtros' + (setor ? ' (setor ' + setor + ')' : '') + (uf ? ' (UF ' + uf + ')' : ''));\n\n      const bPed = bucketer(raw.map(r => +r.pedidos || 0));\n      const bPon = bucketer(raw.map(r => +r.pontos || 0));\n      const bRec = bucketer(raw.map(r => (+r.rec_nat || 0) + (+r.rec_avon || 0)));\n\n      S.nodes = raw.map((r, i) => {\n        const nat = +r.rec_nat || 0, avon = +r.rec_avon || 0, rec = nat + avon;\n        const nome = titleCase(r.nome || '');\n        const cb = String(r.cb == null ? '' : r.cb);\n        const ini = nome ? d2.fmt.initials(nome, 2) : cb.slice(-2);\n        return {\n          i, cb, nome, ini,\n          municipio: titleCase(r.municipio || ''), uf: String(r.uf || ''),\n          setor: String(r.setor == null ? '' : r.setor), grupo: String(r.grupo == null ? '' : r.grupo),\n          lider: titleCase(r.lider || ''), nivel: String(r.nivel || ''),\n          pedidos: +r.pedidos || 0, pontos: +r.pontos || 0, receita: rec,\n          ativa: +r.ativa === 1 ? 1 : 0,\n          bRitmo: bPed(+r.pedidos || 0), bAlcance: bPon(+r.pontos || 0), bPorte: bRec(rec),\n          bMarca: rec > 0 ? Math.min(3, Math.floor((nat / rec) * 4)) : null,\n          tint: TINTS[hash(String(r.setor) + '|' + String(r.grupo)) % TINTS.length],\n          r: 0, x: 0, y: 0, vx: 0, vy: 0\n        };\n      });\n\n      const maxP = Math.max(...S.nodes.map(n => n.pontos), 1);\n      S.nodes.forEach(n => {\n        n.r = 7 + 17 * Math.sqrt(Math.max(0, n.pontos) / maxP);\n        const a = (n.i / S.nodes.length) * Math.PI * 2, rad = 140 + (hash(n.cb) % 220);\n        n.x = S.w / 2 + Math.cos(a) * rad; n.y = S.h / 2 + Math.sin(a) * rad;\n      });\n\n      DIMS.forEach(d => S.W[d.k] = weightOf(d.k));\n      rebuild();\n      $('#count').textContent = d2.fmt.number(S.nodes.length);\n      say((demo ? '⚠ AMOSTRA SINTÉTICA (dadosDemo) — ' : '') + `${S.nodes.length} CBs · ${S.edges.length} laços · ${S.nodes.filter(n => n.ativa).length} ativas no ciclo`, demo);\n      renderDetail(null);\n    }\n\n    // ---------- afinidades ----------\n    function keyOf(k, n) {\n      if (k === 'origem') return n.municipio ? n.uf + '/' + n.municipio : null;\n      if (k === 'territorio') return n.setor || null;\n      if (k === 'rede') return n.grupo || null;\n      if (k === 'trajetoria') return n.nivel || null;\n      if (k === 'ritmo') return 'r' + n.bRitmo;\n      if (k === 'alcance') return 'a' + n.bAlcance;\n      if (k === 'porte') return 'p' + n.bPorte;\n      if (k === 'marca') return n.bMarca == null ? null : 'm' + n.bMarca;\n      if (k === 'constancia') return n.ativa ? 'ativa' : null;\n      return null;\n    }\n    // Peso = raridade. p = chance de dois nós sorteados caírem no mesmo grupo desta dimensão;\n    // log2(1/p) transforma isso em bits de informação, então \"mesma líder\" pesa muito mais que\n    // \"ambas ativas\" sem que ninguém precise arbitrar uma tabela de pesos à mão.\n    function weightOf(k) {\n      const g = {}, n = S.nodes.length;\n      S.nodes.forEach(x => { const key = keyOf(k, x); if (key != null) g[key] = (g[key] || 0) + 1; });\n      let p = 0; Object.values(g).forEach(c => { p += (c / n) * (c / n); });\n      return p > 0 ? Math.max(.35, Math.min(6, Math.log2(1 / p))) : 0;\n    }\n    function sharedDims(a, b) {\n      const out = [];\n      for (const d of DIMS) {\n        if (!S.on[d.k]) continue;\n        const ka = keyOf(d.k, a); if (ka == null) continue;\n        if (ka === keyOf(d.k, b)) out.push(d.k);\n      }\n      return out;\n    }\n    function rebuild() {\n      const ns = S.nodes, K = Math.max(1, Math.min(8, +d2.param('lacos', 4) || 4));\n      const cand = ns.map(() => []);\n      for (let i = 0; i < ns.length; i++) {\n        for (let j = i + 1; j < ns.length; j++) {\n          const dims = sharedDims(ns[i], ns[j]);\n          if (!dims.length) continue;\n          let sc = 0; for (const k of dims) sc += S.W[k] || 0;\n          if (sc <= 0) continue;\n          cand[i].push({ o: j, sc, dims }); cand[j].push({ o: i, sc, dims });\n        }\n      }\n      // Corte por nó, não global: um corte global deixaria as CBs de município grande com\n      // dezenas de laços e as demais órfãs — cada uma guarda seus K vínculos mais fortes.\n      const seen = new Set(), out = [];\n      cand.forEach((list, i) => {\n        list.sort((a, b) => b.sc - a.sc).slice(0, K).forEach(e => {\n          const a = Math.min(i, e.o), b = Math.max(i, e.o), key = a + ':' + b;\n          if (seen.has(key)) return; seen.add(key);\n          const top = e.dims.slice().sort((x, y) => (S.W[y] || 0) - (S.W[x] || 0))[0];\n          out.push({ a, b, sc: e.sc, dims: e.dims, top });\n        });\n      });\n      S.edges = out;\n      S.adj = new Map();\n      out.forEach((e, idx) => {\n        if (!S.adj.has(e.a)) S.adj.set(e.a, []);\n        if (!S.adj.has(e.b)) S.adj.set(e.b, []);\n        S.adj.get(e.a).push(idx); S.adj.get(e.b).push(idx);\n      });\n      const maxSc = Math.max(...out.map(e => e.sc), 1);\n      out.forEach(e => e.n = e.sc / maxSc);\n      const counts = {}; DIMS.forEach(d => counts[d.k] = 0);\n      out.forEach(e => e.dims.forEach(k => counts[k]++));\n      DIMS.forEach(d => { const el = root.querySelector(`[data-n=\"${d.k}\"]`); if (el) el.textContent = counts[d.k] ? counts[d.k] : ''; });\n      S.alpha = 1;\n    }\n\n    // ---------- física ----------\n    function tick() {\n      const ns = S.nodes, cx = S.w / 2, cy = S.h / 2;\n      if (S.alpha < .02 || !ns.length) return;\n      const k = S.alpha;\n      for (let i = 0; i < ns.length; i++) {\n        const a = ns[i];\n        for (let j = i + 1; j < ns.length; j++) {\n          const b = ns[j];\n          let dx = b.x - a.x, dy = b.y - a.y, d = Math.hypot(dx, dy);\n          if (d < .01) {   // coincidentes: desempata com um deslocamento determinístico\n            dx = ((hash(a.cb + b.cb) % 21) - 10) / 10;\n            dy = ((hash(b.cb + a.cb) % 21) - 10) / 10;\n            d = Math.hypot(dx, dy) || 1;\n          }\n          const ux = dx / d, uy = dy / d;\n          const rep = Math.min(4, 9000 / (d * d)) * k;\n          a.vx -= ux * rep; a.vy -= uy * rep;\n          b.vx += ux * rep; b.vy += uy * rep;\n          // Colisão dura, resolvida na POSIÇÃO e não na velocidade: só repulsão deixa os círculos\n          // se sobreporem enquanto o sistema esfria, e as iniciais viram sopa.\n          const min = a.r + b.r + 6;\n          if (d < min) {\n            const push = (min - d) * .5;\n            a.x -= ux * push; a.y -= uy * push;\n            b.x += ux * push; b.y += uy * push;\n          }\n        }\n      }\n      for (const e of S.edges) {\n        const a = ns[e.a], b = ns[e.b];\n        const dx = b.x - a.x, dy = b.y - a.y, d = Math.max(.01, Math.hypot(dx, dy));\n        const target = 170 - 95 * e.n;          // laço forte = mais curto\n        const f = (d - target) * .022 * (.4 + .6 * e.n) * k;\n        const ux = dx / d, uy = dy / d;\n        a.vx += ux * f; a.vy += uy * f;\n        b.vx -= ux * f; b.vy -= uy * f;\n      }\n      for (const n of ns) {\n        if (S.drag === n) { n.vx = 0; n.vy = 0; continue; }\n        n.vx += (cx - n.x) * .002 * k; n.vy += (cy - n.y) * .002 * k;\n        n.vx *= .84; n.vy *= .84;\n        n.x += Math.max(-9, Math.min(9, n.vx));\n        n.y += Math.max(-9, Math.min(9, n.vy));\n      }\n      S.alpha *= .994;\n    }\n\n    // Enquadramento roda TODO frame, fora do laço de física: se ficasse dentro, congelaria junto\n    // com o alpha e o grafo terminaria transbordando o palco (ou torto) exatamente onde parou.\n    // Também é o que reenquadra depois de um resize, sem precisar reaquecer a simulação.\n    function fit() {\n      const ns = S.nodes;\n      if (!ns.length || S.drag) return;\n      let x0 = Infinity, y0 = Infinity, x1 = -Infinity, y1 = -Infinity;\n      for (const n of ns) {\n        x0 = Math.min(x0, n.x - n.r); y0 = Math.min(y0, n.y - n.r);\n        x1 = Math.max(x1, n.x + n.r); y1 = Math.max(y1, n.y + n.r);\n      }\n      const cx = S.w / 2, cy = S.h / 2;\n      const ox = cx - (x0 + x1) / 2, oy = cy - (y0 + y1) / 2;\n      if (Math.abs(ox) > .4 || Math.abs(oy) > .4) for (const n of ns) { n.x += ox * .12; n.y += oy * .12; }\n      const sc = Math.min(1, (S.w - 56) / Math.max(1, x1 - x0), (S.h - 56) / Math.max(1, y1 - y0));\n      if (sc < .999) for (const n of ns) {\n        n.x = cx + (n.x - cx) * (1 - (1 - sc) * .12);\n        n.y = cy + (n.y - cy) * (1 - (1 - sc) * .12);\n      }\n    }\n\n    // ---------- desenho ----------\n    function draw() {\n      ctx.clearRect(0, 0, S.w, S.h);\n      ctx.fillStyle = BG; ctx.fillRect(0, 0, S.w, S.h);\n      if (!S.nodes.length) return;\n      const focus = S.sel != null ? S.sel : S.hover;\n      const near = new Set();\n      if (focus != null) { near.add(focus); (S.adj.get(focus) || []).forEach(i => { near.add(S.edges[i].a); near.add(S.edges[i].b); }); }\n\n      S.edges.forEach((e, idx) => {\n        const a = S.nodes[e.a], b = S.nodes[e.b];\n        const lit = focus == null || e.a === focus || e.b === focus;\n        const col = (DIM_BY[e.top] || DIMS[0]).color;\n        ctx.globalAlpha = focus == null ? .16 + .34 * e.n : (lit ? .5 + .4 * e.n : .05);\n        ctx.strokeStyle = col;\n        ctx.lineWidth = .5 + 1.7 * e.n;\n        ctx.beginPath(); ctx.moveTo(a.x, a.y); ctx.lineTo(b.x, b.y); ctx.stroke();\n        // uma conta por dimensão compartilhada, no meio do laço — é a leitura rápida de\n        // \"quantas coisas estas duas têm em comum\" sem precisar do hover\n        const dims = e.dims;\n        for (let i = 0; i < dims.length; i++) {\n          const t = (i + 1) / (dims.length + 1);\n          ctx.globalAlpha = focus == null ? .55 : (lit ? .95 : .08);\n          ctx.fillStyle = (DIM_BY[dims[i]] || DIMS[0]).color;\n          ctx.beginPath(); ctx.arc(a.x + (b.x - a.x) * t, a.y + (b.y - a.y) * t, 1.9 + 1.3 * e.n, 0, 6.284); ctx.fill();\n        }\n      });\n\n      S.nodes.forEach(n => {\n        const dim = focus != null && !near.has(n.i);\n        ctx.globalAlpha = dim ? .18 : 1;\n        ctx.beginPath(); ctx.arc(n.x, n.y, n.r, 0, 6.284);\n        ctx.fillStyle = n.tint; ctx.fill();\n        ctx.lineWidth = n.i === focus ? 2.5 : 1;\n        ctx.strokeStyle = n.i === focus ? '#007aff' : (n.ativa ? 'rgba(60,60,67,.38)' : 'rgba(60,60,67,.14)');\n        ctx.stroke();\n        if (n.r >= 12) {   // nós pequenos ficam como pontos, sem inicial ilegível dentro\n          ctx.globalAlpha = dim ? .2 : .85;\n          ctx.fillStyle = '#3a3a3c';\n          ctx.font = `600 ${Math.round(n.r * .78)}px -apple-system,\"Segoe UI\",Roboto,sans-serif`;\n          ctx.textAlign = 'center'; ctx.textBaseline = 'middle';\n          ctx.fillText(n.ini, n.x, n.y + .5);\n        }\n      });\n      ctx.globalAlpha = 1;\n    }\n\n    d2.raf(() => { tick(); fit(); draw(); });\n\n    // ---------- interação ----------\n    function hit(px, py) {\n      let best = null, bd = Infinity;\n      for (const n of S.nodes) {\n        const d = Math.hypot(n.x - px, n.y - py);\n        if (d < n.r + 5 && d < bd) { bd = d; best = n; }\n      }\n      return best;\n    }\n    const rel = ev => { const r = cv.getBoundingClientRect(); return [ev.clientX - r.left, ev.clientY - r.top]; };\n\n    d2.on(cv, 'pointermove', ev => {\n      const [x, y] = rel(ev);\n      if (S.drag) { S.drag.x = x; S.drag.y = y; S.alpha = Math.max(S.alpha, .35); return; }\n      const n = hit(x, y);\n      S.hover = n ? n.i : null;\n      cv.style.cursor = n ? 'pointer' : 'default';\n      if (n) {\n        tip.classList.add('on');\n        tip.innerHTML = `<b>${esc(n.nome || 'CB ' + n.cb)}</b><em>${esc(n.municipio)}${n.uf ? '/' + esc(n.uf) : ''} · setor ${esc(n.setor)} · ${d2.fmt.number(n.pontos)} pontos</em>`;\n        const tw = tip.offsetWidth || 200;\n        tip.style.left = Math.max(6, Math.min(S.w - tw - 6, x + 14)) + 'px';\n        tip.style.top = Math.max(6, y - 42) + 'px';\n      } else tip.classList.remove('on');\n    });\n    d2.on(cv, 'pointerdown', ev => {\n      const [x, y] = rel(ev); const n = hit(x, y);\n      if (n) { S.drag = n; cv.setPointerCapture(ev.pointerId); }\n    });\n    d2.on(cv, 'pointerup', ev => {\n      const [x, y] = rel(ev); const n = hit(x, y);\n      S.drag = null;\n      if (n) { S.sel = (S.sel === n.i ? null : n.i); renderDetail(S.sel); }\n      else { S.sel = null; renderDetail(null); }\n    });\n    d2.on(cv, 'pointerleave', () => { S.hover = null; S.drag = null; tip.classList.remove('on'); });\n\n    d2.on('.chip', 'click', (e, el) => {\n      const k = el.dataset.k;\n      S.on[k] = !S.on[k];\n      el.classList.toggle('off', !S.on[k]);\n      if (S.nodes.length) { rebuild(); renderDetail(S.sel); }\n    });\n    d2.on('.crow', 'click', (e, el) => { S.sel = +el.dataset.i; renderDetail(S.sel); });\n    d2.on('#reload', 'click', (e, el) => {\n      el.disabled = true;\n      S.sel = null; S.hover = null;\n      load().catch(err => say(err && err.message ? err.message : String(err), true))\n        .then(() => { el.disabled = false; });\n    });\n\n    // ---------- painel ----------\n    function renderDetail(i) {\n      const el = $('#detail');\n      if (i == null || !S.nodes[i]) {\n        const on = DIMS.filter(d => S.on[d.k]);\n        el.innerHTML = `<div class=\"hintline\">Cada laço é uma afinidade calculada, não um cadastro: duas CBs se ligam quando compartilham origem, território, líder, trajetória ou um padrão de trabalho parecido.<br><br>O peso de cada dimensão é o inverso da sua frequência — por isso <b>${esc((on.slice().sort((a, b) => (S.W[b.k] || 0) - (S.W[a.k] || 0))[0] || {}).label || '—')}</b> puxa mais que as demais nesta amostra.<br><br>Clique num nó para ver quem ele alcança. Arraste para reorganizar.</div>`;\n        return;\n      }\n      const n = S.nodes[i];\n      const mine = (S.adj.get(i) || []).map(x => S.edges[x]).sort((a, b) => b.sc - a.sc).slice(0, 8);\n      const fact = (v, l) => `<div class=\"fact\"><b>${v}</b><span>${l}</span></div>`;        el.innerHTML = `<div>\n        <h3>${esc(n.nome || 'CB ' + n.cb)}</h3>\n        <div class=\"sub\">${esc(n.municipio)}${n.uf ? ' · ' + esc(n.uf) : ''} · setor ${esc(n.setor)}${n.lider ? ' · líder ' + esc(n.lider) : ''}</div>\n        <div class=\"facts\">\n          ${fact(d2.fmt.number(n.pontos), 'pontos')}\n          ${fact(d2.fmt.number(n.pedidos), 'pedidos')}\n          ${fact(d2.fmt.currency(n.receita, 'BRL'), 'receita')}\n          ${fact(esc(n.nivel || '—'), 'nível')}\n        </div>\n        <div class=\"conn\"><h4>${mine.length} afinidades mais fortes</h4>\n          ${mine.map(e => {\n            const o = S.nodes[e.a === i ? e.b : e.a];\n            return `<div class=\"crow\" data-i=\"${o.i}\" title=\"${esc(e.dims.map(k => (DIM_BY[k] || {}).hint).join(' · '))}\">\n              <span class=\"cdot\" style=\"background:${o.tint}\">${esc(o.ini)}</span>\n              <span class=\"cname\">${esc(o.nome || 'CB ' + o.cb)}</span>\n              <span class=\"tags\">${e.dims.map(k => `<i class=\"tag\" style=\"background:${(DIM_BY[k] || {}).color}\"></i>`).join('')}</span>\n            </div>`;\n          }).join('')}\n        </div>\n      </div>`;\n    }\n\n    load().catch(err => {\n      say(err && err.message ? err.message : String(err), true);\n      $('#detail').innerHTML = `<div class=\"hintline\">A consulta roda no listener do Databricks, que exige sessão do simulador. Se a mensagem acima fala em 401/permissão, é preciso estar logado no app.</div>`;\n    });\n  }\n};"}},"limite":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"limite"}}}},"setor":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"setor"}}}},"uf":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"uf"}}}},"amostra":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"amostra"}}}},"lacos":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"lacos"}}}},"consultaRush":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"consultaRush"}}}}}}}},"parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"limite":{"component":"data2-core-primitives@Number"},"setor":{"component":"data2-core-primitives@String"},"uf":{"component":"data2-core-primitives@String"},"amostra":{"component":"data2-core-primitives@String"},"lacos":{"component":"data2-core-primitives@Number"},"consultaRush":{"component":"data2-core-types@InteractiveModuleReference"}}}},"__d2PrevCode":{"code":"// ---------- Senso de rede — afinidades entre consultoras de beleza ----------\n// Cada nó é uma CB; cada laço é uma AFINIDADE DERIVADA do snapshot mais recente, nunca um\n// cadastro de relacionamento — não existe tabela de \"quem conhece quem\". Por isso o peso de\n// cada dimensão é o INVERSO DA SUA FREQUÊNCIA na amostra: dividir a mesma líder diz muito mais\n// sobre duas CBs do que ambas estarem ativas no ciclo, e é o peso que decide a cor, a espessura\n// e quais laços sobrevivem ao corte por nó. Sem isso o grafo vira uma malha uniforme onde tudo\n// se liga a tudo e nada significa nada.\nconst T = 'product.perfil_cb.crm_perfil_cb_diaria_historico';\nconst RUSH_FALLBACK = 'AwW_11Nkg-dKksP7ic8V8';\nconst SNAP = `(SELECT MAX(DT_HISTORICO) FROM ${T} WHERE CD_PAIS=1)`;\n// Paleta = cores de sistema do macOS, as mesmas do simulador de timeline, pra que os dois módulos\n// leiam como um produto só e não como duas ferramentas diferentes coladas.\nconst BG = '#f5f5f7';\n\nconst DIMS = [\n  { k:'origem',     label:'Origem',     color:'#ff9500', hint:'mesmo município' },\n  { k:'territorio', label:'Território', color:'#34c759', hint:'mesmo setor' },\n  { k:'rede',       label:'Rede',       color:'#007aff', hint:'mesma líder' },\n  { k:'trajetoria', label:'Trajetória', color:'#af52de', hint:'mesmo nível do plano' },\n  { k:'ritmo',      label:'Ritmo',      color:'#ff2d55', hint:'pedidos por ciclo parecidos' },\n  { k:'alcance',    label:'Alcance',    color:'#ffcc00', hint:'pontos parecidos' },\n  { k:'porte',      label:'Porte',      color:'#30b0c7', hint:'receita parecida' },\n  { k:'marca',      label:'Marca',      color:'#a2845e', hint:'mix Natura/Avon parecido' },\n  { k:'constancia', label:'Constância', color:'#8e8e93', hint:'ativas no ciclo' },\n];\nconst DIM_BY = {}; DIMS.forEach(d => DIM_BY[d.k] = d);\nconst TINTS = ['#e6f0ff','#e6f7ea','#fff2e0','#f6ecfd','#ffe9ee','#e6f5f9','#f2f2f7'];\n\nconst esc = s => (s == null ? '' : String(s)).replace(/[&<>\"]/g, c => ({'&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;'}[c]));\nconst digits = s => String(s == null ? '' : s).replace(/[^0-9]/g, '');\nconst letters = s => String(s == null ? '' : s).replace(/[^A-Za-zÀ-ÿ]/g, '');\nconst hash = s => { let h = 0; const t = String(s || ''); for (let i = 0; i < t.length; i++) h = (h * 31 + t.charCodeAt(i)) | 0; return Math.abs(h); };\nconst titleCase = s => String(s || '').toLowerCase().replace(/(^|[\\s'-])([a-zà-ÿ])/g, (m, a, b) => a + b.toUpperCase());\n\nfunction rowsOf(resp) {\n  const c = (resp.columns || []).map(x => x.name);\n  return (resp.rows || []).map(a => Object.fromEntries(c.map((k, i) => [k, a[i]])));\n}\nasync function q(sql) {\n  const ref = d2.params.consultaRush || RUSH_FALLBACK;\n  let dbx;\n  try {\n    const res = await d2.rush(ref).invoke({ sql });\n    dbx = res.data.result.data;              // envelope do listener: res.data, depois o payload do Databricks\n  } catch (e) {\n    throw new Error('consulta indisponível (rush ' + ref + '): ' + (e && e.message ? e.message : e));\n  }\n  if (dbx.state && dbx.state !== 'SUCCEEDED') {\n    throw new Error('Databricks ' + dbx.state + ': ' + ((dbx.error && dbx.error.message) || 'erro desconhecido'));\n  }\n  return dbx;\n}\n\nexport default {\n  css: `\n  :host{display:block;height:100%;--bg:#f5f5f7;--panel:#ffffff;--panel2:#f2f2f7;--line:#e5e5ea;--ink:#1c1c1e;--mut:#6e6e73;--acc:#007aff;--closing:#ff3b30}\n  *{box-sizing:border-box}\n  .root{display:flex;flex-direction:column;height:100%;background:var(--bg);color:var(--ink);\n    font:13px/1.45 -apple-system,BlinkMacSystemFont,\"SF Pro Text\",\"Segoe UI\",Roboto,sans-serif;-webkit-font-smoothing:antialiased}\n  header{padding:10px 16px;background:rgba(246,246,248,.85);backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);\n    border-bottom:1px solid var(--line);display:flex;align-items:center;gap:10px;flex-wrap:wrap;flex:0 0 auto}\n  header h1{font-size:14.5px;margin:0;font-weight:600;letter-spacing:-.1px;color:var(--ink)}\n  .spacer{flex:1}\n  .pill{font-size:10.5px;padding:2.5px 9px;border-radius:99px;border:1px solid var(--line);color:var(--mut);background:var(--panel2);white-space:nowrap}\n  .pill b{color:var(--ink);font-weight:600}\n  .status{font-size:11px;color:var(--mut)}\n  .status.err{color:var(--closing)}\n  .btn{font:inherit;font-size:12px;padding:4.5px 11px;border-radius:7px;border:1px solid var(--line);background:var(--panel);color:var(--ink);cursor:pointer}\n  .btn:hover{border-color:#d5d5da;background:#fbfbfd}\n  .btn:active{background:#f0f0f4}\n  .btn:disabled{opacity:.5;cursor:progress}\n  .howto{padding:8px 16px;background:var(--panel);border-bottom:1px solid var(--line);display:flex;gap:16px;flex-wrap:wrap;\n    font-size:11.5px;color:var(--mut);flex:0 0 auto}\n  .howto b{color:var(--ink)} .howto span{max-width:360px}\n  .body{flex:1;display:flex;min-height:0}\n  .stage{flex:1;position:relative;min-width:0}\n  canvas{width:100%;height:100%;display:block}\n  .side{width:334px;flex:0 0 334px;border-left:1px solid var(--line);padding:12px;display:flex;flex-direction:column;gap:12px;overflow:auto}\n  .card{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:12px 13px}\n  .card h2{margin:0 0 9px;font-size:10.5px;letter-spacing:.06em;text-transform:uppercase;color:var(--mut);font-weight:600}\n  .card h3{margin:0 0 2px;font-size:15px;font-weight:600;letter-spacing:-.2px}\n  .card .sub{font-size:11.5px;color:var(--mut);margin-bottom:10px}\n  .facts{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-bottom:10px}\n  .fact{background:var(--panel2);border-radius:8px;padding:6px 8px}\n  .fact b{display:block;font-size:13px;font-weight:600}\n  .fact span{font-size:9.5px;color:var(--mut);letter-spacing:.05em;text-transform:uppercase}\n  .conn{border-top:1px solid var(--line);padding-top:8px}\n  .conn h4{margin:0 0 4px;font-size:10px;letter-spacing:.06em;text-transform:uppercase;color:var(--mut);font-weight:600}\n  .crow{display:flex;align-items:center;gap:8px;padding:5px 6px;margin:0 -6px;cursor:pointer;border-radius:7px}\n  .crow:hover{background:var(--panel2)}\n  .cdot{width:22px;height:22px;border-radius:50%;flex:0 0 22px;display:flex;align-items:center;justify-content:center;\n    font-size:9px;font-weight:600;color:#3a3a3c;border:1px solid rgba(60,60,67,.12)}\n  .cname{flex:1;font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n  .tags{display:flex;gap:3px;flex-wrap:wrap;justify-content:flex-end;max-width:110px}\n  .tag{width:7px;height:7px;border-radius:50%}\n  .hintline{font-size:11.5px;color:var(--mut);line-height:1.5}\n  .hintline b{color:var(--ink)}\n  .legend{display:flex;flex-wrap:wrap;gap:6px}\n  .chip{display:inline-flex;align-items:center;gap:6px;background:var(--panel2);border:1px solid var(--line);border-radius:99px;\n    padding:4px 10px 4px 7px;font:inherit;font-size:11.5px;color:var(--ink);cursor:pointer;user-select:none;\n    transition:opacity .12s,border-color .12s,color .12s}\n  .chip i{width:8px;height:8px;border-radius:50%;flex:0 0 8px}\n  .chip b{font-weight:500;color:var(--mut);font-size:10px}\n  .chip:hover{border-color:var(--acc);color:var(--acc)}\n  .chip:focus-visible{outline:2px solid rgba(0,122,255,.35);outline-offset:1px}\n  .chip.off{opacity:.4}\n  .tip{position:absolute;pointer-events:none;background:rgba(28,28,30,.94);color:#fff;border-radius:8px;padding:6px 9px;\n    font-size:11.5px;line-height:1.35;opacity:0;transition:opacity .1s;max-width:230px;z-index:5;box-shadow:0 8px 24px rgba(0,0,0,.18)}\n  .tip.on{opacity:1}\n  .tip em{font-style:normal;color:#aeaeb2;display:block;font-size:10.5px;margin-top:2px}\n  `,\n\n  // Shell estático de propósito: há um <canvas> aqui, e qualquer leitura reativa dentro de\n  // render() re-executa o render inteiro e devolve o canvas ao default 300x150 (checklist §15).\n  // Tudo que muda — contagem, cards, chips — é escrito por DOM dentro de mounted().\n  render() {\n    const chips = DIMS.map(d =>\n      `<button class=\"chip\" data-k=\"${d.k}\" title=\"${esc(d.hint)}\"><i style=\"background:${d.color}\"></i>${d.label} <b data-n=\"${d.k}\"></b></button>`\n    ).join('');\n    return `<div class=\"root\">\n      <header>\n        <h1>Senso de rede — consultoras</h1>\n        <span class=\"pill\"><b id=\"count\">—</b> pessoas</span>\n        <span class=\"status\" id=\"status\">consultando…</span>\n        <div class=\"spacer\"></div>\n        <button class=\"btn\" id=\"reload\">Recarregar</button>\n      </header>\n      <div class=\"howto\">\n        <span><b>1.</b> Cada nó é uma CB — o tamanho segue os pontos do ciclo, o anel marca quem está ativa.</span>\n        <span><b>2.</b> Cada laço é uma afinidade calculada; as contas no meio contam quantas dimensões as duas dividem.</span>\n        <span><b>3.</b> Clique num nó pra ver quem ele alcança — arraste pra reorganizar.</span>\n        <span><b>4.</b> Ligue e desligue dimensões nas marcações à direita.</span>\n      </div>\n      <div class=\"body\">\n        <div class=\"stage\" data-d2-static>\n          <canvas id=\"net\"></canvas>\n          <div class=\"tip\" id=\"tip\"></div>\n        </div>\n        <aside class=\"side\">\n          <section class=\"card\">\n            <h2>Afinidades</h2>\n            <div class=\"legend\" id=\"legend\">${chips}</div>\n          </section>\n          <section class=\"card\" id=\"detail\"></section>\n        </aside>\n      </div>\n    </div>`;\n  },\n\n  mounted(d2, root) {\n    const $ = s => root.querySelector(s);\n    const cv = $('#net'), ctx = cv.getContext('2d'), tip = $('#tip');\n    const S = {\n      nodes: [], edges: [], adj: new Map(), W: {}, on: {},\n      hover: null, sel: null, drag: null, alpha: 0, w: 0, h: 0\n    };\n    DIMS.forEach(d => S.on[d.k] = true);\n\n    const say = (msg, err) => { const el = $('#status'); el.textContent = msg || ''; el.classList.toggle('err', !!err); };\n\n    // ---------- canvas ----------\n    function resize() {\n      const r = cv.getBoundingClientRect();\n      const dpr = Math.min(window.devicePixelRatio || 1, 2);\n      S.w = r.width; S.h = r.height;\n      cv.width = Math.max(1, Math.round(r.width * dpr));\n      cv.height = Math.max(1, Math.round(r.height * dpr));\n      ctx.setTransform(dpr, 0, 0, dpr, 0, 0);   // o resize zera a matriz — reaplicar sempre\n    }\n    const ro = new ResizeObserver(resize); ro.observe(cv);\n    d2.onUnmount(() => ro.disconnect());\n    resize();\n\n    // ---------- amostra ----------\n    async function nameColumn() {\n      // O nome da CB não está no contrato conhecido da tabela, então em vez de chutar um\n      // DS_NOME que pode não existir (e derrubar a query inteira), descobrimos a coluna.\n      try {\n        const d = await q(`DESCRIBE ${T}`);\n        const cols = rowsOf(d).map(r => String(r.col_name || r.name || '')).filter(Boolean);\n        const cand = cols.filter(c => /NOME|NAME/i.test(c) &&\n          !/LEADER|LIDER|MUNIC|ESTAD|SETOR|GRUPO|CANAL|MARCA|PAIS|REGIA|GV|NVL/i.test(c));\n        cand.sort((a, b) => (/CONSULT|CB|PESSOA/i.test(b) ? 1 : 0) - (/CONSULT|CB|PESSOA/i.test(a) ? 1 : 0));\n        return cand[0] || null;\n      } catch (e) { return null; }\n    }\n    function sqlFor(nomeCol, where, order, lim) {\n      const nome = nomeCol ? `MAX(${nomeCol}) nome,` : '';\n      return `SELECT CD_CONSULTORA cb, ${nome}\n        MAX(DS_MUNICIPIO) municipio, MAX(DS_ESTADO) uf, MAX(CD_SETOR) setor,\n        MAX(CD_GRUPO) grupo, MAX(DS_LEADER_NAME) lider, MAX(DS_NVL_PLAN_CRESC) nivel,\n        SUM(QT_PEDIDOS_CICLO) pedidos, SUM(QT_PONTOS_CICLO) pontos,\n        SUM(VL_PEDIDOS_NATURA_CICLO) rec_nat, SUM(VL_PEDIDOS_AVON_CICLO) rec_avon,\n        MAX(CASE WHEN ST_FEZ_PED_CICLO_ATUAL THEN 1 ELSE 0 END) ativa\n       FROM ${T} WHERE ${where} GROUP BY CD_CONSULTORA ${order} LIMIT ${lim}`;\n    }\n\n    // Faixas relativas à AMOSTRA, não absolutas: \"ritmo parecido\" só quer dizer alguma coisa\n    // comparado com as outras CBs desta consulta.\n    function bucketer(vals) {\n      const v = vals.filter(x => isFinite(x)).sort((a, b) => a - b);\n      if (!v.length) return () => 0;\n      const at = p => v[Math.min(v.length - 1, Math.floor(p * v.length))];\n      const q1 = at(.25), q2 = at(.5), q3 = at(.75);\n      return x => (x <= q1 ? 0 : x <= q2 ? 1 : x <= q3 ? 2 : 3);\n    }\n\n    // Amostra sintética — existe para revisar layout/física sem sessão do simulador (o listener do\n    // Databricks é gated). Nunca é o default e se anuncia na tela: um grafo bonito com gente que não\n    // existe é pior do que um erro honesto.\n    function demoRows(n) {\n      const NOMES = ['Ana Ribeiro','Marta Souza','Cláudia Lima','Rita Alves','Vera Nunes','Sônia Braga','Ivone Castro','Lúcia Prado','Neide Rocha','Tânia Melo','Dora Pires','Elis Faria','Bruna Antunes','Carla Moraes','Selma Dutra','Joana Bastos','Regina Paiva','Marli Cardoso','Fátima Goulart','Simone Teles'];\n      const MUN = ['Brasília','Formosa','Buritis','Unaí','Paracatu','Arinos','Riachinho','Bonfinópolis','Chapada Gaúcha','Urucuia'];\n      const NIV = ['Bronze','Cristal','Prata','Ouro','Diamante'];\n      const out = [];\n      for (let i = 0; i < n; i++) {\n        const h = hash('cb' + i);\n        const mun = MUN[h % MUN.length];\n        const setor = 3200 + ((h >> 3) % 6) * 7;\n        const grupo = 100 + ((h >> 5) % 14);\n        const escala = .25 + ((h >> 7) % 100) / 100 * 1.8;\n        out.push({\n          cb: 900000 + i,\n          nome: NOMES[h % NOMES.length] + ' ' + String.fromCharCode(65 + (h >> 11) % 26) + '.',\n          municipio: mun, uf: mun === 'Chapada Gaúcha' || mun === 'Urucuia' ? 'MG' : 'GO',\n          setor: setor, grupo: grupo, lider: 'Líder ' + grupo,\n          nivel: NIV[(h >> 13) % NIV.length],\n          pedidos: Math.round(4 + escala * 22), pontos: Math.round(120 + escala * 900),\n          rec_nat: Math.round(escala * 3200), rec_avon: Math.round(escala * 3200 * (((h >> 17) % 100) / 100)),\n          ativa: (h >> 19) % 10 > 2 ? 1 : 0\n        });\n      }\n      return out;\n    }\n\n    async function load() {\n      say('consultando o snapshot mais recente…');\n      const lim = Math.max(12, Math.min(400, +d2.param('limite', 82) || 82));\n      const setor = digits(d2.param('setor', ''));\n      const uf = letters(d2.param('uf', '')).toUpperCase();\n      const aleat = String(d2.param('amostra', 'top') || 'top').toLowerCase().indexOf('aleat') === 0;\n      let where = `CD_PAIS=1 AND CD_GRUPO>0 AND DT_HISTORICO=${SNAP}`;\n      if (setor) where += ` AND CD_SETOR=${setor}`;\n      if (uf) where += ` AND UPPER(DS_ESTADO)='${uf}'`;\n      const order = aleat ? 'ORDER BY RAND()' : 'ORDER BY pontos DESC';\n\n      // `amostra: \"demo\"` em vez de um param novo — a declaração já existe e o modo fica visível\n      // no mesmo lugar onde se escolhe top/aleatória, não escondido num booleano à parte.\n      const demo = String(d2.param('amostra', 'top') || '').toLowerCase().indexOf('demo') === 0;\n      let raw;\n      if (demo) {\n        raw = demoRows(lim);\n      } else {\n        const nc = await nameColumn();\n        const attempts = nc ? [nc, null] : [null];\n        let data = null, lastErr = null;\n        for (const col of attempts) {\n          try { data = await q(sqlFor(col, where, order, lim)); break; }\n          catch (e) { lastErr = e; }\n        }\n        if (!data) throw lastErr || new Error('sem resposta da consulta');\n        raw = rowsOf(data);\n      }\n      if (!raw.length) throw new Error('nenhuma CB encontrada com esses filtros' + (setor ? ' (setor ' + setor + ')' : '') + (uf ? ' (UF ' + uf + ')' : ''));\n\n      const bPed = bucketer(raw.map(r => +r.pedidos || 0));\n      const bPon = bucketer(raw.map(r => +r.pontos || 0));\n      const bRec = bucketer(raw.map(r => (+r.rec_nat || 0) + (+r.rec_avon || 0)));\n\n      S.nodes = raw.map((r, i) => {\n        const nat = +r.rec_nat || 0, avon = +r.rec_avon || 0, rec = nat + avon;\n        const nome = titleCase(r.nome || '');\n        const cb = String(r.cb == null ? '' : r.cb);\n        const ini = nome ? d2.fmt.initials(nome, 2) : cb.slice(-2);\n        return {\n          i, cb, nome, ini,\n          municipio: titleCase(r.municipio || ''), uf: String(r.uf || ''),\n          setor: String(r.setor == null ? '' : r.setor), grupo: String(r.grupo == null ? '' : r.grupo),\n          lider: titleCase(r.lider || ''), nivel: String(r.nivel || ''),\n          pedidos: +r.pedidos || 0, pontos: +r.pontos || 0, receita: rec,\n          ativa: +r.ativa === 1 ? 1 : 0,\n          bRitmo: bPed(+r.pedidos || 0), bAlcance: bPon(+r.pontos || 0), bPorte: bRec(rec),\n          bMarca: rec > 0 ? Math.min(3, Math.floor((nat / rec) * 4)) : null,\n          tint: TINTS[hash(String(r.setor) + '|' + String(r.grupo)) % TINTS.length],\n          r: 0, x: 0, y: 0, vx: 0, vy: 0\n        };\n      });\n\n      const maxP = Math.max(...S.nodes.map(n => n.pontos), 1);\n      S.nodes.forEach(n => {\n        n.r = 7 + 17 * Math.sqrt(Math.max(0, n.pontos) / maxP);\n        const a = (n.i / S.nodes.length) * Math.PI * 2, rad = 140 + (hash(n.cb) % 220);\n        n.x = S.w / 2 + Math.cos(a) * rad; n.y = S.h / 2 + Math.sin(a) * rad;\n      });\n\n      DIMS.forEach(d => S.W[d.k] = weightOf(d.k));\n      rebuild();\n      $('#count').textContent = d2.fmt.number(S.nodes.length);\n      say((demo ? '⚠ AMOSTRA SINTÉTICA (dadosDemo) — ' : '') + `${S.nodes.length} CBs · ${S.edges.length} laços · ${S.nodes.filter(n => n.ativa).length} ativas no ciclo`, demo);\n      renderDetail(null);\n    }\n\n    // ---------- afinidades ----------\n    function keyOf(k, n) {\n      if (k === 'origem') return n.municipio ? n.uf + '/' + n.municipio : null;\n      if (k === 'territorio') return n.setor || null;\n      if (k === 'rede') return n.grupo || null;\n      if (k === 'trajetoria') return n.nivel || null;\n      if (k === 'ritmo') return 'r' + n.bRitmo;\n      if (k === 'alcance') return 'a' + n.bAlcance;\n      if (k === 'porte') return 'p' + n.bPorte;\n      if (k === 'marca') return n.bMarca == null ? null : 'm' + n.bMarca;\n      if (k === 'constancia') return n.ativa ? 'ativa' : null;\n      return null;\n    }\n    // Peso = raridade. p = chance de dois nós sorteados caírem no mesmo grupo desta dimensão;\n    // log2(1/p) transforma isso em bits de informação, então \"mesma líder\" pesa muito mais que\n    // \"ambas ativas\" sem que ninguém precise arbitrar uma tabela de pesos à mão.\n    function weightOf(k) {\n      const g = {}, n = S.nodes.length;\n      S.nodes.forEach(x => { const key = keyOf(k, x); if (key != null) g[key] = (g[key] || 0) + 1; });\n      let p = 0; Object.values(g).forEach(c => { p += (c / n) * (c / n); });\n      return p > 0 ? Math.max(.35, Math.min(6, Math.log2(1 / p))) : 0;\n    }\n    function sharedDims(a, b) {\n      const out = [];\n      for (const d of DIMS) {\n        if (!S.on[d.k]) continue;\n        const ka = keyOf(d.k, a); if (ka == null) continue;\n        if (ka === keyOf(d.k, b)) out.push(d.k);\n      }\n      return out;\n    }\n    function rebuild() {\n      const ns = S.nodes, K = Math.max(1, Math.min(8, +d2.param('lacos', 4) || 4));\n      const cand = ns.map(() => []);\n      for (let i = 0; i < ns.length; i++) {\n        for (let j = i + 1; j < ns.length; j++) {\n          const dims = sharedDims(ns[i], ns[j]);\n          if (!dims.length) continue;\n          let sc = 0; for (const k of dims) sc += S.W[k] || 0;\n          if (sc <= 0) continue;\n          cand[i].push({ o: j, sc, dims }); cand[j].push({ o: i, sc, dims });\n        }\n      }\n      // Corte por nó, não global: um corte global deixaria as CBs de município grande com\n      // dezenas de laços e as demais órfãs — cada uma guarda seus K vínculos mais fortes.\n      const seen = new Set(), out = [];\n      cand.forEach((list, i) => {\n        list.sort((a, b) => b.sc - a.sc).slice(0, K).forEach(e => {\n          const a = Math.min(i, e.o), b = Math.max(i, e.o), key = a + ':' + b;\n          if (seen.has(key)) return; seen.add(key);\n          const top = e.dims.slice().sort((x, y) => (S.W[y] || 0) - (S.W[x] || 0))[0];\n          out.push({ a, b, sc: e.sc, dims: e.dims, top });\n        });\n      });\n      S.edges = out;\n      S.adj = new Map();\n      out.forEach((e, idx) => {\n        if (!S.adj.has(e.a)) S.adj.set(e.a, []);\n        if (!S.adj.has(e.b)) S.adj.set(e.b, []);\n        S.adj.get(e.a).push(idx); S.adj.get(e.b).push(idx);\n      });\n      const maxSc = Math.max(...out.map(e => e.sc), 1);\n      out.forEach(e => e.n = e.sc / maxSc);\n      const counts = {}; DIMS.forEach(d => counts[d.k] = 0);\n      out.forEach(e => e.dims.forEach(k => counts[k]++));\n      DIMS.forEach(d => { const el = root.querySelector(`[data-n=\"${d.k}\"]`); if (el) el.textContent = counts[d.k] ? counts[d.k] : ''; });\n      S.alpha = 1;\n    }\n\n    // ---------- física ----------\n    function tick() {\n      const ns = S.nodes, cx = S.w / 2, cy = S.h / 2;\n      if (S.alpha < .02 || !ns.length) return;\n      const k = S.alpha;\n      for (let i = 0; i < ns.length; i++) {\n        const a = ns[i];\n        for (let j = i + 1; j < ns.length; j++) {\n          const b = ns[j];\n          let dx = b.x - a.x, dy = b.y - a.y, d = Math.hypot(dx, dy);\n          if (d < .01) {   // coincidentes: desempata com um deslocamento determinístico\n            dx = ((hash(a.cb + b.cb) % 21) - 10) / 10;\n            dy = ((hash(b.cb + a.cb) % 21) - 10) / 10;\n            d = Math.hypot(dx, dy) || 1;\n          }\n          const ux = dx / d, uy = dy / d;\n          const rep = Math.min(4, 9000 / (d * d)) * k;\n          a.vx -= ux * rep; a.vy -= uy * rep;\n          b.vx += ux * rep; b.vy += uy * rep;\n          // Colisão dura, resolvida na POSIÇÃO e não na velocidade: só repulsão deixa os círculos\n          // se sobreporem enquanto o sistema esfria, e as iniciais viram sopa.\n          const min = a.r + b.r + 6;\n          if (d < min) {\n            const push = (min - d) * .5;\n            a.x -= ux * push; a.y -= uy * push;\n            b.x += ux * push; b.y += uy * push;\n          }\n        }\n      }\n      for (const e of S.edges) {\n        const a = ns[e.a], b = ns[e.b];\n        const dx = b.x - a.x, dy = b.y - a.y, d = Math.max(.01, Math.hypot(dx, dy));\n        const target = 170 - 95 * e.n;          // laço forte = mais curto\n        const f = (d - target) * .022 * (.4 + .6 * e.n) * k;\n        const ux = dx / d, uy = dy / d;\n        a.vx += ux * f; a.vy += uy * f;\n        b.vx -= ux * f; b.vy -= uy * f;\n      }\n      for (const n of ns) {\n        if (S.drag === n) { n.vx = 0; n.vy = 0; continue; }\n        n.vx += (cx - n.x) * .002 * k; n.vy += (cy - n.y) * .002 * k;\n        n.vx *= .84; n.vy *= .84;\n        n.x += Math.max(-9, Math.min(9, n.vx));\n        n.y += Math.max(-9, Math.min(9, n.vy));\n      }\n      // Recentrar + encolher, em vez de prender nas bordas: o clamp anterior deformava o grafo\n      // contra as margens e foi o que empurrou o desenho inteiro pra um canto.\n      let x0 = Infinity, y0 = Infinity, x1 = -Infinity, y1 = -Infinity;\n      for (const n of ns) {\n        x0 = Math.min(x0, n.x - n.r); y0 = Math.min(y0, n.y - n.r);\n        x1 = Math.max(x1, n.x + n.r); y1 = Math.max(y1, n.y + n.r);\n      }\n      const ox = cx - (x0 + x1) / 2, oy = cy - (y0 + y1) / 2;\n      for (const n of ns) { n.x += ox * .12; n.y += oy * .12; }\n      const sc = Math.min(1, (S.w - 48) / Math.max(1, x1 - x0), (S.h - 48) / Math.max(1, y1 - y0));\n      if (sc < 1) for (const n of ns) {\n        n.x = cx + (n.x - cx) * (1 - (1 - sc) * .1);\n        n.y = cy + (n.y - cy) * (1 - (1 - sc) * .1);\n      }\n      S.alpha *= .994;\n    }\n\n    // ---------- desenho ----------\n    function draw() {\n      ctx.clearRect(0, 0, S.w, S.h);\n      ctx.fillStyle = BG; ctx.fillRect(0, 0, S.w, S.h);\n      if (!S.nodes.length) return;\n      const focus = S.sel != null ? S.sel : S.hover;\n      const near = new Set();\n      if (focus != null) { near.add(focus); (S.adj.get(focus) || []).forEach(i => { near.add(S.edges[i].a); near.add(S.edges[i].b); }); }\n\n      S.edges.forEach((e, idx) => {\n        const a = S.nodes[e.a], b = S.nodes[e.b];\n        const lit = focus == null || e.a === focus || e.b === focus;\n        const col = (DIM_BY[e.top] || DIMS[0]).color;\n        ctx.globalAlpha = focus == null ? .16 + .34 * e.n : (lit ? .5 + .4 * e.n : .05);\n        ctx.strokeStyle = col;\n        ctx.lineWidth = .5 + 1.7 * e.n;\n        ctx.beginPath(); ctx.moveTo(a.x, a.y); ctx.lineTo(b.x, b.y); ctx.stroke();\n        // uma conta por dimensão compartilhada, no meio do laço — é a leitura rápida de\n        // \"quantas coisas estas duas têm em comum\" sem precisar do hover\n        const dims = e.dims;\n        for (let i = 0; i < dims.length; i++) {\n          const t = (i + 1) / (dims.length + 1);\n          ctx.globalAlpha = focus == null ? .55 : (lit ? .95 : .08);\n          ctx.fillStyle = (DIM_BY[dims[i]] || DIMS[0]).color;\n          ctx.beginPath(); ctx.arc(a.x + (b.x - a.x) * t, a.y + (b.y - a.y) * t, 1.9 + 1.3 * e.n, 0, 6.284); ctx.fill();\n        }\n      });\n\n      S.nodes.forEach(n => {\n        const dim = focus != null && !near.has(n.i);\n        ctx.globalAlpha = dim ? .18 : 1;\n        ctx.beginPath(); ctx.arc(n.x, n.y, n.r, 0, 6.284);\n        ctx.fillStyle = n.tint; ctx.fill();\n        ctx.lineWidth = n.i === focus ? 2.5 : 1;\n        ctx.strokeStyle = n.i === focus ? '#007aff' : (n.ativa ? 'rgba(60,60,67,.38)' : 'rgba(60,60,67,.14)');\n        ctx.stroke();\n        if (n.r >= 12) {   // nós pequenos ficam como pontos, sem inicial ilegível dentro\n          ctx.globalAlpha = dim ? .2 : .85;\n          ctx.fillStyle = '#3a3a3c';\n          ctx.font = `600 ${Math.round(n.r * .78)}px -apple-system,\"Segoe UI\",Roboto,sans-serif`;\n          ctx.textAlign = 'center'; ctx.textBaseline = 'middle';\n          ctx.fillText(n.ini, n.x, n.y + .5);\n        }\n      });\n      ctx.globalAlpha = 1;\n    }\n\n    d2.raf(() => { tick(); draw(); });\n\n    // ---------- interação ----------\n    function hit(px, py) {\n      let best = null, bd = Infinity;\n      for (const n of S.nodes) {\n        const d = Math.hypot(n.x - px, n.y - py);\n        if (d < n.r + 5 && d < bd) { bd = d; best = n; }\n      }\n      return best;\n    }\n    const rel = ev => { const r = cv.getBoundingClientRect(); return [ev.clientX - r.left, ev.clientY - r.top]; };\n\n    d2.on(cv, 'pointermove', ev => {\n      const [x, y] = rel(ev);\n      if (S.drag) { S.drag.x = x; S.drag.y = y; S.alpha = Math.max(S.alpha, .35); return; }\n      const n = hit(x, y);\n      S.hover = n ? n.i : null;\n      cv.style.cursor = n ? 'pointer' : 'default';\n      if (n) {\n        tip.classList.add('on');\n        tip.innerHTML = `<b>${esc(n.nome || 'CB ' + n.cb)}</b><em>${esc(n.municipio)}${n.uf ? '/' + esc(n.uf) : ''} · setor ${esc(n.setor)} · ${d2.fmt.number(n.pontos)} pontos</em>`;\n        const tw = tip.offsetWidth || 200;\n        tip.style.left = Math.max(6, Math.min(S.w - tw - 6, x + 14)) + 'px';\n        tip.style.top = Math.max(6, y - 42) + 'px';\n      } else tip.classList.remove('on');\n    });\n    d2.on(cv, 'pointerdown', ev => {\n      const [x, y] = rel(ev); const n = hit(x, y);\n      if (n) { S.drag = n; cv.setPointerCapture(ev.pointerId); }\n    });\n    d2.on(cv, 'pointerup', ev => {\n      const [x, y] = rel(ev); const n = hit(x, y);\n      S.drag = null;\n      if (n) { S.sel = (S.sel === n.i ? null : n.i); renderDetail(S.sel); }\n      else { S.sel = null; renderDetail(null); }\n    });\n    d2.on(cv, 'pointerleave', () => { S.hover = null; S.drag = null; tip.classList.remove('on'); });\n\n    d2.on('.chip', 'click', (e, el) => {\n      const k = el.dataset.k;\n      S.on[k] = !S.on[k];\n      el.classList.toggle('off', !S.on[k]);\n      if (S.nodes.length) { rebuild(); renderDetail(S.sel); }\n    });\n    d2.on('.crow', 'click', (e, el) => { S.sel = +el.dataset.i; renderDetail(S.sel); });\n    d2.on('#reload', 'click', (e, el) => {\n      el.disabled = true;\n      S.sel = null; S.hover = null;\n      load().catch(err => say(err && err.message ? err.message : String(err), true))\n        .then(() => { el.disabled = false; });\n    });\n\n    // ---------- painel ----------\n    function renderDetail(i) {\n      const el = $('#detail');\n      if (i == null || !S.nodes[i]) {\n        const on = DIMS.filter(d => S.on[d.k]);\n        el.innerHTML = `<div class=\"hintline\">Cada laço é uma afinidade calculada, não um cadastro: duas CBs se ligam quando compartilham origem, território, líder, trajetória ou um padrão de trabalho parecido.<br><br>O peso de cada dimensão é o inverso da sua frequência — por isso <b>${esc((on.slice().sort((a, b) => (S.W[b.k] || 0) - (S.W[a.k] || 0))[0] || {}).label || '—')}</b> puxa mais que as demais nesta amostra.<br><br>Clique num nó para ver quem ele alcança. Arraste para reorganizar.</div>`;\n        return;\n      }\n      const n = S.nodes[i];\n      const mine = (S.adj.get(i) || []).map(x => S.edges[x]).sort((a, b) => b.sc - a.sc).slice(0, 8);\n      const fact = (v, l) => `<div class=\"fact\"><b>${v}</b><span>${l}</span></div>`;        el.innerHTML = `<div>\n        <h3>${esc(n.nome || 'CB ' + n.cb)}</h3>\n        <div class=\"sub\">${esc(n.municipio)}${n.uf ? ' · ' + esc(n.uf) : ''} · setor ${esc(n.setor)}${n.lider ? ' · líder ' + esc(n.lider) : ''}</div>\n        <div class=\"facts\">\n          ${fact(d2.fmt.number(n.pontos), 'pontos')}\n          ${fact(d2.fmt.number(n.pedidos), 'pedidos')}\n          ${fact(d2.fmt.currency(n.receita, 'BRL'), 'receita')}\n          ${fact(esc(n.nivel || '—'), 'nível')}\n        </div>\n        <div class=\"conn\"><h4>${mine.length} afinidades mais fortes</h4>\n          ${mine.map(e => {\n            const o = S.nodes[e.a === i ? e.b : e.a];\n            return `<div class=\"crow\" data-i=\"${o.i}\" title=\"${esc(e.dims.map(k => (DIM_BY[k] || {}).hint).join(' · '))}\">\n              <span class=\"cdot\" style=\"background:${o.tint}\">${esc(o.ini)}</span>\n              <span class=\"cname\">${esc(o.nome || 'CB ' + o.cb)}</span>\n              <span class=\"tags\">${e.dims.map(k => `<i class=\"tag\" style=\"background:${(DIM_BY[k] || {}).color}\"></i>`).join('')}</span>\n            </div>`;\n          }).join('')}\n        </div>\n      </div>`;\n    }\n\n    load().catch(err => {\n      say(err && err.message ? err.message : String(err), true);\n      $('#detail').innerHTML = `<div class=\"hintline\">A consulta roda no listener do Databricks, que exige sessão do simulador. Se a mensagem acima fala em 401/permissão, é preciso estar logado no app.</div>`;\n    });\n  }\n};","at":"2026-08-07T05:00:41.560Z"}},"updatedAt":"2026-08-07T05:00:41.961Z","createdAt":"2026-08-07T04:41:49.446Z"},{"_id":"6a7a38bbc9940e37623ae676","component":"data2-core-types@Component","system":"6a57cfe9673eb7e3c5e57784","params":{"component":"bsaEubO9EjIykK7MU-EnV","package":"natura-geomarketing","title":"Timeline de fechamentos","extends":"data2-core-primitives@Block","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"sessionsDataset":{"component":"data2-core-types@InteractiveModuleReference"},"dominantesCsvUrl":{"component":"data2-core-types@FileComponentUrlReference"}}}},"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"const T='product.perfil_cb.crm_perfil_cb_diaria_historico';\nconst ELO='product.elo_modelo_combinado.commercial_consultant_index';\nconst PALETTE=['#5856d6','#ff9500','#34c759','#af52de','#ff2d55','#a2845e'];\nconst CLOSE_COLOR='#8e8e93';\nconst UF_CODE={RO:'11',AC:'12',AM:'13',RR:'14',PA:'15',AP:'16',TO:'17',MA:'21',PI:'22',CE:'23',RN:'24',PB:'25',PE:'26',AL:'27',SE:'28',BA:'29',MG:'31',ES:'32',RJ:'33',SP:'35',PR:'41',SC:'42',RS:'43',MS:'50',MT:'51',GO:'52',DF:'53'};\nconst UF_BORDERS={AC:['AM','RO'],AL:['BA','PE','SE'],AM:['AC','RO','RR','PA','MT'],AP:['PA'],\n BA:['AL','SE','PE','PI','TO','GO','MG','ES'],CE:['PI','PB','PE','RN'],DF:['GO','MG'],\n ES:['BA','MG','RJ'],GO:['DF','MT','MS','MG','BA','TO'],MA:['PA','TO','PI'],\n MG:['BA','GO','DF','MS','SP','RJ','ES'],MS:['MT','GO','MG','SP','PR'],MT:['RO','AM','PA','TO','GO','MS'],\n PA:['AP','AM','MT','TO','MA','RR'],PB:['RN','CE','PE'],PE:['PB','CE','PI','BA','AL'],\n PI:['MA','TO','BA','PE','CE'],PR:['SP','MS','SC'],RJ:['ES','MG','SP'],RN:['CE','PB'],\n RO:['AC','AM','MT'],RR:['AM','PA'],RS:['SC'],SC:['PR','RS'],SE:['BA','AL'],\n SP:['MG','RJ','PR','MS'],TO:['PA','MA','PI','BA','GO','MT']};\nconst NIVEIS=['Bronze','Cristal','Prata','Ouro','Diamante','Diamante+'];\nconst METRICS_DEF=[['cbs','CBs'],['ativas','Ativas'],['pedidos','Pedidos'],['pontos','Pontos'],['receita','Receita','$'],['rec_nat','Rec. Natura','$'],['rec_avon','Rec. Avon','$']];\nconst OPT_K=1.5;\nconst SESSIONS_DS='timeline-shared-sessionsDataSet';   // same table as SHARED_DS — see notes at listSessions()\n// Span defaults are the real operating band for a setor receptor, not placeholders: 2200 ≤ span ≤ 3500\n// with 2700 as the target. null meant \"sem limite\", so every new session started with the optimiser\n// balancing against nothing. Existing sessions are NOT touched — their persisted settings carry explicit\n// values that spread OVER these in openOptions/applyOptions, which is deliberate: their etapas were\n// computed under the old band and changing it silently would leave the stored result and the rule that\n// produced it out of sync.\nconst DEFAULT_SETTINGS={destRule:'any',destMinCbs:9,targetSpan:2700,maxSpan:3500,minSpan:2200};\nconst DOM_MEDIA_BASE='https://natura-geomarketing.data2.media/file/';\nconst DOM_CSV_FALLBACK=DOM_MEDIA_BASE+'yw_TQdp0QXEk6JsrliAqP'; \nconst numOrNull=v=>{const n=Math.round(+v);return (isFinite(n)&&n>0)?n:null;};\nconst spanShort=st=>{const p=[];if(st&&st.targetSpan)p.push('alvo '+st.targetSpan);if(st&&st.maxSpan)p.push('máx '+st.maxSpan);if(st&&st.minSpan)p.push('mín '+st.minSpan);return p.length?p.join(' · '):'livre';};\nconst ruleShort=st=>((st&&st.destRule)==='dominant')?('dominantes ≥'+((st&&st.destMinCbs)||DEFAULT_SETTINGS.destMinCbs)+' CBs'):'qualquer municipio';\n\nexport default {\n  css: `\n  :host{display:block;height:100%;--bg:#f5f5f7;--panel:#ffffff;--panel2:#f2f2f7;--line:#e5e5ea;--ink:#1c1c1e;--mut:#6e6e73;--acc:#007aff;--acc2:#0060df;--closing:#ff3b30;--ok:#34c759}\n  *{box-sizing:border-box}\n  .simroot{position:relative;height:100%;overflow:auto;font:13px/1.45 -apple-system,BlinkMacSystemFont,\"SF Pro Text\",\"Segoe UI\",Roboto,sans-serif;background:var(--bg);color:var(--ink);-webkit-font-smoothing:antialiased}\n  header{padding:10px 16px;background:rgba(246,246,248,.85);backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);border-bottom:1px solid var(--line);display:flex;align-items:center;gap:10px;flex-wrap:wrap}\n  header h1{font-size:14.5px;margin:0;font-weight:600;letter-spacing:-.1px;color:var(--ink)}\n  .mac-spacer{flex:1}\n  .howto{padding:8px 16px;background:var(--panel);border-bottom:1px solid var(--line);display:flex;gap:16px;flex-wrap:wrap;font-size:11.5px;color:var(--mut);align-items:center}\n  .howto b{color:var(--ink)} .howto span{max-width:340px}\n  .pill{font-size:10.5px;padding:2.5px 9px;border-radius:99px;border:1px solid var(--line);color:var(--mut);background:var(--panel2)}\n  .pill.live{color:var(--ink);cursor:pointer;user-select:none;transition:border-color .1s,color .1s,background .1s}\n  .pill.live:hover{border-color:var(--acc);color:var(--acc);background:#eaf3ff}\n  .pill.live:focus-visible{outline:2px solid rgba(0,122,255,.35);outline-offset:1px}\n  .pill.live.busy{border-color:var(--acc);color:var(--acc);cursor:progress}\n  .status{font-size:11px;color:var(--mut)}.status.err{color:var(--closing)}\n  select,input,textarea,button{font:inherit}\n  select,input{background:var(--panel);border:1px solid var(--line);color:var(--ink);border-radius:7px;padding:5.5px 9px}\n  select:focus,input:focus{outline:2px solid rgba(0,122,255,.35);outline-offset:0;border-color:var(--acc)}\n  button.act{background:var(--acc);color:#fff;border:1px solid transparent;border-radius:7px;padding:6px 13px;font-weight:600;cursor:pointer;box-shadow:0 1px 1px rgba(0,0,0,.08)}\n  button.act:hover{background:var(--acc2)}\n  button.ghost{background:var(--panel);color:var(--ink);border:1px solid var(--line);border-radius:7px;padding:5.5px 12px;cursor:pointer}\n  button.ghost:hover{background:var(--panel2)}\n  button.ghost.on{border-color:var(--acc);color:var(--acc);background:#eaf3ff}\n  button.ghost:disabled,button.act:disabled{opacity:.4;cursor:not-allowed}\n  .sessbar{padding:9px 20px;background:var(--panel2);border-bottom:1px solid var(--line);display:flex;gap:8px;flex-wrap:wrap;align-items:center}\n  .rail{padding:9px 16px;background:var(--panel);border-bottom:1px solid var(--line);display:flex;gap:8px;align-items:center;overflow-x:auto}\n  #movementChips{display:flex;gap:8px;flex:0 0 auto}\n  #addMovementGroup{display:flex;gap:8px;align-items:center;flex:0 0 auto;margin-left:auto;padding-left:12px;border-left:1px solid var(--line)}\n  #addMovementGroup input{min-width:150px}\n  .tchip{display:flex;align-items:center;gap:7px;background:var(--panel2);border:1px solid var(--line);border-radius:8px;padding:6px 10px;cursor:pointer;font-size:12px;flex:0 0 auto}\n  .tchip.on{border-color:var(--acc);background:#eaf3ff}\n  .tchip.stale{border-style:dashed;opacity:.85}\n  .tchip .tstale{color:#ff9500;font-weight:700}\n  .tchip .tnum{background:var(--ink);color:#fff;border-radius:99px;width:16px;height:16px;font-size:9.5px;display:flex;align-items:center;justify-content:center;font-weight:700}\n  .tchip .tsec{font-weight:600}\n  .tchip .tstat{color:var(--mut)}\n  .tchip .trm{color:var(--mut);font-weight:700;padding:0 3px}\n  .tchip .trm:hover{color:var(--closing)}\n  .rail .empty{color:var(--mut);font-size:12px}\n  .wrap{display:grid;grid-template-columns:minmax(360px,1fr) 430px;gap:14px;padding:14px 16px;align-items:start}\n  @media(max-width:1150px){.wrap{grid-template-columns:1fr}}\n  .card{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:14px 16px;margin-bottom:14px;box-shadow:0 1px 2px rgba(0,0,0,.04)}\n  .card h2{font-size:11px;text-transform:uppercase;letter-spacing:.4px;color:var(--mut);margin:0 0 9px;font-weight:600}\n  /* user-select, not pointer-events. .lbl already sets pointer-events:none, which stops the text from\n     RECEIVING clicks but does not exclude it from the browser's selection range — so cycling a\n     município's destination with repeated clicks kept dragging a double-click selection across the\n     labels. Nothing drawn in an svg here is text anyone needs to copy. */\n  svg{width:100%;height:auto;display:block;user-select:none;-webkit-user-select:none}\n  /* White hairlines inside the closing sector: the municipios read as one territory cut into parts\n     rather than as separate outlined units, and the saturated fills carry the grouping instead of the\n     ink. Neighbour sectors keep their own coloured strokes (.sect) — that contrast is what separates\n     what is being reallocated from what is only context. Selection no longer draws an outline; the\n     white border was the click affordance AND the default is now white, so it had nothing left to say. */\n  .muni{stroke:#fff;stroke-width:1.1;cursor:pointer;transition:filter .1s}.muni:hover{filter:brightness(1.15)}\n  .sect{stroke-width:1;fill-opacity:.32;stroke-opacity:.6}\n  .sect.plain{fill:#e8e8ec;stroke:#d4d4d9;fill-opacity:1;stroke-opacity:1}\n  .sect.closed-ctx{fill:#e2e2e7;stroke:#aeaeb2;stroke-dasharray:3 2;fill-opacity:1;stroke-opacity:1}\n  .lbl{pointer-events:none}\n  /* No plate behind the text: a halo painted UNDER the glyphs (paint-order) keeps a name legible on any\n     fill without stamping an opaque box over the territory it names. Ink and halo are chosen per label\n     from the luminance of the fill underneath, so they are deliberately NOT declared here — a\n     stylesheet rule outranks a presentation attribute and would silently override that choice. */\n  .lbl text{text-anchor:middle;paint-order:stroke fill;stroke-width:2.2px;stroke-linejoin:round;stroke-linecap:round}\n  .lbl.big text{stroke-width:2.9px}\n  .lbl line.lead{stroke-opacity:.5;stroke-width:.8}\n  .legend{display:flex;gap:12px;flex-wrap:wrap;margin-top:8px;font-size:12px}\n  .legend b{display:inline-block;width:11px;height:11px;border-radius:3px;margin-right:5px;vertical-align:-1px}\n  .kpis{display:grid;grid-template-columns:1fr 1fr;gap:9px;margin-bottom:12px}\n  .kpi{background:var(--panel2);border:1px solid var(--line);border-radius:10px;padding:9px 11px}\n  .kpi .n{font-size:19px;font-weight:700}.kpi .l{font-size:10.5px;color:var(--mut);margin-top:2px}\n  .kpi.warn{border-color:#ffd1cc}.kpi.warn .n{color:var(--closing)}.kpi.ok{border-color:#bdeecb}.kpi.ok .n{color:var(--ok)}\n  .bar-row{display:flex;align-items:center;gap:8px;margin:6px 0}\n  .bar-row .tag{width:42px;font-weight:600;font-size:12px}\n  .bar-track{flex:1;height:18px;background:var(--panel2);border-radius:5px;overflow:hidden;display:flex;position:relative}\n  .bar-mark{position:absolute;top:0;bottom:0;width:2px;opacity:.9;z-index:2}\n  .bar-base{height:100%;opacity:.4}.bar-inc{height:100%}\n  .bar-val{width:132px;text-align:right;font-size:11px;color:var(--mut);font-variant-numeric:tabular-nums}\n  table{border-collapse:collapse;width:100%;font-size:11.5px}\n  th,td{padding:5px 6px;text-align:right;border-bottom:1px solid var(--line);font-variant-numeric:tabular-nums}\n  th:first-child,td:first-child{text-align:left}\n  thead th{color:var(--mut);font-weight:600;font-size:10.5px;position:sticky;top:0;background:var(--panel)}\n  .home{display:inline-block;width:9px;height:9px;border-radius:2px;margin-right:4px}\n  .muni-item{display:flex;align-items:center;gap:8px;background:var(--panel2);border:1px solid var(--line);border-radius:8px;padding:5px 8px;margin-bottom:6px}\n  .muni-item .nm{flex:1;font-weight:600;font-size:12px}.muni-item .ct{color:var(--mut);font-size:11px}\n  .seg{display:flex;border:1px solid var(--line);border-radius:7px;overflow:hidden}\n  .seg button{border:0;background:transparent;color:var(--mut);padding:4px 8px;font-size:11px;font-weight:600;cursor:pointer}\n  .seg button.on{color:#fff}\n  .toolbar{display:flex;gap:8px;align-items:center;flex-wrap:wrap}\n  .toggle{display:flex;border:1px solid var(--line);border-radius:8px;overflow:hidden;font-size:12px}\n  .toggle button{background:transparent;border:0;color:var(--mut);padding:6px 10px;cursor:pointer;font-weight:600}\n  .toggle button.on{background:var(--panel2);color:var(--ink)}\n  .note{color:var(--mut);font-size:10.5px;margin-top:7px;line-height:1.5}\n  .cell{font-variant-numeric:tabular-nums}\n  .scroll{max-height:240px;overflow:auto}\n  /* Tables meant to be READ in full rather than sampled. Only the vertical cap is dropped — overflow\n     stays auto so the wide grupo grid can still scroll sideways inside its card, which is the one axis\n     that genuinely cannot fit. */\n  .scroll.grow{max-height:none}\n  .tip{position:fixed;pointer-events:none;background:#1c1c1e;color:#fff;border-radius:8px;padding:7px 9px;font-size:11px;opacity:0;transition:opacity .1s;z-index:9;max-width:230px}\n  .spark{display:flex;align-items:flex-end;gap:3px;height:44px}\n  .spark .b{flex:1;background:var(--acc);border-radius:2px 2px 0 0;min-height:2px;opacity:.85}\n  .delta{font-size:10px}.delta.up{color:var(--ok)}.delta.dn{color:var(--closing)}\n  .tabs{display:flex;gap:6px;margin-bottom:10px;flex-wrap:wrap}\n  .tabs button{background:transparent;border:1px solid var(--line);border-radius:8px;color:var(--mut);padding:6px 12px;cursor:pointer;font-weight:600}\n  .tabs button.on{background:var(--panel2);color:var(--ink);border-color:var(--acc)}\n  .hidden{display:none}\n  .sqlbox{width:100%;height:60px;font-family:ui-monospace,Menlo,monospace;font-size:11px;resize:vertical}\n  .load{position:absolute;inset:0;background:rgba(245,245,247,.85);backdrop-filter:blur(4px);display:flex;align-items:center;justify-content:center;z-index:20;font-size:13px;color:var(--acc);font-weight:600;text-align:center;padding:20px}\n  .load.hidden{display:none}\n  .badge{font-size:10px;padding:1px 6px;border-radius:5px;background:var(--panel2);border:1px solid var(--line);color:var(--mut)}\n  .sheet-bg{position:fixed;inset:0;background:rgba(28,28,30,.34);backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);display:flex;align-items:center;justify-content:center;z-index:40;padding:24px}\n  .sheet-bg.hidden{display:none}\n  .sheet{background:var(--panel);border:1px solid var(--line);border-radius:14px;box-shadow:0 24px 60px rgba(0,0,0,.22);width:min(580px,100%);max-height:100%;display:flex;flex-direction:column;overflow:hidden}\n  .sheet-hd{display:flex;align-items:center;gap:9px;padding:12px 16px;border-bottom:1px solid var(--line)}\n  .sheet-hd h3{margin:0;font-size:14px;font-weight:600;letter-spacing:-.1px}\n  .sheet-x{background:transparent;border:0;color:var(--mut);font-size:13px;cursor:pointer;padding:3px 7px;border-radius:6px}\n  .sheet-x:hover{background:var(--panel2);color:var(--ink)}\n  .sheet-bd{padding:14px 16px;overflow:auto}\n  .sheet-ft{display:flex;align-items:center;gap:8px;padding:11px 16px;border-top:1px solid var(--line);background:var(--panel2)}\n  .opt-lbl{font-size:11px;text-transform:uppercase;letter-spacing:.4px;color:var(--mut);font-weight:600}\n  .opt-sub{font-size:11.5px;color:var(--mut);margin:4px 0 10px;line-height:1.5}\n  .opt-row{display:flex;gap:10px;align-items:flex-start;border:1px solid var(--line);border-radius:10px;padding:10px 12px;margin-bottom:8px;cursor:pointer;background:var(--panel)}\n  .opt-row:hover{background:var(--panel2)}\n  .opt-row.on{border-color:var(--acc);background:#eaf3ff}\n  .opt-row input[type=radio]{margin:2px 0 0;accent-color:var(--acc);flex:0 0 auto}\n  .opt-t{font-size:12.5px;font-weight:600;display:flex;align-items:center;gap:6px;flex-wrap:wrap}\n  .opt-d{font-size:11.5px;color:var(--mut);margin-top:3px;line-height:1.55}\n  .opt-inline{font-size:11.5px;color:var(--mut);margin-top:9px;display:flex;align-items:center;gap:7px;flex-wrap:wrap}\n  .opt-inline.off{opacity:.4;pointer-events:none}\n  .opt-note{border:1px solid var(--line);background:var(--panel2);border-radius:10px;padding:9px 11px;font-size:11.5px;color:var(--mut);line-height:1.6;margin-top:12px}\n  .opt-grid{display:grid;grid-template-columns:1fr 1fr 1fr;gap:8px;margin-top:2px}\n  .opt-fld{display:flex;flex-direction:column;gap:5px;border:1px solid var(--line);border-radius:9px;padding:8px 10px;background:var(--panel2)}\n  .opt-fld span{font-size:11px;color:var(--mut);font-weight:600;line-height:1.35}\n  .opt-fld i{font-style:normal;font-weight:400;opacity:.72}\n  .opt-fld input{width:100%;background:var(--panel)}\n  .opt-err{margin-top:9px;font-size:11.5px;color:var(--closing);font-weight:600}\n  .opt-hr{height:1px;background:var(--line);margin:17px 0 0}\n  .shareurl{margin-top:9px;padding:9px 10px;border-radius:8px;background:var(--panel);border:1px solid var(--acc);\n    font-family:ui-monospace,Menlo,monospace;font-size:11px;color:var(--ink);word-break:break-all;user-select:all}\n`,\n  render(d2){\n    return `<div class=\"simroot\"><header id=\"topHeader\" class=\"hidden\">\n  <h1>Simulador de Timeline de Fechamentos</h1>\n  <span class=\"pill live\" id=\"liveState\" role=\"button\" tabindex=\"0\" title=\"Clique pra buscar o snapshot mais recente e recalcular a timeline inteira\">● iniciando</span>\n  <span class=\"pill ro\">read-only · nunca escreve</span>\n  <span class=\"pill\" id=\"basePill\"></span>\n  <span class=\"pill\" id=\"rulePill\"></span>\n  <span class=\"pill\" id=\"spanPill\"></span>\n  <span class=\"status\" id=\"ds\"></span>\n  <div class=\"mac-spacer\"></div>\n  <select id=\"sessionPick\" style=\"min-width:200px\"></select>\n  <button class=\"ghost\" id=\"openOptions\" title=\"Configurações desta sessão\">⚙ Opções</button>\n  <button class=\"act\" id=\"saveSession\">Salvar sessão</button>\n  <button class=\"ghost\" id=\"dupSession\" title=\"Cria uma cópia independente desta sessão — a original fica intacta e a cópia passa a ser a sessão ativa\">⧉ Duplicar</button>\n  <button class=\"ghost\" id=\"openShare\" title=\"Publicar uma cópia congelada desta sessão em modo leitura\">⇪ Compartilhar</button>\n  <span class=\"status\" id=\"sessStatus\"></span>\n</header>\n\n<div class=\"rail hidden\" id=\"timelineRail\">\n  <div id=\"movementChips\"></div>\n  <div id=\"addMovementGroup\">\n    <input id=\"sectorPick\" list=\"sectorPickList\" placeholder=\"código do setor\" style=\"min-width:150px\">\n    <datalist id=\"sectorPickList\"></datalist>\n    <button class=\"ghost\" id=\"rand\" title=\"Setor aleatório\">🎲</button>\n    <button class=\"act\" id=\"go\">Fechar setor ▶ (nova etapa)</button>\n  </div>\n</div>\n\n<div class=\"card\" id=\"confirmCard\" style=\"margin:14px 20px\">\n  <h2 style=\"margin:0 0 9px\">Confirmar snapshot antes de simular</h2>\n  <div class=\"note\" id=\"confirmBody\">congelando snapshot…</div>\n  <button class=\"act\" id=\"confirmSnap\" style=\"margin-top:12px\">Confirmar snapshot ▶ ir pra simulação</button>\n  <div class=\"note\" style=\"margin-top:16px\">ou continue uma sessão salva:</div>\n  <select id=\"confirmSessionPick\" style=\"min-width:260px;margin-top:4px\"></select>\n  <div class=\"status\" id=\"confirmStatus\" style=\"margin-top:8px\"></div>\n</div>\n\n<div class=\"howto hidden\" id=\"howtoBox\">\n  <b>Como usar &nbsp;→&nbsp;</b>\n  <span><b>1.</b> Escolha um setor pra <b>fechar</b> (ou 🎲) — isso cria a etapa 1 da timeline.</span>\n  <span><b>2.</b> Feche outro setor pra criar a etapa 2 — ela já considera pra onde a etapa 1 mandou cada município.</span>\n  <span><b>3.</b> Clique numa etapa (chip acima) pra revisitar/editar — editar uma etapa recalcula automaticamente todas as etapas seguintes.</span>\n  <span><b>4.</b> Veja o efeito acumulado da cadeia inteira na aba <b>Impacto acumulado</b>.</span>\n</div>\n<div class=\"wrap hidden\" id=\"mainWrap\">\n  <div>\n    <div class=\"card\">\n      <div style=\"display:flex;justify-content:space-between;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:9px\">\n        <h2 id=\"mapTitle\" style=\"margin:0\">Mapa — clique num município p/ trocar o setor destino</h2>\n        <div class=\"toggle\" id=\"viewToggle\" title=\"ASIS = estrutura do setor antes desta etapa (já considerando etapas anteriores) · TOBE = após a redistribuição desta etapa\">\n          <button data-v=\"asis\">◧ ASIS (antes desta etapa)</button>\n          <button data-v=\"tobe\" class=\"on\">◨ TOBE (simulação)</button>\n        </div>\n      </div>\n      <svg id=\"map\" viewBox=\"0 0 700 500\" preserveAspectRatio=\"xMidYMid meet\"></svg>\n      <div class=\"legend\" id=\"legend\"></div>\n      <div class=\"note\">Coloridos = municípios do setor fechado nesta etapa (cor = destino). Ao redor, cada área é um <b>setor vizinho inteiro</b> com o código no meio — não municípios soltos: cor = setor destino, cinza = contexto, cinza tracejado = setor já fechado numa etapa anterior. Shapes reais IBGE/tbrugz.</div>\n      <div class=\"note\" id=\"mapIgnoredNote\"></div>\n    </div>\n\n    <div class=\"card\">\n      <h2>Líderes — destino e CBs deslocadas (nesta etapa)</h2>\n      <div class=\"note\" style=\"margin:-4px 0 9px\"><b>Home</b> = setor que ficou com a maioria das CBs da líder. <b style=\"color:var(--closing)\">Deslocadas</b> = CBs dela que caíram noutro setor.</div>\n      <div class=\"scroll grow\"><table id=\"leaders\"></table></div>\n    </div>\n\n    <div class=\"card\">\n      <div class=\"tabs\">\n        <button data-tab=\"matrix\" class=\"on\">Matriz ASIS</button>\n        <button data-tab=\"tobe\">Matriz TOBE</button>\n        <button data-tab=\"report\">Relatório de impacto (etapa)</button>\n        <button data-tab=\"cumulative\">Impacto acumulado (timeline)</button>\n        <button data-tab=\"sql\">Console SQL</button>\n      </div>\n      <div id=\"tab-matrix\"><div class=\"scroll grow\"><table id=\"matrix\"></table></div></div>\n      <div id=\"tab-tobe\" class=\"hidden\"><div class=\"scroll grow\"><table id=\"matrixTobe\"></table></div>\n        <div class=\"note\" id=\"tobeNote\"></div></div>\n      <div id=\"tab-report\" class=\"hidden\"></div>\n      <div id=\"tab-cumulative\" class=\"hidden\"></div>\n      <div id=\"tab-sql\" class=\"hidden\">\n        <textarea class=\"sqlbox\" id=\"sqlIn\">SELECT DS_MUNICIPIO, COUNT(DISTINCT CD_CONSULTORA) qtd FROM product.perfil_cb.crm_perfil_cb_diaria_historico WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR=3504 GROUP BY DS_MUNICIPIO ORDER BY qtd DESC</textarea>\n        <div class=\"toolbar\" style=\"margin:8px 0\"><button class=\"act\" id=\"runSql\">▶ Rodar</button><span class=\"status\" id=\"sqlStatus\"></span></div>\n        <div class=\"note\" style=\"margin:-4px 0 8px\">Roda contra o snapshot congelado desta sessão (não \"ao vivo\") — mesma coerência da timeline.</div>\n        <div class=\"scroll\"><table id=\"sqlOut\"></table></div>\n      </div>\n    </div>\n  </div>\n\n  <div>\n    <div class=\"card\">\n      <div class=\"toolbar\" style=\"margin-bottom:11px\">\n        <button class=\"ghost\" id=\"optim\" title=\"testa todas alocações contíguas e escolhe a que equilibra a carga entre setores + minimiza a quebra (evita empilhar tudo num setor)\">★ Modelo ÓTIMO (equilíbrio + quebra)</button>\n        <button class=\"ghost\" id=\"autoTobe\" title=\"preenche cada município pelo setor vizinho mais próximo (geografia)\">TOBE por adjacência</button>\n        <span class=\"badge\" id=\"optBadge\"></span>\n      </div>\n      <div class=\"note\" style=\"margin:-4px 0 10px\"><b style=\"color:var(--ink)\">★ ÓTIMO</b> = equilibra a carga entre os setores <b>e</b> minimiza a quebra (contíguo; não empilha tudo num setor). <b style=\"color:var(--ink)\">TOBE</b> = sugestão por vizinhança. Editar esta etapa recalcula automaticamente as etapas seguintes da timeline.</div>\n      <div class=\"note\" id=\"ruleNote\" style=\"margin:-6px 0 11px;padding:7px 9px;background:var(--panel2);border:1px solid var(--line);border-radius:8px\"></div>\n      <div class=\"kpis\" id=\"kpis\"></div>\n      <div id=\"contig\"></div>\n      <div id=\"spanRule\"></div>\n      <h2>Span por setor (CBs) — base + entrantes</h2>\n      <div id=\"spans\"></div>\n      <div style=\"display:flex;justify-content:space-between;align-items:center;margin:14px 0 7px\">\n        <h2 style=\"margin:0\">CBs deslocadas</h2>\n        <div class=\"toggle\" id=\"policy\">\n          <button data-p=\"fora\" class=\"on\">= fora do setor</button>\n          <button data-p=\"quebra\">= quebra de relação</button>\n        </div>\n      </div>\n      <div class=\"note\" id=\"policyNote\"></div>\n    </div>\n\n    <div class=\"card\">\n      <h2>Municípios → setor destino</h2>\n      <div class=\"note\" style=\"margin:-4px 0 9px\">Clique no <b>código do setor</b> pra mandar o município <b>inteiro</b> pra lá (regra de negócio). A cor acompanha o mapa.</div>\n      <div id=\"muniList\"></div>\n    </div>\n\n    <div class=\"card\">\n      <div class=\"toolbar\" style=\"justify-content:space-between\">\n        <h2 style=\"margin:0\">Plano de migração (etapa selecionada)</h2>\n        <div><button class=\"ghost\" id=\"copyPlan\">Copiar</button> <button class=\"ghost\" id=\"csvPlan\">CSV</button></div>\n      </div>\n      <div id=\"plan\" class=\"note\"></div>\n    </div>\n  </div>\n</div>\n\n<div class=\"sheet-bg hidden\" id=\"shareBg\">\n  <div class=\"sheet\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"shareTitle\">\n    <div class=\"sheet-hd\"><h3 id=\"shareTitle\">Compartilhar sessão</h3><div class=\"mac-spacer\"></div><button class=\"sheet-x\" id=\"shareX\" title=\"Fechar\">✕</button></div>\n    <div class=\"sheet-bd\" id=\"shareBody\"></div>\n    <div class=\"sheet-ft\">\n      <span class=\"status\" id=\"shareStatus\"></span>\n      <div class=\"mac-spacer\"></div>\n      <button class=\"ghost hidden\" id=\"shareCopy\">Copiar link</button>\n      <button class=\"ghost hidden\" id=\"shareOpen\">Abrir</button>\n      <button class=\"ghost\" id=\"shareCancel\">Cancelar</button>\n      <button class=\"act\" id=\"shareGo\">Compartilhar</button>\n    </div>\n  </div>\n</div>\n\n<div class=\"sheet-bg hidden\" id=\"optionsBg\">\n  <div class=\"sheet\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"optTitle\">\n    <div class=\"sheet-hd\"><h3 id=\"optTitle\">Opções da sessão</h3><span class=\"badge\" id=\"optSessName\"></span><div class=\"mac-spacer\"></div><button class=\"sheet-x\" id=\"optClose\" title=\"Fechar\">✕</button></div>\n    <div class=\"sheet-bd\">\n      <div class=\"opt-lbl\">Regra rígida — seleção dos setores destino</div>\n      <div class=\"opt-sub\">Define quais setores vizinhos podem entrar na lista de destinos de cada etapa. Vale pra toda a timeline desta sessão.</div>\n      <label class=\"opt-row\" data-r=\"any\">\n        <input type=\"radio\" name=\"destRule\" value=\"any\">\n        <div>\n          <div class=\"opt-t\">Adjacente a qualquer município <span class=\"badge\">padrão</span></div>\n          <div class=\"opt-d\">Um setor entra na lista de destinos se tiver município vizinho a <b>qualquer</b> município do setor fechado — inclusive os menores. É o comportamento de hoje.</div>\n        </div>\n      </label>\n      <label class=\"opt-row\" data-r=\"dominant\">\n        <input type=\"radio\" name=\"destRule\" value=\"dominant\">\n        <div>\n          <div class=\"opt-t\">Adjacente a municípios dominantes</div>\n          <div class=\"opt-d\">Só os municípios do setor fechado com <b>CBs suficientes</b> valem como ponte. Os pequenos continuam sendo redistribuídos normalmente — só não trazem setor novo pra lista de destinos.</div>\n          <div class=\"opt-inline\" id=\"optMinCbsWrap\">Ignorar municípios com menos de <input type=\"number\" id=\"optMinCbs\" min=\"1\" max=\"9999\" step=\"1\" style=\"width:74px\"> CBs</div>\n        </div>\n      </label>\n      <div class=\"opt-hr\"></div>\n      <div class=\"opt-lbl\" style=\"margin-top:15px\">Pré-requisitos do setor destino — tamanho em CBs</div>\n      <div class=\"opt-sub\">Vale pro tamanho de cada setor receptor <b>depois</b> da redistribuição (base + entrantes). Em branco = desligado.</div>\n      <div class=\"opt-grid\">\n        <label class=\"opt-fld\"><span>Span alvo <i>(tamanho ideal)</i></span><input type=\"number\" id=\"optTargetSpan\" min=\"1\" max=\"99999\" step=\"1\" placeholder=\"livre\"></label>\n        <label class=\"opt-fld\"><span>Span máximo <i>(nenhum setor acima)</i></span><input type=\"number\" id=\"optMaxSpan\" min=\"1\" max=\"99999\" step=\"1\" placeholder=\"sem limite\"></label>\n        <label class=\"opt-fld\"><span>Span mínimo <i>(nenhum setor abaixo)</i></span><input type=\"number\" id=\"optMinSpan\" min=\"1\" max=\"99999\" step=\"1\" placeholder=\"sem limite\"></label>\n      </div>\n      <div class=\"opt-err hidden\" id=\"optSpanErr\"></div>\n      <div class=\"opt-note\" id=\"optPreview\"></div>\n    </div>\n    <div class=\"sheet-ft\"><span class=\"status\" id=\"optStatus\"></span><div class=\"mac-spacer\"></div><button class=\"ghost\" id=\"optCancel\">Cancelar</button><button class=\"act\" id=\"optApply\">Aplicar</button></div>\n  </div>\n</div>\n\n<div class=\"tip\" id=\"tip\"></div>\n<div class=\"load hidden\" id=\"loader\">carregando…</div>\n<span id=\"ready\" style=\"display:none\"></span></div>`;\n  },\n  mounted(d2, root){\n\nconst $=s=>root.querySelector(s);\nconst fmt=n=>n==null?'–':Math.round(+n).toLocaleString('pt-BR');\nconst money=n=>{n=+n||0;return n>=1e6?'R$'+(n/1e6).toFixed(1)+'M':n>=1e3?'R$'+(n/1e3).toFixed(0)+'k':'R$'+Math.round(n)};\nconst norm=s=>(s||'').normalize('NFKD').replace(/[̀-ͯ]/g,'').toUpperCase().replace(/[^A-Z0-9]+/g,' ').trim();\nconst esc=s=>(s==null?'':String(s)).replace(/[&<>]/g,c=>({'&':'&amp;','<':'&lt;','>':'&gt;'}[c]));\nconst blankM=()=>({cbs:0,receita:0,rec_nat:0,rec_avon:0,pontos:0,pedidos:0,ativas:0});\n// ---------- município identity ----------\n// Brazil has many municipalities sharing a name (Bom Jesus alone exists in PI, RN, RS, SC, PB, GO).\n// A stage loads the dominant UF PLUS every bordering UF, so those collisions land in the SAME\n// feature set routinely: keyed by name alone the last shape loaded won, the map could draw a\n// município from the wrong state, buildAdj merged two unrelated municipalities into one node, and\n// GROUP BY DS_MUNICIPIO summed two real municipalities into one row. The key is NAME/UF everywhere\n// — SQL rows, GeoJSON features, the dominantes base, assignments, persisted sessions. norm() maps\n// every non-alphanumeric to a space, so '/' can never occur inside a name and the split is exact.\n// A missing UF degrades to a bare NAME key rather than inventing one.\nconst mkey=(name,uf)=>{const n=norm(name),u=String(uf==null?'':uf).trim().toUpperCase();return u?n+'/'+u:n;};\nconst mName=k=>{const s=String(k==null?'':k),i=s.lastIndexOf('/');return i<0?s:s.slice(0,i);};\nconst mUf=k=>{const s=String(k==null?'':k),i=s.lastIndexOf('/');return i<0?'':s.slice(i+1);};\nconst mDisp=k=>{const u=mUf(k);return u?mName(k)+' ('+u+')':mName(k);};\n// The base CSV is the ONLY source of a município's UF now, so its column is accepted in whatever\n// shape the base is maintained in: sigla, IBGE numeric code, or full state name. Anything that does\n// not resolve to a real sigla is treated as UNKNOWN rather than passed through — a bogus UF would key\n// a município to a shape that does not exist and drop it off the map without a word.\nconst UF_OF_CODE={}; Object.keys(UF_CODE).forEach(k=>{ UF_OF_CODE[UF_CODE[k]]=k; });\nconst UF_OF_NAME={ACRE:'AC',ALAGOAS:'AL',AMAPA:'AP',AMAZONAS:'AM',BAHIA:'BA',CEARA:'CE','DISTRITO FEDERAL':'DF','ESPIRITO SANTO':'ES',GOIAS:'GO',MARANHAO:'MA','MATO GROSSO':'MT','MATO GROSSO DO SUL':'MS','MINAS GERAIS':'MG',PARA:'PA',PARAIBA:'PB',PARANA:'PR',PERNAMBUCO:'PE',PIAUI:'PI','RIO DE JANEIRO':'RJ','RIO GRANDE DO NORTE':'RN','RIO GRANDE DO SUL':'RS',RONDONIA:'RO',RORAIMA:'RR','SANTA CATARINA':'SC','SAO PAULO':'SP',SERGIPE:'SE',TOCANTINS:'TO'};\nconst ufNorm=v=>{const s=norm(v); if(!s) return '';\n  if(UF_CODE[s]) return s;\n  if(UF_OF_CODE[s]) return UF_OF_CODE[s];\n  return UF_OF_NAME[s]||'';};\nconst loader=(on,t)=>{const l=$('#loader');l.classList.toggle('hidden',!on);if(t)l.textContent=t;};\nconst setError=(msg)=>{ const t=$('#ds'); if(t){t.textContent=msg;t.classList.add('err');} const c=$('#confirmStatus'); if(c){c.textContent=msg;c.classList.add('err');} };\n\n// ---------- base de municípios dominantes (CSV) ----------\n// WHICH municipalities belong to a sector is a business fact, not something to infer from CB volume:\n// it comes from a maintained CSV (one row per setor x município) linked through the `dominantesCsvUrl`\n// param. Anything the closing sector has CBs in but that the base does NOT assign to it is spillover:\n// not realocated, not drawn on the map, and its CBs follow their leader. Loaded once per URL and\n// cached for the whole session; a failure is thrown, never swallowed — a silent fallback here would\n// quietly change every number on the screen.\nconst DOM={url:null,promise:null,bySetor:null,ufBySetorMuni:null,rows:0,setores:0,hasUf:false,ufCol:null,badUf:0,clashes:0,headers:null,error:null};\nfunction parseCsv(text){\n  const out=[]; let row=[],cur='',q=false;\n  const push=()=>{ row.push(cur); cur=''; };\n  const endRow=()=>{ push(); if(row.length>1||row[0]!=='') out.push(row); row=[]; };\n  for(let i=0;i<text.length;i++){ const ch=text[i];\n    if(q){ if(ch==='\"'){ if(text[i+1]==='\"'){ cur+='\"'; i++; } else q=false; } else cur+=ch; }\n    else if(ch==='\"') q=true;\n    else if(ch===',') push();\n    else if(ch==='\\n') endRow();\n    else if(ch!=='\\r') cur+=ch;\n  }\n  if(cur!==''||row.length) endRow();\n  return out;\n}\n// `dominantesCsvUrl` is declared as a FileComponentUrlReference, so the instance points at the Drive\n// FILE, not at a URL literal — the Drive is policy-gated behind the app's auth strategy and a baked\n// string would be both stale and unauthorised. What the resolver hands back varies by where it is\n// resolved (URL string / file record / bare reference), so accept every shape instead of silently\n// reading undefined and falling through to the fallback.\n// The Drive is gated by the app's AuthenticationStrategy, so this read has to travel as the LOGGED-IN\n// USER — an anonymous CDN GET is exactly what the policy is there to refuse. `<system>.data2.media` is\n// only a cache in front of the SSP: on a cache miss it 302s to `<system>.data2apis.com`, which is where\n// the policy is actually evaluated.\n// COOKIES CANNOT CARRY THAT SESSION, which is why the previous `credentials:'include'` attempt could\n// never have worked: the app runs on <app>.<system>.data2.app and the SSP on <system>.data2apis.com —\n// cross-site — and the SSP answers `Access-Control-Allow-Origin: *` with no `Allow-Credentials`, so the\n// browser rejects a credentialed CORS read before it ever leaves the page. What the SSP actually reads\n// is `Authorization: Bearer <token>`: the runtime keeps that token in localStorage under\n// `__data2-session-<systemDomain>` (`__data2-session-data2` inside the builder preview) and replays it\n// on every dataset and rush call — same token, same header, same session, so the Drive policy sees the\n// logged-in user. Preflight passes because the SSP echoes whatever header the request asks for.\nfunction d2SessionToken(sysDomain){\n  const read=k=>{ try{ return (k&&window.localStorage.getItem(k))||''; }catch(e){ return ''; } };\n  return read(sysDomain?('__data2-session-'+sysDomain):'')||read('__data2-session-data2')||'';\n}\nfunction domCsvSystemDomain(url){\n  const m=/^https?:\\/\\/([^.\\/]+)\\.data2\\.(?:media|app)\\//i.exec(url)||/^https?:\\/\\/([^.\\/]+)\\.data2apis\\.com\\//i.exec(url);\n  return m?m[1]:'';\n}\nfunction domCsvCandidates(url){\n  const out=[];\n  const isMedia=/^https?:\\/\\/[^.\\/]+\\.data2\\.media\\//i.test(url);\n  const api=isMedia?url.replace(/^(https?:\\/\\/[^.\\/]+)\\.data2\\.media\\//i,'$1.data2apis.com/'):null;\n  const tok=d2SessionToken(domCsvSystemDomain(url));\n  const auth=tok?{authorization:'Bearer '+tok}:null;\n  // Authenticated origin read first — the only candidate a GATED Drive can actually answer.\n  if(api&&auth) out.push({url:api,headers:auth,label:'api+sessão'});\n  if(!api&&auth) out.push({url:url,headers:auth,label:'origem+sessão'});\n  // Anonymous last: only ever succeeds on an UNGATED Drive — or on a stale CDN cache hit, which is NOT\n  // proof the file is public (the origin keeps answering 401 once the edge entry expires).\n  if(api) out.push({url:api,headers:null,label:'api anônimo'});\n  out.push({url:url,headers:null,label:'origem anônima'});\n  return out;\n}\nfunction domCsvUrl(){\n  const pick=v=>{\n    if(!v) return '';\n    if(typeof v==='string') return v;\n    const q=v.params||{};\n    const ref=q.reference||v.reference;\n    return q.fileUrl||q.url||v.fileUrl||v.url||(ref?DOM_MEDIA_BASE+ref:'');\n  };\n  return String(pick(d2.param('dominantesCsvUrl'))||DOM_CSV_FALLBACK||'').trim();\n}\nasync function ensureDominantes(){\n  const url=domCsvUrl();\n  if(!url) throw new Error('base de municípios dominantes não configurada — ligue o arquivo CSV no parâmetro dominantesCsvUrl da instância do componente');\n  if(DOM.url===url && DOM.bySetor) return DOM.bySetor;\n  if(DOM.url===url && DOM.promise) return DOM.promise;\n  DOM.url=url; DOM.error=null;\n  DOM.promise=(async()=>{\n    // Self-diagnosing on purpose: every candidate reports its own outcome and the message names the\n    // session it was carrying. \"Unauthorized\" alone cannot distinguish \"not logged into THIS strategy\"\n    // from \"cookie not sent cross-site\" from \"param never bound, so it tried the fallback URL\" — and\n    // guessing between those from the outside costs a round trip each time.\n    let r=null; const tried=[];\n    for(const c of domCsvCandidates(url)){\n      let res=null;\n      try{ res=await fetch(c.url,{cache:'no-store',credentials:'omit',headers:c.headers||undefined}); }\n      catch(e){ tried.push(c.label+' → rede/CORS'); continue; }\n      if(res.ok){ r=res; break; }\n      tried.push(c.label+' → '+res.status);\n    }\n    if(!r){\n      let sess='sessão desconhecida';\n      try{\n        const a=d2.auth(AUTH_REF);\n        sess=(a&&a.isAuthed)?('logado como '+((a.user&&(a.user.email||a.user.nome))||'?')):('NÃO logado na estratégia '+AUTH_REF);\n      }catch(e){ sess='estratégia '+AUTH_REF+' não resolvida'; }\n      const tk=d2SessionToken(domCsvSystemDomain(url));\n      throw new Error('base de municípios dominantes: não foi possível ler o arquivo — '+sess+' · token de sessão '+(tk?'presente':'AUSENTE no localStorage')+'. Tentativas: '+tried.join(' · '));\n    }\n    const table=parseCsv(await r.text());\n    if(table.length<2) throw new Error('base de municípios dominantes vazia');\n    const head=table[0].map(h=>norm(h));\n    const iS=head.indexOf('CD SETOR'), iM=head.indexOf('MUNICIPIO');\n    if(iS<0||iM<0) throw new Error('base de municípios dominantes sem as colunas CD_SETOR / MUNICIPIO');\n    // CD_GV is the gerência de vendas the setor answers to, and it is the authority for the hard rule\n    // that a closing sector only ever hands territory to sectors of its OWN gerência. Its absence is\n    // fatal rather than a warning: with no GV there is no way to PROVE two sectors share one, and\n    // falling through unchecked is exactly the leak this column exists to close.\n    const iG=['CD GV','CDGV','GV','CD GERENCIA','CD GERENCIA VENDAS','CD GERENCIA DE VENDAS','GERENCIA DE VENDAS','GERENCIA'].map(h=>head.indexOf(h)).find(i=>i>=0);\n    if(iG==null) throw new Error('base de municípios dominantes sem a coluna CD_GV — a regra de gerência de vendas não pode ser aplicada. Colunas lidas: '+head.slice(0,40).join(', '));\n    // The UF column is what the whole keying now rests on — SQL no longer carries DS_ESTADO — so its\n    // absence is a first-class finding, not a footnote. The header actually matched is reported on the\n    // base pill, and when nothing matches the pill lists every column read, because guessing a header\n    // name from the outside costs a round trip each time.\n    const iU=['UF','SIGLA UF','SG UF','CD UF','ESTADO','DS ESTADO','SIGLA','ESTADO SIGLA','UF MUNICIPIO'].map(h=>head.indexOf(h)).find(i=>i>=0);\n    const by={},ufBy={},gvBy={}; let n=0,bad=0; const clash={},gvClash={};\n    for(let i=1;i<table.length;i++){\n      const line=table[i]; if(!line) continue;\n      const s=String(line[iS]==null?'':line[iS]).trim(), m=norm(line[iM]);\n      if(!s||!m) continue;\n      // One setor spans many rows (one per município) and every one of them repeats its CD_GV. Two\n      // DIFFERENT values for the same setor means the base itself disagrees about which gerência owns\n      // it — counted and reported, never keyed to whichever row happened to be read last.\n      const gvv=String(line[iG]==null?'':line[iG]).trim();\n      if(gvv){ if(gvBy[s]!==undefined && gvBy[s]!==gvv) gvClash[s]=true; else gvBy[s]=gvv; }\n      const raw=(iU==null)?'':line[iU];\n      const u=(iU==null)?'':ufNorm(raw);\n      if(iU!=null && String(raw==null?'':raw).trim() && !u) bad++;\n      // The same name twice in ONE setor under two UFs is the single case the reverted SQL cannot\n      // survive: mSQL groups by DS_MUNICIPIO alone, so both municipalities arrive summed into one row\n      // and no lookup can split them again. Counted and reported — never quietly keyed to whichever\n      // UF happened to be read last.\n      const kk=s+'|'+m;\n      // An UNRESOLVED uf must never outrank a resolved one. Reading a blank/bogus UF row first wrote ''\n      // here, and the next row carrying the real sigla was then rejected as a clash — so the key stayed\n      // falsy for good, ufFor() fell through, and the município degraded to a bare NAME key that matches\n      // no shape and no dominance entry. With DISTRITO/ZONA in the base a município spans several rows,\n      // so which row lands first is pure luck. A clash is only two RESOLVED siglas that disagree.\n      if(!u){ if(ufBy[kk]===undefined) ufBy[kk]=''; }\n      else if(!ufBy[kk]) ufBy[kk]=u;\n      else if(ufBy[kk]!==u) clash[kk]=true;\n      (by[s]=by[s]||new Set()).add(u?m+'/'+u:m); n++;\n    }\n    if(!n) throw new Error('base de municípios dominantes sem linhas válidas');\n    DOM.bySetor=by; DOM.ufBySetorMuni=ufBy; DOM.rows=n; DOM.setores=Object.keys(by).length;\n    DOM.gvBySetor=gvBy; DOM.gvClashes=Object.keys(gvClash).length; DOM.gvCol=String(table[0][iG]||'').trim();\n    DOM.gvSetores=Object.keys(gvBy).length;\n    DOM.hasUf=(iU!=null); DOM.ufCol=(iU==null?null:String(table[0][iU]||'').trim());\n    DOM.badUf=bad; DOM.clashes=Object.keys(clash).length; DOM.headers=head.slice(0,40); DOM.error=null;\n    return by;\n  })();\n  DOM.promise.catch(e=>{ DOM.promise=null; DOM.bySetor=null; DOM.error=e.message; renderAll(); });\n  return DOM.promise;\n}\n\nlet SESS={ snapshotRaw:null, snapshotSyncedAt:null, snapLiteral:null, eloMaxCycle:null, timeline:[], selected:0,\n           sessionId:null, sessionLabel:null, sessionsList:[], sectorsList:[], sectorBaseCache:{}, stage:'loading', dirtyFrom:null,\n           snapBusy:false, settings:{...DEFAULT_SETTINGS} };\n\nasync function q(sql){\n  let dbx,res;\n  try{\n    res=await d2.rush('AwW_11Nkg-dKksP7ic8V8').invoke({sql});\n  }catch(e){\n    throw new Error('Databricks indisponível (rush AwW_11Nkg-dKksP7ic8V8): '+e.message);\n  }\n  // The listener answers 200 with {sql} and NO `result` when its upstream probe times out: the\n  // handler builds `result: $result.data`, so an empty upstream simply drops the key rather than\n  // failing. Reading straight through to res.data.result.data reported \"Cannot read properties of\n  // undefined (reading 'data')\" — which reads like a bug in THIS component and sent a debugging\n  // session after the wrong thing. Name the layer that actually failed instead.\n  const payload=res&&res.data;\n  if(!payload) throw new Error('rush AwW_11Nkg-dKksP7ic8V8 não devolveu corpo — listener fora do ar?');\n  if(!payload.result) throw new Error('a sonda Databricks não respondeu: o listener AwW_11Nkg-dKksP7ic8V8 devolveu 200 sem `result`, o que normalmente é timeout do upstream (natura-x-app). O SQL não chegou a rodar.');\n  dbx=payload.result.data;\n  if(!dbx) throw new Error('sonda Databricks respondeu sem dados (result.data vazio).');\n  if(dbx.state && dbx.state!=='SUCCEEDED') throw new Error('Databricks '+dbx.state+': '+(dbx.error?.message||JSON.stringify(dbx.error)||'erro desconhecido'));\n  return dbx;\n}\nfunction rows(resp){const c=(resp.columns||[]).map(x=>x.name);\n  return (resp.rows||[]).map(a=>Object.fromEntries(c.map((k,i)=>[k,a[i]])));}\n// Stamps the UF onto every feature at load: the fetch is per-UF, so this is the ONLY point where a\n// shape's state is known for certain. Downstream the features are flattened into one array and the\n// origin would be unrecoverable. Persisted with the feature in saved sessions.\nasync function geoUF(uf){const code=UF_CODE[uf]||uf;const r=await fetch('https://raw.githubusercontent.com/tbrugz/geodata-br/master/geojson/geojs-'+code+'-mun.json');if(!r.ok)throw new Error('geo '+uf);\n  const g=await r.json(); const U=String(uf).toUpperCase();\n  (g.features||[]).forEach(f=>{ f.__uf=U; });\n  return g;}\n\nfunction buildAdj(features){\n  const pts=f=>{const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates],s=new Set();\n    ps.forEach(poly=>poly.forEach(ring=>ring.forEach(p=>s.add(Math.round(p[0]*1000)/1000+','+Math.round(p[1]*1000)/1000))));return s;};\n  const feat={},idx={};\n  features.forEach(f=>{const nm=mkey(f.properties.name||f.properties.NOME||f.properties.nome,f.__uf);feat[nm]={f,pts:pts(f)};});\n  for(const nm in feat) feat[nm].pts.forEach(p=>(idx[p]=idx[p]||[]).push(nm));\n  const nbrs=nm=>{const c={};feat[nm].pts.forEach(p=>idx[p].forEach(o=>{if(o!==nm)c[o]=(c[o]||0)+1;}));\n    return Object.entries(c).filter(([,n])=>n>=2).map(([o,n])=>({o,w:n}));};\n  return {feat,nbrs};\n}\nfunction centroidLL(f){let x=0,y=0,n=0;const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];\n  ps.forEach(poly=>poly[0].forEach(p=>{x+=p[0];y+=p[1];n++;}));return[x/n,y/n];}\n\n// ---------- snapshot pinning ----------\nasync function resolveSnapshotPin(){\n  const [rawR,liveCountR,eloR]=await Promise.all([\n    q(`SELECT MAX(DT_HISTORICO) snap FROM ${T} WHERE CD_PAIS=1`).then(rows),\n    q(`SELECT COUNT(*) n FROM ${T} WHERE CD_PAIS=1 AND DT_HISTORICO=(SELECT MAX(DT_HISTORICO) FROM ${T} WHERE CD_PAIS=1)`).then(rows),\n    q(`SELECT MAX(operational_cycle) mx FROM ${ELO} WHERE country_code=1`).then(rows).catch(()=>[]),\n  ]);\n  const raw=rawR[0]&&rawR[0].snap;\n  const liveCount=+((liveCountR[0]||{}).n||0);\n  const eloMax=+((eloR[0]||{}).mx||0);\n  const LIVE_SUBQ=`(SELECT MAX(DT_HISTORICO) FROM ${T} WHERE CD_PAIS=1)`;\n  const dbTs=(raw||'').replace('T',' ').replace(/Z$/,'');\n  const candidates=[`TIMESTAMP'${dbTs}'`,`'${dbTs}'`,`DATE'${dbTs}'`];\n  const tests=await Promise.all(candidates.map(c=>\n    q(`SELECT COUNT(*) n FROM ${T} WHERE CD_PAIS=1 AND DT_HISTORICO=${c}`).then(rows).then(r=>+((r[0]||{}).n||0)).catch(()=>-1)\n  ));\n  let chosen=LIVE_SUBQ;\n  for(let i=0;i<candidates.length;i++){ if(liveCount>0 && tests[i]===liveCount){ chosen=candidates[i]; break; } }\n  return {snapshotRaw:raw, snapLiteral:chosen, eloMaxCycle:eloMax, syncedAt:new Date().toISOString()};\n}\n// DISPLAY CONTRACT: the UI never prints the snapshot's own DT_HISTORICO (snapshotRaw). What the user\n// sees is `snapshotSyncedAt` — the date AND hour at which THIS instance last pulled/pinned the\n// snapshot it is querying. snapshotRaw is still resolved, still drives every SQL literal, and is\n// still persisted by saveSession/doShare; it is only kept off the screen.\nfunction fmtSyncedAt(iso){\n  if(!iso) return '—';\n  const d=new Date(iso);\n  if(isNaN(d.getTime())) return String(iso);\n  return d.toLocaleString('pt-BR',{day:'2-digit',month:'2-digit',year:'numeric',hour:'2-digit',minute:'2-digit'});\n}\nasync function ensurePinned(){\n  if(SESS.snapLiteral) return;\n  const p=await resolveSnapshotPin();\n  SESS.snapshotRaw=p.snapshotRaw; SESS.snapLiteral=p.snapLiteral; SESS.eloMaxCycle=p.eloMaxCycle;\n  SESS.snapshotSyncedAt=p.syncedAt;\n}\n\n// ---------- world-state fold ----------\nfunction accMetrics(base,add){\n  const out=base?{...base}:blankM();\n  Object.keys(blankM()).forEach(k=>{ out[k]=(out[k]||0)+((add&&add[k])||0); });\n  return out;\n}\nfunction foldWorldState(timeline,uptoIdx){\n  const closedSectors=new Set(),muniOverride={},muniGeo={},muniRow={},muniLevel={},sectorInflow={},sectorInflowLevel={},sectorOrphanRows={};\n  for(let k=0;k<uptoIdx;k++){\n    const mv=timeline[k]; if(!mv||!mv.sector||!mv.munis) continue;\n    closedSectors.add(String(mv.sector));\n    Object.keys(mv.munis).forEach(m=>{\n      if(m==='__OUTROS__') return;\n      const dest=mv.assign[m]; if(!dest) return;\n      muniOverride[m]=String(dest);\n      if(mv.geoFeat&&mv.geoFeat[m]) muniGeo[m]=mv.geoFeat[m];\n      const rws=(mv.matrix||[]).filter(r=>mkey(r.municipio,r.uf)===m);\n      muniRow[m]=(muniRow[m]||[]).concat(rws);\n      if(mv.levelByMuni&&mv.levelByMuni[m]) muniLevel[m]={...(muniLevel[m]||{}),...mv.levelByMuni[m]};\n      sectorInflow[dest]=accMetrics(sectorInflow[dest],mv.munis[m]);\n      const lv=(mv.levelByMuni&&mv.levelByMuni[m])||{};\n      sectorInflowLevel[dest]=sectorInflowLevel[dest]||{};\n      Object.entries(lv).forEach(([nv,c])=>{ sectorInflowLevel[dest][nv]=(sectorInflowLevel[dest][nv]||0)+c; });\n    });\n    // Orphan CBs follow their leader's home sector, so later etapas must inherit them the same way\n    // the allocated municipalities are inherited — otherwise a stage's span would not match the\n    // base carried into the next one.\n    if(mv.orphanMetricsByGroup && Object.keys(mv.orphanMetricsByGroup).length){\n      const d=computeDerived(mv);\n      d.leaders.forEach(L=>{\n        if(!L.home) return;\n        const om=mv.orphanMetricsByGroup[L.grupo];\n        if(om) sectorInflow[L.home]=accMetrics(sectorInflow[L.home],om);\n        // sectorInflow only reaches a sector while it is a DESTINATION (it lands in baseMetrics).\n        // Keep the rows as well, so the sector still carries these CBs on the day it is the one\n        // being closed — that read goes through mv.matrix, which baseMetrics never touches.\n        const orws=mv.orphanRowsByGroup&&mv.orphanRowsByGroup[L.grupo];\n        if(orws&&orws.length) sectorOrphanRows[L.home]=(sectorOrphanRows[L.home]||[]).concat(orws);\n        const ol=mv.orphanLevelByGroup&&mv.orphanLevelByGroup[L.grupo];\n        if(ol){ sectorInflowLevel[L.home]=sectorInflowLevel[L.home]||{};\n          Object.entries(ol).forEach(([nv,c])=>{ sectorInflowLevel[L.home][nv]=(sectorInflowLevel[L.home][nv]||0)+c; }); }\n      });\n    }\n  }\n  return {closedSectors,muniOverride,muniGeo,muniRow,muniLevel,sectorInflow,sectorInflowLevel,sectorOrphanRows};\n}\n\n// ---------- per-movement compute ----------\nfunction aggregateMovement(mv){\n  const munis={},leaders={};\n  const exSet=new Set((mv.excludedMunis||[]).map(x=>x.muni));\n  const acc=(o,r)=>{o.cbs+=+r.cbs;o.receita+=+r.receita||0;o.rec_nat+=+r.rec_nat||0;o.rec_avon+=+r.rec_avon||0;o.pontos+=+r.pontos||0;o.pedidos+=+r.pedidos||0;o.ativas+=+r.ativas||0;};\n  // Orphans = CBs in municipalities outside the sector's dominance base. They are NOT allocated\n  // geographically; they follow their own leader's home sector. Kept per leader group so every\n  // consumer (span, cascade, impact report) can route them the same way.\n  mv.orphanByGroup={}; mv.orphanMetricsByGroup={}; mv.orphanRowsByGroup={};\n  mv.matrix.forEach(r=>{\n    const m=mkey(r.municipio,r.uf);\n    r._out=!mv.geoFeat[m];   // assign, never just set: absorbed rows are reused across etapas\n    const mm=r._out?'__OUTROS__':m;\n    munis[mm]=munis[mm]||{...blankM(),name:mm}; acc(munis[mm],r);\n    const g=String(r.grupo); leaders[g]=leaders[g]||{grupo:g,lider:r.lider,total:0,byMuni:{}};\n    leaders[g].total+=+r.cbs; leaders[g].byMuni[mm]=(leaders[g].byMuni[mm]||0)+ +r.cbs;\n    if(r._out && exSet.has(m)){\n      mv.orphanByGroup[g]=(mv.orphanByGroup[g]||0)+ +r.cbs;\n      // The ROW too, not just the totals: when the leader's home sector is itself closed in a later\n      // etapa, that etapa rebuilds its matrix from SQL + absorbed municípios, and these CBs are in\n      // neither (their município never moved). Without the row they silently vanish from the sector\n      // they were just credited to — see sectorOrphanRows in foldWorldState.\n      (mv.orphanRowsByGroup[g]=mv.orphanRowsByGroup[g]||[]).push(r);\n      mv.orphanMetricsByGroup[g]=accMetrics(mv.orphanMetricsByGroup[g],\n        {cbs:+r.cbs,receita:+r.receita||0,rec_nat:+r.rec_nat||0,rec_avon:+r.rec_avon||0,pontos:+r.pontos||0,pedidos:+r.pedidos||0,ativas:+r.ativas||0});\n    }\n  });\n  // Level counts only exist per municipality, never per leader, so an excluded municipality's level\n  // mix is credited to the group holding most of its CBs (sub-threshold by definition, so usually one).\n  mv.orphanLevelByGroup={};\n  (mv.excludedMunis||[]).forEach(({muni})=>{\n    const lv=(mv.levelByMuni&&mv.levelByMuni[muni])||{}; if(!Object.keys(lv).length) return;\n    let bg=null,bc=-1;\n    mv.matrix.forEach(r=>{ if(mkey(r.municipio,r.uf)!==muni) return; const cc=+r.cbs; if(cc>bc){bc=cc;bg=String(r.grupo);} });\n    if(!bg) return;\n    mv.orphanLevelByGroup[bg]=mv.orphanLevelByGroup[bg]||{};\n    Object.entries(lv).forEach(([nv,cc])=>{ mv.orphanLevelByGroup[bg][nv]=(mv.orphanLevelByGroup[bg][nv]||0)+cc; });\n  });\n  mv.munis=munis; mv.leaders=Object.values(leaders).sort((a,b)=>b.total-a.total);\n}\nfunction autoAssignFor(mv){\n  const a={};\n  Object.keys(mv.munis).forEach(m=>{ if(m==='__OUTROS__')return;\n    const v=mv.allowed[m]||{}; const votes=Object.keys(v);\n    if(votes.length){ let best=votes[0],bw=-1; for(const s of votes) if(v[s]>bw){bw=v[s];best=s;} a[m]=best; }\n    else if(mv.dest.length){ const c=mv.muniCentroid[m]; let best=mv.dest[0],bd=Infinity;\n      for(const s of mv.dest){ const sc=mv.secCentroid[s]; if(!sc||!c)continue; const d=(c[0]-sc[0])**2+(c[1]-sc[1])**2; if(d<bd){bd=d;best=s;} }\n      a[m]=best; }\n  });\n  return a;\n}\nfunction deslocFor(mv,assign){\n  let d=0;\n  mv.leaders.forEach(L=>{const byS={};let tot=0;\n    for(const [m,c] of Object.entries(L.byMuni)){if(m==='__OUTROS__')continue;const s=assign[m];if(s){byS[s]=(byS[s]||0)+c;tot+=c;}}\n    const home=mv.dest.reduce((a,s)=>(byS[s]||0)>(byS[a]||0)?s:a,mv.dest[0]);\n    d+=tot-(byS[home]||0);});\n  return d;\n}\nfunction spanMapFor(mv,a){const inc={};mv.dest.forEach(s=>inc[s]=0);\n  Object.entries(mv.munis).forEach(([m,o])=>{if(m==='__OUTROS__')return;const s=a[m];if(s&&inc[s]!=null)inc[s]+=o.cbs;});\n  // Orphan CBs follow their leader's home sector, and that home depends on THIS candidate\n  // assignment — so they have to be counted here, or the optimizer would score and constrain a\n  // span that differs from the one the UI shows. Skipped entirely when there are no orphans.\n  if(mv.orphanByGroup&&Object.keys(mv.orphanByGroup).length){\n    mv.leaders.forEach(L=>{\n      const orphan=mv.orphanByGroup[L.grupo]||0; if(!orphan) return;\n      const byS={}; let tot=0;\n      for(const [m,c] of Object.entries(L.byMuni)){ if(m==='__OUTROS__') continue; const s=a[m]; if(s&&inc[s]!=null){ byS[s]=(byS[s]||0)+c; tot+=c; } }\n      if(!tot) return;   // no home to follow -> stranded, counted nowhere\n      const home=mv.dest.reduce((x,s)=>(byS[s]||0)>(byS[x]||0)?s:x,mv.dest[0]);\n      if(inc[home]!=null) inc[home]+=orphan;\n    });\n  }\n  const sp={};mv.dest.forEach(s=>sp[s]=(+(mv.baseMetrics[s]?.cbs||0))+inc[s]);return sp;}\nfunction maxSpanOfFor(mv,a){return Math.max(...Object.values(spanMapFor(mv,a)),0);}\nfunction spanLimits(){const st={...DEFAULT_SETTINGS,...(SESS.settings||{})};\n  return {target:numOrNull(st.targetSpan),max:numOrNull(st.maxSpan),min:numOrNull(st.minSpan)};}\nfunction spanLimitsOn(lim){return !!(lim.target||lim.max||lim.min);}\nfunction spanViolationsOf(sp,lim){const over=[],under=[];\n  Object.entries(sp).forEach(([s,v])=>{ if(lim.max&&v>lim.max)over.push(s); if(lim.min&&v<lim.min)under.push(s); });\n  return {over,under};}\nfunction spanViolationsFor(mv,a){return spanViolationsOf(spanMapFor(mv,a),spanLimits());}\n// With a target span the objective becomes RMS distance from the ideal size (punishes too big AND\n// too small). With no target we keep the legacy objective: shave the biggest sector.\nfunction spanCostFor(mv,a){const lim=spanLimits(),vals=Object.values(spanMapFor(mv,a));\n  if(!vals.length) return 0;\n  if(lim.target) return Math.sqrt(vals.reduce((s,v)=>s+(v-lim.target)**2,0)/vals.length);\n  return Math.max(...vals);}\n// ---------- ÓTIMO: objetivo multi-critério ----------\n// Three normalised objectives, each 0..1, so the weights below are directly comparable. The old\n// score added a span cost measured in CBs to a desloc measured in CBs, so on a large sector the\n// balance term was numerically ~100x the desloc term and silently decided everything on its own.\n//   balance — RMS spread of the resulting spans (against the target span when one is set,\n//             otherwise against their own mean), over that reference. 0 = every destination\n//             sector ends up the same size.\n//   dist    — how far each município travels, CB-weighted: half from the share of its outer\n//             border that faces the sector it was given to, half from centroid distance. 0 =\n//             every município went to a sector it physically touches. Adjacency used to be a\n//             pure yes/no constraint (contiguity); this is what makes it a preference too.\n//   orphan  — stranded orphan CBs (leader left without a home sector, so they land nowhere at\n//             all) plus CBs split away from their leader's home, over the CBs at stake.\n//             Stranded ones count OPT_STRAND_K times: a stranded CB leaves the model entirely,\n//             a deslocated one merely changes hands.\nconst OPT_W={balance:1, dist:0.85, orphan:1};\nconst OPT_STRAND_K=3;\nconst OPT_SIMS=24;             // simultaneous simulations per run, scaled down on big stages\nconst OPT_PASSES=14;           // local-search sweeps inside one simulation\nconst OPT_EVAL_BUDGET=120000;  // total candidate evaluations across the whole portfolio\nconst OPT_EXHAUSTIVE_MAX=60000;\nfunction optDistPrep(mv){\n  let mx=0;\n  Object.keys(mv.munis).forEach(m=>{ if(m==='__OUTROS__') return; const c=mv.muniCentroid[m]; if(!c) return;\n    mv.dest.forEach(s=>{ const sc=mv.secCentroid[s]; if(!sc) return;\n      const d=Math.hypot(c[0]-sc[0],c[1]-sc[1]); if(d>mx) mx=d; }); });\n  return mx||1;\n}\nfunction optDistCost(mv,m,s,dmax){\n  const v=mv.allowed[m]||{}; let tot=0; for(const k in v) tot+=v[k];\n  const share=tot?((v[s]||0)/tot):0;\n  const c=mv.muniCentroid[m], sc=mv.secCentroid[s];\n  // Missing centroid on either side is neutral (0.5), never 0 — an unmeasurable move must not\n  // score as the cheapest one on the board.\n  const geo=(c&&sc)?Math.min(1,Math.hypot(c[0]-sc[0],c[1]-sc[1])/dmax):0.5;\n  return 0.5*(1-share)+0.5*geo;\n}\nfunction optEval(mv,a,dmax){\n  const lim=spanLimits();\n  const sp=spanMapFor(mv,a), vals=Object.values(sp);\n  let balance=0;\n  if(vals.length){\n    const ref=lim.target||(vals.reduce((x,y)=>x+y,0)/vals.length);\n    if(ref) balance=Math.min(1,Math.sqrt(vals.reduce((s,v)=>s+(v-ref)**2,0)/vals.length)/ref);\n  }\n  let cbs=0,dist=0;\n  for(const m in a){ const o=mv.munis[m]; if(!o) continue; const w=+o.cbs||0; cbs+=w; dist+=w*optDistCost(mv,m,a[m],dmax); }\n  dist=cbs?(dist/cbs):0;\n  let stranded=0,desloc=0,tot=0;\n  mv.leaders.forEach(L=>{\n    const byS={}; let t=0;\n    for(const [m,c] of Object.entries(L.byMuni)){ if(m==='__OUTROS__') continue; const s=a[m]; if(s){ byS[s]=(byS[s]||0)+c; t+=c; } }\n    const orphan=(mv.orphanByGroup&&mv.orphanByGroup[L.grupo])||0;\n    tot+=t+orphan;\n    if(!t){ stranded+=orphan; return; }   // no allocated CBs -> no home -> these orphans land nowhere\n    const home=mv.dest.reduce((x,s)=>(byS[s]||0)>(byS[x]||0)?s:x,mv.dest[0]);\n    desloc+=t-(byS[home]||0);\n  });\n  const orphanTerm=tot?Math.min(1,(desloc+OPT_STRAND_K*stranded)/tot):0;\n  return { cost:OPT_W.balance*balance+OPT_W.dist*dist+OPT_W.orphan*orphanTerm,\n           balance, dist, desloc, stranded, sp, viol:spanViolationsOf(sp,lim) };\n}\nfunction optScoreFor(mv,a){ return optEval(mv,a,mv.__optDmax||optDistPrep(mv)).cost; }\n// Seeded PRNG on purpose. computeMovement runs the optimizer for EVERY stage and recomputeFrom\n// re-runs every stage downstream of an edit, so a Math.random() portfolio would hand back a\n// different allocation on each pass and a saved timeline would never reproduce.\nfunction optRng(seed){ let a=seed>>>0;\n  return ()=>{ a=(a+0x6D2B79F5)>>>0; let t=Math.imul(a^(a>>>15),1|a);\n    t=(t+Math.imul(t^(t>>>7),61|t))^t; return ((t^(t>>>14))>>>0)/4294967296; }; }\nfunction optSeed(mv,ms){ let h=2166136261>>>0;\n  const s=String(mv.sector)+'|'+ms.join(',')+'|'+mv.dest.join(',');\n  for(let i=0;i<s.length;i++) h=Math.imul(h^s.charCodeAt(i),16777619);\n  return h>>>0; }\nfunction contigBadFor(mv,assign){\n  const bySec={}; for(const m in assign){(bySec[assign[m]]=bySec[assign[m]]||[]).push(m);}\n  const bad=[];\n  for(const s in bySec){const grp=bySec[s],inGrp=new Set(grp);\n    const seeds=grp.filter(m=>(mv.allowed[m]||{})[s]);\n    if(!seeds.length){bad.push(s);continue;}\n    const seen=new Set(seeds),st=[...seeds];\n    while(st.length){const m=st.pop();(mv.closeAdj[m]||[]).forEach(o=>{if(inGrp.has(o)&&!seen.has(o)){seen.add(o);st.push(o);}});}\n    if(seen.size!==grp.length)bad.push(s);}\n  return bad;\n}\nfunction greedyFor(mv,ms,opts){const lim=spanLimits();const a={};\n  ms.forEach((m,i)=>{let best=opts[i][0],bd=Infinity;\n    for(const s of opts[i]){a[m]=s;\n      // over-max only grows as we keep assigning, so it is safe to penalise mid-build;\n      // under-min shrinks, so penalising it here would just chase noise.\n      const over=lim.max?spanViolationsOf(spanMapFor(mv,a),{max:lim.max,min:null}).over.length:0;\n      const d=optScoreFor(mv,a)+(contigBadFor(mv,a).length?1e9:0)+over*1e6;\n      if(d<bd){bd=d;best=s;}}\n    a[m]=best;});\n  return a;}\nfunction optimizeFor(mv){\n  const ms=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__');\n  if(!ms.length||!mv.dest.length){ mv.optBadge=mv.dest.length?'':'sem setor destino identificado'; return {}; }\n  const opts=ms.map(m=>{const al=(mv.reachable[m]&&mv.reachable[m].length)?mv.reachable[m]:mv.dest.slice();return al.length?al:mv.dest.slice();});\n  const combos=opts.reduce((a,o)=>a*o.length,1);\n  const lim=spanLimits();\n  const dmax=optDistPrep(mv); mv.__optDmax=dmax;\n\n  // Feasibility ladder — same meaning as before, because renderSpanRule and the saved sessions\n  // both read mv.optTier: 0 = contíguo + max + min span, 1 = contíguo + max span, 2 = contíguo\n  // only. Every candidate any simulation produces is offered to all three tiers; we ship the\n  // strictest tier that got a solution, so an unreachable min/max relaxes loudly instead of\n  // stranding the stage with nothing.\n  const tier=[null,null,null],tSc=[Infinity,Infinity,Infinity],tEv=[null,null,null];\n  let feasible=0,evals=0;\n  const offer=(a,ev)=>{\n    if(contigBadFor(mv,a).length) return false;\n    feasible++;\n    const put=t=>{ if(ev.cost<tSc[t]){ tSc[t]=ev.cost; tier[t]={...a}; tEv[t]=ev; } };\n    put(2);\n    if(!ev.viol.over.length){ put(1); if(!ev.viol.under.length) put(0); }\n    return true;\n  };\n  const evalOf=a=>{ evals++; return optEval(mv,a,dmax); };\n\n  // Small enough to settle the question outright: enumerate every contiguous allocation and the\n  // winner is provably the best one under this objective. No search needed, so none is run.\n  const exhaustive=combos<=OPT_EXHAUSTIVE_MAX;\n  let sims=0;\n  if(exhaustive){\n    const cur={};\n    const rec=i=>{ if(i===ms.length){ offer(cur,evalOf(cur)); return; }\n      for(const s of opts[i]){ cur[ms[i]]=s; rec(i+1); } };\n    rec(0);\n  } else {\n    // Too big to enumerate, so run a portfolio of independent simulations instead. Each one is a\n    // seed assignment, then hill-climbing on single-município reassignments, then one perturbation\n    // and another climb to escape whatever local optimum it settled into. Different seeds land in\n    // different basins; the ladder above keeps the best across all of them.\n    const improve=a=>{\n      let ev=evalOf(a); offer(a,ev);\n      for(let pass=0;pass<OPT_PASSES;pass++){\n        let moved=false;\n        for(let i=0;i<ms.length;i++){\n          const m=ms[i],cur=a[m]; let best=cur,bev=ev;\n          for(const s of opts[i]){\n            if(s===cur) continue;\n            a[m]=s;\n            const e=evalOf(a);\n            // contiguity is a hard constraint, and the cheaper test runs first on purpose\n            if(e.cost<bev.cost-1e-12 && !contigBadFor(mv,a).length){ best=s; bev=e; }\n          }\n          a[m]=best;\n          if(best!==cur){ ev=bev; moved=true; offer(a,ev); }\n        }\n        if(!moved) break;\n      }\n    };\n    const rng=optRng(optSeed(mv,ms));\n    const perSim=Math.max(1,ms.length*Math.max(1,mv.dest.length)*OPT_PASSES);\n    const budget=Math.max(4,Math.min(OPT_SIMS,Math.floor(OPT_EVAL_BUDGET/perSim)||4));\n    const seeds=[];\n    if(mv.assign&&ms.every(m=>mv.assign[m])) seeds.push({...mv.assign});   // never regress on what is already on screen\n    seeds.push(autoAssignFor(mv));                                        // adjacency-first seed\n    seeds.push(greedyFor(mv,ms,opts));                                    // balance-first seed\n    while(seeds.length<budget){\n      // randomised construction biased toward nearby sectors — the bias keeps each seed sane, the\n      // randomness is what sends the runs into different basins\n      const a={};\n      ms.forEach((m,i)=>{ let bs=opts[i][0],bw=-Infinity;\n        for(const s of opts[i]){ const w=(1-optDistCost(mv,m,s,dmax))+rng()*0.9; if(w>bw){bw=w;bs=s;} }\n        a[m]=bs; });\n      seeds.push(a);\n    }\n    seeds.forEach(seed=>{\n      const a={...seed};\n      // a restored or legacy assign can still name a sector this stage no longer offers\n      ms.forEach((m,i)=>{ if(!opts[i].includes(a[m])) a[m]=opts[i][0]; });\n      improve(a);\n      const kick=Math.max(1,Math.round(ms.length*0.25));\n      for(let k=0;k<kick;k++){ const i=Math.floor(rng()*ms.length); a[ms[i]]=opts[i][Math.floor(rng()*opts[i].length)]; }\n      improve(a);\n    });\n    sims=seeds.length;\n  }\n\n  const t=tier.findIndex(x=>x);\n  if(t<0){ mv.optTier=-1; mv.optBadge='sem solução contígua — heurística'; return greedyFor(mv,ms,opts); }\n  const best=tier[t], ev=tEv[t]; mv.optTier=t;\n  const relax=[];\n  if(t>0 && lim.min) relax.push('span mínimo '+fmt(lim.min));\n  if(t>1 && lim.max) relax.push('span máximo '+fmt(lim.max));\n  mv.optStats={balance:ev.balance,dist:ev.dist,desloc:ev.desloc,stranded:ev.stranded,sims,evals,feasible,combos,exhaustive};\n  mv.optBadge=`ótimo · ${exhaustive?`espaço completo (${fmt(combos)})`:`${fmt(sims)} simulações`}`\n    +` · equilíbrio ±${Math.round(ev.balance*100)}% · adjacência ${Math.round((1-ev.dist)*100)}%`\n    +` · quebra ${fmt(ev.desloc)} CBs · órfãs sem destino ${fmt(ev.stranded)}`\n    +` · pico ${fmt(maxSpanOfFor(mv,best))} CBs`\n    +(lim.target?` · alvo ${fmt(lim.target)}`:'')\n    +(relax.length?` · ⚠ inatingível: ${relax.join(' + ')}`:(spanLimitsOn(lim)?' · limites ok':''));\n  return best;\n}\nfunction computeDerived(mv){\n  const inc={},gained={},orph={};mv.dest.forEach(s=>{inc[s]=0;gained[s]=0;orph[s]=0;});\n  Object.entries(mv.munis).forEach(([m,o])=>{if(m==='__OUTROS__')return;const s=mv.assign[m];if(s&&inc[s]!=null)inc[s]+=o.cbs;});\n  let desloc=0,orphanTotal=0,orphanStranded=0;\n  const L2=mv.leaders.map(L=>{const byS={};mv.dest.forEach(s=>byS[s]=0);let tot=0;\n    for(const [m,c] of Object.entries(L.byMuni)){if(m==='__OUTROS__')continue;const s=mv.assign[m];if(s&&byS[s]!=null){byS[s]+=c;tot+=c;}}\n    // no allocated CBs => no home. Picking dest[0] by default would silently dump this leader's\n    // orphan CBs into an arbitrary sector, so we leave it null and report them as stranded.\n    const home=(tot>0&&mv.dest.length)?mv.dest.reduce((a,s)=>byS[s]>byS[a]?s:a,mv.dest[0]):null;\n    const dl=tot-(home?byS[home]:0);desloc+=dl;if(home)gained[home]++;\n    const orphan=(mv.orphanByGroup&&mv.orphanByGroup[L.grupo])||0;\n    orphanTotal+=orphan;\n    if(orphan){ if(home&&orph[home]!=null) orph[home]+=orphan; else orphanStranded+=orphan; }\n    return {...L,byS,home,desloc:dl,assignedTotal:tot,orphan,orphanHome:(orphan&&home)?home:null};});\n  const span={};mv.dest.forEach(s=>span[s]=(+(mv.baseMetrics[s]?.cbs||0))+inc[s]+orph[s]);\n  return {inc,gained,desloc,leaders:L2,span,orph,orphanTotal,orphanStranded};\n}\n\nasync function computeMovement(sec,world){\n  sec=String(sec);\n  const mv={sector:sec,policy:'fora',view:'tobe',selMuni:null,optBadge:''};\n  const SNAP=SESS.snapLiteral;\n  const mSQL=`SELECT DS_MUNICIPIO municipio, CD_GRUPO grupo, MAX(DS_LEADER_NAME) lider,\n     COUNT(DISTINCT CD_CONSULTORA) cbs, ROUND(SUM(VL_PEDIDOS_CICLO),0) receita,\n     ROUND(SUM(VL_PEDIDOS_NATURA_CICLO),0) rec_nat, ROUND(SUM(VL_PEDIDOS_AVON_CICLO),0) rec_avon,\n     ROUND(SUM(QT_PONTOS_CICLO),0) pontos, ROUND(SUM(QT_PEDIDOS_CICLO),0) pedidos,\n     SUM(CASE WHEN ST_FEZ_PED_CICLO_ATUAL THEN 1 ELSE 0 END) ativas\n    FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR=${sec} AND DT_HISTORICO=${SNAP}\n    GROUP BY DS_MUNICIPIO, CD_GRUPO`;\n  const ufSQL=`SELECT DS_ESTADO uf, COUNT(*) n FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR=${sec} AND DT_HISTORICO=${SNAP} GROUP BY DS_ESTADO ORDER BY n DESC`;\n  const trendSQL=`SELECT operational_cycle ciclo, COUNT(DISTINCT person_code) cbs,\n     COUNT(DISTINCT CASE WHEN registered_bc_ind=1 THEN person_code END) ativas,\n     ROUND(SUM(revenue_nat_ss_amt),0) receita, ROUND(SUM(points_nat_ss_amt),0) pontos\n    FROM ${ELO} WHERE country_code=1 AND sector_code=${sec} AND operational_cycle<=${SESS.eloMaxCycle||999999} GROUP BY operational_cycle ORDER BY operational_cycle DESC LIMIT 8`;\n  const lvlSQL=`SELECT DS_NVL_PLAN_CRESC nivel, COUNT(DISTINCT CD_CONSULTORA) cbs,\n     ROUND(SUM(VL_PEDIDOS_NATURA_CICLO),0) rec_nat, ROUND(SUM(VL_PEDIDOS_AVON_CICLO),0) rec_avon\n    FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR=${sec} AND DS_NVL_PLAN_CRESC IS NOT NULL AND DT_HISTORICO=${SNAP} GROUP BY DS_NVL_PLAN_CRESC ORDER BY cbs DESC`;\n  const lvlMuniSQL=`SELECT DS_MUNICIPIO municipio, DS_NVL_PLAN_CRESC nivel, COUNT(DISTINCT CD_CONSULTORA) cbs\n    FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR=${sec} AND DS_NVL_PLAN_CRESC IS NOT NULL AND DT_HISTORICO=${SNAP} GROUP BY DS_MUNICIPIO, DS_NVL_PLAN_CRESC`;\n  const [mR,ufR,tR,lR,lmR]=await Promise.all([q(mSQL),q(ufSQL),q(trendSQL),q(lvlSQL),q(lvlMuniSQL)]);\n\n  const ownMatrix=rows(mR).filter(r=>+r.cbs>0);\n  mv.pureOwnMetrics=blankM();\n  ownMatrix.forEach(r=>{ mv.pureOwnMetrics.cbs+=+r.cbs; mv.pureOwnMetrics.receita+=+r.receita||0; mv.pureOwnMetrics.rec_nat+=+r.rec_nat||0; mv.pureOwnMetrics.rec_avon+=+r.rec_avon||0; mv.pureOwnMetrics.pontos+=+r.pontos||0; mv.pureOwnMetrics.pedidos+=+r.pedidos||0; mv.pureOwnMetrics.ativas+=+r.ativas||0; });\n\n  mv.levelByMuni={};\n  Object.entries(world.muniLevel||{}).forEach(([m,lv])=>{ if(world.muniOverride[m]===sec) mv.levelByMuni[m]={...lv}; });\n  // keyed further down, once the UF resolver exists — see the stamp block after buildAdj.\n\n  mv.trend=rows(tR).map(r=>({...r,cbs:+r.cbs,ativas:+r.ativas,receita:+r.receita,pontos:+r.pontos})).filter(r=>r.cbs>10).reverse();\n  mv.levels=rows(lR);\n\n  const absorbedRows=[];\n  Object.entries(world.muniOverride).forEach(([m,destSec])=>{ if(destSec===sec && world.muniRow[m]) absorbedRows.push(...world.muniRow[m]); });\n  // CBs an earlier etapa sent here by FOLLOWING THEIR LEADER (quebra de vínculo) carry no\n  // muniOverride — the município stayed where it was, only the CBs moved — so absorbedRows misses\n  // them. Leaving them out made this sector's ASIS total smaller than the span the previous etapa's\n  // TOBE promised for it, by exactly that etapa's \"CBs ignoradas\", and dropped those CBs from the\n  // redistribution as if they had never existed.\n  const inheritedOrphanRows=(world.sectorOrphanRows&&world.sectorOrphanRows[sec])||[];\n  mv.matrix=ownMatrix.concat(absorbedRows,inheritedOrphanRows);\n\n  const ufList=rows(ufR).map(r=>r.uf).filter(Boolean);\n  const domUF=ufList[0]||'PR';\n  mv.domUF=domUF;\n  const ufs=[domUF,...(UF_BORDERS[domUF]||[])];\n  const geos=await Promise.all(ufs.map(u=>geoUF(u).catch(()=>null)));\n  const allFeat=geos.filter(Boolean).flatMap(g=>g.features);\n  const adj=buildAdj(allFeat);\n\n  // ---- UF resolution ----\n  // SQL no longer selects DS_ESTADO. The base CSV is the authority on a município's UF, indexed by the\n  // (setor, município) pair it already maintains, and rows are stamped ONCE here so every consumer\n  // downstream keeps reading r.uf exactly as it did before.\n  // Fallback for a município the base does not carry — spillover, where the sector has CBs but no\n  // dominance: adopt the UF of the loaded shape when that name is unique across the UFs in this\n  // window. A name shared by two of them stays unresolved instead of guessed; it is spillover either\n  // way, and a guess would put a shape from the wrong state on the map.\n  const featUfByName={};\n  Object.keys(adj.feat).forEach(k=>{ const nm=mName(k),u=mUf(k);\n    if(!(nm in featUfByName)) featUfByName[nm]=u; else if(featUfByName[nm]!==u) featUfByName[nm]=null; });\n  const ufGuessed={};\n  const ufFor=(setorOf,muni)=>{const nm=norm(muni);\n    const fromCsv=DOM.ufBySetorMuni&&DOM.ufBySetorMuni[String(setorOf)+'|'+nm];\n    if(fromCsv) return fromCsv;\n    const uniq=featUfByName[nm];\n    if(uniq) return uniq;\n    // uniq===null means the name is shared by two of the LOADED UFs — Terra Nova exists in BA and in PE,\n    // and a BA sector loads PE as a border — so the unique-name fallback gave up. Giving up here too\n    // yields a bare NAME key, which matches NO shape: the município leaves the map without a word. The\n    // sector's own dominant UF is a real signal rather than a coin flip: when a shape of this name\n    // exists in domUF, that is the one this sector means. Recorded so the inference is never invisible.\n    if(uniq===null && adj.feat[mkey(nm,domUF)]){ ufGuessed[nm]=domUF; return domUF; }\n    return '';};\n  // Absorbed and orphan rows inherited from an earlier etapa were stamped when THAT etapa ran, under\n  // the setor they belonged to then; `if(!r.uf)` keeps that original resolution intact.\n  mv.matrix.forEach(r=>{ if(!r.uf) r.uf=ufFor(sec,r.municipio); });\n  rows(lmR).forEach(r=>{ const k=mkey(r.municipio,ufFor(sec,r.municipio)); (mv.levelByMuni[k]=mv.levelByMuni[k]||{})[r.nivel]=+r.cbs; });\n\n  const totBy={}; mv.matrix.forEach(r=>{const n=mkey(r.municipio,r.uf); totBy[n]=(totBy[n]||0)+ +r.cbs;});\n  const footprint=new Set(Object.entries(totBy).filter(([,c])=>c>0).map(([m])=>m));\n  const withShape=[...footprint].filter(n=>adj.feat[n]||world.muniGeo[n]);\n  mv.cbsByMuni={...totBy}; mv.shapeMunis=withShape.slice();\n  mv.noShapeMunis=[...footprint].filter(n=>!(adj.feat[n]||world.muniGeo[n])).map(n=>({muni:n,cbs:totBy[n]||0})).sort((a,b)=>b.cbs-a.cbs);\n  mv.noShapeCbs=mv.noShapeMunis.reduce((a,x)=>a+x.cbs,0);\n\n  // ---- RULE: which municipalities belong to this sector ----\n  // Comes from the dominantes CSV (setor x município), NOT from CB volume. A municipality where the\n  // closing sector happens to have a handful of CBs but which the base assigns to ANOTHER sector is\n  // spillover: it is not reallocated, it is not drawn, and its CBs follow their leader (quebra de\n  // vínculo). Municipalities an EARLIER etapa moved into this sector count as belonging to it too —\n  // otherwise the cascade would throw away the territory the sector just received.\n  const domBase=await ensureDominantes();\n  const domOwn=domBase[String(sec)];\n  const inherited=new Set(Object.keys(world.muniOverride).filter(m=>world.muniOverride[m]===sec));\n  if((!domOwn||!domOwn.size)&&!inherited.size) throw new Error('setor '+sec+' não existe na base de municípios dominantes (CSV) — atualize a base antes de fechar este setor');\n  const belongs=n=>(domOwn&&(domOwn.has(n)||(!DOM.hasUf&&domOwn.has(mName(n)))))||inherited.has(n);\n  mv.domCsvMunis=(domOwn&&domOwn.size)||0;\n  const dropped=withShape.filter(n=>!belongs(n));\n  if(withShape.length && dropped.length===withShape.length) throw new Error('setor '+sec+': nenhum dos municípios com CBs está na base de dominantes — nada pra realocar');\n  const droppedSet=new Set(dropped);\n  mv.excludedMunis=dropped.map(n=>({muni:n,cbs:totBy[n]||0})).sort((a,b)=>b.cbs-a.cbs);\n  mv.excludedCbs=dropped.reduce((a,n)=>a+(totBy[n]||0),0);\n\n  const closingNames=withShape.filter(n=>!droppedSet.has(n));\n  const closingSet=new Set(closingNames);\n  mv.geoFeat={}; closingNames.forEach(n=>{ mv.geoFeat[n]=(adj.feat[n]&&adj.feat[n].f)||world.muniGeo[n]; });\n\n  // ---- why is the map short of the base? ----\n  // Three gates drop a município between the CSV and the map: footprint (no CBs under this setor at\n  // the snapshot), withShape (no geometry in the loaded UFs) and belongs (key mismatch). Only the last\n  // two had a counter, so the FIRST one was invisible — the operator counted 5 shapes against a base\n  // that says 6 and had nothing on screen explaining the missing one. Named here, with its reason.\n  const drawnCsv=new Set(closingNames.map(n=>DOM.hasUf?n:mName(n)));\n  const footKeyOf=k=>DOM.hasUf?(footprint.has(k)?k:null):([...footprint].find(x=>mName(x)===k)||null);\n  mv.csvMunisTotal=(domOwn&&domOwn.size)||0;\n  mv.ufGuessed={...ufGuessed};\n  mv.missingMunis=[...(domOwn||[])].filter(k=>!drawnCsv.has(k)).map(k=>{\n    const fk=footKeyOf(k);\n    const hasShape=!!(adj.feat[fk||k]||world.muniGeo[fk||k]);\n    // The SAME name present in footprint under a DIFFERENT key means UF resolution disagreed with the\n    // base: the CBs are there, they just landed on a key that no shape and no dominance entry can\n    // match. That is a different failure from \"this município has no CBs\", and conflating the two sends\n    // the next investigation into the CB base when the answer is in the UF column.\n    const alias=[...footprint].filter(x=>x!==k&&mName(x)===mName(k));\n    let reason;\n    if(!fk&&alias.length) reason=`UF divergente — as CBs entraram na chave ${alias.join(' / ')} e a base diz ${k}`;\n    else if(!fk) reason=hasShape?'sem CBs neste setor no snapshot — desenhado como vizinho':'sem CBs neste setor no snapshot';\n    else if(!hasShape) reason='sem shape nas UFs carregadas';\n    else reason='chave não casou com a base de dominantes';\n    return {muni:k,cbs:(fk?totBy[fk]:alias.reduce((a,x)=>a+(totBy[x]||0),0))||0,reason:reason};\n  });\n\n  const extVotes={}; const nbrNames=new Set();\n  closingNames.forEach(n=>{\n    if(!adj.feat[n]) return;\n    // droppedSet is excluded too: a municipality outside this sector's dominance base must not\n    // nominate a destination sector, and it is not drawn on the map at all.\n    adj.nbrs(n).forEach(({o,w})=>{ if(!closingSet.has(o) && !droppedSet.has(o)){ nbrNames.add(o); (extVotes[n]=extVotes[n]||[]).push({o,w}); } });\n  });\n  // mv.nbrFeat is assembled far below, once mv.dest is final: the map draws only the closing sector's\n  // municípios and the destination sectors' territory, so the feature list cannot be built until the\n  // neighbour query has resolved each neighbour's sector AND the destination list has settled.\n  let neigh=[];\n  if(nbrNames.size){\n    // The IN-list carries bare names — that is what the column holds, and the query is back to not\n    // selecting DS_ESTADO. Every returned row names its own CD_SETOR, which is exactly the key the\n    // base CSV is indexed by, so each row's UF is resolved from the base right after the fetch.\n    const inList=[...new Set([...nbrNames].map(n=>mName(n)))].map(n=>`'${n.replace(/'/g,\"''\")}'`).join(',');\n    const nSQL=`SELECT DS_MUNICIPIO municipio, CD_SETOR setor, COUNT(DISTINCT CD_CONSULTORA) cbs\n      FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR<>${sec} AND CD_SETOR>0 AND DT_HISTORICO=${SNAP} AND DS_MUNICIPIO IN (${inList}) GROUP BY DS_MUNICIPIO, CD_SETOR`;\n    neigh=rows(await q(nSQL));\n  }\n  const domSecOf={};\n  neigh.forEach(r=>{ if(!r.uf) r.uf=ufFor(r.setor,r.municipio); });\n  const byM={}; neigh.forEach(r=>{const m=mkey(r.municipio,r.uf); if(!nbrNames.has(m)) return; (byM[m]=byM[m]||[]).push(r);});\n  Object.entries(byM).forEach(([m,rs])=>{ rs.sort((a,b)=>+b.cbs-+a.cbs); domSecOf[m]=String(rs[0].setor); });\n  nbrNames.forEach(n=>{ if(world.muniOverride[n]) domSecOf[n]=world.muniOverride[n]; });\n  mv.nbrCurrentSector=domSecOf;\n\n  // ---- HARD RULE: which sectors are eligible as destinations ----\n  // 'any'      = a sector qualifies if it borders ANY municipality of the closing sector (legacy default)\n  // 'dominant' = only municipalities with >= destMinCbs CBs act as a bridge; smaller ones are still\n  //              redistributed, they just cannot pull a new sector into the destination list.\n  //\n  // ---- HARD RULE (não negociável): destino tem de ser da MESMA gerência de vendas ----\n  // Território não atravessa fronteira de GV num fechamento real: outra gerência é outra gestora,\n  // outra meta e outro P&L, então oferecer um setor de fora produz um plano que ninguém pode\n  // executar. CD_GV da base de dominantes é a autoridade, e o filtro roda ANTES de qualquer peso,\n  // regra de ponte ou corte de top-6 — nenhum caminho a jusante pode reintroduzir um setor de fora.\n  const gvBySetor=DOM.gvBySetor||{};\n  const gvOf=s=>gvBySetor[String(s)]||'';\n  const ownGv=gvOf(sec);\n  if(!ownGv) throw new Error('setor '+sec+' não tem CD_GV na base de municípios dominantes — sem a gerência de vendas do setor que fecha não há como garantir que os destinos sejam da mesma gerência');\n  // Um candidato que a base não carrega NÃO pode ser provado como da mesma gerência, então é recusado\n  // em vez de presumido: a regra só vale se nunca vazar.\n  const sameGv=s=>gvOf(s)===ownGv;\n  mv.gv=ownGv;\n  // Foreign-GV neighbours are not drawn AT ALL. Filtering them only out of the destination list still\n  // left them sitting on the map as context, which invites the exact question the rule exists to\n  // settle — \"why is 3471 right there if nothing can be sent to it?\". A neighbour whose sector is\n  // UNKNOWN is not being asserted to be foreign, so it stays as plain geography.\n  // Dropping them also tightens the frame: project() fits the bounding box of whatever survives, so the\n  // closing sector is drawn larger once foreign territory stops padding the extent.\n  mv.gvRejected=[];\n  const gvHidden=new Set();\n  nbrNames.forEach(n=>{ const s=domSecOf[n];\n    if(s && !sameGv(s)){ gvHidden.add(n); if(mv.gvRejected.indexOf(s)<0) mv.gvRejected.push(s); } });\n  gvHidden.forEach(n=>{ nbrNames.delete(n); delete domSecOf[n]; });\n  Object.keys(extVotes).forEach(n=>{ extVotes[n]=extVotes[n].filter(v=>!gvHidden.has(v.o)); });\n  const destRule=(SESS.settings&&SESS.settings.destRule)||DEFAULT_SETTINGS.destRule;\n  const destMinCbs=Math.max(1,Math.round(+((SESS.settings||{}).destMinCbs)||DEFAULT_SETTINGS.destMinCbs));\n  mv.destRule=destRule; mv.destMinCbs=destMinCbs; mv.destRuleFallback=false;\n  const isBridge=n=>destRule!=='dominant'||(totBy[n]||0)>=destMinCbs;\n  mv.bridgeMunis=closingNames.filter(isBridge);\n  mv.ignoredBridges=closingNames.filter(n=>!isBridge(n));\n\n  mv.allowed={}; mv.allowedRaw={};\n  const wAny={}, wDom={};\n  closingNames.forEach(n=>{\n    const v={}, bridge=isBridge(n);\n    (extVotes[n]||[]).forEach(({o,w})=>{\n      const s=domSecOf[o];\n      if(!s || s===sec || world.closedSectors.has(s)) return;\n      // Belt to the braces above: domSecOf has already had every foreign-GV neighbour removed, so this\n      // cannot fire any more. It stays because it costs one comparison and the failure it guards — a\n      // destination in the wrong gerência — is the whole reason this code exists.\n      if(!sameGv(s)) return;\n      v[s]=(v[s]||0)+w;\n      wAny[s]=(wAny[s]||0)+w;\n      if(bridge) wDom[s]=(wDom[s]||0)+w;\n    });\n    mv.allowed[n]=v; mv.allowedRaw[n]={...v};\n  });\n  let secWeight=wAny;\n  if(destRule==='dominant'){\n    if(Object.keys(wDom).length) secWeight=wDom;\n    else { secWeight=wAny; mv.destRuleFallback=true; }   // no dominant municipality at all -> relax, never strand the stage\n  }\n  mv.dest=Object.keys(secWeight).sort((a,b)=>secWeight[b]-secWeight[a]).slice(0,6);\n  if(!mv.dest.length){\n    // O fallback de emergência lê domSecOf direto, contornando os votos — então repete o filtro de GV\n    // aqui. Sem isso a regra vazaria exatamente no caso em que ninguém está olhando.\n    mv.dest=[...new Set(Object.values(domSecOf))].filter(s=>s!==sec&&!world.closedSectors.has(s)&&sameGv(s)).slice(0,6);\n    closingNames.forEach(n=>{ if(!Object.keys(mv.allowed[n]).length){ mv.dest.forEach(s=>mv.allowed[n][s]=1); } });\n  }\n  // Cinto e suspensório: qualquer rota que tenha preenchido mv.dest (pesos, fallback, um branch novo\n  // amanhã) passa por esta linha, e nada de fora da gerência do setor que fecha sobrevive a ela.\n  mv.dest=mv.dest.filter(sameGv);\n  // WHAT GETS DRAWN — decided here because it depends on the final destination list. Two things only:\n  // the closing sector's municípios and the territory of the sectors that can actually receive them.\n  // Every other neighbour was geographic filler that stretched the frame and settled no question.\n  // nbrCurrentSector deliberately keeps its full mapping: drawMap groups whatever survives in nbrFeat\n  // by it, so trimming the feature list is the entire change.\n  const drawSet=new Set(mv.dest);\n  mv.nbrFeat=[...nbrNames].filter(n=>drawSet.has(domSecOf[n])).map(n=>adj.feat[n]&&adj.feat[n].f).filter(Boolean);\n  // votes may reference a sector that did not survive the rule / top-6 cut — drop them so\n  // autoAssign + contiguity seeds can never point at a sector outside mv.dest\n  closingNames.forEach(n=>{ Object.keys(mv.allowed[n]||{}).forEach(s=>{ if(!mv.dest.includes(s)) delete mv.allowed[n][s]; }); });\n  mv.color={}; mv.dest.forEach((s,i)=>mv.color[s]=PALETTE[i%PALETTE.length]);\n\n  const accC={}; Object.entries(domSecOf).forEach(([nb,s])=>{ if(!mv.dest.includes(s))return; const f=(adj.feat[nb]&&adj.feat[nb].f)||world.muniGeo[nb]; if(!f)return; const c=centroidLL(f); accC[s]=accC[s]||[0,0,0]; accC[s][0]+=c[0]; accC[s][1]+=c[1]; accC[s][2]++; });\n  mv.secCentroid={}; mv.dest.forEach(s=>{ if(accC[s]) mv.secCentroid[s]=[accC[s][0]/accC[s][2],accC[s][1]/accC[s][2]]; });\n  mv.muniCentroid={}; closingNames.forEach(n=>{ if(mv.geoFeat[n]) mv.muniCentroid[n]=centroidLL(mv.geoFeat[n]); });\n  mv.closeAdj={}; closingNames.forEach(n=>{ mv.closeAdj[n]=adj.feat[n]?adj.nbrs(n).filter(({o})=>closingSet.has(o)).map(({o})=>o):[]; });\n  const comp={}; let ci=0; closingNames.forEach(n=>{ if(comp[n]!=null)return; const st=[n]; comp[n]=ci; while(st.length){ const x=st.pop(); (mv.closeAdj[x]||[]).forEach(o=>{ if(comp[o]==null){ comp[o]=ci; st.push(o); } }); } ci++; });\n  const compAllowed={}; closingNames.forEach(n=>{ const cid=comp[n]; (compAllowed[cid]=compAllowed[cid]||new Set()); Object.keys(mv.allowed[n]||{}).forEach(s=>compAllowed[cid].add(s)); });\n  mv.reachable={}; closingNames.forEach(n=>{ mv.reachable[n]=[...(compAllowed[comp[n]]||[])].filter(s=>mv.dest.includes(s)); });\n\n  if(mv.dest.length){\n    const rList=mv.dest.join(',');\n    const bSQL=`SELECT CD_SETOR setor, COUNT(DISTINCT CD_CONSULTORA) cbs,\n       SUM(CASE WHEN ST_FEZ_PED_CICLO_ATUAL THEN 1 ELSE 0 END) ativas,\n       ROUND(SUM(VL_PEDIDOS_CICLO),0) receita, ROUND(SUM(VL_PEDIDOS_NATURA_CICLO),0) rec_nat,\n       ROUND(SUM(VL_PEDIDOS_AVON_CICLO),0) rec_avon, ROUND(SUM(QT_PONTOS_CICLO),0) pontos, ROUND(SUM(QT_PEDIDOS_CICLO),0) pedidos\n      FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR IN (${rList}) AND DT_HISTORICO=${SNAP} GROUP BY CD_SETOR`;\n    const blSQL=`SELECT CD_SETOR setor, DS_NVL_PLAN_CRESC nivel, COUNT(DISTINCT CD_CONSULTORA) cbs\n      FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR IN (${rList}) AND DS_NVL_PLAN_CRESC IS NOT NULL AND DT_HISTORICO=${SNAP} GROUP BY CD_SETOR, DS_NVL_PLAN_CRESC`;\n    const [bR,blR]=await Promise.all([q(bSQL),q(blSQL)]);\n    mv.baseMetrics={}; rows(bR).forEach(r=>{ mv.baseMetrics[String(r.setor)]=r; if(!SESS.sectorBaseCache[String(r.setor)]) SESS.sectorBaseCache[String(r.setor)]=r; });\n    mv.baseLevel={}; rows(blR).forEach(r=>{ const s=String(r.setor); (mv.baseLevel[s]=mv.baseLevel[s]||{})[r.nivel]=+r.cbs; });\n  } else { mv.baseMetrics={}; mv.baseLevel={}; }\n\n  mv.dest.forEach(s=>{\n    if(!mv.baseMetrics[s]) mv.baseMetrics[s]={setor:s,cbs:0,ativas:0,receita:0,rec_nat:0,rec_avon:0,pontos:0,pedidos:0};\n    const infl=world.sectorInflow[s];\n    if(infl) Object.keys(blankM()).forEach(k=>{ mv.baseMetrics[s][k]=(+mv.baseMetrics[s][k]||0)+(infl[k]||0); });\n    const inflLv=world.sectorInflowLevel[s];\n    if(inflLv){ mv.baseLevel[s]=mv.baseLevel[s]||{}; Object.entries(inflLv).forEach(([nv,c])=>{ mv.baseLevel[s][nv]=(mv.baseLevel[s][nv]||0)+c; }); }\n  });\n\n  aggregateMovement(mv);\n  mv.assign=optimizeFor(mv);\n  return mv;\n}\n\n// ---------- cascade engine ----------\nasync function computeAt(i){\n  await ensurePinned();\n  const world=foldWorldState(SESS.timeline,i);\n  const sec=SESS.timeline[i].sector;\n  const mv=await computeMovement(sec,world);\n  SESS.timeline[i]=mv;\n}\nasync function recomputeFrom(i){\n  for(let k=i;k<SESS.timeline.length;k++){\n    loader(true,`recalculando etapa ${k+1} de ${SESS.timeline.length}…`);\n    try{ await computeAt(k); }\n    catch(e){\n      // A stage that failed to recompute still holds its PREVIOUS result, so the timeline would\n      // silently mix pre- and post-change etapas. Flag this stage and everything after it as stale\n      // (dashed chip + ⟳) so the state is visible and flushDirty retries from here.\n      SESS.dirtyFrom = SESS.dirtyFrom==null ? k : Math.min(SESS.dirtyFrom,k);\n      throw e;\n    }\n  }\n}\nasync function flushDirty(){\n  if(SESS.dirtyFrom==null) return;\n  const from=SESS.dirtyFrom; SESS.dirtyFrom=null;\n  loader(true,'recalculando etapas seguintes…');\n  try{ await recomputeFrom(from); }\n  catch(e){ $('#ds').textContent='erro ao recalcular cadeia: '+e.message; $('#ds').classList.add('err'); }\n  finally{ loader(false); }\n}\nasync function addMovement(sec){\n  sec=(sec==null?'':String(sec)).trim();\n  if(!sec) return;\n  const closedNow=new Set(SESS.timeline.map(mv=>mv.sector));\n  if(closedNow.has(sec)){ $('#ds').textContent='setor '+sec+' já fechado nesta timeline.'; $('#ds').classList.add('err'); return; }\n  if(!SESS.sectorsList.some(s=>s.setor===sec)){ $('#ds').textContent='setor \"'+sec+'\" não existe no snapshot congelado.'; $('#ds').classList.add('err'); return; }\n  await flushDirty();\n  loader(true,'fechando setor '+sec+' — puxando dado do snapshot congelado…');\n  $('#liveState').classList.remove('err');\n  try{\n    SESS.timeline.push({sector:String(sec)});\n    await computeAt(SESS.timeline.length-1);\n    SESS.selected=SESS.timeline.length-1;\n    $('#ds').classList.remove('err'); $('#ds').textContent='';\n  }catch(e){\n    SESS.timeline.pop();\n    $('#ds').textContent='erro ao fechar setor '+sec+': '+e.message; $('#ds').classList.add('err');\n  } finally { loader(false); renderAll(); }\n}\nfunction removeFrom(i){\n  SESS.timeline.length=i;\n  SESS.selected=Math.min(SESS.selected,Math.max(0,SESS.timeline.length-1));\n  if(SESS.dirtyFrom!=null && SESS.dirtyFrom>=SESS.timeline.length) SESS.dirtyFrom=null;\n  renderAll();\n}\nasync function editSelected(mutator){\n  const mv=SESS.timeline[SESS.selected]; if(!mv) return;\n  mutator(mv);\n  if(SESS.selected<SESS.timeline.length-1){\n    SESS.dirtyFrom = SESS.dirtyFrom==null ? SESS.selected+1 : Math.min(SESS.dirtyFrom, SESS.selected+1);\n  }\n  renderAll();\n}\n\n// ---------- sectors list / picker ----------\nasync function loadSectors(){\n  const sql=`SELECT CD_SETOR setor, MAX(DS_ESTADO) uf, COUNT(DISTINCT CD_CONSULTORA) cbs, COUNT(DISTINCT DS_MUNICIPIO) munis\n    FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR>0 AND DT_HISTORICO=(SELECT MAX(DT_HISTORICO) FROM ${T} WHERE CD_PAIS=1) GROUP BY CD_SETOR ORDER BY CD_SETOR`;\n  SESS.sectorsList=rows(await q(sql)).map(r=>({setor:String(r.setor),uf:r.uf,cbs:+r.cbs,munis:+r.munis}));\n}\nfunction renderSectorPicker(){\n  const closed=new Set(SESS.timeline.map(mv=>mv.sector));\n  const avail=SESS.sectorsList.filter(s=>!closed.has(s.setor));\n  const dl=$('#sectorPickList');\n  if(dl) dl.innerHTML=avail.map(s=>`<option value=\"${s.setor}\">${s.setor} · ${s.uf||'?'} · ${fmt(s.cbs)} CBs · ${s.munis} munic.</option>`).join('');\n  const ready=SESS.stage==='main';\n  $('#rand').disabled=!ready||!avail.length; $('#go').disabled=!ready||!avail.length; $('#sectorPick').disabled=!ready;\n}\nfunction renderStage(){\n  const isMain=SESS.stage==='main';\n  const cc=$('#confirmCard'), hb=$('#howtoBox'), mw=$('#mainWrap');\n  const hdr=$('#topHeader'), rl=$('#timelineRail');\n  if(hdr) hdr.classList.toggle('hidden', !isMain);\n  if(rl) rl.classList.toggle('hidden', !isMain);\n  if(cc) cc.classList.toggle('hidden', isMain);\n  if(hb) hb.classList.toggle('hidden', !isMain);\n  if(mw) mw.classList.toggle('hidden', !isMain);\n  const cb=$('#confirmBody');\n  if(cb && !isMain) cb.innerHTML = SESS.snapshotRaw\n    ? `Snapshot congelado · atualizado em <b>${fmtSyncedAt(SESS.snapshotSyncedAt)}</b> · <b>${SESS.sectorsList.length}</b> setor(es) disponível(eis) pra fechar. Nenhuma consulta de detalhe roda até você confirmar e escolher o primeiro setor.`\n    : 'congelando snapshot…';\n}\n\n// ---------- session persistence ----------\n// ONE table (`timeline-shared-sessions`) holds BOTH kinds of row, so SESSIONS_DS and SHARED_DS\n// deliberately resolve to the SAME DataSet — the two names mark intent, not two stores:\n//   · working session  — carries `movements`; saveSession updates it in place\n//   · shared snapshot  — carries `sharedAt` + `stages`; doShare CREATES it and nothing updates it\n// listSessions MUST exclude the shared rows. They are write-once by contract, and if one showed\n// up in the picker, loading it and pressing Salvar would fire ds.update() straight at a frozen\n// snapshot. Filtering here is what keeps that unreachable — it is the guard, not a cosmetic.\n// Both lookups stay because a policy-gated DataSet's Process resolves late; same race the reader\n// component polls for. SESSIONS_DS lives at module scope so no call site can hit it in the TDZ.\nasync function listSessions(){\n  const ds=(d2.data('sessionsDataset')||d2.data(SESSIONS_DS)); if(!ds) return [];\n  await ds.refresh();\n  const recs=ds.records()||[];\n  return [...recs].filter(r=>!r.sharedAt).sort((a,b)=>new Date(b.updatedAt||0)-new Date(a.updatedAt||0));\n}\nasync function refreshSessionPicker(){\n  const list=await listSessions().catch(()=>[]);\n  SESS.sessionsList=list;\n  const opts=list.map(s=>`<option value=\"${s._id}\">${esc(s.label||'sem nome')} · ${fmt((s.movements||[]).length)} etapa(s)</option>`).join('')+`<option value=\"\">+ Nova sessão</option>`;\n  const sel=$('#sessionPick'); if(sel){ sel.innerHTML=opts; sel.value=SESS.sessionId||''; }\n  const csel=$('#confirmSessionPick'); if(csel){ csel.innerHTML=opts; csel.value=SESS.sessionId||''; }\n}\nasync function saveSession(){\n  const ds=(d2.data('sessionsDataset')||d2.data(SESSIONS_DS));\n  if(!ds){ $('#sessStatus').textContent='dataset de sessões indisponível'; return; }\n  if(!SESS.timeline.length){ $('#sessStatus').textContent='nada pra salvar ainda'; return; }\n  await flushDirty();\n  const label=SESS.sessionLabel||('Sessão '+new Date().toLocaleString('pt-BR'));\n  const nowIso=new Date().toISOString();\n  const payload={\n    label,\n    settings:{...DEFAULT_SETTINGS,...(SESS.settings||{})},\n    snapshotRaw:SESS.snapshotRaw, snapshotSyncedAt:SESS.snapshotSyncedAt, snapLiteral:SESS.snapLiteral, eloMaxCycle:SESS.eloMaxCycle,\n    movements:SESS.timeline.map(mv=>({\n      sector:mv.sector, assign:mv.assign, policy:mv.policy,\n      matrix:mv.matrix, trend:mv.trend, levels:mv.levels, levelByMuni:mv.levelByMuni,\n      pureOwnMetrics:mv.pureOwnMetrics, domUF:mv.domUF, dest:mv.dest, color:mv.color,\n      gv:mv.gv, gvRejected:mv.gvRejected,\n      missingMunis:mv.missingMunis, csvMunisTotal:mv.csvMunisTotal, ufGuessed:mv.ufGuessed,\n      baseMetrics:mv.baseMetrics, baseLevel:mv.baseLevel, geoFeat:mv.geoFeat, nbrFeat:mv.nbrFeat,\n      nbrCurrentSector:mv.nbrCurrentSector, allowed:mv.allowed, allowedRaw:mv.allowedRaw, reachable:mv.reachable,\n      destRule:mv.destRule, destMinCbs:mv.destMinCbs, destRuleFallback:mv.destRuleFallback, optTier:mv.optTier,\n      cbsByMuni:mv.cbsByMuni, shapeMunis:mv.shapeMunis, excludedMunis:mv.excludedMunis, domCsvMunis:mv.domCsvMunis,\n      excludedCbs:mv.excludedCbs, noShapeMunis:mv.noShapeMunis, noShapeCbs:mv.noShapeCbs,\n      secCentroid:mv.secCentroid, muniCentroid:mv.muniCentroid, closeAdj:mv.closeAdj, optBadge:mv.optBadge,\n    })),\n    updatedAt:nowIso,\n  };\n  $('#sessStatus').textContent='salvando…';\n  try{\n    if(SESS.sessionId){\n      await ds.update({_id:SESS.sessionId,...payload});\n    } else {\n      payload.createdAt=nowIso;\n      const created=await ds.create(payload);\n      SESS.sessionId=(created&&created._id)||(created&&created.data&&created.data._id)||(ds.selected&&ds.selected()&&ds.selected()._id)||null;\n    }\n    SESS.sessionLabel=label;\n    await refreshSessionPicker();\n    $('#sessStatus').textContent='salvo ✓';\n  }catch(e){ $('#sessStatus').textContent='erro ao salvar: '+e.message; }\n  setTimeout(()=>{ if($('#sessStatus')) $('#sessStatus').textContent=''; },2200);\n}\n// Duplicate = drop sessionId so saveSession takes its CREATE branch instead of its update branch.\n// The source record is never written to, the copy gets a fresh _id and its own createdAt, and the\n// copy becomes the active session (so the next Salvar edits the copy, not the original).\nasync function duplicateSession(){\n  if(!SESS.timeline.length){ $('#sessStatus').textContent='nada pra duplicar ainda'; return; }\n  const prevId=SESS.sessionId, prevLabel=SESS.sessionLabel;\n  SESS.sessionId=null;\n  SESS.sessionLabel=(SESS.sessionLabel||'Sessão')+' (cópia)';\n  await saveSession();\n  if(!SESS.sessionId){\n    // saveSession swallows its own errors into #sessStatus, so a still-null id after the await is\n    // the only failure signal we get. Put the original identity back — otherwise a failed copy\n    // silently leaves the session detached, and the next Salvar would fork a new record instead\n    // of updating the one the user thought they were editing.\n    SESS.sessionId=prevId; SESS.sessionLabel=prevLabel;\n    await refreshSessionPicker().catch(()=>{});\n    return;\n  }\n  if($('#sessStatus')) $('#sessStatus').textContent='duplicado ✓';\n}\nasync function loadSession(id){\n  if(!id) return newSession();\n  const list=(SESS.sessionsList&&SESS.sessionsList.length)?SESS.sessionsList:await listSessions().catch(()=>[]);\n  const rec=list.find(s=>String(s._id)===String(id));\n  if(!rec) return newSession();\n  loader(true,'carregando sessão…');\n  SESS.sessionId=rec._id; SESS.sessionLabel=rec.label;\n  SESS.snapshotRaw=rec.snapshotRaw; SESS.snapshotSyncedAt=rec.snapshotSyncedAt||null; SESS.snapLiteral=rec.snapLiteral; SESS.eloMaxCycle=rec.eloMaxCycle;\n  SESS.settings={...DEFAULT_SETTINGS,...(rec.settings||{})};\n  SESS.timeline=(rec.movements||[]).map(m=>({sector:String(m.sector)}));\n  SESS.selected=0; SESS.sectorBaseCache={}; SESS.stage='main'; SESS.dirtyFrom=null;\n  try{\n    for(let i=0;i<SESS.timeline.length;i++){\n      const saved=(rec.movements||[])[i]||{};\n      // Sessions saved before the UF became part of the key hold bare-name keys in matrix rows,\n      // assign, geoFeat and closeAdj alike. Restoring that cache would mix key shapes the moment the\n      // stage is recomputed — and it would preserve the very collision this fixes — so those stages\n      // are replayed against the pinned snapshot and the manual assignment is remapped by name.\n      const legacyKeys=!!(saved.matrix&&saved.matrix.length&&saved.matrix.every(r=>r&&r.uf==null));\n      // Sessões salvas antes da regra de gerência podem carregar um destino de outra GV no cache.\n      // Restaurar esse cache manteria o setor proibido na tela para sempre, então essas etapas são\n      // reprocessadas contra o snapshot fixado — igual ao tratamento das chaves legadas.\n      const crossGv=await savedCrossesGv(saved);\n      if(saved.matrix&&!legacyKeys&&!crossGv){\n        loader(true,`restaurando etapa ${i+1}/${SESS.timeline.length} — setor ${SESS.timeline[i].sector} (cache, sem consulta)…`);\n        const mv={sector:String(saved.sector), policy:saved.policy||'fora', view:'tobe', selMuni:null, optBadge:saved.optBadge||''};\n        mv.matrix=saved.matrix; mv.trend=saved.trend||[]; mv.levels=saved.levels||[]; mv.levelByMuni=saved.levelByMuni||{};\n        mv.pureOwnMetrics=saved.pureOwnMetrics||blankM(); mv.domUF=saved.domUF; mv.dest=saved.dest||[]; mv.color=saved.color||{};\n        mv.baseMetrics=saved.baseMetrics||{}; mv.baseLevel=saved.baseLevel||{}; mv.geoFeat=saved.geoFeat||{}; mv.nbrFeat=saved.nbrFeat||[];\n        mv.nbrCurrentSector=saved.nbrCurrentSector||{}; mv.allowed=saved.allowed||{}; mv.reachable=saved.reachable||{};\n        mv.allowedRaw=saved.allowedRaw||saved.allowed||{};\n        mv.destRule=saved.destRule||SESS.settings.destRule; mv.destMinCbs=saved.destMinCbs||SESS.settings.destMinCbs; mv.destRuleFallback=!!saved.destRuleFallback;\n        mv.optTier=(saved.optTier==null?0:saved.optTier);\n        mv.gv=saved.gv||''; mv.gvRejected=saved.gvRejected||[];\n        mv.missingMunis=saved.missingMunis||[]; mv.csvMunisTotal=saved.csvMunisTotal||0;\n        mv.ufGuessed=saved.ufGuessed||{};\n        mv.cbsByMuni=saved.cbsByMuni||{}; mv.shapeMunis=saved.shapeMunis||[];\n        mv.excludedMunis=saved.excludedMunis||[]; mv.excludedCbs=saved.excludedCbs||0; mv.domCsvMunis=saved.domCsvMunis||0;\n        mv.noShapeMunis=saved.noShapeMunis||[]; mv.noShapeCbs=saved.noShapeCbs||0;\n        mv.secCentroid=saved.secCentroid||{}; mv.muniCentroid=saved.muniCentroid||{}; mv.closeAdj=saved.closeAdj||{};\n        aggregateMovement(mv);\n        mv.assign=saved.assign||{};\n        mv.dest.forEach(s=>{ if(!SESS.sectorBaseCache[s]) SESS.sectorBaseCache[s]=mv.baseMetrics[s]; });\n        SESS.timeline[i]=mv;\n      } else {\n        loader(true,`replay ${i+1}/${SESS.timeline.length} — setor ${SESS.timeline[i].sector}…`);\n        await computeAt(i);\n        if(saved.assign) SESS.timeline[i].assign=legacyKeys?remapAssign(SESS.timeline[i],saved.assign):saved.assign;\n        if(saved.policy) SESS.timeline[i].policy=saved.policy;\n      }\n    }\n    await loadSectors();\n  }catch(e){ $('#ds').textContent='erro ao carregar sessão: '+e.message; $('#ds').classList.add('err'); }\n  finally{ loader(false); }\n  renderAll();\n}\n// Re-points a legacy bare-name assignment at the NAME/UF key it can only mean. When a name resolves\n// to more than one município in the recomputed stage the manual choice is genuinely ambiguous —\n// dropping it lets the optimizer allocate instead of guessing on the operator's behalf.\n// True when a cached stage names a destination outside the closing sector's gerência de vendas.\n// Judges the cache by TODAY's rule, reading the (memoised) dominantes base rather than trusting what\n// the session was saved with. Unknown GV on the closing sector answers false: the stage then loads\n// from cache instead of being replayed into the hard throw in computeMovement, which would leave the\n// operator staring at a broken session with no way back.\nasync function savedCrossesGv(saved){\n  if(!saved||!saved.sector||!(saved.dest||[]).length) return false;\n  let gvBy={};\n  try{ await ensureDominantes(); gvBy=DOM.gvBySetor||{}; }catch(e){ return false; }\n  const own=gvBy[String(saved.sector)]||'';\n  if(!own) return false;\n  if(saved.dest.some(s=>(gvBy[String(s)]||'')!==own)) return true;\n  // A stage saved before foreign-GV neighbours stopped being drawn can hold a perfectly clean dest and\n  // STILL carry their shapes in nbrFeat/nbrCurrentSector — it would repaint the old map straight from\n  // cache. An unknown gerência is not evidence of a foreign one, so only a known, differing GV replays.\n  return Object.values(saved.nbrCurrentSector||{}).some(s=>{ const g=gvBy[String(s)]||''; return g&&g!==own; });\n}\nfunction remapAssign(mv,savedAssign){\n  const keys=Object.keys(mv.munis||{}).filter(k=>k!=='__OUTROS__');\n  const out={};\n  Object.entries(savedAssign||{}).forEach(([k,v])=>{\n    if(keys.indexOf(k)>=0){ out[k]=v; return; }\n    const cand=keys.filter(x=>mName(x)===mName(k));\n    if(cand.length===1) out[cand[0]]=v;\n  });\n  return out;\n}\nfunction newSession(){\n  SESS.sessionId=null; SESS.sessionLabel=null; SESS.timeline=[]; SESS.selected=0; SESS.sectorBaseCache={};\n  SESS.settings={...DEFAULT_SETTINGS};\n  SESS.snapshotRaw=null; SESS.snapshotSyncedAt=null; SESS.snapLiteral=null; SESS.eloMaxCycle=null; SESS.stage='loading'; SESS.dirtyFrom=null;\n  (async()=>{\n    loader(true,'iniciando nova sessão…');\n    try{ await Promise.all([ensurePinned(), loadSectors()]); SESS.stage='confirm'; }\n    catch(e){ setError('erro init: '+e.message); }\n    finally{ loader(false); renderAll(); }\n  })();\n}\n\n// ---------- snapshot refresh ----------\n// Deliberately breaks the frozen-snapshot guarantee, on demand: re-resolves DT_HISTORICO and\n// replays the whole timeline against the new one. Skips the replay when the snapshot has not\n// actually moved, so a stray click on a long timeline costs one cheap probe instead of ~8 queries\n// per etapa.\nasync function refreshSnapshot(){\n  if(SESS.stage!=='main' || SESS.snapBusy) return;\n  SESS.snapBusy=true;\n  const prevRaw=SESS.snapshotRaw;\n  const pill=$('#liveState'); if(pill){ pill.classList.add('busy'); pill.textContent='◌ atualizando snapshot…'; }\n  loader(true,'buscando o snapshot mais recente…');\n  let ok=false;\n  try{\n    const p=await resolveSnapshotPin();\n    if(!p.snapshotRaw) throw new Error('não foi possível resolver DT_HISTORICO');\n    const same=String(p.snapshotRaw)===String(prevRaw);\n    SESS.snapshotRaw=p.snapshotRaw; SESS.snapshotSyncedAt=p.syncedAt; SESS.snapLiteral=p.snapLiteral; SESS.eloMaxCycle=p.eloMaxCycle;\n    await loadSectors();   // the sector list follows the live max, so it can have moved too\n    if(same){\n      $('#ds').textContent=`snapshot já era o mais recente · atualizado em ${fmtSyncedAt(p.syncedAt)} — nada recalculado`;\n    } else if(SESS.timeline.length){\n      SESS.dirtyFrom=null;\n      SESS.sectorBaseCache={};   // baselines come from the snapshot, so every one of them changed\n      loader(true,'snapshot novo — recalculando a timeline…');\n      await recomputeFrom(0);\n      $('#ds').textContent=`snapshot atualizado em ${fmtSyncedAt(p.syncedAt)} · ${fmt(SESS.timeline.length)} etapa(s) recalculada(s)`;\n    } else {\n      $('#ds').textContent=`snapshot atualizado em ${fmtSyncedAt(p.syncedAt)}`;\n    }\n    $('#ds').classList.remove('err');\n    ok=true;\n  }catch(e){\n    const at=(SESS.dirtyFrom==null?null:SESS.dirtyFrom+1);\n    $('#ds').textContent='erro ao atualizar o snapshot'+(at?` na etapa ${at} — etapa ${at} em diante ficou desatualizada (⟳)`:'')+': '+e.message;\n    $('#ds').classList.add('err');\n  }finally{\n    SESS.snapBusy=false;\n    if(pill) pill.classList.remove('busy');\n    loader(false); renderAll();\n    if(ok) setTimeout(()=>{ const d=$('#ds'); if(d&&!d.classList.contains('err')) d.textContent=''; },7000);\n  }\n}\n\n// ---------- session options ----------\nfunction previewDest(mv,rule,minCbs){\n  if(!mv||!mv.allowedRaw||!mv.munis) return null;\n  const w={}; let relaxed=false;\n  const cbsOf=m=>(mv.cbsByMuni&&mv.cbsByMuni[m]!=null)?mv.cbsByMuni[m]:((mv.munis[m]&&mv.munis[m].cbs)||0);\n  const add=m=>Object.entries(mv.allowedRaw[m]||{}).forEach(([s,v])=>{ w[s]=(w[s]||0)+v; });\n  // allowedRaw only carries municipalities already inside the sector's dominance base, so there is\n  // nothing left to filter out here beyond the destination rule itself.\n  Object.keys(mv.allowedRaw).forEach(m=>{ const cbs=cbsOf(m);\n    if(rule==='dominant'&&cbs<minCbs) return; add(m); });\n  if(rule==='dominant'&&!Object.keys(w).length){ Object.keys(mv.allowedRaw).forEach(add); relaxed=true; }\n  return {dest:Object.keys(w).sort((a,b)=>w[b]-w[a]).slice(0,6),relaxed};\n}\nfunction readOptForm(){\n  const r=root.querySelector('input[name=\"destRule\"]:checked');\n  let n=Math.round(+$('#optMinCbs').value);\n  if(!(n>0)) n=DEFAULT_SETTINGS.destMinCbs;\n  return {destRule:(r&&r.value)||DEFAULT_SETTINGS.destRule, destMinCbs:n,\n          targetSpan:numOrNull($('#optTargetSpan').value),\n          maxSpan:numOrNull($('#optMaxSpan').value),\n          minSpan:numOrNull($('#optMinSpan').value)};\n}\nfunction spanFormError(f){\n  if(f.minSpan&&f.maxSpan&&f.minSpan>f.maxSpan) return `Span mínimo (${fmt(f.minSpan)}) não pode ser maior que o máximo (${fmt(f.maxSpan)}).`;\n  if(f.targetSpan&&f.maxSpan&&f.targetSpan>f.maxSpan) return `Span alvo (${fmt(f.targetSpan)}) não pode passar do máximo (${fmt(f.maxSpan)}).`;\n  if(f.targetSpan&&f.minSpan&&f.targetSpan<f.minSpan) return `Span alvo (${fmt(f.targetSpan)}) não pode ficar abaixo do mínimo (${fmt(f.minSpan)}).`;\n  return '';\n}\nfunction renderOptPreview(){\n  const el=$('#optPreview'); if(!el) return;\n  const f=readOptForm();\n  root.querySelectorAll('.opt-row').forEach(r=>{\n    if(r.dataset.r!=null) r.classList.toggle('on',r.dataset.r===f.destRule);\n  });\n  const wrap=$('#optMinCbsWrap'); if(wrap) wrap.classList.toggle('off',f.destRule!=='dominant');\n  const err=spanFormError(f), ee=$('#optSpanErr');\n  if(ee){ ee.textContent=err; ee.classList.toggle('hidden',!err); }\n  const ap=$('#optApply'); if(ap) ap.disabled=!!err;\n  const mv=SESS.timeline[SESS.selected];\n  if(!mv||!mv.munis){ el.innerHTML='Nenhuma etapa calculada ainda — as regras passam a valer no próximo fechamento.'; return; }\n  const cbsOf=m=>(mv.cbsByMuni&&mv.cbsByMuni[m]!=null)?mv.cbsByMuni[m]:((mv.munis[m]&&mv.munis[m].cbs)||0);\n  const ms=Object.keys(mv.geoFeat||{});\n  const ig=f.destRule==='dominant'?ms.filter(m=>cbsOf(m)<f.destMinCbs):[];\n  const pv=previewDest(mv,f.destRule,f.destMinCbs);\n  let h=`<b style=\"color:var(--ink)\">Prévia — etapa ${SESS.selected+1}, setor ${mv.sector}</b><br>`;\n  const exN=(mv.excludedMunis||[]).length;\n  if(exN) h+=`Base de dominantes: <b>${fmt(ms.length)}</b> município(s) no mapa · <span style=\"color:var(--closing)\">${fmt(exN)} fora da base — ${fmt(mv.excludedCbs||0)} CBs seguem suas líderes</span><br>`;\n  h+=`${fmt(ms.length-ig.length)} de ${fmt(ms.length)} município(s) valem como ponte`;\n  if(ig.length) h+=` · <span style=\"color:var(--closing)\">ignorados:</span> ${ig.slice(0,8).join(', ')}${ig.length>8?' +'+(ig.length-8):''}`;\n  if(pv){\n    h+=`<br>Setores destino com esta regra: <b style=\"color:var(--ink)\">${pv.dest.join(', ')||'–'}</b>`;\n    const cur=(mv.dest||[]).join(', ');\n    if(pv.dest.join(',')!==(mv.dest||[]).join(',')) h+=` <span style=\"color:var(--closing)\">(hoje: ${cur||'–'})</span>`;\n    if(pv.relaxed) h+=`<br><b style=\"color:var(--closing)\">⚠ nenhum município dominante nesta etapa — a regra relaxa pra \"qualquer município\" pra não deixar a etapa sem destino.</b>`;\n  }\n  if(f.targetSpan||f.maxSpan||f.minSpan){\n    const sp=spanMapFor(mv,mv.assign||{}), v=spanViolationsOf(sp,{target:f.targetSpan,max:f.maxSpan,min:f.minSpan});\n    h+=`<br><br>Span dos destinos como está hoje: ${mv.dest.map(s=>s+' <b>'+fmt(sp[s])+'</b>').join(' · ')||'–'}`;\n    if(v.over.length||v.under.length) h+=`<br><span style=\"color:var(--closing)\">Fora dos limites: ${[...v.over.map(s=>s+' ▲ acima do máx'),...v.under.map(s=>s+' ▼ abaixo do mín')].join(', ')}</span> — o modelo ÓTIMO tenta corrigir no recálculo.`;\n    else h+=` <span style=\"color:var(--ok)\">— já dentro dos limites</span>`;\n  }\n  if(SESS.timeline.length) h+=`<br><span style=\"margin-top:4px;display:inline-block\">Aplicar <b>recalcula as ${fmt(SESS.timeline.length)} etapa(s)</b> contra o snapshot congelado — os destinos ajustados à mão serão refeitos pelo modelo ÓTIMO.</span>`;\n  el.innerHTML=h;\n}\nfunction openOptions(){\n  const st={...DEFAULT_SETTINGS,...(SESS.settings||{})};\n  root.querySelectorAll('input[name=\"destRule\"]').forEach(r=>{ r.checked=(r.value===st.destRule); });\n  $('#optMinCbs').value=st.destMinCbs;\n  $('#optTargetSpan').value=st.targetSpan||'';\n  $('#optMaxSpan').value=st.maxSpan||'';\n  $('#optMinSpan').value=st.minSpan||'';\n  $('#optApply').disabled=false;\n  $('#optSessName').textContent=SESS.sessionLabel||'sessão não salva';\n  $('#optStatus').textContent='';\n  $('#optionsBg').classList.remove('hidden');\n  renderOptPreview();\n  const c=$('#optCancel'); if(c) c.focus();\n}\nfunction closeOptions(){ const b=$('#optionsBg'); if(b) b.classList.add('hidden'); }\nasync function applyOptions(){\n  const f=readOptForm();\n  if(spanFormError(f)) return;\n  const prev={...DEFAULT_SETTINGS,...(SESS.settings||{})};\n  const changed = prev.destRule!==f.destRule\n    || (f.destRule==='dominant' && prev.destMinCbs!==f.destMinCbs)\n    || numOrNull(prev.targetSpan)!==f.targetSpan\n    || numOrNull(prev.maxSpan)!==f.maxSpan\n    || numOrNull(prev.minSpan)!==f.minSpan;\n  SESS.settings={...prev,...f};\n  closeOptions();\n  if(!changed || !SESS.timeline.length){ renderAll(); return; }\n  SESS.dirtyFrom=null;\n  SESS.sectorBaseCache={};   // the recompute re-derives every baseline; keeping the old ones would\n                             // leave \"Impacto acumulado\" comparing against pre-change numbers\n  loader(true,'aplicando nova regra de destino — recalculando timeline…');\n  try{\n    await recomputeFrom(0);\n    $('#ds').textContent=''; $('#ds').classList.remove('err');\n  }catch(e){\n    const at=(SESS.dirtyFrom==null?0:SESS.dirtyFrom)+1;\n    $('#ds').textContent=`erro ao aplicar a regra na etapa ${at}: ${e.message} — etapa ${at} em diante ficou desatualizada (⟳)`;\n    $('#ds').classList.add('err');\n  }finally{ loader(false); renderAll(); }\n}\n\nconst SHARED_DS='timeline-shared-sessionsDataSet';\nconst AUTH_REF='timelineSimAuthFinal';   // single source of truth for the auth strategy reference\nlet SHARE={busy:false,url:null,last:null};\n// Serialise a PRESENTATION model, not the raw session, so the reader stays purely presentational\n// and never re-derives spans/desloc/orphans — no second copy of this engine to keep in sync.\n// NOTE: METRICS_DEF[2] is the money marker; read it as !!md[2] (a literal dollar sign in this\n// position trips the upsert's parse check).\nfunction buildShareStages(){\n  return SESS.timeline.map((mv,i)=>{\n    const c=computeDerived(mv);\n    const incBy={};\n    mv.dest.forEach(s=>{ incBy[s]=Object.fromEntries(METRICS_DEF.map(md=>[md[0],0])); });\n    Object.entries(mv.munis).forEach(([m,o])=>{\n      if(m==='__OUTROS__') return;\n      const s=mv.assign[m]; if(!s||!incBy[s]) return;\n      METRICS_DEF.forEach(md=>{ incBy[s][md[0]]+=o[md[0]]||0; });\n    });\n    const saiTot={};\n    METRICS_DEF.forEach(md=>{\n      const k=md[0];\n      saiTot[k]=Object.entries(mv.munis).filter(([m])=>m!=='__OUTROS__').reduce((a,p)=>a+((p[1][k])||0),0);\n    });\n    // orphans follow their leader's home: they enter that sector AND leave the closing one\n    c.leaders.forEach(L=>{\n      const om=mv.orphanMetricsByGroup&&mv.orphanMetricsByGroup[L.grupo];\n      if(!om||!L.home) return;\n      METRICS_DEF.forEach(md=>{ const k=md[0];\n        if(incBy[L.home]) incBy[L.home][k]+=om[k]||0;\n        saiTot[k]+=om[k]||0; });\n    });\n    const ms=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__').sort((a,b)=>mv.munis[b].cbs-mv.munis[a].cbs);\n    const sv=mv.dest.map(s=>c.span[s]);\n    const baseOf=(s,k)=>{ const b=mv.baseMetrics[s]||{}; return +(b[k]||0); };\n    return {\n      i:i, sector:mv.sector, policy:mv.policy, domUF:mv.domUF,\n      optTier:(mv.optTier==null?0:mv.optTier),\n      destRuleFallback:!!mv.destRuleFallback,\n      dest:mv.dest.slice(), color:Object.assign({},mv.color), assign:Object.assign({},mv.assign),\n      kpis:{ cbsRealocadas:closingCbsOf(mv), desloc:c.desloc,\n             spread:(sv.length?Math.max.apply(null,sv)-Math.min.apply(null,sv):0),\n             municipios:ms.length, lideres:mv.leaders.length },\n      destinos:mv.dest.map(s=>({ s:s, base:baseOf(s,'cbs'), inc:c.inc[s]||0, orph:c.orph[s]||0, span:c.span[s]||0, gained:c.gained[s]||0 })),\n      municipios:ms.map(m=>({ nome:mName(m), uf:mUf(m), cbs:mv.munis[m].cbs, destino:mv.assign[m]||null })),\n      excluidos:(mv.excludedMunis||[]).map(x=>({ muni:x.muni, cbs:x.cbs })),\n      orphanTotal:c.orphanTotal||0, orphanStranded:c.orphanStranded||0, noShapeCbs:mv.noShapeCbs||0,\n      lideres:c.leaders.map(L=>({ lider:(L.lider||'').split(' ').slice(0,2).join(' '), grupo:L.grupo,\n        total:L.total, home:L.home, desloc:L.desloc, orphan:L.orphan||0 })),\n      metricas:METRICS_DEF.map(md=>{ const k=md[0];\n        return { key:k, label:md[1], money:!!md[2],\n          rows:mv.dest.map(s=>({ s:s, antes:baseOf(s,k), depois:baseOf(s,k)+((incBy[s]&&incBy[s][k])||0) })),\n          sai:saiTot[k]||0 }; }),\n      geoFeat:mv.geoFeat, nbrFeat:mv.nbrFeat, excludedFeat:[]\n    };\n  });\n}\nfunction buildShareSummary(stages){\n  const world=foldWorldState(SESS.timeline,SESS.timeline.length);\n  const receivers=[];\n  SESS.timeline.forEach((mv,i)=>{\n    const own=mv.pureOwnMetrics||{};\n    receivers.push({ s:mv.sector, situacao:'fechado (etapa '+(i+1)+')', antes:+(own.cbs||0), depois:0 });\n  });\n  const seen={};\n  Object.values(world.muniOverride).forEach(s=>{\n    if(seen[s]) return; seen[s]=1;\n    const base=SESS.sectorBaseCache[s]||{}, infl=world.sectorInflow[s]||{};\n    receivers.push({ s:s, situacao:'recebeu território', antes:+(base.cbs||0), depois:(+(base.cbs||0))+(infl.cbs||0) });\n  });\n  return { stages:stages.length, sectors:SESS.timeline.map(mv=>mv.sector),\n    totalCbs:stages.reduce((a,s)=>a+(s.kpis.cbsRealocadas||0),0),\n    totalDesloc:stages.reduce((a,s)=>a+(s.kpis.desloc||0),0), receivers:receivers };\n}\nfunction renderShareBody(){\n  const el=$('#shareBody'); if(!el) return;\n  const go=$('#shareGo'), cp=$('#shareCopy'), op=$('#shareOpen'), cc=$('#shareCancel');\n  if(SHARE.url){\n    el.innerHTML=`<div class=\"opt-note\" style=\"margin-top:0\"><b style=\"color:var(--ink)\">Sessão compartilhada ✓</b><br>\n      Link de leitura desta simulação congelada. Quem abrir precisa ter login no simulador.\n      <div class=\"shareurl\">${esc(SHARE.url)}</div></div>`;\n    if(go) go.classList.add('hidden');\n    if(cp) cp.classList.remove('hidden');\n    if(op) op.classList.remove('hidden');\n    if(cc) cc.textContent='Fechar';\n    return;\n  }\n  if(go) go.classList.remove('hidden');\n  if(cp) cp.classList.add('hidden');\n  if(op) op.classList.add('hidden');\n  if(cc) cc.textContent='Cancelar';\n  const st={...DEFAULT_SETTINGS,...(SESS.settings||{})};\n  const desloc=SESS.timeline.reduce((a,mv)=>a+(mv.munis?computeDerived(mv).desloc:0),0);\n  const destTxt=st.destRule==='dominant'?('dominantes ≥'+fmt(st.destMinCbs)+' CBs'):'qualquer município';\n  el.innerHTML=`<div class=\"opt-lbl\">Confirmar compartilhamento</div>\n    <div class=\"opt-sub\">Publica uma <b>cópia congelada</b> desta sessão, exatamente no estado atual.</div>\n    <div class=\"opt-note\" style=\"margin-top:0\">\n      · <b>${fmt(SESS.timeline.length)}</b> etapa(s) — ${esc(SESS.timeline.map(mv=>mv.sector).join(' → '))}<br>\n      · snapshot atualizado em <b>${esc(fmtSyncedAt(SESS.snapshotSyncedAt))}</b><br>\n      · base: <b>municípios dominantes (CSV)</b> · destino: <b>${esc(destTxt)}</b> · span: <b>${esc(spanShort(st))}</b><br>\n      · <b>${fmt(desloc)}</b> CBs deslocadas somando a cadeia\n    </div>\n    <div class=\"opt-note\">A cópia <b>não</b> acompanha edições posteriores desta sessão — pra atualizar, compartilhe de novo e use o link novo. O link exige login no simulador; não é público.</div>\n    ${SHARE.last?`<div class=\"opt-note\"><b style=\"color:var(--ink)\">Último link gerado nesta sessão</b> — aponta pro estado de <b>antes</b> das edições feitas depois dele.<div class=\"shareurl\">${esc(SHARE.last)}</div></div>`:''}`;\n}\nasync function openShare(){\n  if(!SESS.timeline.length){ $('#ds').textContent='nada pra compartilhar — feche pelo menos um setor primeiro.'; $('#ds').classList.add('err'); return; }\n  await flushDirty();\n  SHARE.url=null;\n  const s=$('#shareStatus'); if(s){ s.textContent=''; s.classList.remove('err'); }\n  renderShareBody();\n  $('#shareBg').classList.remove('hidden');\n  const b=$('#shareCancel'); if(b) b.focus();\n}\nfunction closeShare(){ const b=$('#shareBg'); if(b) b.classList.add('hidden'); }\nasync function doShare(){\n  if(SHARE.busy) return;\n  const go=$('#shareGo'), stx=$('#shareStatus');\n  SHARE.busy=true;\n  if(go){ go.disabled=true; go.textContent='Compartilhando…'; }\n  if(stx){ stx.textContent=''; stx.classList.remove('err'); }\n  try{\n    // Resolved as a GLOBAL PROCESS, not a declared param — which only works because the block\n    // instance on the `main` artboard binds `sharedDataset: @timeline-shared-sessionsDataSet`.\n    // That binding is load-bearing: a Process is only define()d once something on the rendering\n    // tree references it, so without it this lookup returns null and sharing dies on the guard\n    // below. Do NOT remove the instance param because this file never reads d2.params.sharedDataset.\n    const ds=d2.data(SHARED_DS);\n    if(!ds) throw new Error('dataset de sessões compartilhadas indisponível');\n    await flushDirty();\n    const stages=buildShareStages();\n    const summary=buildShareSummary(stages);\n    let who='';\n    try{ const a=d2.auth(AUTH_REF); who=(a&&a.user&&(a.user.email||a.user.nome))||''; }catch(e){}\n    const created=await ds.create({\n      label:SESS.sessionLabel||('Sessão '+new Date().toLocaleString('pt-BR')),\n      snapshotRaw:SESS.snapshotRaw, snapshotSyncedAt:SESS.snapshotSyncedAt,\n      settings:{...DEFAULT_SETTINGS,...(SESS.settings||{})},\n      stages:stages, summary:summary, sharedBy:who, sharedAt:new Date().toISOString()\n    });\n    const id=(created&&created._id)||(created&&created.data&&created.data._id)||(ds.selected&&ds.selected()&&ds.selected()._id)||null;\n    if(!id) throw new Error('registro gravado, mas sem _id na resposta — não foi possível montar o link');\n    SHARE.url=window.location.origin+'/sessions/'+id;\n    SHARE.last=SHARE.url;\n    renderShareBody();\n  }catch(e){\n    if(stx){ stx.textContent='erro ao compartilhar: '+e.message; stx.classList.add('err'); }\n  }finally{\n    SHARE.busy=false;\n    if(go){ go.disabled=false; go.textContent='Compartilhar'; }\n  }\n}\n\n// ---------- rendering ----------\nfunction renderTimeline(){\n  const el=$('#movementChips'); if(!el) return;\n  if(!SESS.timeline.length){ el.innerHTML='<span class=\"empty\">Nenhuma etapa ainda — use \"Fechar setor ▶\" à direita.</span>'; return; }\n  el.innerHTML=SESS.timeline.map((mv,i)=>{\n    const ready=mv.dest!==undefined;\n    const c=ready?computeDerived(mv):null;\n    const stale=SESS.dirtyFrom!=null && i>=SESS.dirtyFrom;\n    return `<div class=\"tchip ${i===SESS.selected?'on':''} ${stale?'stale':''}\" data-i=\"${i}\">\n      <span class=\"tnum\">${i+1}</span><span class=\"tsec\">Setor ${mv.sector}</span>\n      <span class=\"tstat\">${ready?fmt(c.desloc)+' desloc.':'…'}</span>\n      ${stale?'<span class=\"tstale\" title=\"recalcula ao selecionar outra etapa\">⟳</span>':''}\n      <span class=\"trm\" data-rm=\"${i}\" title=\"remover esta etapa e as seguintes\">✕</span>\n    </div>`;\n  }).join('');\n  el.querySelectorAll('.tchip').forEach(ch=>{\n    ch.addEventListener('click',async (e)=>{\n      if(e.target.dataset.rm!=null && e.target.dataset.rm!==''){ removeFrom(+e.target.dataset.rm); return; }\n      const i=+ch.dataset.i;\n      if(i!==SESS.selected) await flushDirty();\n      SESS.selected=i; renderAll();\n    });\n  });\n}\nfunction renderRuleNote(){\n  const el=$('#ruleNote'); if(!el) return;\n  const st={...DEFAULT_SETTINGS,...(SESS.settings||{})};\n  const mv=SESS.timeline[SESS.selected];\n  let h='';\n  h+=`<b style=\"color:var(--ink)\">Base de municípios dominantes:</b> só os municípios que a base (CSV) atribui ao setor entram no mapa e na alocação`;\n  if(mv&&mv.domCsvMunis) h+=` · <b>${fmt(mv.domCsvMunis)}</b> na base do setor ${mv.sector}`;\n  if(mv&&mv.excludedCbs) h+=` · <b style=\"color:var(--closing)\">${fmt(mv.excludedMunis.length)} município(s) / ${fmt(mv.excludedCbs)} CBs</b> fora da base nesta etapa — não aparecem no mapa e as CBs seguem suas líderes (quebra de vínculo)`;\n  if(DOM.error) h+=` · <b style=\"color:var(--closing)\">⚠ base indisponível: ${esc(DOM.error)}</b>`;\n  h+=`<br>`;\n  h+=`<b style=\"color:var(--ink)\">Regra de destino:</b> `;\n  h+= st.destRule==='dominant'\n    ? `só municípios com <b>≥${fmt(st.destMinCbs)} CBs</b> trazem setor pra lista de destinos`\n    : `qualquer município do setor fechado vale como ponte <span style=\"opacity:.7\">(padrão)</span>`;\n  if(mv&&mv.munis&&st.destRule==='dominant'){\n    const ig=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__'&&mv.munis[m].cbs<st.destMinCbs);\n    if(ig.length) h+=` · <b style=\"color:var(--closing)\">${fmt(ig.length)}</b> ignorado(s) como ponte (ainda redistribuído(s)): ${ig.slice(0,5).join(', ')}${ig.length>5?' +'+(ig.length-5):''}`;\n    if(mv.destRuleFallback) h+=`<br><b style=\"color:var(--closing)\">⚠ nenhum município dominante nesta etapa — regra relaxada pra \"qualquer município\".</b>`;\n  }\n  el.innerHTML=h;\n}\nfunction renderSpanRule(){\n  const el=$('#spanRule'); if(!el) return;\n  const mv=SESS.timeline[SESS.selected], lim=spanLimits();\n  if(!mv||!mv.munis||mv.view==='asis'||!spanLimitsOn(lim)){ el.innerHTML=''; return; }\n  const sp=spanMapFor(mv,mv.assign||{}), v=spanViolationsOf(sp,lim);\n  const bits=[];\n  if(lim.target) bits.push(`alvo <b>${fmt(lim.target)}</b>`);\n  if(lim.max) bits.push(`máx <b>${fmt(lim.max)}</b>`);\n  if(lim.min) bits.push(`mín <b>${fmt(lim.min)}</b>`);\n  let h=`Pré-requisito de span: ${bits.join(' · ')} CBs — `;\n  if(v.over.length||v.under.length){\n    h+=`<b style=\"color:var(--closing)\">⚠ `;\n    if(v.over.length) h+=`acima do máximo: ${v.over.map(s=>s+' ('+fmt(sp[s])+')').join(', ')}`;\n    if(v.over.length&&v.under.length) h+=' · ';\n    if(v.under.length) h+=`abaixo do mínimo: ${v.under.map(s=>s+' ('+fmt(sp[s])+')').join(', ')}`;\n    h+=`</b>`;\n    if(mv.optTier===1) h+=`<br><span style=\"opacity:.85\">Nenhuma alocação contígua respeita o span mínimo nesta etapa — o modelo relaxou essa exigência.</span>`;\n    else if(mv.optTier===2) h+=`<br><span style=\"opacity:.85\">Nenhuma alocação contígua respeita os limites nesta etapa — o modelo relaxou essa exigência.</span>`;\n    else if(mv.optTier===-1) h+=`<br><span style=\"opacity:.85\">Etapa resolvida por heurística — os limites não são garantidos.</span>`;\n  } else h+=`<b style=\"color:var(--ok)\">✓ todos os setores receptores dentro dos limites</b>`;\n  el.innerHTML=`<div class=\"note\" style=\"margin:-2px 0 6px\">${h}</div>`;\n}\nfunction renderContig(){const mv=SESS.timeline[SESS.selected];const el=$('#contig');if(!el||!mv)return;\n  if(mv.view==='asis'){el.innerHTML='';return;}\n  const bad=contigBadFor(mv,mv.assign);\n  el.innerHTML=bad.length\n    ?`<div class=\"note\" style=\"color:var(--closing);font-weight:600;margin:-2px 0 6px\">⚠ Contiguidade quebrada em ${bad.join(', ')} — município(s) desconectado(s) do território do setor. Use ★ ÓTIMO ou reassocie no mapa.</div>`\n    :`<div class=\"note\" style=\"color:var(--ok);margin:-2px 0 6px\">✓ Contíguo — cada setor forma uma região conectada.</div>`;\n}\nfunction closingCbsOf(mv){ return Object.entries(mv.munis).filter(([m])=>m!=='__OUTROS__').reduce((a,[,o])=>a+o.cbs,0); }\nfunction sectorTotalCbs(mv){ return Object.values(mv.munis).reduce((a,o)=>a+o.cbs,0); }\nfunction renderKpis(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const c=computeDerived(mv);\n  if(mv.view==='asis'){const mc=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__').length;\n    $('#kpis').innerHTML=[\n      {n:fmt(sectorTotalCbs(mv)),l:`CBs no setor ${mv.sector} (antes desta etapa)`,t:'Total de CBs no setor hoje — já considerando o que etapas anteriores da timeline mandaram pra cá.'},\n      {n:mv.csvMunisTotal?`${fmt(mc)}/${fmt(mv.csvMunisTotal)}`:fmt(mc),l:'Municípios do setor',t:`Municípios desenhados nesta etapa${mv.csvMunisTotal?` de ${fmt(mv.csvMunisTotal)} que a base de dominantes atribui ao setor`:''}.${(mv.missingMunis||[]).length?' Fora do mapa: '+mv.missingMunis.map(x=>x.muni+' ('+x.reason+')').join(' · '):''}${Object.keys(mv.ufGuessed||{}).length?' UF inferida da UF dominante do setor (nome repetido em outra UF carregada): '+Object.entries(mv.ufGuessed).map(([nm,u])=>nm+'→'+u).join(', '):''}`},\n      {n:fmt(mv.leaders.length),l:'Líderes (grupos)',t:'Líderes presentes no setor nesta etapa.'},\n      {n:fmt(mv.dest.length),l:'Setores adjacentes',t:`Setores vizinhos (ainda abertos) da MESMA gerência de vendas (CD_GV ${mv.gv||'?'}) que poderiam receber os municípios.${(mv.gvRejected||[]).length?' Fora do mapa, por serem de outra gerência: '+mv.gvRejected.join(', ')+'.':''}`},\n    ].map(k=>`<div class=\"kpi\" title=\"${k.t}\"><div class=\"n\">${k.n}</div><div class=\"l\">${k.l}</div></div>`).join('');\n    return;}\n  const sv=mv.dest.map(s=>c.span[s]);const spread=sv.length?Math.max(...sv)-Math.min(...sv):0;\n  const zero=mv.dest.filter(s=>c.gained[s]===0);const totCbs=closingCbsOf(mv);\n  $('#kpis').innerHTML=[\n    {n:fmt(c.desloc),l:mv.policy==='fora'?'CBs fora do setor':'CBs c/ quebra de relação',cls:'warn',t:'CBs cuja líder acabou noutro setor nesta etapa.'},\n    {n:fmt(spread),l:'Desequilíbrio (máx−mín CBs)',cls:spread>800?'warn':'ok',t:'Diferença de tamanho entre o maior e o menor setor depois desta etapa.'},\n    {n:fmt(totCbs),l:'CBs realocadas',cls:'',t:`Total de CBs do setor ${mv.sector} sendo redistribuídas nesta etapa.`},\n    {n:zero.length?zero.join(', '):'nenhum',l:'Setor sem líder herdada',cls:zero.length?'warn':'ok',t:'Setor que recebe município(s) mas nenhuma líder nesta etapa.'},\n  ].concat(mv.excludedCbs?[{n:fmt(mv.excludedCbs),l:`CBs ignoradas · ${fmt(mv.excludedMunis.length)} município(s) fora da base`,cls:'warn',t:'CBs em municípios que a base de dominantes não atribui a este setor: ficam fora do mapa e da alocação geográfica e seguem a líder do seu grupo.'}]:[])\n   .concat((mv.missingMunis||[]).length?[{n:fmt(mv.missingMunis.length),l:`Município(s) da base fora do mapa · ${fmt(mv.csvMunisTotal)} na base`,cls:'warn',t:`A base de dominantes atribui ${fmt(mv.csvMunisTotal)} município(s) ao setor ${mv.sector} e ${fmt(mv.csvMunisTotal-mv.missingMunis.length)} chegaram ao mapa. Fora: ${mv.missingMunis.map(x=>x.muni+' — '+x.reason+(x.cbs?' ('+fmt(x.cbs)+' CBs)':'')).join(' · ')}`}]:[])\n   .map(k=>`<div class=\"kpi ${k.cls}\" title=\"${k.t}\"><div class=\"n\">${k.n}</div><div class=\"l\">${k.l}</div></div>`).join('');\n}\nfunction renderSpans(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const c=computeDerived(mv);\n  if(mv.view==='asis'){const items=[{s:mv.sector,val:sectorTotalCbs(mv),color:CLOSE_COLOR}].concat(mv.dest.map(s=>({s,val:+(mv.baseMetrics[s]?.cbs||0),color:mv.color[s]})));\n    const max=Math.max(...items.map(x=>x.val),1);\n    $('#spans').innerHTML=items.map(x=>`<div class=\"bar-row\"><div class=\"tag\" style=\"color:${x.color}\">${x.s}</div><div class=\"bar-track\">\n      <div class=\"bar-inc\" style=\"width:${x.val/max*100}%;background:${x.color}\"></div></div>\n      <div class=\"bar-val\">${fmt(x.val)}</div></div>`).join('')\n      +`<div class=\"note\">Estrutura antes desta etapa — o setor <b>${mv.sector}</b> ainda existe. Alterne pra <b>TOBE</b> pra ver a redistribuição.</div>`;\n    return;}\n  const lim=spanLimits(),on=spanLimitsOn(lim);\n  const rawMax=Math.max(...mv.dest.map(s=>c.span[s]),lim.target||0,lim.max||0,1);\n  const max=on?rawMax*1.04:rawMax;   // headroom so a marker sitting at the scale top stays visible\n  const mk=(v,color,label)=>v?`<div class=\"bar-mark\" style=\"left:${Math.min(99.6,v/max*100).toFixed(1)}%;background:${color}\" title=\"${label}\"></div>`:'';\n  const marks=mk(lim.min,'#ff9500','span mínimo '+fmt(lim.min))+mk(lim.target,'#007aff','span alvo '+fmt(lim.target))+mk(lim.max,'#ff3b30','span máximo '+fmt(lim.max));\n  $('#spans').innerHTML=mv.dest.map(s=>{const base=+(mv.baseMetrics[s]?.cbs||0),i=c.inc[s];\n    const over=lim.max&&c.span[s]>lim.max,under=lim.min&&c.span[s]<lim.min;\n    return `<div class=\"bar-row\"><div class=\"tag\" style=\"color:${mv.color[s]}\">${s}</div><div class=\"bar-track\">\n      <div class=\"bar-base\" style=\"width:${base/max*100}%;background:${mv.color[s]}\"></div>\n      <div class=\"bar-inc\" style=\"width:${i/max*100}%;background:${mv.color[s]}\"></div>${marks}</div>\n      <div class=\"bar-val\" style=\"${over?'color:var(--closing);font-weight:700':(under?'color:#ff9500;font-weight:700':'')}\">${fmt(c.span[s])} <span style=\"opacity:.6\">(+${fmt(i)})</span>${over?' ▲':''}${under?' ▼':''}</div></div>`;}).join('')\n    +`<div class=\"note\">Claro = base (já incluindo etapas anteriores) · cheio = CBs entrantes do ${mv.sector} nesta etapa.${c.orphanTotal?` Inclui <b>${fmt(c.orphanTotal-c.orphanStranded)}</b> CB(s) de municípios fora da base de dominantes que seguiram suas líderes.`:''}${on?' Marcas: <b style=\"color:#007aff\">│</b> alvo · <b style=\"color:#ff3b30\">│</b> máx · <b style=\"color:#ff9500\">│</b> mín.':''}</div>`;\n}\n// Two very different reasons land rows in the __OUTROS__ bucket — no IBGE shape, or outside the\n// sector's dominance base. Same bucket computationally, but they must not read as the same thing.\nfunction outsideNote(mv){\n  const bits=[];\n  if(mv.noShapeCbs) bits.push(`<b>${fmt(mv.noShapeCbs)}</b> CBs em ${fmt(mv.noShapeMunis.length)} município(s) sem shape na UF`);\n  if(mv.excludedCbs) bits.push(`<b>${fmt(mv.excludedCbs)}</b> CBs em ${fmt(mv.excludedMunis.length)} município(s) <b>fora da base de dominantes</b> deste setor — <b style=\"color:var(--closing)\">quebra de vínculo</b>`);\n  if(!bits.length) return '';\n  let h=`<div class=\"note\">Fora do mapa e da alocação geográfica: ${bits.join(' · ')}.`;\n  if(mv.excludedCbs){\n    const c=computeDerived(mv);\n    h+=` As <b>${fmt(mv.excludedCbs)}</b> CBs em quebra de vínculo <b>seguem a líder do seu grupo</b>`;\n    const byS=mv.dest.filter(s=>c.orph[s]).map(s=>`<b style=\"color:${mv.color[s]}\">${s}</b> (${fmt(c.orph[s])})`);\n    h+=byS.length?`: ${byS.join(' · ')}.`:'.';\n    if(c.orphanStranded) h+=` <b style=\"color:var(--closing)\">${fmt(c.orphanStranded)} CB(s) sem destino</b> — a líder não ficou com nenhum município realocado, então não há setor pra seguir.`;\n  }\n  if(mv.noShapeCbs) h+=` As CBs sem shape na UF continuam fora de qualquer setor destino.`;\n  if(mv.excludedMunis&&mv.excludedMunis.length) h+=`<br><span style=\"opacity:.85\">${mv.excludedMunis.slice(0,8).map(x=>x.muni+' ('+fmt(x.cbs)+')').join(', ')}${mv.excludedMunis.length>8?' +'+(mv.excludedMunis.length-8):''}</span>`;\n  return h+`</div>`;\n}\nfunction renderMuni(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const ms=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__').sort((a,b)=>mv.munis[b].cbs-mv.munis[a].cbs);\n  if(mv.view==='asis'){$('#muniList').innerHTML=ms.map(m=>`<div class=\"muni-item\"><div class=\"nm\">${m}</div><div class=\"ct\">${fmt(mv.munis[m].cbs)} CBs</div><span class=\"badge\" style=\"background:${CLOSE_COLOR};color:#fff;border-color:${CLOSE_COLOR}\">setor ${mv.sector}</span></div>`).join('')\n      +`<div class=\"note\">Hoje todos pertencem ao setor <b>${mv.sector}</b>. No <b>TOBE</b> cada um vira botões de destino.</div>`+outsideNote(mv);return;}\n  $('#muniList').innerHTML=ms.map(m=>`<div class=\"muni-item\"><div class=\"nm\">${m}</div><div class=\"ct\">${fmt(mv.munis[m].cbs)} CBs</div>\n    <div class=\"seg\" data-m=\"${m}\">${mv.dest.map(s=>`<button data-s=\"${s}\" class=\"${mv.assign[m]===s?'on':''}\" style=\"${mv.assign[m]===s?'background:'+mv.color[s]:''}\">${s}</button>`).join('')}</div></div>`).join('')\n    +outsideNote(mv);\n  $('#muniList').querySelectorAll('.seg button').forEach(b=>b.onclick=()=>{const m=b.parentElement.dataset.m,s=b.dataset.s;editSelected(m2=>{m2.assign[m]=s;});});\n}\nfunction renderLeaders(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const c=computeDerived(mv);\n  if(mv.view==='asis'){$('#leaders').innerHTML=`<thead><tr><th>Líder</th><th>Grupo</th><th>CBs</th><th>Setor</th></tr></thead><tbody>`\n    +mv.leaders.map(L=>`<tr><td>${(L.lider||'').split(' ').slice(0,2).join(' ')}</td><td>${L.grupo}</td><td>${fmt(L.total)}</td><td><span class=\"home\" style=\"background:${CLOSE_COLOR}\"></span>${mv.sector}</td></tr>`).join('')\n    +`<tr style=\"font-weight:700\"><td>TOTAL</td><td></td><td>${fmt(mv.leaders.reduce((a,L)=>a+L.total,0))}</td><td></td></tr></tbody>`;return;}\n  const showOrph=c.orphanTotal>0;\n  $('#leaders').innerHTML=`<thead><tr><th>Líder</th><th>CBs</th><th>Home</th>${mv.dest.map(s=>`<th>${s}</th>`).join('')}${showOrph?'<th title=\"CBs em municípios fora da base de dominantes que seguiram esta líder\">Órfãs</th>':''}<th>Desloc.</th></tr></thead><tbody>`\n   +c.leaders.map(L=>`<tr><td>${(L.lider||'').split(' ').slice(0,2).join(' ')}</td><td>${fmt(L.total)}</td>\n     <td>${L.home?`<span class=\"home\" style=\"background:${mv.color[L.home]}\"></span>${L.home}`:'–'}</td>\n     ${mv.dest.map(s=>`<td class=\"cell\" style=\"${s===L.home?'color:'+mv.color[s]+';font-weight:700':''}\">${L.byS[s]||'·'}</td>`).join('')}\n     ${showOrph?`<td class=\"cell\" style=\"${L.orphan&&!L.orphanHome?'color:var(--closing);font-weight:700':''}\" title=\"${L.orphan?(L.orphanHome?'seguem a líder para o setor '+L.orphanHome:'sem home — CBs sem setor pra seguir'):''}\">${L.orphan?fmt(L.orphan)+(L.orphanHome?'':' ⚠'):'·'}</td>`:''}\n     <td style=\"color:${L.desloc?'var(--closing)':'var(--mut)'};font-weight:${L.desloc?700:400}\">${L.desloc||'0'}</td></tr>`).join('')\n   +`<tr style=\"font-weight:700\"><td>TOTAL</td><td>${fmt(c.leaders.reduce((a,L)=>a+L.total,0))}</td><td></td>${mv.dest.map(s=>`<td>${fmt(c.leaders.reduce((a,L)=>a+L.byS[s],0))}</td>`).join('')}${showOrph?`<td>${fmt(c.orphanTotal)}</td>`:''}<td style=\"color:var(--closing)\">${fmt(c.desloc)}</td></tr></tbody>`;\n}\nfunction renderMatrix(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const ms=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__').sort((a,b)=>mv.munis[b].cbs-mv.munis[a].cbs);\n  // `_out` is a flag stamped on the ROW, and rows are shared between etapas (absorbed + inherited\n  // orphans), so the last etapa to aggregate wins and reading it here can describe the wrong etapa.\n  // Derive the bucket from THIS mv instead. Summing rather than .find() because several out-municípios\n  // of the same group all collapse into __OUTROS__, and only the first was being counted.\n  const outOf=x=>!mv.geoFeat[mkey(x.municipio,x.uf)];\n  const cell=(m,g)=>mv.matrix.reduce((a,x)=>a+((((outOf(x)?'__OUTROS__':mkey(x.municipio,x.uf))===m)&&String(x.grupo)===g)?+x.cbs:0),0);\n  const mx=Math.max(...ms.flatMap(m=>mv.leaders.map(L=>cell(m,L.grupo))),1);\n  // No destination column here. This is the AS-IS matrix: every município in it still belongs to the\n  // closing sector, so showing where it is HEADED mixed the two states of the world in one table and\n  // made the ASIS view read like a plan. The destination lives on the map and in \"Municípios → setor\n  // destino\", which are about the to-be.\n  $('#matrix').innerHTML=`<thead><tr><th>Município</th>${mv.leaders.map(L=>`<th title=\"${L.lider}\">${L.grupo}</th>`).join('')}<th>Tot</th></tr></thead><tbody>`\n   +ms.map(m=>`<tr><td>${m}</td>`\n     +mv.leaders.map(L=>{const v=cell(m,L.grupo);return `<td class=\"cell\" style=\"${v?`background:rgba(229,181,63,${.08+v/mx*.5})`:''}\">${v||'·'}</td>`;}).join('')\n     +`<td style=\"font-weight:700\">${fmt(mv.munis[m].cbs)}</td></tr>`).join('')+`</tbody>`;\n}\n// TOBE counterpart of the AS-IS matrix: the same município × grupo grid plus the two columns the AS-IS\n// view deliberately refuses to carry — where the município ends up, and under which líder.\n// \"Líder resultante\" is the líder holding the most CBs in that município. A município is served by several\n// grupos at once and the data names no single owner, so the dominant one is the honest answer and its\n// share is printed beside it instead of being hidden behind a single name.\nfunction renderMatrixTobe(){const mv=SESS.timeline[SESS.selected]; const el=$('#matrixTobe'); const nt=$('#tobeNote');\n  if(!el) return;\n  if(!mv||!mv.munis){ el.innerHTML=''; if(nt) nt.innerHTML=''; return; }\n  const c=computeDerived(mv);\n  const homeOf={}; c.leaders.forEach(L=>{ homeOf[L.grupo]=L.home; });\n  const ms=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__').sort((a,b)=>mv.munis[b].cbs-mv.munis[a].cbs);\n  // One pass over the matrix instead of a scan per cell: the AS-IS table can afford the naive version\n  // on six municípios, but this one asks for the dominant líder too, which multiplies the lookups.\n  const outOf=x=>!mv.geoFeat[mkey(x.municipio,x.uf)];\n  const cellBy={}; mv.matrix.forEach(x=>{ const k=(outOf(x)?'__OUTROS__':mkey(x.municipio,x.uf))+'|'+String(x.grupo);\n    cellBy[k]=(cellBy[k]||0)+ +x.cbs; });\n  const cell=(m,g)=>cellBy[m+'|'+g]||0;\n  const mx=Math.max(...ms.flatMap(m=>mv.leaders.map(L=>cell(m,L.grupo))),1);\n  const domLeader=m=>{ let best=null,bc=0;\n    mv.leaders.forEach(L=>{ const v=cell(m,L.grupo); if(v>bc){ bc=v; best=L; } });\n    return best?{L:best,cbs:bc}:null; };\n  const short=L=>(L.lider||'').split(' ').slice(0,2).join(' ')||('grupo '+L.grupo);\n  // NOT named `rows` — that is the module-level Databricks response helper, and shadowing it inside a\n  // render function is a trap for whoever adds a query here later.\n  const recs=ms.map(m=>{ const d=mv.assign[m]||null, dl=domLeader(m);\n    const home=dl?(homeOf[dl.L.grupo]||null):null;\n    // The mismatch worth seeing: the territory goes to one setor while the líder serving it ends up in\n    // another. Under \"manter vínculo\" those CBs stay with her, which is exactly what \"CBs fora do setor\"\n    // counts — so this column is where that KPI becomes a list of names.\n    return {m:m,d:d,dl:dl,home:home,off:!!(dl&&home&&d&&home!==d)}; });\n  el.innerHTML=`<thead><tr><th>Município</th><th>→ Setor</th><th>Líder resultante</th>${mv.leaders.map(L=>`<th title=\"${esc(L.lider||'')}\">${L.grupo}</th>`).join('')}<th>Tot</th></tr></thead><tbody>`\n   +recs.map(r=>`<tr><td>${r.m}</td>`\n     +`<td>${r.d?`<span class=\"home\" style=\"background:${mv.color[r.d]}\"></span>${r.d}`:'–'}</td>`\n     +`<td${r.off?' style=\"color:var(--closing)\"':''} title=\"${r.dl?esc(short(r.dl.L)+' · grupo '+r.dl.L.grupo+' · '+fmt(r.dl.cbs)+' CBs neste município'+(r.home?' · termina no setor '+r.home:' · sem setor de destino')):'nenhuma CB neste município'}\">`\n       +(r.dl?`${esc(short(r.dl.L))} <span class=\"badge\">${r.home||'sem setor'}</span>${r.off?' ⚠':''}`:'–')\n     +`</td>`\n     +mv.leaders.map(L=>{const v=cell(r.m,L.grupo);return `<td class=\"cell\" style=\"${v?`background:rgba(229,181,63,${.08+v/mx*.5})`:''}\">${v||'·'}</td>`;}).join('')\n     +`<td style=\"font-weight:700\">${fmt(mv.munis[r.m].cbs)}</td></tr>`).join('')+`</tbody>`;\n  if(nt){\n    const offN=recs.filter(r=>r.off).length;\n    nt.innerHTML=(mv.policy!=='fora')\n      ? `Política <b>quebrar relação</b>: as CBs deixam a líder atual e passam à estrutura do setor destino — a coluna mostra quem as atende <b>hoje</b>, não quem assume depois.`\n      : `<b>Líder resultante</b> = a líder com mais CBs no município; o chip é o setor onde ela termina. `\n        +(offN?`<span style=\"color:var(--closing)\">${fmt(offN)} município(s) ⚠</span> vão para um setor diferente do da sua líder — as CBs seguem a líder (é disso que o KPI “CBs fora do setor” é feito).`\n          :`Em todos os municípios a líder termina no mesmo setor que recebe o território.`);\n  }\n}\nfunction renderPolicy(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const c=computeDerived(mv);\n  $('#policyNote').innerHTML=mv.policy==='fora'\n    ?`<b style=\"color:var(--acc)\">Mantendo vínculo:</b> ${fmt(c.desloc)} CBs seguem com a líder mas ficam <b>fisicamente noutro setor</b>. Preserva relação; suja geografia.`\n    :`<b style=\"color:var(--acc)\">Quebrando vínculo:</b> ${fmt(c.desloc)} CBs <b>re-vinculam a uma líder do setor destino</b>. Geografia limpa; rompe relação.`;\n}\nfunction renderPlan(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const c=computeDerived(mv);const ms=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__').sort((a,b)=>a.localeCompare(b));\n  mv._plan=ms.map(m=>({municipio:mName(m),uf:mUf(m),cbs:mv.munis[m].cbs,destino:mv.assign[m]}));\n  $('#plan').innerHTML=`Etapa ${SESS.selected+1} · Setor <b>${mv.sector}</b> → ${ms.map(m=>`${m}→<b style=\"color:${mv.color[mv.assign[m]]}\">${mv.assign[m]||'–'}</b>`).join(' · ')}<br>\n   Política: <b>${mv.policy==='fora'?'manter vínculo (CBs fora do setor)':'quebrar relação'}</b> · ${fmt(c.desloc)} CBs impactadas nesta etapa.`\n   +(c.orphanTotal?`<br>Fora da base de dominantes: ${fmt(c.orphanTotal)} CB(s) seguem suas líderes — ${mv.dest.filter(s=>c.orph[s]).map(s=>`${s} (${fmt(c.orph[s])})`).join(' · ')||'–'}${c.orphanStranded?` · <b style=\"color:var(--closing)\">${fmt(c.orphanStranded)} sem líder com destino</b>`:''}. Não entram no CSV, que é por município.`:'');\n}\nfunction renderReport(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const c=computeDerived(mv);\n  mv.metric=mv.metric||'cbs';\n  const KEYS=METRICS_DEF.map(m=>m[0]);\n  const incBy={};mv.dest.forEach(s=>incBy[s]=Object.fromEntries(KEYS.map(k=>[k,0])));\n  Object.entries(mv.munis).forEach(([m,o])=>{if(m==='__OUTROS__')return;const s=mv.assign[m];if(!s||!incBy[s])return;KEYS.forEach(k=>incBy[s][k]+=o[k]||0);});\n  // orphan CBs land on their leader's home sector, not on a geographic destination\n  c.leaders.forEach(L=>{ const om=mv.orphanMetricsByGroup&&mv.orphanMetricsByGroup[L.grupo];\n    if(om&&L.home&&incBy[L.home]) KEYS.forEach(k=>incBy[L.home][k]+=om[k]||0); });\n  const closeTot={};KEYS.forEach(k=>closeTot[k]=Object.entries(mv.munis).filter(([m])=>m!=='__OUTROS__').reduce((a,[,o])=>a+(o[k]||0),0));\n  // they leave the closing sector too, so antes → depois still balances\n  c.leaders.forEach(L=>{ const om=mv.orphanMetricsByGroup&&mv.orphanMetricsByGroup[L.grupo];\n    if(om&&L.home) KEYS.forEach(k=>closeTot[k]+=om[k]||0); });\n  const trend=mv.trend.slice(-6);\n  const chartHTML=mk=>{\n    const isM=['receita','rec_nat','rec_avon'].includes(mk); const fN=isM?money:fmt;\n    const data=mv.dest.map(s=>({label:s,color:mv.color[s],antes:+(mv.baseMetrics[s]?.[mk]||0),depois:+(mv.baseMetrics[s]?.[mk]||0)+(incBy[s]?.[mk]||0)}));\n    data.push({label:mv.sector+'✕',color:'#ff3b30',antes:closeTot[mk]||0,depois:0});\n    const max=Math.max(...data.flatMap(d=>[d.antes,d.depois]),1);\n    const W=720,H=290,base=238,top=42,maxH=base-top,n=data.length,gw=(W-16)/n;\n    let g='';\n    data.forEach((d,i)=>{const cx=8+gw*i+gw/2,bw=Math.min(30,gw*0.30);\n      const ah=d.antes/max*maxH,dh=d.depois/max*maxH,ax=cx-bw-2,dx=cx+2;\n      g+=`<rect x=\"${ax.toFixed(1)}\" y=\"${(base-ah).toFixed(1)}\" width=\"${bw.toFixed(1)}\" height=\"${ah.toFixed(1)}\" rx=\"2.5\" fill=\"${d.color}\" opacity=\"0.35\"/>`;\n      g+=`<rect x=\"${dx.toFixed(1)}\" y=\"${(base-dh).toFixed(1)}\" width=\"${bw.toFixed(1)}\" height=\"${dh.toFixed(1)}\" rx=\"2.5\" fill=\"${d.color}\"/>`;\n      g+=`<text x=\"${(ax+bw/2).toFixed(1)}\" y=\"${(base-ah-4).toFixed(1)}\" text-anchor=\"middle\" font-size=\"9\" fill=\"#9a9aa8\">${fN(d.antes)}</text>`;\n      g+=`<text x=\"${(dx+bw/2).toFixed(1)}\" y=\"${(base-dh-4).toFixed(1)}\" text-anchor=\"middle\" font-size=\"9.5\" font-weight=\"700\" fill=\"${d.color}\">${fN(d.depois)}</text>`;\n      const dp=d.antes?((d.depois-d.antes)/d.antes*100):(d.depois?100:0);\n      g+=`<text x=\"${cx.toFixed(1)}\" y=\"16\" text-anchor=\"middle\" font-size=\"10.5\" font-weight=\"700\" fill=\"${dp>=0?'#34c759':'#ff3b30'}\">${dp>0?'+':''}${dp.toFixed(0)}%</text>`;\n      g+=`<text x=\"${cx.toFixed(1)}\" y=\"${base+16}\" text-anchor=\"middle\" font-size=\"10.5\" font-weight=\"700\" fill=\"#1c1c2b\">${d.label}</text>`;});\n    return `<svg viewBox=\"0 0 ${W} ${H}\" style=\"width:100%\"><line x1=\"8\" y1=\"${base}\" x2=\"${W-8}\" y2=\"${base}\" stroke=\"#e7e7ef\"/>${g}</svg>`;\n  };\n  let h=`<div style=\"display:flex;justify-content:space-between;align-items:center;gap:10px;flex-wrap:wrap\">\n      <h2 style=\"margin:0\">Impacto antes → depois desta etapa</h2>\n      <select id=\"metricSel\">${METRICS_DEF.map(m=>`<option value=\"${m[0]}\" ${m[0]===mv.metric?'selected':''}>${m[1]}</option>`).join('')}</select></div>\n    <div class=\"note\" style=\"margin:2px 0 4px\">Barra clara = <b>antes desta etapa</b> (já incluindo etapas anteriores) · barra cheia = <b>depois</b> · <b style=\"color:var(--acc)\">${mv.sector}✕</b> = setor fechado nesta etapa · % = variação</div>\n    ${chartHTML(mv.metric)}`;\n  h+=`<h2 style=\"margin-top:16px\">Antes → Depois por setor receptor (snapshot congelado)</h2>\n    <div class=\"scroll\"><table><thead><tr><th>Setor</th>${METRICS_DEF.map(m=>`<th>${m[1]}</th>`).join('')}</tr></thead><tbody>`;\n  mv.dest.forEach(s=>{const b=mv.baseMetrics[s]||{};const inc=incBy[s];\n    h+=`<tr><td><span class=\"home\" style=\"background:${mv.color[s]}\"></span>${s}</td>`+\n      METRICS_DEF.map(([k])=>{const bv=+b[k]||0,av=bv+(inc[k]||0);const d=bv?((av-bv)/bv*100):0;const f=METRICS_DEF.find(x=>x[0]===k)[2]==='$'?money:fmt;\n        return `<td>${f(av)}<div class=\"delta ${d>=0?'up':'dn'}\">${d>0?'+':''}${d.toFixed(0)}%</div></td>`;}).join('')+`</tr>`;});\n  h+=`<tr style=\"opacity:.8\"><td>${mv.sector} (sai)</td>`+METRICS_DEF.map(([k,,t])=>`<td>${(t==='$'?money:fmt)(closeTot[k]||0)}</td>`).join('')+`</tr>`;\n  h+=`</tbody></table></div>`;\n  const incLvl={};mv.dest.forEach(s=>incLvl[s]={});\n  Object.keys(mv.munis).forEach(m=>{if(m==='__OUTROS__')return;const s=mv.assign[m];if(!s||!incLvl[s])return;const lv=mv.levelByMuni[m]||{};for(const nv in lv)incLvl[s][nv]=(incLvl[s][nv]||0)+lv[nv];});\n  c.leaders.forEach(L=>{ const ol=mv.orphanLevelByGroup&&mv.orphanLevelByGroup[L.grupo];\n    if(ol&&L.home&&incLvl[L.home]) Object.entries(ol).forEach(([nv,n])=>incLvl[L.home][nv]=(incLvl[L.home][nv]||0)+n); });\n  h+=`<h2 style=\"margin-top:18px\">Consultoras por nível — antes → depois por setor receptor</h2>\n    <div class=\"scroll\"><table><thead><tr><th>Setor</th>${NIVEIS.map(n=>`<th>${n}</th>`).join('')}<th>Total</th></tr></thead><tbody>`;\n  mv.dest.forEach(s=>{const base=mv.baseLevel[s]||{},inc=incLvl[s]||{};let tb=0,ta=0;\n    h+=`<tr><td><span class=\"home\" style=\"background:${mv.color[s]}\"></span>${s}</td>`+\n      NIVEIS.map(nv=>{const b=base[nv]||0,i=inc[nv]||0,a=b+i;tb+=b;ta+=a;\n        return `<td>${a?fmt(a):'·'}${i?`<div class=\"delta up\">+${fmt(i)}</div>`:''}</td>`;}).join('')+\n      `<td style=\"font-weight:700\">${fmt(ta)}${ta-tb?`<div class=\"delta up\">+${fmt(ta-tb)}</div>`:''}</td></tr>`;});\n  h+=`</tbody></table></div><div class=\"note\">Número = CBs por nível <b>depois</b> desta etapa · <span style=\"color:var(--ok)\">+N</span> = entrantes do ${mv.sector}.</div>`;\n  const spk=(key)=>{const vals=trend.map(t=>+t[key]||0);const mx=Math.max(...vals,1);\n    return `<div class=\"spark\">${vals.map(v=>`<div class=\"b\" style=\"height:${(v/mx*100).toFixed(0)}%\" title=\"${fmt(v)}\"></div>`).join('')}</div>\n      <div class=\"note\">${trend.map(t=>String(t.ciclo).slice(-2)).join(' · ')}</div>`;};\n  h+=`<h2 style=\"margin-top:18px\">Setor ${mv.sector} — últimos ${trend.length} ciclos até o snapshot congelado</h2>\n    <div class=\"note\" style=\"margin:-4px 0 8px\">Tendência histórica <b>do próprio setor</b> — não ajustada pela absorção hipotética de etapas anteriores (limitação conhecida: tendência é por setor, não decomponível por município).</div>\n    <div style=\"display:grid;grid-template-columns:repeat(4,1fr);gap:10px\">\n    ${[['cbs','CBs'],['ativas','Ativas'],['receita','Receita'],['pontos','Pontos']].map(([k,l])=>`<div><div class=\"note\" style=\"margin:0 0 3px;font-weight:600;color:var(--ink)\">${l}</div>${spk(k)}</div>`).join('')}</div>`;\n  $('#tab-report').innerHTML=h;\n  const sel=$('#metricSel'); if(sel) sel.onchange=()=>{mv.metric=sel.value; renderReport();};\n}\nfunction renderCumulative(){\n  const el=$('#tab-cumulative'); if(!el) return;\n  if(!SESS.timeline.length){ el.innerHTML='<div class=\"note\">Nenhuma etapa na timeline ainda.</div>'; return; }\n  const ready=SESS.timeline.every(mv=>mv.munis);\n  if(!ready){ el.innerHTML='<div class=\"note\">Aguardando etapas terminarem de calcular…</div>'; return; }\n  const finalWorld=foldWorldState(SESS.timeline,SESS.timeline.length);\n  const openSectors=[...new Set(Object.values(finalWorld.muniOverride))];\n  let h=`<h2 style=\"margin:0 0 8px\">Linha do tempo — ${SESS.timeline.length} fechamento(s)</h2>\n    <div class=\"note\" style=\"margin:-2px 0 10px\">Setores fechados, em ordem: ${SESS.timeline.map(mv=>mv.sector).join(' → ')}. Cada linha abaixo soma o efeito de <b>toda a cadeia</b>, não apenas da última etapa.</div>`;\n  h+=`<div class=\"scroll\"><table><thead><tr><th>Setor</th><th>Situação</th>${METRICS_DEF.map(([,l])=>`<th>${l}</th>`).join('')}</tr></thead><tbody>`;\n  SESS.timeline.forEach((mv,i)=>{\n    h+=`<tr style=\"opacity:.75\"><td>${mv.sector}</td><td>fechado (etapa ${i+1})</td>`+METRICS_DEF.map(([k,,t])=>`<td>${(t==='$'?money:fmt)(mv.pureOwnMetrics?.[k]||0)}</td>`).join('')+`</tr>`;\n  });\n  openSectors.forEach(s=>{\n    const base=SESS.sectorBaseCache[s]||{};\n    const infl=finalWorld.sectorInflow[s]||{};\n    h+=`<tr><td>${s}</td><td>recebeu território</td>`+METRICS_DEF.map(([k,,t])=>{\n      const bv=+base[k]||0, av=bv+(infl[k]||0); const d=bv?((av-bv)/bv*100):0; const f=(t==='$'?money:fmt);\n      return `<td>${f(av)}<div class=\"delta ${d>=0?'up':'dn'}\">${d>0?'+':''}${d.toFixed(0)}%</div></td>`;\n    }).join('')+`</tr>`;\n  });\n  h+=`</tbody></table></div><div class=\"note\">\"Antes\" de um setor receptor é o snapshot congelado (sem nenhum fechamento aplicado); \"depois\" soma tudo que a cadeia inteira jogou pra ele.</div>`;\n  el.innerHTML=h;\n}\nfunction project(feats){let mnx=1/0,mny=1/0,mxx=-1/0,mxy=-1/0;\n  const each=cb=>feats.forEach(f=>{const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];ps.forEach(p=>p.forEach(r=>r.forEach(cb)));});\n  each(p=>{mnx=Math.min(mnx,p[0]);mxx=Math.max(mxx,p[0]);mny=Math.min(mny,p[1]);mxy=Math.max(mxy,p[1]);});\n  const mlat=(mny+mxy)/2,kx=Math.cos(mlat*Math.PI/180),W=700,H=500,pad=22;\n  const gw=(mxx-mnx)*kx,gh=(mxy-mny),sc=Math.min((W-2*pad)/gw,(H-2*pad)/gh);\n  const ox=(W-gw*sc)/2,oy=(H-gh*sc)/2;\n  return p=>[ox+(p[0]-mnx)*kx*sc, oy+(mxy-p[1])*sc];\n}\nfunction pathFor(f,pr){const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];\n  return ps.map(poly=>poly.map(r=>'M'+r.map(p=>{const q=pr(p);return q[0].toFixed(1)+','+q[1].toFixed(1);}).join('L')+'Z').join('')).join('');}\nfunction cxy(f,pr){let x=0,y=0,n=0;const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];ps.forEach(poly=>poly[0].forEach(p=>{const q=pr(p);x+=q[0];y+=q[1];n++;}));return[x/n,y/n];}\n// ---------- label placement ----------\n// Pole of inaccessibility: the interior point farthest from ANY boundary of the dissolved area. A\n// centroid is only a mean — on a concave sector, one split across a river, or a member whose vertex\n// average falls in a bay, it lands outside the very territory it is supposed to name, which is what\n// pushed the sector numbers off their own shapes. Even-odd across every ring of every member is a\n// correct union test here because municipalities tile rather than overlap.\n// The search box is clipped to the viewBox, so the result is inside the territory AND on screen.\n// Rings are decimated first — this is a label, not a measurement — which keeps a 20-município sector\n// to a few million ops, and the result is cached per stage: geometry never changes between renders,\n// only the fill does.\nfunction labelPointFor(fs,pr){\n  const rings=[];\n  (fs||[]).forEach(f=>{ if(!f||!f.geometry) return;\n    const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];\n    ps.forEach(poly=>poly.forEach(r=>{\n      if(!r||r.length<4) return;\n      const step=Math.max(1,Math.floor(r.length/120)),pts=[];\n      for(let i=0;i<r.length;i+=step) pts.push(pr(r[i]));\n      if(pts.length>3) rings.push(pts);\n    }));});\n  if(!rings.length) return null;\n  let mnx=1/0,mny=1/0,mxx=-1/0,mxy=-1/0;\n  rings.forEach(r=>r.forEach(p=>{ if(p[0]<mnx)mnx=p[0]; if(p[0]>mxx)mxx=p[0]; if(p[1]<mny)mny=p[1]; if(p[1]>mxy)mxy=p[1]; }));\n  mnx=Math.max(mnx,2); mny=Math.max(mny,2); mxx=Math.min(mxx,698); mxy=Math.min(mxy,498);\n  if(!(mxx>mnx&&mxy>mny)) return null;\n  const inside=(x,y)=>{ let c=false;\n    for(const r of rings) for(let i=0,j=r.length-1;i<r.length;j=i++){ const a=r[i],b=r[j];\n      if(((a[1]>y)!==(b[1]>y)) && (x<(b[0]-a[0])*(y-a[1])/(b[1]-a[1])+a[0])) c=!c; }\n    return c; };\n  const edgeDist=(x,y)=>{ let m=Infinity;\n    for(const r of rings) for(let i=0,j=r.length-1;i<r.length;j=i++){ const a=r[i],b=r[j];\n      const dx=b[0]-a[0],dy=b[1]-a[1],L=dx*dx+dy*dy;\n      let t=L?(((x-a[0])*dx+(y-a[1])*dy)/L):0; t=t<0?0:(t>1?1:t);\n      const ex=a[0]+t*dx-x,ey=a[1]+t*dy-y,d=ex*ex+ey*ey; if(d<m)m=d; }\n    return Math.sqrt(m); };\n  const W=mxx-mnx,H=mxy-mny,N=26;\n  let best=null,bd=-1;\n  for(let i=0;i<=N;i++) for(let j=0;j<=N;j++){\n    const x=mnx+W*i/N,y=mny+H*j/N;\n    if(!inside(x,y)) continue;\n    const d=edgeDist(x,y); if(d>bd){ bd=d; best=[x,y]; }\n  }\n  if(!best) return null;\n  // Hill-climb off the coarse grid: the grid only has to land somewhere in the right lobe, the\n  // refinement finds the deep point inside it — halving the step whenever no neighbour improves.\n  let step=Math.max(W,H)/N/2;\n  for(let k=0;k<7;k++){\n    let moved=false;\n    for(const o of [[1,0],[-1,0],[0,1],[0,-1],[1,1],[1,-1],[-1,1],[-1,-1]]){\n      const x=best[0]+o[0]*step,y=best[1]+o[1]*step;\n      if(x<mnx||x>mxx||y<mny||y>mxy||!inside(x,y)) continue;\n      const d=edgeDist(x,y); if(d>bd){ bd=d; best=[x,y]; moved=true; }\n    }\n    if(!moved) step/=2;\n  }\n  // The clearance travels with the point: it is the radius of the largest circle that fits inside the\n  // territory there, which is exactly the budget a caller needs to decide how much text will fit.\n  return {p:best,r:bd};\n}\nfunction labelPointOf(mv,key,fs,pr){\n  if(!mv._lbl) mv._lbl={};\n  if(!(key in mv._lbl)) mv._lbl[key]=labelPointFor(fs,pr);\n  return mv._lbl[key];\n}\nfunction drawMap(){\n  const mv=SESS.timeline[SESS.selected]; const svg=$('#map'); const ignNote=$('#mapIgnoredNote');\n  if(!mv){ svg.innerHTML=''; if(ignNote) ignNote.innerHTML=''; return; }\n  const c=computeDerived(mv);const NS='http://www.w3.org/2000/svg'; svg.innerHTML='';\n  const feats=[...mv.nbrFeat,...Object.values(mv.geoFeat)]; if(!feats.length) return;\n  const pr=project(feats);\n  const world=foldWorldState(SESS.timeline,SESS.selected);\n  // The context layer is ONE area per SECTOR, not one shape per município. The unit of this decision\n  // is the destination sector; a scatter of individually outlined municipalities carrying their own\n  // names invited exactly the wrong reading of the map. Members of a sector are filled AND stroked in\n  // the same colour, so the shared borders vanish and the group reads as a single dissolved\n  // territory — the IBGE shapes do not share vertices precisely enough to extract a clean union\n  // outline, and carrying a real polygon-clipping union for a context layer is not worth it.\n  // Labels are COLLECTED here and drawn last, after every path. Drawn inline they were buried by the\n  // next sector's fill, and placement cannot avoid a collision it has not seen yet.\n  const labels=[],placed=[];\n  const textW=(s,fs)=>String(s).length*fs*0.56;\n  // WCAG relative luminance of the fill a label sits on, so ink and halo can invert per label. \"Would\n  // white be better?\" has no single answer on this map: white reads on #5856d6 (L≈0.14) and disappears\n  // on #ff9500 and #34c759 (both L≈0.43, where black wins ~9:1 against white's ~2.2:1) and on every\n  // context fill, which is .32 opacity over white. Decided per label, never globally.\n  const lum=col=>{let h=String(col||'').replace('#','');\n    if(h.length===3) h=h[0]+h[0]+h[1]+h[1]+h[2]+h[2];\n    if(h.length!==6) return 1;\n    const c=[0,2,4].map(i=>parseInt(h.slice(i,i+2),16)/255)\n      .map(v=>v<=0.03928?v/12.92:Math.pow((v+0.055)/1.055,2.4));\n    return 0.2126*c[0]+0.7152*c[1]+0.0722*c[2];};\n  // Centred on (x,y) in BOTH axes. The old box hung off the first line's baseline, so every two-line\n  // label sat half its own height below the point it was supposed to mark.\n  const rectOf=(x,y,lines)=>{const w=Math.max.apply(null,lines.map(l=>textW(l.t,l.size)));\n    const h=lines.reduce((a,l)=>a+l.size*1.2,0);\n    return {x1:x-w/2-2.5,x2:x+w/2+2.5,y1:y-h/2-1.5,y2:y+h/2+1.5};};\n  const nbrBySec={};\n  mv.nbrFeat.forEach(f=>{\n    const nm=mkey(f.properties.name||f.properties.NOME||f.properties.nome||'',f.__uf);\n    const s=String((mv.nbrCurrentSector&&mv.nbrCurrentSector[nm])||'');\n    (nbrBySec[s]=nbrBySec[s]||[]).push(f);\n  });\n  Object.keys(nbrBySec).forEach(s=>{\n    const fs=nbrBySec[s];\n    const isDest=!!s&&mv.dest.includes(s);\n    const closedCtx=!!s&&world.closedSectors.has(s);\n    const col=isDest?(mv.color[s]||null):null;\n    fs.forEach(f=>{\n      const p=document.createElementNS(NS,'path');\n      p.setAttribute('d',pathFor(f,pr));\n      p.setAttribute('class','sect'+(isDest?'':(closedCtx?' closed-ctx':' plain')));\n      if(col){ p.setAttribute('fill',col); p.setAttribute('stroke',col); }\n      svg.appendChild(p);\n    });\n    if(!s) return;\n    // One number per sector, at the pole of inaccessibility of its DISSOLVED area — the whole group\n    // of members at once, not a representative member, so the number sits in the visual middle of the\n    // territory the operator actually sees.\n    const lp=labelPointOf(mv,'s:'+s,fs,pr);\n    // Context areas always read LIGHT — .sect paints dest colours at fill-opacity .32 over white, and\n    // plain/closed-ctx are near-white greys — so a sector number never wants white ink, whatever colour\n    // the sector itself was assigned.\n    if(lp&&lp.p) labels.push({anchor:lp.p,big:true,dark:false,lines:[{t:s,size:11.5,weight:700}]});\n  });\n  const asis=mv.view==='asis';\n  // The UF prefix is information only when the stage actually straddles a border. On a single-UF setor\n  // it is the same three characters repeated on every label — a large share of the clutter and none of\n  // the meaning. The hover tooltip carries the UF either way.\n  const showUf=new Set(Object.keys(mv.geoFeat).map(k=>mUf(k)).filter(Boolean)).size>1;\n  Object.entries(mv.geoFeat).forEach(([m,f])=>{const p=document.createElementNS(NS,'path');p.setAttribute('d',pathFor(f,pr));\n    const fillCol=asis?CLOSE_COLOR:(mv.color[mv.assign[m]]||'#444');\n    p.setAttribute('class','muni');p.setAttribute('fill',fillCol);\n    if(!asis) p.onclick=()=>{editSelected(m2=>{const i=m2.dest.indexOf(m2.assign[m]);if(m2.dest.length)m2.assign[m]=m2.dest[(i+1)%m2.dest.length];m2.selMuni=m;});};\n    p.style.cursor=asis?'default':'pointer';\n    p.onmousemove=e=>{const t=$('#tip');t.style.opacity=1;t.style.left=(e.clientX+12)+'px';t.style.top=(e.clientY+12)+'px';\n      t.innerHTML=asis?`<b>${mDisp(m)}</b><br>${fmt(mv.munis[m]?.cbs||0)} CBs · setor ${mv.sector}`:`<b>${mDisp(m)}</b><br>${fmt(mv.munis[m]?.cbs||0)} CBs → ${mv.assign[m]||'–'}<br><span style=\"color:var(--mut)\">clique p/ trocar</span>`;};\n    p.onmouseleave=()=>$('#tip').style.opacity=0;svg.appendChild(p);\n    // The name is never cut and never dropped. The pole of inaccessibility is still where the label\n    // WANTS to sit — the visual middle of the territory rather than a centroid that can fall outside a\n    // concave shape — but its clearance no longer gates anything: cutting BA-SAO SEBASTIAO DO PASSE\n    // down to BA-SAO SEBAST saved space by destroying the one thing the label existed to convey, and\n    // measuring the name against the inscribed circle rejected the centre for nearly every município.\n    const lp=labelPointOf(mv,'m:'+m,[f],pr);\n    const at=(lp&&lp.p)||cxy(f,pr);\n    const nmFull=(showUf&&mUf(m)?mUf(m)+'-':'')+mName(m);\n    const num=fmt(mv.munis[m]?.cbs||0)+(asis?'':'·'+(mv.assign[m]||'–'));\n    labels.push({anchor:at,cbs:+(mv.munis[m]?.cbs||0),dark:lum(fillCol)<0.18,\n      lines:[{t:nmFull,size:8.2,weight:700},{t:num,size:7,weight:500,mut:true}]});\n  });\n  // Placement, not de-cluttering. Every label IS drawn: it starts at its anchor and, if the text does\n  // not fit the territory or the slot is already taken, walks outward ring by ring until it finds\n  // clear canvas, trailing a hairline leader back to the shape it names. The previous pass dropped the\n  // loser of every collision outright, which is why municípios silently had no name at all.\n  // Order still matters — sector numbers first, then municípios by CB weight — because the earlier a\n  // label is placed the closer to home it lands.\n  const CW=700,CH=500,CPAD=2;\n  const inBounds=r=>r.x1>=CPAD&&r.x2<=CW-CPAD&&r.y1>=CPAD&&r.y2<=CH-CPAD;\n  const hits=r=>placed.reduce((a,q)=>a+((r.x2<q.x1||r.x1>q.x2||r.y2<q.y1||r.y1>q.y2)?0:1),0);\n  // Ring 0 is the anchor itself. Rings step 9u out over 16 directions, stretched horizontally because\n  // a label is wider than it is tall and sideways room is the room it actually needs.\n  const CAND=[[0,0]];\n  for(let ring=1;ring<=7;ring++){ const d=ring*9;\n    for(let a=0;a<16;a++){ const th=a*Math.PI/8; CAND.push([Math.cos(th)*d*1.35,Math.sin(th)*d]); } }\n  labels.sort((a,b)=>(b.big?1:0)-(a.big?1:0)||((b.cbs||0)-(a.cbs||0)));\n  labels.forEach(L=>{\n    let chosen=null,best=null,bestN=Infinity;\n    // Centred on the anchor is ALWAYS the first choice. An earlier cut here refused the anchor whenever\n    // the text was wider than the município's inscribed circle — true of almost every real name at this\n    // scale (BA-SAO SEBASTIAO DO PASSE is ~140u against ~80u of clearance), so every single label got\n    // nudged outside and nothing ended up centred on anything. Spilling past a border is normal on a\n    // choropleth and the halo keeps it readable; only a genuine COLLISION earns a move.\n    for(const off of CAND){\n      const x=L.anchor[0]+off[0], y=L.anchor[1]+off[1];\n      const r=rectOf(x,y,L.lines);\n      if(!inBounds(r)) continue;\n      const n=hits(r);\n      if(!n){ chosen={x,y,r,off}; break; }\n      // No clear slot yet — remember the LEAST crowded one. Falling back to the first in-bounds\n      // candidate meant falling back to the anchor every time, so a crowded map piled every loser onto\n      // the same point. CAND is ordered nearest-first and the compare is strict, so ties keep the\n      // closest slot.\n      if(n<bestN){ bestN=n; best={x,y,r,off}; }\n    }\n    // Canvas genuinely full: take the nearest in-bounds slot and accept the overlap. A label sitting\n    // on top of another is recoverable by eye; a name that was never drawn is not.\n    if(!chosen) chosen=best||{x:L.anchor[0],y:L.anchor[1],r:rectOf(L.anchor[0],L.anchor[1],L.lines),off:[0,0]};\n    placed.push(chosen.r);\n    const g=document.createElementNS(NS,'g'); g.setAttribute('class','lbl'+(L.big?' big':''));\n    if(Math.abs(chosen.off[0])>0.5||Math.abs(chosen.off[1])>0.5){\n      // The leader stops at the label's edge rather than its centre, so it never runs under the glyphs.\n      const cx=(chosen.r.x1+chosen.r.x2)/2, cy=(chosen.r.y1+chosen.r.y2)/2;\n      const hw=(chosen.r.x2-chosen.r.x1)/2, hh=(chosen.r.y2-chosen.r.y1)/2;\n      const dx=L.anchor[0]-cx, dy=L.anchor[1]-cy;\n      const tt=Math.min(dx?hw/Math.abs(dx):Infinity, dy?hh/Math.abs(dy):Infinity);\n      const ln=document.createElementNS(NS,'line'); ln.setAttribute('class','lead');\n      ln.style.stroke=L.dark?'#fff':'#1c1c1e';\n      ln.setAttribute('x1',L.anchor[0].toFixed(1)); ln.setAttribute('y1',L.anchor[1].toFixed(1));\n      ln.setAttribute('x2',(cx+dx*tt).toFixed(1)); ln.setAttribute('y2',(cy+dy*tt).toFixed(1));\n      g.appendChild(ln);\n    }\n    const hTot=L.lines.reduce((a,l)=>a+l.size*1.2,0);\n    let ty=chosen.y-hTot/2+L.lines[0].size*0.86;\n    // Inline style rather than a class: a stylesheet rule would outrank a presentation attribute and\n    // undo the per-label contrast decision made above.\n    const ink=L.dark?'#fff':'#1c1c1e', inkMut=L.dark?'rgba(255,255,255,.85)':'#48484d';\n    const halo=L.dark?'rgba(0,0,0,.6)':'#fff';\n    L.lines.forEach(l=>{ const t=document.createElementNS(NS,'text');\n      t.setAttribute('x',chosen.x.toFixed(1)); t.setAttribute('y',ty.toFixed(1));\n      t.setAttribute('font-size',l.size); t.setAttribute('font-weight',l.weight||600);\n      t.style.fill=l.mut?inkMut:ink; t.style.stroke=halo;\n      t.textContent=l.t; g.appendChild(t); ty+=l.size*1.2; });\n    svg.appendChild(g);\n  });\n  $('#legend').innerHTML=asis\n    ?`<span><b style=\"background:${CLOSE_COLOR}\"></b>Setor ${mv.sector} (estrutura antes desta etapa — ${Object.keys(mv.geoFeat).length} municípios)</span>`\n    // No \"vizinhos (contexto)\" or \"setor já fechado antes\" entry any more: every feature still drawn\n    // belongs to a destination sector, so .sect.plain and .sect.closed-ctx can no longer be produced\n    // and a legend key for them would point at nothing on the map.\n    :mv.dest.map(s=>`<span><b style=\"background:${mv.color[s]}\"></b>Setor ${s} — ${c.gained[s]} líder(es)</span>`).join('');\n  // Municipalities outside the dominance base are deliberately NOT drawn — no shape, no hover, no\n  // legend entry. They are reported in the panel instead, so the map only ever shows territory that\n  // is actually being reallocated.\n  if(ignNote) ignNote.innerHTML=(mv.excludedMunis&&mv.excludedMunis.length)\n    ? `<b style=\"color:var(--closing)\">${fmt(mv.excludedMunis.length)} município(s) / ${fmt(mv.excludedCbs||0)} CBs</b> fora da base de dominantes deste setor não são desenhados no mapa — as CBs seguem a líder do seu grupo (detalhe em “Municípios → setor destino”).`\n    : '';\n}\nasync function runSql(){const sql=$('#sqlIn').value.trim();$('#sqlStatus').textContent='rodando…';$('#sqlStatus').classList.remove('err');\n  try{ await ensurePinned(); const resp=await q(sql);const rs=rows(resp);const cols=(resp.manifest?.schema?.columns||[]).map(c=>c.name);\n    $('#sqlOut').innerHTML=`<thead><tr>${cols.map(c=>`<th>${c}</th>`).join('')}</tr></thead><tbody>`+rs.slice(0,200).map(r=>`<tr>${cols.map(c=>`<td>${r[c]??'·'}</td>`).join('')}</tr>`).join('')+`</tbody>`;\n    $('#sqlStatus').textContent=rs.length+' linha(s)';}\n  catch(e){$('#sqlStatus').textContent='bloqueado/erro: '+e.message;$('#sqlStatus').classList.add('err');}\n}\nfunction renderAll(){\n  renderStage();\n  renderTimeline(); renderSectorPicker();\n  const shb=$('#openShare'); if(shb) shb.disabled=!SESS.timeline.length;\n  const dpb=$('#dupSession'); if(dpb) dpb.disabled=!SESS.timeline.length;\n  const mv=SESS.timeline[SESS.selected];\n  // resolveSnapshotPin falls back to a live sub-select when it cannot pin a literal; saying\n  // \"congelado\" in that case would be a lie, so the pill reports what is actually in the SQL.\n  const pinned=SESS.snapLiteral && !/^\\(SELECT/i.test(SESS.snapLiteral);\n  $('#liveState').textContent = SESS.snapshotRaw\n    ? (pinned?'● snapshot congelado · ':'◍ snapshot ao vivo (não fixado) · ')+'atualizado em '+fmtSyncedAt(SESS.snapshotSyncedAt)+' · ↻'\n    : '● iniciando';\n  const mp=$('#basePill');\n  if(mp){\n    const warn=[];\n    if(DOM.bySetor&&!DOM.hasUf) warn.push('⚠ sem coluna UF');\n    if(DOM.badUf) warn.push('⚠ '+fmt(DOM.badUf)+' UF não reconhecida(s)');\n    if(DOM.clashes) warn.push('⚠ '+fmt(DOM.clashes)+' homônimo(s) no mesmo setor');\n    mp.textContent=DOM.bySetor?('◇ base dominantes: '+fmt(DOM.setores)+' setores · '+fmt(DOM.rows)+' municípios'+(warn.length?' · '+warn.join(' · '):'')):(DOM.error?'◇ base dominantes: indisponível':'◇ base dominantes: carregando…');\n    mp.title=DOM.error||(DOM.bySetor?((DOM.hasUf\n        ?('Coluna de UF usada: \"'+DOM.ufCol+'\".')\n        :('SEM coluna de UF. Colunas lidas: '+((DOM.headers||[]).join(' | ')||'?')+'. A UF de cada município vem desta base — sem ela, homônimos voltam a ser casados só pelo nome.'))\n      +(DOM.badUf?('\\n'+DOM.badUf+' linha(s) com UF irreconhecível — tratadas como desconhecida.'):'')\n      +(DOM.clashes?('\\n'+DOM.clashes+' município(s) aparecem no mesmo setor com UFs diferentes. O SQL agrupa só por DS_MUNICIPIO, então esses chegam somados numa linha única e não há como separá-los.'):'')\n      ):'')||DOM.url||''; }\n  const rp=$('#rulePill'); if(rp) rp.textContent='◈ destino: '+ruleShort(SESS.settings);\n  const sp=$('#spanPill'); if(sp) sp.textContent='◎ span: '+spanShort(SESS.settings);\n  renderRuleNote(); renderSpanRule();\n  if(!mv){ ['#map','#matrix','#matrixTobe','#tobeNote','#leaders'].forEach(s=>{const el=$(s);if(el)el.innerHTML='';}); $('#kpis').innerHTML=''; $('#spans').innerHTML=''; $('#muniList').innerHTML=''; $('#plan').innerHTML=''; return; }\n  $('#mapTitle').textContent=`Etapa ${SESS.selected+1}/${SESS.timeline.length} — fechando setor ${mv.sector}`;\n  $('#viewToggle').querySelectorAll('button').forEach(b=>b.classList.toggle('on',b.dataset.v===mv.view));\n  $('#policy').querySelectorAll('button').forEach(b=>b.classList.toggle('on',b.dataset.p===mv.policy));\n  $('#optBadge').textContent=mv.optBadge||'';\n  drawMap(); renderContig(); renderSpanRule(); renderKpis(); renderSpans(); renderMuni(); renderLeaders(); renderMatrix(); renderMatrixTobe(); renderPolicy(); renderPlan(); renderReport(); renderCumulative();\n}\n\n// ---------- event wiring ----------\n$('#go').onclick=()=>addMovement($('#sectorPick').value);\n$('#confirmSnap').onclick=()=>{ SESS.stage='main'; renderAll(); };\n$('#rand').onclick=()=>{\n  const closed=new Set(SESS.timeline.map(mv=>mv.sector));\n  const pool=SESS.sectorsList.filter(s=>!closed.has(s.setor));\n  const cand=pool.filter(s=>s.munis>=3&&s.munis<=10&&s.cbs>300);\n  const list=cand.length?cand:pool; if(!list.length) return;\n  const pick=list[Math.floor(Math.random()*list.length)];\n  $('#sectorPick').value=pick.setor;\n  addMovement(pick.setor);\n};\n$('#sectorPick').addEventListener('keydown',e=>{ if(e.key==='Enter') addMovement($('#sectorPick').value); });\n$('#confirmSessionPick').onchange=()=>loadSession($('#confirmSessionPick').value);\n$('#optim').onclick=()=>editSelected(mv=>{ mv.assign=optimizeFor(mv); });\n$('#autoTobe').onclick=()=>editSelected(mv=>{ mv.assign=autoAssignFor(mv); mv.optBadge='TOBE por adjacência'; });\n$('#viewToggle').querySelectorAll('button').forEach(b=>b.onclick=()=>{const mv=SESS.timeline[SESS.selected];if(!mv)return;mv.view=b.dataset.v;renderAll();});\n$('#policy').querySelectorAll('button').forEach(b=>b.onclick=()=>{const mv=SESS.timeline[SESS.selected];if(!mv)return;mv.policy=b.dataset.p;renderKpis();renderPolicy();renderPlan();});\nroot.querySelectorAll('.tabs button').forEach(b=>b.onclick=()=>{root.querySelectorAll('.tabs button').forEach(x=>x.classList.toggle('on',x===b));\n  ['matrix','tobe','report','cumulative','sql'].forEach(t=>$('#tab-'+t).classList.toggle('hidden',t!==b.dataset.tab));});\n$('#runSql').onclick=runSql;\n$('#copyPlan').onclick=()=>{const mv=SESS.timeline[SESS.selected];if(!mv)return;navigator.clipboard.writeText(JSON.stringify({setor:mv.sector,politica:mv.policy,plano:mv._plan},null,2));$('#copyPlan').textContent='copiado ✓';setTimeout(()=>$('#copyPlan').textContent='Copiar',1500);};\n$('#csvPlan').onclick=()=>{const mv=SESS.timeline[SESS.selected];if(!mv)return;const csv='municipio,uf,cbs,setor_destino\\n'+mv._plan.map(p=>`${p.municipio},${p.uf||''},${p.cbs},${p.destino}`).join('\\n');\n  const a=document.createElement('a');a.href=URL.createObjectURL(new Blob([csv],{type:'text/csv'}));a.download=`plano_migracao_setor_${mv.sector}.csv`;a.click();};\n$('#saveSession').onclick=saveSession;\n$('#dupSession').onclick=duplicateSession;\n$('#sessionPick').onchange=()=>loadSession($('#sessionPick').value);\n$('#liveState').onclick=refreshSnapshot;\n$('#liveState').addEventListener('keydown',e=>{ if(e.key==='Enter'||e.key===' '){ e.preventDefault(); refreshSnapshot(); } });\n$('#openOptions').onclick=openOptions;\n$('#optClose').onclick=closeOptions;\n$('#optCancel').onclick=closeOptions;\n$('#optApply').onclick=applyOptions;\n$('#optMinCbs').addEventListener('input',renderOptPreview);\n['#optTargetSpan','#optMaxSpan','#optMinSpan'].forEach(id=>$(id).addEventListener('input',renderOptPreview));\nroot.querySelectorAll('input[name=\"destRule\"]').forEach(r=>r.addEventListener('change',renderOptPreview));\n$('#optionsBg').addEventListener('click',e=>{ if(e.target.id==='optionsBg') closeOptions(); });\nroot.addEventListener('keydown',e=>{ if(e.key==='Escape'){ closeOptions(); closeShare(); } });\n\n$('#openShare').onclick=openShare;\n$('#shareX').onclick=closeShare;\n$('#shareCancel').onclick=closeShare;\n$('#shareGo').onclick=doShare;\n$('#shareCopy').onclick=()=>{ if(!SHARE.url) return; navigator.clipboard.writeText(SHARE.url);\n  const b=$('#shareCopy'); if(b){ b.textContent='copiado ✓'; setTimeout(()=>{ const x=$('#shareCopy'); if(x) x.textContent='Copiar link'; },1500); } };\n$('#shareOpen').onclick=()=>{ if(SHARE.url) window.open(SHARE.url,'_blank'); };\n$('#shareBg').addEventListener('click',e=>{ if(e.target.id==='shareBg') closeShare(); });\n\n// ---------- init ----------\n(async()=>{\n  loader(true,'congelando snapshot da sessão…');\n  try{\n    await Promise.all([ensurePinned(), loadSectors(), refreshSessionPicker()]);\n    SESS.stage='confirm';\n  }catch(e){ setError('erro init: '+e.message); }\n  finally{ loader(false); renderAll(); const rd=$('#ready'); if(rd) rd.setAttribute('data-loaded','1'); }\n})();\n\n  }\n}\n"}},"sessionsDataset":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"sessionsDataset"}}}},"dominantesCsvUrl":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"dominantesCsvUrl"}}}}}}}},"__d2PrevCode":{"code":"const T='product.perfil_cb.crm_perfil_cb_diaria_historico';\nconst ELO='product.elo_modelo_combinado.commercial_consultant_index';\nconst PALETTE=['#5856d6','#ff9500','#34c759','#af52de','#ff2d55','#a2845e'];\nconst CLOSE_COLOR='#8e8e93';\nconst UF_CODE={RO:'11',AC:'12',AM:'13',RR:'14',PA:'15',AP:'16',TO:'17',MA:'21',PI:'22',CE:'23',RN:'24',PB:'25',PE:'26',AL:'27',SE:'28',BA:'29',MG:'31',ES:'32',RJ:'33',SP:'35',PR:'41',SC:'42',RS:'43',MS:'50',MT:'51',GO:'52',DF:'53'};\nconst UF_BORDERS={AC:['AM','RO'],AL:['BA','PE','SE'],AM:['AC','RO','RR','PA','MT'],AP:['PA'],\n BA:['AL','SE','PE','PI','TO','GO','MG','ES'],CE:['PI','PB','PE','RN'],DF:['GO','MG'],\n ES:['BA','MG','RJ'],GO:['DF','MT','MS','MG','BA','TO'],MA:['PA','TO','PI'],\n MG:['BA','GO','DF','MS','SP','RJ','ES'],MS:['MT','GO','MG','SP','PR'],MT:['RO','AM','PA','TO','GO','MS'],\n PA:['AP','AM','MT','TO','MA','RR'],PB:['RN','CE','PE'],PE:['PB','CE','PI','BA','AL'],\n PI:['MA','TO','BA','PE','CE'],PR:['SP','MS','SC'],RJ:['ES','MG','SP'],RN:['CE','PB'],\n RO:['AC','AM','MT'],RR:['AM','PA'],RS:['SC'],SC:['PR','RS'],SE:['BA','AL'],\n SP:['MG','RJ','PR','MS'],TO:['PA','MA','PI','BA','GO','MT']};\nconst NIVEIS=['Bronze','Cristal','Prata','Ouro','Diamante','Diamante+'];\nconst METRICS_DEF=[['cbs','CBs'],['ativas','Ativas'],['pedidos','Pedidos'],['pontos','Pontos'],['receita','Receita','$'],['rec_nat','Rec. Natura','$'],['rec_avon','Rec. Avon','$']];\nconst OPT_K=1.5;\nconst SESSIONS_DS='timeline-shared-sessionsDataSet';   // same table as SHARED_DS — see notes at listSessions()\n// Span defaults are the real operating band for a setor receptor, not placeholders: 2200 ≤ span ≤ 3500\n// with 2700 as the target. null meant \"sem limite\", so every new session started with the optimiser\n// balancing against nothing. Existing sessions are NOT touched — their persisted settings carry explicit\n// values that spread OVER these in openOptions/applyOptions, which is deliberate: their etapas were\n// computed under the old band and changing it silently would leave the stored result and the rule that\n// produced it out of sync.\nconst DEFAULT_SETTINGS={destRule:'any',destMinCbs:9,targetSpan:2700,maxSpan:3500,minSpan:2200};\nconst DOM_MEDIA_BASE='https://natura-geomarketing.data2.media/file/';\nconst DOM_CSV_FALLBACK=DOM_MEDIA_BASE+'yw_TQdp0QXEk6JsrliAqP'; \nconst numOrNull=v=>{const n=Math.round(+v);return (isFinite(n)&&n>0)?n:null;};\nconst spanShort=st=>{const p=[];if(st&&st.targetSpan)p.push('alvo '+st.targetSpan);if(st&&st.maxSpan)p.push('máx '+st.maxSpan);if(st&&st.minSpan)p.push('mín '+st.minSpan);return p.length?p.join(' · '):'livre';};\nconst ruleShort=st=>((st&&st.destRule)==='dominant')?('dominantes ≥'+((st&&st.destMinCbs)||DEFAULT_SETTINGS.destMinCbs)+' CBs'):'qualquer municipio';\n\nexport default {\n  css: `\n  :host{display:block;height:100%;--bg:#f5f5f7;--panel:#ffffff;--panel2:#f2f2f7;--line:#e5e5ea;--ink:#1c1c1e;--mut:#6e6e73;--acc:#007aff;--acc2:#0060df;--closing:#ff3b30;--ok:#34c759}\n  *{box-sizing:border-box}\n  .simroot{position:relative;height:100%;overflow:auto;font:13px/1.45 -apple-system,BlinkMacSystemFont,\"SF Pro Text\",\"Segoe UI\",Roboto,sans-serif;background:var(--bg);color:var(--ink);-webkit-font-smoothing:antialiased}\n  header{padding:10px 16px;background:rgba(246,246,248,.85);backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);border-bottom:1px solid var(--line);display:flex;align-items:center;gap:10px;flex-wrap:wrap}\n  header h1{font-size:14.5px;margin:0;font-weight:600;letter-spacing:-.1px;color:var(--ink)}\n  .mac-spacer{flex:1}\n  .howto{padding:8px 16px;background:var(--panel);border-bottom:1px solid var(--line);display:flex;gap:16px;flex-wrap:wrap;font-size:11.5px;color:var(--mut);align-items:center}\n  .howto b{color:var(--ink)} .howto span{max-width:340px}\n  .pill{font-size:10.5px;padding:2.5px 9px;border-radius:99px;border:1px solid var(--line);color:var(--mut);background:var(--panel2)}\n  .pill.live{color:var(--ink);cursor:pointer;user-select:none;transition:border-color .1s,color .1s,background .1s}\n  .pill.live:hover{border-color:var(--acc);color:var(--acc);background:#eaf3ff}\n  .pill.live:focus-visible{outline:2px solid rgba(0,122,255,.35);outline-offset:1px}\n  .pill.live.busy{border-color:var(--acc);color:var(--acc);cursor:progress}\n  .status{font-size:11px;color:var(--mut)}.status.err{color:var(--closing)}\n  select,input,textarea,button{font:inherit}\n  select,input{background:var(--panel);border:1px solid var(--line);color:var(--ink);border-radius:7px;padding:5.5px 9px}\n  select:focus,input:focus{outline:2px solid rgba(0,122,255,.35);outline-offset:0;border-color:var(--acc)}\n  button.act{background:var(--acc);color:#fff;border:1px solid transparent;border-radius:7px;padding:6px 13px;font-weight:600;cursor:pointer;box-shadow:0 1px 1px rgba(0,0,0,.08)}\n  button.act:hover{background:var(--acc2)}\n  button.ghost{background:var(--panel);color:var(--ink);border:1px solid var(--line);border-radius:7px;padding:5.5px 12px;cursor:pointer}\n  button.ghost:hover{background:var(--panel2)}\n  button.ghost.on{border-color:var(--acc);color:var(--acc);background:#eaf3ff}\n  button.ghost:disabled,button.act:disabled{opacity:.4;cursor:not-allowed}\n  .sessbar{padding:9px 20px;background:var(--panel2);border-bottom:1px solid var(--line);display:flex;gap:8px;flex-wrap:wrap;align-items:center}\n  .rail{padding:9px 16px;background:var(--panel);border-bottom:1px solid var(--line);display:flex;gap:8px;align-items:center;overflow-x:auto}\n  #movementChips{display:flex;gap:8px;flex:0 0 auto}\n  #addMovementGroup{display:flex;gap:8px;align-items:center;flex:0 0 auto;margin-left:auto;padding-left:12px;border-left:1px solid var(--line)}\n  #addMovementGroup input{min-width:150px}\n  .tchip{display:flex;align-items:center;gap:7px;background:var(--panel2);border:1px solid var(--line);border-radius:8px;padding:6px 10px;cursor:pointer;font-size:12px;flex:0 0 auto}\n  .tchip.on{border-color:var(--acc);background:#eaf3ff}\n  .tchip.stale{border-style:dashed;opacity:.85}\n  .tchip .tstale{color:#ff9500;font-weight:700}\n  .tchip .tnum{background:var(--ink);color:#fff;border-radius:99px;width:16px;height:16px;font-size:9.5px;display:flex;align-items:center;justify-content:center;font-weight:700}\n  .tchip .tsec{font-weight:600}\n  .tchip .tstat{color:var(--mut)}\n  .tchip .trm{color:var(--mut);font-weight:700;padding:0 3px}\n  .tchip .trm:hover{color:var(--closing)}\n  .rail .empty{color:var(--mut);font-size:12px}\n  .wrap{display:grid;grid-template-columns:minmax(360px,1fr) 430px;gap:14px;padding:14px 16px;align-items:start}\n  @media(max-width:1150px){.wrap{grid-template-columns:1fr}}\n  .card{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:14px 16px;margin-bottom:14px;box-shadow:0 1px 2px rgba(0,0,0,.04)}\n  .card h2{font-size:11px;text-transform:uppercase;letter-spacing:.4px;color:var(--mut);margin:0 0 9px;font-weight:600}\n  /* user-select, not pointer-events. .lbl already sets pointer-events:none, which stops the text from\n     RECEIVING clicks but does not exclude it from the browser's selection range — so cycling a\n     município's destination with repeated clicks kept dragging a double-click selection across the\n     labels. Nothing drawn in an svg here is text anyone needs to copy. */\n  svg{width:100%;height:auto;display:block;user-select:none;-webkit-user-select:none}\n  /* White hairlines inside the closing sector: the municipios read as one territory cut into parts\n     rather than as separate outlined units, and the saturated fills carry the grouping instead of the\n     ink. Neighbour sectors keep their own coloured strokes (.sect) — that contrast is what separates\n     what is being reallocated from what is only context. Selection no longer draws an outline; the\n     white border was the click affordance AND the default is now white, so it had nothing left to say. */\n  .muni{stroke:#fff;stroke-width:1.1;cursor:pointer;transition:filter .1s}.muni:hover{filter:brightness(1.15)}\n  .sect{stroke-width:1;fill-opacity:.32;stroke-opacity:.6}\n  .sect.plain{fill:#e8e8ec;stroke:#d4d4d9;fill-opacity:1;stroke-opacity:1}\n  .sect.closed-ctx{fill:#e2e2e7;stroke:#aeaeb2;stroke-dasharray:3 2;fill-opacity:1;stroke-opacity:1}\n  .lbl{pointer-events:none}\n  /* No plate behind the text: a halo painted UNDER the glyphs (paint-order) keeps a name legible on any\n     fill without stamping an opaque box over the territory it names. Ink and halo are chosen per label\n     from the luminance of the fill underneath, so they are deliberately NOT declared here — a\n     stylesheet rule outranks a presentation attribute and would silently override that choice. */\n  .lbl text{text-anchor:middle;paint-order:stroke fill;stroke-width:2.2px;stroke-linejoin:round;stroke-linecap:round}\n  .lbl.big text{stroke-width:2.9px}\n  .lbl line.lead{stroke-opacity:.5;stroke-width:.8}\n  .legend{display:flex;gap:12px;flex-wrap:wrap;margin-top:8px;font-size:12px}\n  .legend b{display:inline-block;width:11px;height:11px;border-radius:3px;margin-right:5px;vertical-align:-1px}\n  .kpis{display:grid;grid-template-columns:1fr 1fr;gap:9px;margin-bottom:12px}\n  .kpi{background:var(--panel2);border:1px solid var(--line);border-radius:10px;padding:9px 11px}\n  .kpi .n{font-size:19px;font-weight:700}.kpi .l{font-size:10.5px;color:var(--mut);margin-top:2px}\n  .kpi.warn{border-color:#ffd1cc}.kpi.warn .n{color:var(--closing)}.kpi.ok{border-color:#bdeecb}.kpi.ok .n{color:var(--ok)}\n  .bar-row{display:flex;align-items:center;gap:8px;margin:6px 0}\n  .bar-row .tag{width:42px;font-weight:600;font-size:12px}\n  .bar-track{flex:1;height:18px;background:var(--panel2);border-radius:5px;overflow:hidden;display:flex;position:relative}\n  .bar-mark{position:absolute;top:0;bottom:0;width:2px;opacity:.9;z-index:2}\n  .bar-base{height:100%;opacity:.4}.bar-inc{height:100%}\n  .bar-val{width:132px;text-align:right;font-size:11px;color:var(--mut);font-variant-numeric:tabular-nums}\n  table{border-collapse:collapse;width:100%;font-size:11.5px}\n  th,td{padding:5px 6px;text-align:right;border-bottom:1px solid var(--line);font-variant-numeric:tabular-nums}\n  th:first-child,td:first-child{text-align:left}\n  thead th{color:var(--mut);font-weight:600;font-size:10.5px;position:sticky;top:0;background:var(--panel)}\n  .home{display:inline-block;width:9px;height:9px;border-radius:2px;margin-right:4px}\n  .muni-item{display:flex;align-items:center;gap:8px;background:var(--panel2);border:1px solid var(--line);border-radius:8px;padding:5px 8px;margin-bottom:6px}\n  .muni-item .nm{flex:1;font-weight:600;font-size:12px}.muni-item .ct{color:var(--mut);font-size:11px}\n  .seg{display:flex;border:1px solid var(--line);border-radius:7px;overflow:hidden}\n  .seg button{border:0;background:transparent;color:var(--mut);padding:4px 8px;font-size:11px;font-weight:600;cursor:pointer}\n  .seg button.on{color:#fff}\n  .toolbar{display:flex;gap:8px;align-items:center;flex-wrap:wrap}\n  .toggle{display:flex;border:1px solid var(--line);border-radius:8px;overflow:hidden;font-size:12px}\n  .toggle button{background:transparent;border:0;color:var(--mut);padding:6px 10px;cursor:pointer;font-weight:600}\n  .toggle button.on{background:var(--panel2);color:var(--ink)}\n  .note{color:var(--mut);font-size:10.5px;margin-top:7px;line-height:1.5}\n  .cell{font-variant-numeric:tabular-nums}\n  .scroll{max-height:240px;overflow:auto}\n  .tip{position:fixed;pointer-events:none;background:#1c1c1e;color:#fff;border-radius:8px;padding:7px 9px;font-size:11px;opacity:0;transition:opacity .1s;z-index:9;max-width:230px}\n  .spark{display:flex;align-items:flex-end;gap:3px;height:44px}\n  .spark .b{flex:1;background:var(--acc);border-radius:2px 2px 0 0;min-height:2px;opacity:.85}\n  .delta{font-size:10px}.delta.up{color:var(--ok)}.delta.dn{color:var(--closing)}\n  .tabs{display:flex;gap:6px;margin-bottom:10px;flex-wrap:wrap}\n  .tabs button{background:transparent;border:1px solid var(--line);border-radius:8px;color:var(--mut);padding:6px 12px;cursor:pointer;font-weight:600}\n  .tabs button.on{background:var(--panel2);color:var(--ink);border-color:var(--acc)}\n  .hidden{display:none}\n  .sqlbox{width:100%;height:60px;font-family:ui-monospace,Menlo,monospace;font-size:11px;resize:vertical}\n  .load{position:absolute;inset:0;background:rgba(245,245,247,.85);backdrop-filter:blur(4px);display:flex;align-items:center;justify-content:center;z-index:20;font-size:13px;color:var(--acc);font-weight:600;text-align:center;padding:20px}\n  .load.hidden{display:none}\n  .badge{font-size:10px;padding:1px 6px;border-radius:5px;background:var(--panel2);border:1px solid var(--line);color:var(--mut)}\n  .sheet-bg{position:fixed;inset:0;background:rgba(28,28,30,.34);backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);display:flex;align-items:center;justify-content:center;z-index:40;padding:24px}\n  .sheet-bg.hidden{display:none}\n  .sheet{background:var(--panel);border:1px solid var(--line);border-radius:14px;box-shadow:0 24px 60px rgba(0,0,0,.22);width:min(580px,100%);max-height:100%;display:flex;flex-direction:column;overflow:hidden}\n  .sheet-hd{display:flex;align-items:center;gap:9px;padding:12px 16px;border-bottom:1px solid var(--line)}\n  .sheet-hd h3{margin:0;font-size:14px;font-weight:600;letter-spacing:-.1px}\n  .sheet-x{background:transparent;border:0;color:var(--mut);font-size:13px;cursor:pointer;padding:3px 7px;border-radius:6px}\n  .sheet-x:hover{background:var(--panel2);color:var(--ink)}\n  .sheet-bd{padding:14px 16px;overflow:auto}\n  .sheet-ft{display:flex;align-items:center;gap:8px;padding:11px 16px;border-top:1px solid var(--line);background:var(--panel2)}\n  .opt-lbl{font-size:11px;text-transform:uppercase;letter-spacing:.4px;color:var(--mut);font-weight:600}\n  .opt-sub{font-size:11.5px;color:var(--mut);margin:4px 0 10px;line-height:1.5}\n  .opt-row{display:flex;gap:10px;align-items:flex-start;border:1px solid var(--line);border-radius:10px;padding:10px 12px;margin-bottom:8px;cursor:pointer;background:var(--panel)}\n  .opt-row:hover{background:var(--panel2)}\n  .opt-row.on{border-color:var(--acc);background:#eaf3ff}\n  .opt-row input[type=radio]{margin:2px 0 0;accent-color:var(--acc);flex:0 0 auto}\n  .opt-t{font-size:12.5px;font-weight:600;display:flex;align-items:center;gap:6px;flex-wrap:wrap}\n  .opt-d{font-size:11.5px;color:var(--mut);margin-top:3px;line-height:1.55}\n  .opt-inline{font-size:11.5px;color:var(--mut);margin-top:9px;display:flex;align-items:center;gap:7px;flex-wrap:wrap}\n  .opt-inline.off{opacity:.4;pointer-events:none}\n  .opt-note{border:1px solid var(--line);background:var(--panel2);border-radius:10px;padding:9px 11px;font-size:11.5px;color:var(--mut);line-height:1.6;margin-top:12px}\n  .opt-grid{display:grid;grid-template-columns:1fr 1fr 1fr;gap:8px;margin-top:2px}\n  .opt-fld{display:flex;flex-direction:column;gap:5px;border:1px solid var(--line);border-radius:9px;padding:8px 10px;background:var(--panel2)}\n  .opt-fld span{font-size:11px;color:var(--mut);font-weight:600;line-height:1.35}\n  .opt-fld i{font-style:normal;font-weight:400;opacity:.72}\n  .opt-fld input{width:100%;background:var(--panel)}\n  .opt-err{margin-top:9px;font-size:11.5px;color:var(--closing);font-weight:600}\n  .opt-hr{height:1px;background:var(--line);margin:17px 0 0}\n  .shareurl{margin-top:9px;padding:9px 10px;border-radius:8px;background:var(--panel);border:1px solid var(--acc);\n    font-family:ui-monospace,Menlo,monospace;font-size:11px;color:var(--ink);word-break:break-all;user-select:all}\n`,\n  render(d2){\n    return `<div class=\"simroot\"><header id=\"topHeader\" class=\"hidden\">\n  <h1>Simulador de Timeline de Fechamentos</h1>\n  <span class=\"pill live\" id=\"liveState\" role=\"button\" tabindex=\"0\" title=\"Clique pra buscar o snapshot mais recente e recalcular a timeline inteira\">● iniciando</span>\n  <span class=\"pill ro\">read-only · nunca escreve</span>\n  <span class=\"pill\" id=\"basePill\"></span>\n  <span class=\"pill\" id=\"rulePill\"></span>\n  <span class=\"pill\" id=\"spanPill\"></span>\n  <span class=\"status\" id=\"ds\"></span>\n  <div class=\"mac-spacer\"></div>\n  <select id=\"sessionPick\" style=\"min-width:200px\"></select>\n  <button class=\"ghost\" id=\"openOptions\" title=\"Configurações desta sessão\">⚙ Opções</button>\n  <button class=\"act\" id=\"saveSession\">Salvar sessão</button>\n  <button class=\"ghost\" id=\"dupSession\" title=\"Cria uma cópia independente desta sessão — a original fica intacta e a cópia passa a ser a sessão ativa\">⧉ Duplicar</button>\n  <button class=\"ghost\" id=\"openShare\" title=\"Publicar uma cópia congelada desta sessão em modo leitura\">⇪ Compartilhar</button>\n  <span class=\"status\" id=\"sessStatus\"></span>\n</header>\n\n<div class=\"rail hidden\" id=\"timelineRail\">\n  <div id=\"movementChips\"></div>\n  <div id=\"addMovementGroup\">\n    <input id=\"sectorPick\" list=\"sectorPickList\" placeholder=\"código do setor\" style=\"min-width:150px\">\n    <datalist id=\"sectorPickList\"></datalist>\n    <button class=\"ghost\" id=\"rand\" title=\"Setor aleatório\">🎲</button>\n    <button class=\"act\" id=\"go\">Fechar setor ▶ (nova etapa)</button>\n  </div>\n</div>\n\n<div class=\"card\" id=\"confirmCard\" style=\"margin:14px 20px\">\n  <h2 style=\"margin:0 0 9px\">Confirmar snapshot antes de simular</h2>\n  <div class=\"note\" id=\"confirmBody\">congelando snapshot…</div>\n  <button class=\"act\" id=\"confirmSnap\" style=\"margin-top:12px\">Confirmar snapshot ▶ ir pra simulação</button>\n  <div class=\"note\" style=\"margin-top:16px\">ou continue uma sessão salva:</div>\n  <select id=\"confirmSessionPick\" style=\"min-width:260px;margin-top:4px\"></select>\n  <div class=\"status\" id=\"confirmStatus\" style=\"margin-top:8px\"></div>\n</div>\n\n<div class=\"howto hidden\" id=\"howtoBox\">\n  <b>Como usar &nbsp;→&nbsp;</b>\n  <span><b>1.</b> Escolha um setor pra <b>fechar</b> (ou 🎲) — isso cria a etapa 1 da timeline.</span>\n  <span><b>2.</b> Feche outro setor pra criar a etapa 2 — ela já considera pra onde a etapa 1 mandou cada município.</span>\n  <span><b>3.</b> Clique numa etapa (chip acima) pra revisitar/editar — editar uma etapa recalcula automaticamente todas as etapas seguintes.</span>\n  <span><b>4.</b> Veja o efeito acumulado da cadeia inteira na aba <b>Impacto acumulado</b>.</span>\n</div>\n<div class=\"wrap hidden\" id=\"mainWrap\">\n  <div>\n    <div class=\"card\">\n      <div style=\"display:flex;justify-content:space-between;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:9px\">\n        <h2 id=\"mapTitle\" style=\"margin:0\">Mapa — clique num município p/ trocar o setor destino</h2>\n        <div class=\"toggle\" id=\"viewToggle\" title=\"ASIS = estrutura do setor antes desta etapa (já considerando etapas anteriores) · TOBE = após a redistribuição desta etapa\">\n          <button data-v=\"asis\">◧ ASIS (antes desta etapa)</button>\n          <button data-v=\"tobe\" class=\"on\">◨ TOBE (simulação)</button>\n        </div>\n      </div>\n      <svg id=\"map\" viewBox=\"0 0 700 500\" preserveAspectRatio=\"xMidYMid meet\"></svg>\n      <div class=\"legend\" id=\"legend\"></div>\n      <div class=\"note\">Coloridos = municípios do setor fechado nesta etapa (cor = destino). Ao redor, cada área é um <b>setor vizinho inteiro</b> com o código no meio — não municípios soltos: cor = setor destino, cinza = contexto, cinza tracejado = setor já fechado numa etapa anterior. Shapes reais IBGE/tbrugz.</div>\n      <div class=\"note\" id=\"mapIgnoredNote\"></div>\n    </div>\n\n    <div class=\"card\">\n      <h2>Líderes — destino e CBs deslocadas (nesta etapa)</h2>\n      <div class=\"note\" style=\"margin:-4px 0 9px\"><b>Home</b> = setor que ficou com a maioria das CBs da líder. <b style=\"color:var(--closing)\">Deslocadas</b> = CBs dela que caíram noutro setor.</div>\n      <div class=\"scroll\"><table id=\"leaders\"></table></div>\n    </div>\n\n    <div class=\"card\">\n      <div class=\"tabs\">\n        <button data-tab=\"matrix\" class=\"on\">Matriz ASIS</button>\n        <button data-tab=\"tobe\">Matriz TOBE</button>\n        <button data-tab=\"report\">Relatório de impacto (etapa)</button>\n        <button data-tab=\"cumulative\">Impacto acumulado (timeline)</button>\n        <button data-tab=\"sql\">Console SQL</button>\n      </div>\n      <div id=\"tab-matrix\"><div class=\"scroll\"><table id=\"matrix\"></table></div></div>\n      <div id=\"tab-tobe\" class=\"hidden\"><div class=\"scroll\"><table id=\"matrixTobe\"></table></div>\n        <div class=\"note\" id=\"tobeNote\"></div></div>\n      <div id=\"tab-report\" class=\"hidden\"></div>\n      <div id=\"tab-cumulative\" class=\"hidden\"></div>\n      <div id=\"tab-sql\" class=\"hidden\">\n        <textarea class=\"sqlbox\" id=\"sqlIn\">SELECT DS_MUNICIPIO, COUNT(DISTINCT CD_CONSULTORA) qtd FROM product.perfil_cb.crm_perfil_cb_diaria_historico WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR=3504 GROUP BY DS_MUNICIPIO ORDER BY qtd DESC</textarea>\n        <div class=\"toolbar\" style=\"margin:8px 0\"><button class=\"act\" id=\"runSql\">▶ Rodar</button><span class=\"status\" id=\"sqlStatus\"></span></div>\n        <div class=\"note\" style=\"margin:-4px 0 8px\">Roda contra o snapshot congelado desta sessão (não \"ao vivo\") — mesma coerência da timeline.</div>\n        <div class=\"scroll\"><table id=\"sqlOut\"></table></div>\n      </div>\n    </div>\n  </div>\n\n  <div>\n    <div class=\"card\">\n      <div class=\"toolbar\" style=\"margin-bottom:11px\">\n        <button class=\"ghost\" id=\"optim\" title=\"testa todas alocações contíguas e escolhe a que equilibra a carga entre setores + minimiza a quebra (evita empilhar tudo num setor)\">★ Modelo ÓTIMO (equilíbrio + quebra)</button>\n        <button class=\"ghost\" id=\"autoTobe\" title=\"preenche cada município pelo setor vizinho mais próximo (geografia)\">TOBE por adjacência</button>\n        <span class=\"badge\" id=\"optBadge\"></span>\n      </div>\n      <div class=\"note\" style=\"margin:-4px 0 10px\"><b style=\"color:var(--ink)\">★ ÓTIMO</b> = equilibra a carga entre os setores <b>e</b> minimiza a quebra (contíguo; não empilha tudo num setor). <b style=\"color:var(--ink)\">TOBE</b> = sugestão por vizinhança. Editar esta etapa recalcula automaticamente as etapas seguintes da timeline.</div>\n      <div class=\"note\" id=\"ruleNote\" style=\"margin:-6px 0 11px;padding:7px 9px;background:var(--panel2);border:1px solid var(--line);border-radius:8px\"></div>\n      <div class=\"kpis\" id=\"kpis\"></div>\n      <div id=\"contig\"></div>\n      <div id=\"spanRule\"></div>\n      <h2>Span por setor (CBs) — base + entrantes</h2>\n      <div id=\"spans\"></div>\n      <div style=\"display:flex;justify-content:space-between;align-items:center;margin:14px 0 7px\">\n        <h2 style=\"margin:0\">CBs deslocadas</h2>\n        <div class=\"toggle\" id=\"policy\">\n          <button data-p=\"fora\" class=\"on\">= fora do setor</button>\n          <button data-p=\"quebra\">= quebra de relação</button>\n        </div>\n      </div>\n      <div class=\"note\" id=\"policyNote\"></div>\n    </div>\n\n    <div class=\"card\">\n      <h2>Municípios → setor destino</h2>\n      <div class=\"note\" style=\"margin:-4px 0 9px\">Clique no <b>código do setor</b> pra mandar o município <b>inteiro</b> pra lá (regra de negócio). A cor acompanha o mapa.</div>\n      <div id=\"muniList\"></div>\n    </div>\n\n    <div class=\"card\">\n      <div class=\"toolbar\" style=\"justify-content:space-between\">\n        <h2 style=\"margin:0\">Plano de migração (etapa selecionada)</h2>\n        <div><button class=\"ghost\" id=\"copyPlan\">Copiar</button> <button class=\"ghost\" id=\"csvPlan\">CSV</button></div>\n      </div>\n      <div id=\"plan\" class=\"note\"></div>\n    </div>\n  </div>\n</div>\n\n<div class=\"sheet-bg hidden\" id=\"shareBg\">\n  <div class=\"sheet\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"shareTitle\">\n    <div class=\"sheet-hd\"><h3 id=\"shareTitle\">Compartilhar sessão</h3><div class=\"mac-spacer\"></div><button class=\"sheet-x\" id=\"shareX\" title=\"Fechar\">✕</button></div>\n    <div class=\"sheet-bd\" id=\"shareBody\"></div>\n    <div class=\"sheet-ft\">\n      <span class=\"status\" id=\"shareStatus\"></span>\n      <div class=\"mac-spacer\"></div>\n      <button class=\"ghost hidden\" id=\"shareCopy\">Copiar link</button>\n      <button class=\"ghost hidden\" id=\"shareOpen\">Abrir</button>\n      <button class=\"ghost\" id=\"shareCancel\">Cancelar</button>\n      <button class=\"act\" id=\"shareGo\">Compartilhar</button>\n    </div>\n  </div>\n</div>\n\n<div class=\"sheet-bg hidden\" id=\"optionsBg\">\n  <div class=\"sheet\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"optTitle\">\n    <div class=\"sheet-hd\"><h3 id=\"optTitle\">Opções da sessão</h3><span class=\"badge\" id=\"optSessName\"></span><div class=\"mac-spacer\"></div><button class=\"sheet-x\" id=\"optClose\" title=\"Fechar\">✕</button></div>\n    <div class=\"sheet-bd\">\n      <div class=\"opt-lbl\">Regra rígida — seleção dos setores destino</div>\n      <div class=\"opt-sub\">Define quais setores vizinhos podem entrar na lista de destinos de cada etapa. Vale pra toda a timeline desta sessão.</div>\n      <label class=\"opt-row\" data-r=\"any\">\n        <input type=\"radio\" name=\"destRule\" value=\"any\">\n        <div>\n          <div class=\"opt-t\">Adjacente a qualquer município <span class=\"badge\">padrão</span></div>\n          <div class=\"opt-d\">Um setor entra na lista de destinos se tiver município vizinho a <b>qualquer</b> município do setor fechado — inclusive os menores. É o comportamento de hoje.</div>\n        </div>\n      </label>\n      <label class=\"opt-row\" data-r=\"dominant\">\n        <input type=\"radio\" name=\"destRule\" value=\"dominant\">\n        <div>\n          <div class=\"opt-t\">Adjacente a municípios dominantes</div>\n          <div class=\"opt-d\">Só os municípios do setor fechado com <b>CBs suficientes</b> valem como ponte. Os pequenos continuam sendo redistribuídos normalmente — só não trazem setor novo pra lista de destinos.</div>\n          <div class=\"opt-inline\" id=\"optMinCbsWrap\">Ignorar municípios com menos de <input type=\"number\" id=\"optMinCbs\" min=\"1\" max=\"9999\" step=\"1\" style=\"width:74px\"> CBs</div>\n        </div>\n      </label>\n      <div class=\"opt-hr\"></div>\n      <div class=\"opt-lbl\" style=\"margin-top:15px\">Pré-requisitos do setor destino — tamanho em CBs</div>\n      <div class=\"opt-sub\">Vale pro tamanho de cada setor receptor <b>depois</b> da redistribuição (base + entrantes). Em branco = desligado.</div>\n      <div class=\"opt-grid\">\n        <label class=\"opt-fld\"><span>Span alvo <i>(tamanho ideal)</i></span><input type=\"number\" id=\"optTargetSpan\" min=\"1\" max=\"99999\" step=\"1\" placeholder=\"livre\"></label>\n        <label class=\"opt-fld\"><span>Span máximo <i>(nenhum setor acima)</i></span><input type=\"number\" id=\"optMaxSpan\" min=\"1\" max=\"99999\" step=\"1\" placeholder=\"sem limite\"></label>\n        <label class=\"opt-fld\"><span>Span mínimo <i>(nenhum setor abaixo)</i></span><input type=\"number\" id=\"optMinSpan\" min=\"1\" max=\"99999\" step=\"1\" placeholder=\"sem limite\"></label>\n      </div>\n      <div class=\"opt-err hidden\" id=\"optSpanErr\"></div>\n      <div class=\"opt-note\" id=\"optPreview\"></div>\n    </div>\n    <div class=\"sheet-ft\"><span class=\"status\" id=\"optStatus\"></span><div class=\"mac-spacer\"></div><button class=\"ghost\" id=\"optCancel\">Cancelar</button><button class=\"act\" id=\"optApply\">Aplicar</button></div>\n  </div>\n</div>\n\n<div class=\"tip\" id=\"tip\"></div>\n<div class=\"load hidden\" id=\"loader\">carregando…</div>\n<span id=\"ready\" style=\"display:none\"></span></div>`;\n  },\n  mounted(d2, root){\n\nconst $=s=>root.querySelector(s);\nconst fmt=n=>n==null?'–':Math.round(+n).toLocaleString('pt-BR');\nconst money=n=>{n=+n||0;return n>=1e6?'R$'+(n/1e6).toFixed(1)+'M':n>=1e3?'R$'+(n/1e3).toFixed(0)+'k':'R$'+Math.round(n)};\nconst norm=s=>(s||'').normalize('NFKD').replace(/[̀-ͯ]/g,'').toUpperCase().replace(/[^A-Z0-9]+/g,' ').trim();\nconst esc=s=>(s==null?'':String(s)).replace(/[&<>]/g,c=>({'&':'&amp;','<':'&lt;','>':'&gt;'}[c]));\nconst blankM=()=>({cbs:0,receita:0,rec_nat:0,rec_avon:0,pontos:0,pedidos:0,ativas:0});\n// ---------- município identity ----------\n// Brazil has many municipalities sharing a name (Bom Jesus alone exists in PI, RN, RS, SC, PB, GO).\n// A stage loads the dominant UF PLUS every bordering UF, so those collisions land in the SAME\n// feature set routinely: keyed by name alone the last shape loaded won, the map could draw a\n// município from the wrong state, buildAdj merged two unrelated municipalities into one node, and\n// GROUP BY DS_MUNICIPIO summed two real municipalities into one row. The key is NAME/UF everywhere\n// — SQL rows, GeoJSON features, the dominantes base, assignments, persisted sessions. norm() maps\n// every non-alphanumeric to a space, so '/' can never occur inside a name and the split is exact.\n// A missing UF degrades to a bare NAME key rather than inventing one.\nconst mkey=(name,uf)=>{const n=norm(name),u=String(uf==null?'':uf).trim().toUpperCase();return u?n+'/'+u:n;};\nconst mName=k=>{const s=String(k==null?'':k),i=s.lastIndexOf('/');return i<0?s:s.slice(0,i);};\nconst mUf=k=>{const s=String(k==null?'':k),i=s.lastIndexOf('/');return i<0?'':s.slice(i+1);};\nconst mDisp=k=>{const u=mUf(k);return u?mName(k)+' ('+u+')':mName(k);};\n// The base CSV is the ONLY source of a município's UF now, so its column is accepted in whatever\n// shape the base is maintained in: sigla, IBGE numeric code, or full state name. Anything that does\n// not resolve to a real sigla is treated as UNKNOWN rather than passed through — a bogus UF would key\n// a município to a shape that does not exist and drop it off the map without a word.\nconst UF_OF_CODE={}; Object.keys(UF_CODE).forEach(k=>{ UF_OF_CODE[UF_CODE[k]]=k; });\nconst UF_OF_NAME={ACRE:'AC',ALAGOAS:'AL',AMAPA:'AP',AMAZONAS:'AM',BAHIA:'BA',CEARA:'CE','DISTRITO FEDERAL':'DF','ESPIRITO SANTO':'ES',GOIAS:'GO',MARANHAO:'MA','MATO GROSSO':'MT','MATO GROSSO DO SUL':'MS','MINAS GERAIS':'MG',PARA:'PA',PARAIBA:'PB',PARANA:'PR',PERNAMBUCO:'PE',PIAUI:'PI','RIO DE JANEIRO':'RJ','RIO GRANDE DO NORTE':'RN','RIO GRANDE DO SUL':'RS',RONDONIA:'RO',RORAIMA:'RR','SANTA CATARINA':'SC','SAO PAULO':'SP',SERGIPE:'SE',TOCANTINS:'TO'};\nconst ufNorm=v=>{const s=norm(v); if(!s) return '';\n  if(UF_CODE[s]) return s;\n  if(UF_OF_CODE[s]) return UF_OF_CODE[s];\n  return UF_OF_NAME[s]||'';};\nconst loader=(on,t)=>{const l=$('#loader');l.classList.toggle('hidden',!on);if(t)l.textContent=t;};\nconst setError=(msg)=>{ const t=$('#ds'); if(t){t.textContent=msg;t.classList.add('err');} const c=$('#confirmStatus'); if(c){c.textContent=msg;c.classList.add('err');} };\n\n// ---------- base de municípios dominantes (CSV) ----------\n// WHICH municipalities belong to a sector is a business fact, not something to infer from CB volume:\n// it comes from a maintained CSV (one row per setor x município) linked through the `dominantesCsvUrl`\n// param. Anything the closing sector has CBs in but that the base does NOT assign to it is spillover:\n// not realocated, not drawn on the map, and its CBs follow their leader. Loaded once per URL and\n// cached for the whole session; a failure is thrown, never swallowed — a silent fallback here would\n// quietly change every number on the screen.\nconst DOM={url:null,promise:null,bySetor:null,ufBySetorMuni:null,rows:0,setores:0,hasUf:false,ufCol:null,badUf:0,clashes:0,headers:null,error:null};\nfunction parseCsv(text){\n  const out=[]; let row=[],cur='',q=false;\n  const push=()=>{ row.push(cur); cur=''; };\n  const endRow=()=>{ push(); if(row.length>1||row[0]!=='') out.push(row); row=[]; };\n  for(let i=0;i<text.length;i++){ const ch=text[i];\n    if(q){ if(ch==='\"'){ if(text[i+1]==='\"'){ cur+='\"'; i++; } else q=false; } else cur+=ch; }\n    else if(ch==='\"') q=true;\n    else if(ch===',') push();\n    else if(ch==='\\n') endRow();\n    else if(ch!=='\\r') cur+=ch;\n  }\n  if(cur!==''||row.length) endRow();\n  return out;\n}\n// `dominantesCsvUrl` is declared as a FileComponentUrlReference, so the instance points at the Drive\n// FILE, not at a URL literal — the Drive is policy-gated behind the app's auth strategy and a baked\n// string would be both stale and unauthorised. What the resolver hands back varies by where it is\n// resolved (URL string / file record / bare reference), so accept every shape instead of silently\n// reading undefined and falling through to the fallback.\n// The Drive is gated by the app's AuthenticationStrategy, so this read has to travel as the LOGGED-IN\n// USER — an anonymous CDN GET is exactly what the policy is there to refuse. `<system>.data2.media` is\n// only a cache in front of the SSP: on a cache miss it 302s to `<system>.data2apis.com`, which is where\n// the policy is actually evaluated.\n// COOKIES CANNOT CARRY THAT SESSION, which is why the previous `credentials:'include'` attempt could\n// never have worked: the app runs on <app>.<system>.data2.app and the SSP on <system>.data2apis.com —\n// cross-site — and the SSP answers `Access-Control-Allow-Origin: *` with no `Allow-Credentials`, so the\n// browser rejects a credentialed CORS read before it ever leaves the page. What the SSP actually reads\n// is `Authorization: Bearer <token>`: the runtime keeps that token in localStorage under\n// `__data2-session-<systemDomain>` (`__data2-session-data2` inside the builder preview) and replays it\n// on every dataset and rush call — same token, same header, same session, so the Drive policy sees the\n// logged-in user. Preflight passes because the SSP echoes whatever header the request asks for.\nfunction d2SessionToken(sysDomain){\n  const read=k=>{ try{ return (k&&window.localStorage.getItem(k))||''; }catch(e){ return ''; } };\n  return read(sysDomain?('__data2-session-'+sysDomain):'')||read('__data2-session-data2')||'';\n}\nfunction domCsvSystemDomain(url){\n  const m=/^https?:\\/\\/([^.\\/]+)\\.data2\\.(?:media|app)\\//i.exec(url)||/^https?:\\/\\/([^.\\/]+)\\.data2apis\\.com\\//i.exec(url);\n  return m?m[1]:'';\n}\nfunction domCsvCandidates(url){\n  const out=[];\n  const isMedia=/^https?:\\/\\/[^.\\/]+\\.data2\\.media\\//i.test(url);\n  const api=isMedia?url.replace(/^(https?:\\/\\/[^.\\/]+)\\.data2\\.media\\//i,'$1.data2apis.com/'):null;\n  const tok=d2SessionToken(domCsvSystemDomain(url));\n  const auth=tok?{authorization:'Bearer '+tok}:null;\n  // Authenticated origin read first — the only candidate a GATED Drive can actually answer.\n  if(api&&auth) out.push({url:api,headers:auth,label:'api+sessão'});\n  if(!api&&auth) out.push({url:url,headers:auth,label:'origem+sessão'});\n  // Anonymous last: only ever succeeds on an UNGATED Drive — or on a stale CDN cache hit, which is NOT\n  // proof the file is public (the origin keeps answering 401 once the edge entry expires).\n  if(api) out.push({url:api,headers:null,label:'api anônimo'});\n  out.push({url:url,headers:null,label:'origem anônima'});\n  return out;\n}\nfunction domCsvUrl(){\n  const pick=v=>{\n    if(!v) return '';\n    if(typeof v==='string') return v;\n    const q=v.params||{};\n    const ref=q.reference||v.reference;\n    return q.fileUrl||q.url||v.fileUrl||v.url||(ref?DOM_MEDIA_BASE+ref:'');\n  };\n  return String(pick(d2.param('dominantesCsvUrl'))||DOM_CSV_FALLBACK||'').trim();\n}\nasync function ensureDominantes(){\n  const url=domCsvUrl();\n  if(!url) throw new Error('base de municípios dominantes não configurada — ligue o arquivo CSV no parâmetro dominantesCsvUrl da instância do componente');\n  if(DOM.url===url && DOM.bySetor) return DOM.bySetor;\n  if(DOM.url===url && DOM.promise) return DOM.promise;\n  DOM.url=url; DOM.error=null;\n  DOM.promise=(async()=>{\n    // Self-diagnosing on purpose: every candidate reports its own outcome and the message names the\n    // session it was carrying. \"Unauthorized\" alone cannot distinguish \"not logged into THIS strategy\"\n    // from \"cookie not sent cross-site\" from \"param never bound, so it tried the fallback URL\" — and\n    // guessing between those from the outside costs a round trip each time.\n    let r=null; const tried=[];\n    for(const c of domCsvCandidates(url)){\n      let res=null;\n      try{ res=await fetch(c.url,{cache:'no-store',credentials:'omit',headers:c.headers||undefined}); }\n      catch(e){ tried.push(c.label+' → rede/CORS'); continue; }\n      if(res.ok){ r=res; break; }\n      tried.push(c.label+' → '+res.status);\n    }\n    if(!r){\n      let sess='sessão desconhecida';\n      try{\n        const a=d2.auth(AUTH_REF);\n        sess=(a&&a.isAuthed)?('logado como '+((a.user&&(a.user.email||a.user.nome))||'?')):('NÃO logado na estratégia '+AUTH_REF);\n      }catch(e){ sess='estratégia '+AUTH_REF+' não resolvida'; }\n      const tk=d2SessionToken(domCsvSystemDomain(url));\n      throw new Error('base de municípios dominantes: não foi possível ler o arquivo — '+sess+' · token de sessão '+(tk?'presente':'AUSENTE no localStorage')+'. Tentativas: '+tried.join(' · '));\n    }\n    const table=parseCsv(await r.text());\n    if(table.length<2) throw new Error('base de municípios dominantes vazia');\n    const head=table[0].map(h=>norm(h));\n    const iS=head.indexOf('CD SETOR'), iM=head.indexOf('MUNICIPIO');\n    if(iS<0||iM<0) throw new Error('base de municípios dominantes sem as colunas CD_SETOR / MUNICIPIO');\n    // CD_GV is the gerência de vendas the setor answers to, and it is the authority for the hard rule\n    // that a closing sector only ever hands territory to sectors of its OWN gerência. Its absence is\n    // fatal rather than a warning: with no GV there is no way to PROVE two sectors share one, and\n    // falling through unchecked is exactly the leak this column exists to close.\n    const iG=['CD GV','CDGV','GV','CD GERENCIA','CD GERENCIA VENDAS','CD GERENCIA DE VENDAS','GERENCIA DE VENDAS','GERENCIA'].map(h=>head.indexOf(h)).find(i=>i>=0);\n    if(iG==null) throw new Error('base de municípios dominantes sem a coluna CD_GV — a regra de gerência de vendas não pode ser aplicada. Colunas lidas: '+head.slice(0,40).join(', '));\n    // The UF column is what the whole keying now rests on — SQL no longer carries DS_ESTADO — so its\n    // absence is a first-class finding, not a footnote. The header actually matched is reported on the\n    // base pill, and when nothing matches the pill lists every column read, because guessing a header\n    // name from the outside costs a round trip each time.\n    const iU=['UF','SIGLA UF','SG UF','CD UF','ESTADO','DS ESTADO','SIGLA','ESTADO SIGLA','UF MUNICIPIO'].map(h=>head.indexOf(h)).find(i=>i>=0);\n    const by={},ufBy={},gvBy={}; let n=0,bad=0; const clash={},gvClash={};\n    for(let i=1;i<table.length;i++){\n      const line=table[i]; if(!line) continue;\n      const s=String(line[iS]==null?'':line[iS]).trim(), m=norm(line[iM]);\n      if(!s||!m) continue;\n      // One setor spans many rows (one per município) and every one of them repeats its CD_GV. Two\n      // DIFFERENT values for the same setor means the base itself disagrees about which gerência owns\n      // it — counted and reported, never keyed to whichever row happened to be read last.\n      const gvv=String(line[iG]==null?'':line[iG]).trim();\n      if(gvv){ if(gvBy[s]!==undefined && gvBy[s]!==gvv) gvClash[s]=true; else gvBy[s]=gvv; }\n      const raw=(iU==null)?'':line[iU];\n      const u=(iU==null)?'':ufNorm(raw);\n      if(iU!=null && String(raw==null?'':raw).trim() && !u) bad++;\n      // The same name twice in ONE setor under two UFs is the single case the reverted SQL cannot\n      // survive: mSQL groups by DS_MUNICIPIO alone, so both municipalities arrive summed into one row\n      // and no lookup can split them again. Counted and reported — never quietly keyed to whichever\n      // UF happened to be read last.\n      const kk=s+'|'+m;\n      // An UNRESOLVED uf must never outrank a resolved one. Reading a blank/bogus UF row first wrote ''\n      // here, and the next row carrying the real sigla was then rejected as a clash — so the key stayed\n      // falsy for good, ufFor() fell through, and the município degraded to a bare NAME key that matches\n      // no shape and no dominance entry. With DISTRITO/ZONA in the base a município spans several rows,\n      // so which row lands first is pure luck. A clash is only two RESOLVED siglas that disagree.\n      if(!u){ if(ufBy[kk]===undefined) ufBy[kk]=''; }\n      else if(!ufBy[kk]) ufBy[kk]=u;\n      else if(ufBy[kk]!==u) clash[kk]=true;\n      (by[s]=by[s]||new Set()).add(u?m+'/'+u:m); n++;\n    }\n    if(!n) throw new Error('base de municípios dominantes sem linhas válidas');\n    DOM.bySetor=by; DOM.ufBySetorMuni=ufBy; DOM.rows=n; DOM.setores=Object.keys(by).length;\n    DOM.gvBySetor=gvBy; DOM.gvClashes=Object.keys(gvClash).length; DOM.gvCol=String(table[0][iG]||'').trim();\n    DOM.gvSetores=Object.keys(gvBy).length;\n    DOM.hasUf=(iU!=null); DOM.ufCol=(iU==null?null:String(table[0][iU]||'').trim());\n    DOM.badUf=bad; DOM.clashes=Object.keys(clash).length; DOM.headers=head.slice(0,40); DOM.error=null;\n    return by;\n  })();\n  DOM.promise.catch(e=>{ DOM.promise=null; DOM.bySetor=null; DOM.error=e.message; renderAll(); });\n  return DOM.promise;\n}\n\nlet SESS={ snapshotRaw:null, snapshotSyncedAt:null, snapLiteral:null, eloMaxCycle:null, timeline:[], selected:0,\n           sessionId:null, sessionLabel:null, sessionsList:[], sectorsList:[], sectorBaseCache:{}, stage:'loading', dirtyFrom:null,\n           snapBusy:false, settings:{...DEFAULT_SETTINGS} };\n\nasync function q(sql){\n  let dbx,res;\n  try{\n    res=await d2.rush('AwW_11Nkg-dKksP7ic8V8').invoke({sql});\n  }catch(e){\n    throw new Error('Databricks indisponível (rush AwW_11Nkg-dKksP7ic8V8): '+e.message);\n  }\n  // The listener answers 200 with {sql} and NO `result` when its upstream probe times out: the\n  // handler builds `result: $result.data`, so an empty upstream simply drops the key rather than\n  // failing. Reading straight through to res.data.result.data reported \"Cannot read properties of\n  // undefined (reading 'data')\" — which reads like a bug in THIS component and sent a debugging\n  // session after the wrong thing. Name the layer that actually failed instead.\n  const payload=res&&res.data;\n  if(!payload) throw new Error('rush AwW_11Nkg-dKksP7ic8V8 não devolveu corpo — listener fora do ar?');\n  if(!payload.result) throw new Error('a sonda Databricks não respondeu: o listener AwW_11Nkg-dKksP7ic8V8 devolveu 200 sem `result`, o que normalmente é timeout do upstream (natura-x-app). O SQL não chegou a rodar.');\n  dbx=payload.result.data;\n  if(!dbx) throw new Error('sonda Databricks respondeu sem dados (result.data vazio).');\n  if(dbx.state && dbx.state!=='SUCCEEDED') throw new Error('Databricks '+dbx.state+': '+(dbx.error?.message||JSON.stringify(dbx.error)||'erro desconhecido'));\n  return dbx;\n}\nfunction rows(resp){const c=(resp.columns||[]).map(x=>x.name);\n  return (resp.rows||[]).map(a=>Object.fromEntries(c.map((k,i)=>[k,a[i]])));}\n// Stamps the UF onto every feature at load: the fetch is per-UF, so this is the ONLY point where a\n// shape's state is known for certain. Downstream the features are flattened into one array and the\n// origin would be unrecoverable. Persisted with the feature in saved sessions.\nasync function geoUF(uf){const code=UF_CODE[uf]||uf;const r=await fetch('https://raw.githubusercontent.com/tbrugz/geodata-br/master/geojson/geojs-'+code+'-mun.json');if(!r.ok)throw new Error('geo '+uf);\n  const g=await r.json(); const U=String(uf).toUpperCase();\n  (g.features||[]).forEach(f=>{ f.__uf=U; });\n  return g;}\n\nfunction buildAdj(features){\n  const pts=f=>{const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates],s=new Set();\n    ps.forEach(poly=>poly.forEach(ring=>ring.forEach(p=>s.add(Math.round(p[0]*1000)/1000+','+Math.round(p[1]*1000)/1000))));return s;};\n  const feat={},idx={};\n  features.forEach(f=>{const nm=mkey(f.properties.name||f.properties.NOME||f.properties.nome,f.__uf);feat[nm]={f,pts:pts(f)};});\n  for(const nm in feat) feat[nm].pts.forEach(p=>(idx[p]=idx[p]||[]).push(nm));\n  const nbrs=nm=>{const c={};feat[nm].pts.forEach(p=>idx[p].forEach(o=>{if(o!==nm)c[o]=(c[o]||0)+1;}));\n    return Object.entries(c).filter(([,n])=>n>=2).map(([o,n])=>({o,w:n}));};\n  return {feat,nbrs};\n}\nfunction centroidLL(f){let x=0,y=0,n=0;const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];\n  ps.forEach(poly=>poly[0].forEach(p=>{x+=p[0];y+=p[1];n++;}));return[x/n,y/n];}\n\n// ---------- snapshot pinning ----------\nasync function resolveSnapshotPin(){\n  const [rawR,liveCountR,eloR]=await Promise.all([\n    q(`SELECT MAX(DT_HISTORICO) snap FROM ${T} WHERE CD_PAIS=1`).then(rows),\n    q(`SELECT COUNT(*) n FROM ${T} WHERE CD_PAIS=1 AND DT_HISTORICO=(SELECT MAX(DT_HISTORICO) FROM ${T} WHERE CD_PAIS=1)`).then(rows),\n    q(`SELECT MAX(operational_cycle) mx FROM ${ELO} WHERE country_code=1`).then(rows).catch(()=>[]),\n  ]);\n  const raw=rawR[0]&&rawR[0].snap;\n  const liveCount=+((liveCountR[0]||{}).n||0);\n  const eloMax=+((eloR[0]||{}).mx||0);\n  const LIVE_SUBQ=`(SELECT MAX(DT_HISTORICO) FROM ${T} WHERE CD_PAIS=1)`;\n  const dbTs=(raw||'').replace('T',' ').replace(/Z$/,'');\n  const candidates=[`TIMESTAMP'${dbTs}'`,`'${dbTs}'`,`DATE'${dbTs}'`];\n  const tests=await Promise.all(candidates.map(c=>\n    q(`SELECT COUNT(*) n FROM ${T} WHERE CD_PAIS=1 AND DT_HISTORICO=${c}`).then(rows).then(r=>+((r[0]||{}).n||0)).catch(()=>-1)\n  ));\n  let chosen=LIVE_SUBQ;\n  for(let i=0;i<candidates.length;i++){ if(liveCount>0 && tests[i]===liveCount){ chosen=candidates[i]; break; } }\n  return {snapshotRaw:raw, snapLiteral:chosen, eloMaxCycle:eloMax, syncedAt:new Date().toISOString()};\n}\n// DISPLAY CONTRACT: the UI never prints the snapshot's own DT_HISTORICO (snapshotRaw). What the user\n// sees is `snapshotSyncedAt` — the date AND hour at which THIS instance last pulled/pinned the\n// snapshot it is querying. snapshotRaw is still resolved, still drives every SQL literal, and is\n// still persisted by saveSession/doShare; it is only kept off the screen.\nfunction fmtSyncedAt(iso){\n  if(!iso) return '—';\n  const d=new Date(iso);\n  if(isNaN(d.getTime())) return String(iso);\n  return d.toLocaleString('pt-BR',{day:'2-digit',month:'2-digit',year:'numeric',hour:'2-digit',minute:'2-digit'});\n}\nasync function ensurePinned(){\n  if(SESS.snapLiteral) return;\n  const p=await resolveSnapshotPin();\n  SESS.snapshotRaw=p.snapshotRaw; SESS.snapLiteral=p.snapLiteral; SESS.eloMaxCycle=p.eloMaxCycle;\n  SESS.snapshotSyncedAt=p.syncedAt;\n}\n\n// ---------- world-state fold ----------\nfunction accMetrics(base,add){\n  const out=base?{...base}:blankM();\n  Object.keys(blankM()).forEach(k=>{ out[k]=(out[k]||0)+((add&&add[k])||0); });\n  return out;\n}\nfunction foldWorldState(timeline,uptoIdx){\n  const closedSectors=new Set(),muniOverride={},muniGeo={},muniRow={},muniLevel={},sectorInflow={},sectorInflowLevel={},sectorOrphanRows={};\n  for(let k=0;k<uptoIdx;k++){\n    const mv=timeline[k]; if(!mv||!mv.sector||!mv.munis) continue;\n    closedSectors.add(String(mv.sector));\n    Object.keys(mv.munis).forEach(m=>{\n      if(m==='__OUTROS__') return;\n      const dest=mv.assign[m]; if(!dest) return;\n      muniOverride[m]=String(dest);\n      if(mv.geoFeat&&mv.geoFeat[m]) muniGeo[m]=mv.geoFeat[m];\n      const rws=(mv.matrix||[]).filter(r=>mkey(r.municipio,r.uf)===m);\n      muniRow[m]=(muniRow[m]||[]).concat(rws);\n      if(mv.levelByMuni&&mv.levelByMuni[m]) muniLevel[m]={...(muniLevel[m]||{}),...mv.levelByMuni[m]};\n      sectorInflow[dest]=accMetrics(sectorInflow[dest],mv.munis[m]);\n      const lv=(mv.levelByMuni&&mv.levelByMuni[m])||{};\n      sectorInflowLevel[dest]=sectorInflowLevel[dest]||{};\n      Object.entries(lv).forEach(([nv,c])=>{ sectorInflowLevel[dest][nv]=(sectorInflowLevel[dest][nv]||0)+c; });\n    });\n    // Orphan CBs follow their leader's home sector, so later etapas must inherit them the same way\n    // the allocated municipalities are inherited — otherwise a stage's span would not match the\n    // base carried into the next one.\n    if(mv.orphanMetricsByGroup && Object.keys(mv.orphanMetricsByGroup).length){\n      const d=computeDerived(mv);\n      d.leaders.forEach(L=>{\n        if(!L.home) return;\n        const om=mv.orphanMetricsByGroup[L.grupo];\n        if(om) sectorInflow[L.home]=accMetrics(sectorInflow[L.home],om);\n        // sectorInflow only reaches a sector while it is a DESTINATION (it lands in baseMetrics).\n        // Keep the rows as well, so the sector still carries these CBs on the day it is the one\n        // being closed — that read goes through mv.matrix, which baseMetrics never touches.\n        const orws=mv.orphanRowsByGroup&&mv.orphanRowsByGroup[L.grupo];\n        if(orws&&orws.length) sectorOrphanRows[L.home]=(sectorOrphanRows[L.home]||[]).concat(orws);\n        const ol=mv.orphanLevelByGroup&&mv.orphanLevelByGroup[L.grupo];\n        if(ol){ sectorInflowLevel[L.home]=sectorInflowLevel[L.home]||{};\n          Object.entries(ol).forEach(([nv,c])=>{ sectorInflowLevel[L.home][nv]=(sectorInflowLevel[L.home][nv]||0)+c; }); }\n      });\n    }\n  }\n  return {closedSectors,muniOverride,muniGeo,muniRow,muniLevel,sectorInflow,sectorInflowLevel,sectorOrphanRows};\n}\n\n// ---------- per-movement compute ----------\nfunction aggregateMovement(mv){\n  const munis={},leaders={};\n  const exSet=new Set((mv.excludedMunis||[]).map(x=>x.muni));\n  const acc=(o,r)=>{o.cbs+=+r.cbs;o.receita+=+r.receita||0;o.rec_nat+=+r.rec_nat||0;o.rec_avon+=+r.rec_avon||0;o.pontos+=+r.pontos||0;o.pedidos+=+r.pedidos||0;o.ativas+=+r.ativas||0;};\n  // Orphans = CBs in municipalities outside the sector's dominance base. They are NOT allocated\n  // geographically; they follow their own leader's home sector. Kept per leader group so every\n  // consumer (span, cascade, impact report) can route them the same way.\n  mv.orphanByGroup={}; mv.orphanMetricsByGroup={}; mv.orphanRowsByGroup={};\n  mv.matrix.forEach(r=>{\n    const m=mkey(r.municipio,r.uf);\n    r._out=!mv.geoFeat[m];   // assign, never just set: absorbed rows are reused across etapas\n    const mm=r._out?'__OUTROS__':m;\n    munis[mm]=munis[mm]||{...blankM(),name:mm}; acc(munis[mm],r);\n    const g=String(r.grupo); leaders[g]=leaders[g]||{grupo:g,lider:r.lider,total:0,byMuni:{}};\n    leaders[g].total+=+r.cbs; leaders[g].byMuni[mm]=(leaders[g].byMuni[mm]||0)+ +r.cbs;\n    if(r._out && exSet.has(m)){\n      mv.orphanByGroup[g]=(mv.orphanByGroup[g]||0)+ +r.cbs;\n      // The ROW too, not just the totals: when the leader's home sector is itself closed in a later\n      // etapa, that etapa rebuilds its matrix from SQL + absorbed municípios, and these CBs are in\n      // neither (their município never moved). Without the row they silently vanish from the sector\n      // they were just credited to — see sectorOrphanRows in foldWorldState.\n      (mv.orphanRowsByGroup[g]=mv.orphanRowsByGroup[g]||[]).push(r);\n      mv.orphanMetricsByGroup[g]=accMetrics(mv.orphanMetricsByGroup[g],\n        {cbs:+r.cbs,receita:+r.receita||0,rec_nat:+r.rec_nat||0,rec_avon:+r.rec_avon||0,pontos:+r.pontos||0,pedidos:+r.pedidos||0,ativas:+r.ativas||0});\n    }\n  });\n  // Level counts only exist per municipality, never per leader, so an excluded municipality's level\n  // mix is credited to the group holding most of its CBs (sub-threshold by definition, so usually one).\n  mv.orphanLevelByGroup={};\n  (mv.excludedMunis||[]).forEach(({muni})=>{\n    const lv=(mv.levelByMuni&&mv.levelByMuni[muni])||{}; if(!Object.keys(lv).length) return;\n    let bg=null,bc=-1;\n    mv.matrix.forEach(r=>{ if(mkey(r.municipio,r.uf)!==muni) return; const cc=+r.cbs; if(cc>bc){bc=cc;bg=String(r.grupo);} });\n    if(!bg) return;\n    mv.orphanLevelByGroup[bg]=mv.orphanLevelByGroup[bg]||{};\n    Object.entries(lv).forEach(([nv,cc])=>{ mv.orphanLevelByGroup[bg][nv]=(mv.orphanLevelByGroup[bg][nv]||0)+cc; });\n  });\n  mv.munis=munis; mv.leaders=Object.values(leaders).sort((a,b)=>b.total-a.total);\n}\nfunction autoAssignFor(mv){\n  const a={};\n  Object.keys(mv.munis).forEach(m=>{ if(m==='__OUTROS__')return;\n    const v=mv.allowed[m]||{}; const votes=Object.keys(v);\n    if(votes.length){ let best=votes[0],bw=-1; for(const s of votes) if(v[s]>bw){bw=v[s];best=s;} a[m]=best; }\n    else if(mv.dest.length){ const c=mv.muniCentroid[m]; let best=mv.dest[0],bd=Infinity;\n      for(const s of mv.dest){ const sc=mv.secCentroid[s]; if(!sc||!c)continue; const d=(c[0]-sc[0])**2+(c[1]-sc[1])**2; if(d<bd){bd=d;best=s;} }\n      a[m]=best; }\n  });\n  return a;\n}\nfunction deslocFor(mv,assign){\n  let d=0;\n  mv.leaders.forEach(L=>{const byS={};let tot=0;\n    for(const [m,c] of Object.entries(L.byMuni)){if(m==='__OUTROS__')continue;const s=assign[m];if(s){byS[s]=(byS[s]||0)+c;tot+=c;}}\n    const home=mv.dest.reduce((a,s)=>(byS[s]||0)>(byS[a]||0)?s:a,mv.dest[0]);\n    d+=tot-(byS[home]||0);});\n  return d;\n}\nfunction spanMapFor(mv,a){const inc={};mv.dest.forEach(s=>inc[s]=0);\n  Object.entries(mv.munis).forEach(([m,o])=>{if(m==='__OUTROS__')return;const s=a[m];if(s&&inc[s]!=null)inc[s]+=o.cbs;});\n  // Orphan CBs follow their leader's home sector, and that home depends on THIS candidate\n  // assignment — so they have to be counted here, or the optimizer would score and constrain a\n  // span that differs from the one the UI shows. Skipped entirely when there are no orphans.\n  if(mv.orphanByGroup&&Object.keys(mv.orphanByGroup).length){\n    mv.leaders.forEach(L=>{\n      const orphan=mv.orphanByGroup[L.grupo]||0; if(!orphan) return;\n      const byS={}; let tot=0;\n      for(const [m,c] of Object.entries(L.byMuni)){ if(m==='__OUTROS__') continue; const s=a[m]; if(s&&inc[s]!=null){ byS[s]=(byS[s]||0)+c; tot+=c; } }\n      if(!tot) return;   // no home to follow -> stranded, counted nowhere\n      const home=mv.dest.reduce((x,s)=>(byS[s]||0)>(byS[x]||0)?s:x,mv.dest[0]);\n      if(inc[home]!=null) inc[home]+=orphan;\n    });\n  }\n  const sp={};mv.dest.forEach(s=>sp[s]=(+(mv.baseMetrics[s]?.cbs||0))+inc[s]);return sp;}\nfunction maxSpanOfFor(mv,a){return Math.max(...Object.values(spanMapFor(mv,a)),0);}\nfunction spanLimits(){const st={...DEFAULT_SETTINGS,...(SESS.settings||{})};\n  return {target:numOrNull(st.targetSpan),max:numOrNull(st.maxSpan),min:numOrNull(st.minSpan)};}\nfunction spanLimitsOn(lim){return !!(lim.target||lim.max||lim.min);}\nfunction spanViolationsOf(sp,lim){const over=[],under=[];\n  Object.entries(sp).forEach(([s,v])=>{ if(lim.max&&v>lim.max)over.push(s); if(lim.min&&v<lim.min)under.push(s); });\n  return {over,under};}\nfunction spanViolationsFor(mv,a){return spanViolationsOf(spanMapFor(mv,a),spanLimits());}\n// With a target span the objective becomes RMS distance from the ideal size (punishes too big AND\n// too small). With no target we keep the legacy objective: shave the biggest sector.\nfunction spanCostFor(mv,a){const lim=spanLimits(),vals=Object.values(spanMapFor(mv,a));\n  if(!vals.length) return 0;\n  if(lim.target) return Math.sqrt(vals.reduce((s,v)=>s+(v-lim.target)**2,0)/vals.length);\n  return Math.max(...vals);}\n// ---------- ÓTIMO: objetivo multi-critério ----------\n// Three normalised objectives, each 0..1, so the weights below are directly comparable. The old\n// score added a span cost measured in CBs to a desloc measured in CBs, so on a large sector the\n// balance term was numerically ~100x the desloc term and silently decided everything on its own.\n//   balance — RMS spread of the resulting spans (against the target span when one is set,\n//             otherwise against their own mean), over that reference. 0 = every destination\n//             sector ends up the same size.\n//   dist    — how far each município travels, CB-weighted: half from the share of its outer\n//             border that faces the sector it was given to, half from centroid distance. 0 =\n//             every município went to a sector it physically touches. Adjacency used to be a\n//             pure yes/no constraint (contiguity); this is what makes it a preference too.\n//   orphan  — stranded orphan CBs (leader left without a home sector, so they land nowhere at\n//             all) plus CBs split away from their leader's home, over the CBs at stake.\n//             Stranded ones count OPT_STRAND_K times: a stranded CB leaves the model entirely,\n//             a deslocated one merely changes hands.\nconst OPT_W={balance:1, dist:0.85, orphan:1};\nconst OPT_STRAND_K=3;\nconst OPT_SIMS=24;             // simultaneous simulations per run, scaled down on big stages\nconst OPT_PASSES=14;           // local-search sweeps inside one simulation\nconst OPT_EVAL_BUDGET=120000;  // total candidate evaluations across the whole portfolio\nconst OPT_EXHAUSTIVE_MAX=60000;\nfunction optDistPrep(mv){\n  let mx=0;\n  Object.keys(mv.munis).forEach(m=>{ if(m==='__OUTROS__') return; const c=mv.muniCentroid[m]; if(!c) return;\n    mv.dest.forEach(s=>{ const sc=mv.secCentroid[s]; if(!sc) return;\n      const d=Math.hypot(c[0]-sc[0],c[1]-sc[1]); if(d>mx) mx=d; }); });\n  return mx||1;\n}\nfunction optDistCost(mv,m,s,dmax){\n  const v=mv.allowed[m]||{}; let tot=0; for(const k in v) tot+=v[k];\n  const share=tot?((v[s]||0)/tot):0;\n  const c=mv.muniCentroid[m], sc=mv.secCentroid[s];\n  // Missing centroid on either side is neutral (0.5), never 0 — an unmeasurable move must not\n  // score as the cheapest one on the board.\n  const geo=(c&&sc)?Math.min(1,Math.hypot(c[0]-sc[0],c[1]-sc[1])/dmax):0.5;\n  return 0.5*(1-share)+0.5*geo;\n}\nfunction optEval(mv,a,dmax){\n  const lim=spanLimits();\n  const sp=spanMapFor(mv,a), vals=Object.values(sp);\n  let balance=0;\n  if(vals.length){\n    const ref=lim.target||(vals.reduce((x,y)=>x+y,0)/vals.length);\n    if(ref) balance=Math.min(1,Math.sqrt(vals.reduce((s,v)=>s+(v-ref)**2,0)/vals.length)/ref);\n  }\n  let cbs=0,dist=0;\n  for(const m in a){ const o=mv.munis[m]; if(!o) continue; const w=+o.cbs||0; cbs+=w; dist+=w*optDistCost(mv,m,a[m],dmax); }\n  dist=cbs?(dist/cbs):0;\n  let stranded=0,desloc=0,tot=0;\n  mv.leaders.forEach(L=>{\n    const byS={}; let t=0;\n    for(const [m,c] of Object.entries(L.byMuni)){ if(m==='__OUTROS__') continue; const s=a[m]; if(s){ byS[s]=(byS[s]||0)+c; t+=c; } }\n    const orphan=(mv.orphanByGroup&&mv.orphanByGroup[L.grupo])||0;\n    tot+=t+orphan;\n    if(!t){ stranded+=orphan; return; }   // no allocated CBs -> no home -> these orphans land nowhere\n    const home=mv.dest.reduce((x,s)=>(byS[s]||0)>(byS[x]||0)?s:x,mv.dest[0]);\n    desloc+=t-(byS[home]||0);\n  });\n  const orphanTerm=tot?Math.min(1,(desloc+OPT_STRAND_K*stranded)/tot):0;\n  return { cost:OPT_W.balance*balance+OPT_W.dist*dist+OPT_W.orphan*orphanTerm,\n           balance, dist, desloc, stranded, sp, viol:spanViolationsOf(sp,lim) };\n}\nfunction optScoreFor(mv,a){ return optEval(mv,a,mv.__optDmax||optDistPrep(mv)).cost; }\n// Seeded PRNG on purpose. computeMovement runs the optimizer for EVERY stage and recomputeFrom\n// re-runs every stage downstream of an edit, so a Math.random() portfolio would hand back a\n// different allocation on each pass and a saved timeline would never reproduce.\nfunction optRng(seed){ let a=seed>>>0;\n  return ()=>{ a=(a+0x6D2B79F5)>>>0; let t=Math.imul(a^(a>>>15),1|a);\n    t=(t+Math.imul(t^(t>>>7),61|t))^t; return ((t^(t>>>14))>>>0)/4294967296; }; }\nfunction optSeed(mv,ms){ let h=2166136261>>>0;\n  const s=String(mv.sector)+'|'+ms.join(',')+'|'+mv.dest.join(',');\n  for(let i=0;i<s.length;i++) h=Math.imul(h^s.charCodeAt(i),16777619);\n  return h>>>0; }\nfunction contigBadFor(mv,assign){\n  const bySec={}; for(const m in assign){(bySec[assign[m]]=bySec[assign[m]]||[]).push(m);}\n  const bad=[];\n  for(const s in bySec){const grp=bySec[s],inGrp=new Set(grp);\n    const seeds=grp.filter(m=>(mv.allowed[m]||{})[s]);\n    if(!seeds.length){bad.push(s);continue;}\n    const seen=new Set(seeds),st=[...seeds];\n    while(st.length){const m=st.pop();(mv.closeAdj[m]||[]).forEach(o=>{if(inGrp.has(o)&&!seen.has(o)){seen.add(o);st.push(o);}});}\n    if(seen.size!==grp.length)bad.push(s);}\n  return bad;\n}\nfunction greedyFor(mv,ms,opts){const lim=spanLimits();const a={};\n  ms.forEach((m,i)=>{let best=opts[i][0],bd=Infinity;\n    for(const s of opts[i]){a[m]=s;\n      // over-max only grows as we keep assigning, so it is safe to penalise mid-build;\n      // under-min shrinks, so penalising it here would just chase noise.\n      const over=lim.max?spanViolationsOf(spanMapFor(mv,a),{max:lim.max,min:null}).over.length:0;\n      const d=optScoreFor(mv,a)+(contigBadFor(mv,a).length?1e9:0)+over*1e6;\n      if(d<bd){bd=d;best=s;}}\n    a[m]=best;});\n  return a;}\nfunction optimizeFor(mv){\n  const ms=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__');\n  if(!ms.length||!mv.dest.length){ mv.optBadge=mv.dest.length?'':'sem setor destino identificado'; return {}; }\n  const opts=ms.map(m=>{const al=(mv.reachable[m]&&mv.reachable[m].length)?mv.reachable[m]:mv.dest.slice();return al.length?al:mv.dest.slice();});\n  const combos=opts.reduce((a,o)=>a*o.length,1);\n  const lim=spanLimits();\n  const dmax=optDistPrep(mv); mv.__optDmax=dmax;\n\n  // Feasibility ladder — same meaning as before, because renderSpanRule and the saved sessions\n  // both read mv.optTier: 0 = contíguo + max + min span, 1 = contíguo + max span, 2 = contíguo\n  // only. Every candidate any simulation produces is offered to all three tiers; we ship the\n  // strictest tier that got a solution, so an unreachable min/max relaxes loudly instead of\n  // stranding the stage with nothing.\n  const tier=[null,null,null],tSc=[Infinity,Infinity,Infinity],tEv=[null,null,null];\n  let feasible=0,evals=0;\n  const offer=(a,ev)=>{\n    if(contigBadFor(mv,a).length) return false;\n    feasible++;\n    const put=t=>{ if(ev.cost<tSc[t]){ tSc[t]=ev.cost; tier[t]={...a}; tEv[t]=ev; } };\n    put(2);\n    if(!ev.viol.over.length){ put(1); if(!ev.viol.under.length) put(0); }\n    return true;\n  };\n  const evalOf=a=>{ evals++; return optEval(mv,a,dmax); };\n\n  // Small enough to settle the question outright: enumerate every contiguous allocation and the\n  // winner is provably the best one under this objective. No search needed, so none is run.\n  const exhaustive=combos<=OPT_EXHAUSTIVE_MAX;\n  let sims=0;\n  if(exhaustive){\n    const cur={};\n    const rec=i=>{ if(i===ms.length){ offer(cur,evalOf(cur)); return; }\n      for(const s of opts[i]){ cur[ms[i]]=s; rec(i+1); } };\n    rec(0);\n  } else {\n    // Too big to enumerate, so run a portfolio of independent simulations instead. Each one is a\n    // seed assignment, then hill-climbing on single-município reassignments, then one perturbation\n    // and another climb to escape whatever local optimum it settled into. Different seeds land in\n    // different basins; the ladder above keeps the best across all of them.\n    const improve=a=>{\n      let ev=evalOf(a); offer(a,ev);\n      for(let pass=0;pass<OPT_PASSES;pass++){\n        let moved=false;\n        for(let i=0;i<ms.length;i++){\n          const m=ms[i],cur=a[m]; let best=cur,bev=ev;\n          for(const s of opts[i]){\n            if(s===cur) continue;\n            a[m]=s;\n            const e=evalOf(a);\n            // contiguity is a hard constraint, and the cheaper test runs first on purpose\n            if(e.cost<bev.cost-1e-12 && !contigBadFor(mv,a).length){ best=s; bev=e; }\n          }\n          a[m]=best;\n          if(best!==cur){ ev=bev; moved=true; offer(a,ev); }\n        }\n        if(!moved) break;\n      }\n    };\n    const rng=optRng(optSeed(mv,ms));\n    const perSim=Math.max(1,ms.length*Math.max(1,mv.dest.length)*OPT_PASSES);\n    const budget=Math.max(4,Math.min(OPT_SIMS,Math.floor(OPT_EVAL_BUDGET/perSim)||4));\n    const seeds=[];\n    if(mv.assign&&ms.every(m=>mv.assign[m])) seeds.push({...mv.assign});   // never regress on what is already on screen\n    seeds.push(autoAssignFor(mv));                                        // adjacency-first seed\n    seeds.push(greedyFor(mv,ms,opts));                                    // balance-first seed\n    while(seeds.length<budget){\n      // randomised construction biased toward nearby sectors — the bias keeps each seed sane, the\n      // randomness is what sends the runs into different basins\n      const a={};\n      ms.forEach((m,i)=>{ let bs=opts[i][0],bw=-Infinity;\n        for(const s of opts[i]){ const w=(1-optDistCost(mv,m,s,dmax))+rng()*0.9; if(w>bw){bw=w;bs=s;} }\n        a[m]=bs; });\n      seeds.push(a);\n    }\n    seeds.forEach(seed=>{\n      const a={...seed};\n      // a restored or legacy assign can still name a sector this stage no longer offers\n      ms.forEach((m,i)=>{ if(!opts[i].includes(a[m])) a[m]=opts[i][0]; });\n      improve(a);\n      const kick=Math.max(1,Math.round(ms.length*0.25));\n      for(let k=0;k<kick;k++){ const i=Math.floor(rng()*ms.length); a[ms[i]]=opts[i][Math.floor(rng()*opts[i].length)]; }\n      improve(a);\n    });\n    sims=seeds.length;\n  }\n\n  const t=tier.findIndex(x=>x);\n  if(t<0){ mv.optTier=-1; mv.optBadge='sem solução contígua — heurística'; return greedyFor(mv,ms,opts); }\n  const best=tier[t], ev=tEv[t]; mv.optTier=t;\n  const relax=[];\n  if(t>0 && lim.min) relax.push('span mínimo '+fmt(lim.min));\n  if(t>1 && lim.max) relax.push('span máximo '+fmt(lim.max));\n  mv.optStats={balance:ev.balance,dist:ev.dist,desloc:ev.desloc,stranded:ev.stranded,sims,evals,feasible,combos,exhaustive};\n  mv.optBadge=`ótimo · ${exhaustive?`espaço completo (${fmt(combos)})`:`${fmt(sims)} simulações`}`\n    +` · equilíbrio ±${Math.round(ev.balance*100)}% · adjacência ${Math.round((1-ev.dist)*100)}%`\n    +` · quebra ${fmt(ev.desloc)} CBs · órfãs sem destino ${fmt(ev.stranded)}`\n    +` · pico ${fmt(maxSpanOfFor(mv,best))} CBs`\n    +(lim.target?` · alvo ${fmt(lim.target)}`:'')\n    +(relax.length?` · ⚠ inatingível: ${relax.join(' + ')}`:(spanLimitsOn(lim)?' · limites ok':''));\n  return best;\n}\nfunction computeDerived(mv){\n  const inc={},gained={},orph={};mv.dest.forEach(s=>{inc[s]=0;gained[s]=0;orph[s]=0;});\n  Object.entries(mv.munis).forEach(([m,o])=>{if(m==='__OUTROS__')return;const s=mv.assign[m];if(s&&inc[s]!=null)inc[s]+=o.cbs;});\n  let desloc=0,orphanTotal=0,orphanStranded=0;\n  const L2=mv.leaders.map(L=>{const byS={};mv.dest.forEach(s=>byS[s]=0);let tot=0;\n    for(const [m,c] of Object.entries(L.byMuni)){if(m==='__OUTROS__')continue;const s=mv.assign[m];if(s&&byS[s]!=null){byS[s]+=c;tot+=c;}}\n    // no allocated CBs => no home. Picking dest[0] by default would silently dump this leader's\n    // orphan CBs into an arbitrary sector, so we leave it null and report them as stranded.\n    const home=(tot>0&&mv.dest.length)?mv.dest.reduce((a,s)=>byS[s]>byS[a]?s:a,mv.dest[0]):null;\n    const dl=tot-(home?byS[home]:0);desloc+=dl;if(home)gained[home]++;\n    const orphan=(mv.orphanByGroup&&mv.orphanByGroup[L.grupo])||0;\n    orphanTotal+=orphan;\n    if(orphan){ if(home&&orph[home]!=null) orph[home]+=orphan; else orphanStranded+=orphan; }\n    return {...L,byS,home,desloc:dl,assignedTotal:tot,orphan,orphanHome:(orphan&&home)?home:null};});\n  const span={};mv.dest.forEach(s=>span[s]=(+(mv.baseMetrics[s]?.cbs||0))+inc[s]+orph[s]);\n  return {inc,gained,desloc,leaders:L2,span,orph,orphanTotal,orphanStranded};\n}\n\nasync function computeMovement(sec,world){\n  sec=String(sec);\n  const mv={sector:sec,policy:'fora',view:'tobe',selMuni:null,optBadge:''};\n  const SNAP=SESS.snapLiteral;\n  const mSQL=`SELECT DS_MUNICIPIO municipio, CD_GRUPO grupo, MAX(DS_LEADER_NAME) lider,\n     COUNT(DISTINCT CD_CONSULTORA) cbs, ROUND(SUM(VL_PEDIDOS_CICLO),0) receita,\n     ROUND(SUM(VL_PEDIDOS_NATURA_CICLO),0) rec_nat, ROUND(SUM(VL_PEDIDOS_AVON_CICLO),0) rec_avon,\n     ROUND(SUM(QT_PONTOS_CICLO),0) pontos, ROUND(SUM(QT_PEDIDOS_CICLO),0) pedidos,\n     SUM(CASE WHEN ST_FEZ_PED_CICLO_ATUAL THEN 1 ELSE 0 END) ativas\n    FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR=${sec} AND DT_HISTORICO=${SNAP}\n    GROUP BY DS_MUNICIPIO, CD_GRUPO`;\n  const ufSQL=`SELECT DS_ESTADO uf, COUNT(*) n FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR=${sec} AND DT_HISTORICO=${SNAP} GROUP BY DS_ESTADO ORDER BY n DESC`;\n  const trendSQL=`SELECT operational_cycle ciclo, COUNT(DISTINCT person_code) cbs,\n     COUNT(DISTINCT CASE WHEN registered_bc_ind=1 THEN person_code END) ativas,\n     ROUND(SUM(revenue_nat_ss_amt),0) receita, ROUND(SUM(points_nat_ss_amt),0) pontos\n    FROM ${ELO} WHERE country_code=1 AND sector_code=${sec} AND operational_cycle<=${SESS.eloMaxCycle||999999} GROUP BY operational_cycle ORDER BY operational_cycle DESC LIMIT 8`;\n  const lvlSQL=`SELECT DS_NVL_PLAN_CRESC nivel, COUNT(DISTINCT CD_CONSULTORA) cbs,\n     ROUND(SUM(VL_PEDIDOS_NATURA_CICLO),0) rec_nat, ROUND(SUM(VL_PEDIDOS_AVON_CICLO),0) rec_avon\n    FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR=${sec} AND DS_NVL_PLAN_CRESC IS NOT NULL AND DT_HISTORICO=${SNAP} GROUP BY DS_NVL_PLAN_CRESC ORDER BY cbs DESC`;\n  const lvlMuniSQL=`SELECT DS_MUNICIPIO municipio, DS_NVL_PLAN_CRESC nivel, COUNT(DISTINCT CD_CONSULTORA) cbs\n    FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR=${sec} AND DS_NVL_PLAN_CRESC IS NOT NULL AND DT_HISTORICO=${SNAP} GROUP BY DS_MUNICIPIO, DS_NVL_PLAN_CRESC`;\n  const [mR,ufR,tR,lR,lmR]=await Promise.all([q(mSQL),q(ufSQL),q(trendSQL),q(lvlSQL),q(lvlMuniSQL)]);\n\n  const ownMatrix=rows(mR).filter(r=>+r.cbs>0);\n  mv.pureOwnMetrics=blankM();\n  ownMatrix.forEach(r=>{ mv.pureOwnMetrics.cbs+=+r.cbs; mv.pureOwnMetrics.receita+=+r.receita||0; mv.pureOwnMetrics.rec_nat+=+r.rec_nat||0; mv.pureOwnMetrics.rec_avon+=+r.rec_avon||0; mv.pureOwnMetrics.pontos+=+r.pontos||0; mv.pureOwnMetrics.pedidos+=+r.pedidos||0; mv.pureOwnMetrics.ativas+=+r.ativas||0; });\n\n  mv.levelByMuni={};\n  Object.entries(world.muniLevel||{}).forEach(([m,lv])=>{ if(world.muniOverride[m]===sec) mv.levelByMuni[m]={...lv}; });\n  // keyed further down, once the UF resolver exists — see the stamp block after buildAdj.\n\n  mv.trend=rows(tR).map(r=>({...r,cbs:+r.cbs,ativas:+r.ativas,receita:+r.receita,pontos:+r.pontos})).filter(r=>r.cbs>10).reverse();\n  mv.levels=rows(lR);\n\n  const absorbedRows=[];\n  Object.entries(world.muniOverride).forEach(([m,destSec])=>{ if(destSec===sec && world.muniRow[m]) absorbedRows.push(...world.muniRow[m]); });\n  // CBs an earlier etapa sent here by FOLLOWING THEIR LEADER (quebra de vínculo) carry no\n  // muniOverride — the município stayed where it was, only the CBs moved — so absorbedRows misses\n  // them. Leaving them out made this sector's ASIS total smaller than the span the previous etapa's\n  // TOBE promised for it, by exactly that etapa's \"CBs ignoradas\", and dropped those CBs from the\n  // redistribution as if they had never existed.\n  const inheritedOrphanRows=(world.sectorOrphanRows&&world.sectorOrphanRows[sec])||[];\n  mv.matrix=ownMatrix.concat(absorbedRows,inheritedOrphanRows);\n\n  const ufList=rows(ufR).map(r=>r.uf).filter(Boolean);\n  const domUF=ufList[0]||'PR';\n  mv.domUF=domUF;\n  const ufs=[domUF,...(UF_BORDERS[domUF]||[])];\n  const geos=await Promise.all(ufs.map(u=>geoUF(u).catch(()=>null)));\n  const allFeat=geos.filter(Boolean).flatMap(g=>g.features);\n  const adj=buildAdj(allFeat);\n\n  // ---- UF resolution ----\n  // SQL no longer selects DS_ESTADO. The base CSV is the authority on a município's UF, indexed by the\n  // (setor, município) pair it already maintains, and rows are stamped ONCE here so every consumer\n  // downstream keeps reading r.uf exactly as it did before.\n  // Fallback for a município the base does not carry — spillover, where the sector has CBs but no\n  // dominance: adopt the UF of the loaded shape when that name is unique across the UFs in this\n  // window. A name shared by two of them stays unresolved instead of guessed; it is spillover either\n  // way, and a guess would put a shape from the wrong state on the map.\n  const featUfByName={};\n  Object.keys(adj.feat).forEach(k=>{ const nm=mName(k),u=mUf(k);\n    if(!(nm in featUfByName)) featUfByName[nm]=u; else if(featUfByName[nm]!==u) featUfByName[nm]=null; });\n  const ufGuessed={};\n  const ufFor=(setorOf,muni)=>{const nm=norm(muni);\n    const fromCsv=DOM.ufBySetorMuni&&DOM.ufBySetorMuni[String(setorOf)+'|'+nm];\n    if(fromCsv) return fromCsv;\n    const uniq=featUfByName[nm];\n    if(uniq) return uniq;\n    // uniq===null means the name is shared by two of the LOADED UFs — Terra Nova exists in BA and in PE,\n    // and a BA sector loads PE as a border — so the unique-name fallback gave up. Giving up here too\n    // yields a bare NAME key, which matches NO shape: the município leaves the map without a word. The\n    // sector's own dominant UF is a real signal rather than a coin flip: when a shape of this name\n    // exists in domUF, that is the one this sector means. Recorded so the inference is never invisible.\n    if(uniq===null && adj.feat[mkey(nm,domUF)]){ ufGuessed[nm]=domUF; return domUF; }\n    return '';};\n  // Absorbed and orphan rows inherited from an earlier etapa were stamped when THAT etapa ran, under\n  // the setor they belonged to then; `if(!r.uf)` keeps that original resolution intact.\n  mv.matrix.forEach(r=>{ if(!r.uf) r.uf=ufFor(sec,r.municipio); });\n  rows(lmR).forEach(r=>{ const k=mkey(r.municipio,ufFor(sec,r.municipio)); (mv.levelByMuni[k]=mv.levelByMuni[k]||{})[r.nivel]=+r.cbs; });\n\n  const totBy={}; mv.matrix.forEach(r=>{const n=mkey(r.municipio,r.uf); totBy[n]=(totBy[n]||0)+ +r.cbs;});\n  const footprint=new Set(Object.entries(totBy).filter(([,c])=>c>0).map(([m])=>m));\n  const withShape=[...footprint].filter(n=>adj.feat[n]||world.muniGeo[n]);\n  mv.cbsByMuni={...totBy}; mv.shapeMunis=withShape.slice();\n  mv.noShapeMunis=[...footprint].filter(n=>!(adj.feat[n]||world.muniGeo[n])).map(n=>({muni:n,cbs:totBy[n]||0})).sort((a,b)=>b.cbs-a.cbs);\n  mv.noShapeCbs=mv.noShapeMunis.reduce((a,x)=>a+x.cbs,0);\n\n  // ---- RULE: which municipalities belong to this sector ----\n  // Comes from the dominantes CSV (setor x município), NOT from CB volume. A municipality where the\n  // closing sector happens to have a handful of CBs but which the base assigns to ANOTHER sector is\n  // spillover: it is not reallocated, it is not drawn, and its CBs follow their leader (quebra de\n  // vínculo). Municipalities an EARLIER etapa moved into this sector count as belonging to it too —\n  // otherwise the cascade would throw away the territory the sector just received.\n  const domBase=await ensureDominantes();\n  const domOwn=domBase[String(sec)];\n  const inherited=new Set(Object.keys(world.muniOverride).filter(m=>world.muniOverride[m]===sec));\n  if((!domOwn||!domOwn.size)&&!inherited.size) throw new Error('setor '+sec+' não existe na base de municípios dominantes (CSV) — atualize a base antes de fechar este setor');\n  const belongs=n=>(domOwn&&(domOwn.has(n)||(!DOM.hasUf&&domOwn.has(mName(n)))))||inherited.has(n);\n  mv.domCsvMunis=(domOwn&&domOwn.size)||0;\n  const dropped=withShape.filter(n=>!belongs(n));\n  if(withShape.length && dropped.length===withShape.length) throw new Error('setor '+sec+': nenhum dos municípios com CBs está na base de dominantes — nada pra realocar');\n  const droppedSet=new Set(dropped);\n  mv.excludedMunis=dropped.map(n=>({muni:n,cbs:totBy[n]||0})).sort((a,b)=>b.cbs-a.cbs);\n  mv.excludedCbs=dropped.reduce((a,n)=>a+(totBy[n]||0),0);\n\n  const closingNames=withShape.filter(n=>!droppedSet.has(n));\n  const closingSet=new Set(closingNames);\n  mv.geoFeat={}; closingNames.forEach(n=>{ mv.geoFeat[n]=(adj.feat[n]&&adj.feat[n].f)||world.muniGeo[n]; });\n\n  // ---- why is the map short of the base? ----\n  // Three gates drop a município between the CSV and the map: footprint (no CBs under this setor at\n  // the snapshot), withShape (no geometry in the loaded UFs) and belongs (key mismatch). Only the last\n  // two had a counter, so the FIRST one was invisible — the operator counted 5 shapes against a base\n  // that says 6 and had nothing on screen explaining the missing one. Named here, with its reason.\n  const drawnCsv=new Set(closingNames.map(n=>DOM.hasUf?n:mName(n)));\n  const footKeyOf=k=>DOM.hasUf?(footprint.has(k)?k:null):([...footprint].find(x=>mName(x)===k)||null);\n  mv.csvMunisTotal=(domOwn&&domOwn.size)||0;\n  mv.ufGuessed={...ufGuessed};\n  mv.missingMunis=[...(domOwn||[])].filter(k=>!drawnCsv.has(k)).map(k=>{\n    const fk=footKeyOf(k);\n    const hasShape=!!(adj.feat[fk||k]||world.muniGeo[fk||k]);\n    // The SAME name present in footprint under a DIFFERENT key means UF resolution disagreed with the\n    // base: the CBs are there, they just landed on a key that no shape and no dominance entry can\n    // match. That is a different failure from \"this município has no CBs\", and conflating the two sends\n    // the next investigation into the CB base when the answer is in the UF column.\n    const alias=[...footprint].filter(x=>x!==k&&mName(x)===mName(k));\n    let reason;\n    if(!fk&&alias.length) reason=`UF divergente — as CBs entraram na chave ${alias.join(' / ')} e a base diz ${k}`;\n    else if(!fk) reason=hasShape?'sem CBs neste setor no snapshot — desenhado como vizinho':'sem CBs neste setor no snapshot';\n    else if(!hasShape) reason='sem shape nas UFs carregadas';\n    else reason='chave não casou com a base de dominantes';\n    return {muni:k,cbs:(fk?totBy[fk]:alias.reduce((a,x)=>a+(totBy[x]||0),0))||0,reason:reason};\n  });\n\n  const extVotes={}; const nbrNames=new Set();\n  closingNames.forEach(n=>{\n    if(!adj.feat[n]) return;\n    // droppedSet is excluded too: a municipality outside this sector's dominance base must not\n    // nominate a destination sector, and it is not drawn on the map at all.\n    adj.nbrs(n).forEach(({o,w})=>{ if(!closingSet.has(o) && !droppedSet.has(o)){ nbrNames.add(o); (extVotes[n]=extVotes[n]||[]).push({o,w}); } });\n  });\n  // mv.nbrFeat is assembled far below, once mv.dest is final: the map draws only the closing sector's\n  // municípios and the destination sectors' territory, so the feature list cannot be built until the\n  // neighbour query has resolved each neighbour's sector AND the destination list has settled.\n  let neigh=[];\n  if(nbrNames.size){\n    // The IN-list carries bare names — that is what the column holds, and the query is back to not\n    // selecting DS_ESTADO. Every returned row names its own CD_SETOR, which is exactly the key the\n    // base CSV is indexed by, so each row's UF is resolved from the base right after the fetch.\n    const inList=[...new Set([...nbrNames].map(n=>mName(n)))].map(n=>`'${n.replace(/'/g,\"''\")}'`).join(',');\n    const nSQL=`SELECT DS_MUNICIPIO municipio, CD_SETOR setor, COUNT(DISTINCT CD_CONSULTORA) cbs\n      FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR<>${sec} AND CD_SETOR>0 AND DT_HISTORICO=${SNAP} AND DS_MUNICIPIO IN (${inList}) GROUP BY DS_MUNICIPIO, CD_SETOR`;\n    neigh=rows(await q(nSQL));\n  }\n  const domSecOf={};\n  neigh.forEach(r=>{ if(!r.uf) r.uf=ufFor(r.setor,r.municipio); });\n  const byM={}; neigh.forEach(r=>{const m=mkey(r.municipio,r.uf); if(!nbrNames.has(m)) return; (byM[m]=byM[m]||[]).push(r);});\n  Object.entries(byM).forEach(([m,rs])=>{ rs.sort((a,b)=>+b.cbs-+a.cbs); domSecOf[m]=String(rs[0].setor); });\n  nbrNames.forEach(n=>{ if(world.muniOverride[n]) domSecOf[n]=world.muniOverride[n]; });\n  mv.nbrCurrentSector=domSecOf;\n\n  // ---- HARD RULE: which sectors are eligible as destinations ----\n  // 'any'      = a sector qualifies if it borders ANY municipality of the closing sector (legacy default)\n  // 'dominant' = only municipalities with >= destMinCbs CBs act as a bridge; smaller ones are still\n  //              redistributed, they just cannot pull a new sector into the destination list.\n  //\n  // ---- HARD RULE (não negociável): destino tem de ser da MESMA gerência de vendas ----\n  // Território não atravessa fronteira de GV num fechamento real: outra gerência é outra gestora,\n  // outra meta e outro P&L, então oferecer um setor de fora produz um plano que ninguém pode\n  // executar. CD_GV da base de dominantes é a autoridade, e o filtro roda ANTES de qualquer peso,\n  // regra de ponte ou corte de top-6 — nenhum caminho a jusante pode reintroduzir um setor de fora.\n  const gvBySetor=DOM.gvBySetor||{};\n  const gvOf=s=>gvBySetor[String(s)]||'';\n  const ownGv=gvOf(sec);\n  if(!ownGv) throw new Error('setor '+sec+' não tem CD_GV na base de municípios dominantes — sem a gerência de vendas do setor que fecha não há como garantir que os destinos sejam da mesma gerência');\n  // Um candidato que a base não carrega NÃO pode ser provado como da mesma gerência, então é recusado\n  // em vez de presumido: a regra só vale se nunca vazar.\n  const sameGv=s=>gvOf(s)===ownGv;\n  mv.gv=ownGv;\n  // Foreign-GV neighbours are not drawn AT ALL. Filtering them only out of the destination list still\n  // left them sitting on the map as context, which invites the exact question the rule exists to\n  // settle — \"why is 3471 right there if nothing can be sent to it?\". A neighbour whose sector is\n  // UNKNOWN is not being asserted to be foreign, so it stays as plain geography.\n  // Dropping them also tightens the frame: project() fits the bounding box of whatever survives, so the\n  // closing sector is drawn larger once foreign territory stops padding the extent.\n  mv.gvRejected=[];\n  const gvHidden=new Set();\n  nbrNames.forEach(n=>{ const s=domSecOf[n];\n    if(s && !sameGv(s)){ gvHidden.add(n); if(mv.gvRejected.indexOf(s)<0) mv.gvRejected.push(s); } });\n  gvHidden.forEach(n=>{ nbrNames.delete(n); delete domSecOf[n]; });\n  Object.keys(extVotes).forEach(n=>{ extVotes[n]=extVotes[n].filter(v=>!gvHidden.has(v.o)); });\n  const destRule=(SESS.settings&&SESS.settings.destRule)||DEFAULT_SETTINGS.destRule;\n  const destMinCbs=Math.max(1,Math.round(+((SESS.settings||{}).destMinCbs)||DEFAULT_SETTINGS.destMinCbs));\n  mv.destRule=destRule; mv.destMinCbs=destMinCbs; mv.destRuleFallback=false;\n  const isBridge=n=>destRule!=='dominant'||(totBy[n]||0)>=destMinCbs;\n  mv.bridgeMunis=closingNames.filter(isBridge);\n  mv.ignoredBridges=closingNames.filter(n=>!isBridge(n));\n\n  mv.allowed={}; mv.allowedRaw={};\n  const wAny={}, wDom={};\n  closingNames.forEach(n=>{\n    const v={}, bridge=isBridge(n);\n    (extVotes[n]||[]).forEach(({o,w})=>{\n      const s=domSecOf[o];\n      if(!s || s===sec || world.closedSectors.has(s)) return;\n      // Belt to the braces above: domSecOf has already had every foreign-GV neighbour removed, so this\n      // cannot fire any more. It stays because it costs one comparison and the failure it guards — a\n      // destination in the wrong gerência — is the whole reason this code exists.\n      if(!sameGv(s)) return;\n      v[s]=(v[s]||0)+w;\n      wAny[s]=(wAny[s]||0)+w;\n      if(bridge) wDom[s]=(wDom[s]||0)+w;\n    });\n    mv.allowed[n]=v; mv.allowedRaw[n]={...v};\n  });\n  let secWeight=wAny;\n  if(destRule==='dominant'){\n    if(Object.keys(wDom).length) secWeight=wDom;\n    else { secWeight=wAny; mv.destRuleFallback=true; }   // no dominant municipality at all -> relax, never strand the stage\n  }\n  mv.dest=Object.keys(secWeight).sort((a,b)=>secWeight[b]-secWeight[a]).slice(0,6);\n  if(!mv.dest.length){\n    // O fallback de emergência lê domSecOf direto, contornando os votos — então repete o filtro de GV\n    // aqui. Sem isso a regra vazaria exatamente no caso em que ninguém está olhando.\n    mv.dest=[...new Set(Object.values(domSecOf))].filter(s=>s!==sec&&!world.closedSectors.has(s)&&sameGv(s)).slice(0,6);\n    closingNames.forEach(n=>{ if(!Object.keys(mv.allowed[n]).length){ mv.dest.forEach(s=>mv.allowed[n][s]=1); } });\n  }\n  // Cinto e suspensório: qualquer rota que tenha preenchido mv.dest (pesos, fallback, um branch novo\n  // amanhã) passa por esta linha, e nada de fora da gerência do setor que fecha sobrevive a ela.\n  mv.dest=mv.dest.filter(sameGv);\n  // WHAT GETS DRAWN — decided here because it depends on the final destination list. Two things only:\n  // the closing sector's municípios and the territory of the sectors that can actually receive them.\n  // Every other neighbour was geographic filler that stretched the frame and settled no question.\n  // nbrCurrentSector deliberately keeps its full mapping: drawMap groups whatever survives in nbrFeat\n  // by it, so trimming the feature list is the entire change.\n  const drawSet=new Set(mv.dest);\n  mv.nbrFeat=[...nbrNames].filter(n=>drawSet.has(domSecOf[n])).map(n=>adj.feat[n]&&adj.feat[n].f).filter(Boolean);\n  // votes may reference a sector that did not survive the rule / top-6 cut — drop them so\n  // autoAssign + contiguity seeds can never point at a sector outside mv.dest\n  closingNames.forEach(n=>{ Object.keys(mv.allowed[n]||{}).forEach(s=>{ if(!mv.dest.includes(s)) delete mv.allowed[n][s]; }); });\n  mv.color={}; mv.dest.forEach((s,i)=>mv.color[s]=PALETTE[i%PALETTE.length]);\n\n  const accC={}; Object.entries(domSecOf).forEach(([nb,s])=>{ if(!mv.dest.includes(s))return; const f=(adj.feat[nb]&&adj.feat[nb].f)||world.muniGeo[nb]; if(!f)return; const c=centroidLL(f); accC[s]=accC[s]||[0,0,0]; accC[s][0]+=c[0]; accC[s][1]+=c[1]; accC[s][2]++; });\n  mv.secCentroid={}; mv.dest.forEach(s=>{ if(accC[s]) mv.secCentroid[s]=[accC[s][0]/accC[s][2],accC[s][1]/accC[s][2]]; });\n  mv.muniCentroid={}; closingNames.forEach(n=>{ if(mv.geoFeat[n]) mv.muniCentroid[n]=centroidLL(mv.geoFeat[n]); });\n  mv.closeAdj={}; closingNames.forEach(n=>{ mv.closeAdj[n]=adj.feat[n]?adj.nbrs(n).filter(({o})=>closingSet.has(o)).map(({o})=>o):[]; });\n  const comp={}; let ci=0; closingNames.forEach(n=>{ if(comp[n]!=null)return; const st=[n]; comp[n]=ci; while(st.length){ const x=st.pop(); (mv.closeAdj[x]||[]).forEach(o=>{ if(comp[o]==null){ comp[o]=ci; st.push(o); } }); } ci++; });\n  const compAllowed={}; closingNames.forEach(n=>{ const cid=comp[n]; (compAllowed[cid]=compAllowed[cid]||new Set()); Object.keys(mv.allowed[n]||{}).forEach(s=>compAllowed[cid].add(s)); });\n  mv.reachable={}; closingNames.forEach(n=>{ mv.reachable[n]=[...(compAllowed[comp[n]]||[])].filter(s=>mv.dest.includes(s)); });\n\n  if(mv.dest.length){\n    const rList=mv.dest.join(',');\n    const bSQL=`SELECT CD_SETOR setor, COUNT(DISTINCT CD_CONSULTORA) cbs,\n       SUM(CASE WHEN ST_FEZ_PED_CICLO_ATUAL THEN 1 ELSE 0 END) ativas,\n       ROUND(SUM(VL_PEDIDOS_CICLO),0) receita, ROUND(SUM(VL_PEDIDOS_NATURA_CICLO),0) rec_nat,\n       ROUND(SUM(VL_PEDIDOS_AVON_CICLO),0) rec_avon, ROUND(SUM(QT_PONTOS_CICLO),0) pontos, ROUND(SUM(QT_PEDIDOS_CICLO),0) pedidos\n      FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR IN (${rList}) AND DT_HISTORICO=${SNAP} GROUP BY CD_SETOR`;\n    const blSQL=`SELECT CD_SETOR setor, DS_NVL_PLAN_CRESC nivel, COUNT(DISTINCT CD_CONSULTORA) cbs\n      FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR IN (${rList}) AND DS_NVL_PLAN_CRESC IS NOT NULL AND DT_HISTORICO=${SNAP} GROUP BY CD_SETOR, DS_NVL_PLAN_CRESC`;\n    const [bR,blR]=await Promise.all([q(bSQL),q(blSQL)]);\n    mv.baseMetrics={}; rows(bR).forEach(r=>{ mv.baseMetrics[String(r.setor)]=r; if(!SESS.sectorBaseCache[String(r.setor)]) SESS.sectorBaseCache[String(r.setor)]=r; });\n    mv.baseLevel={}; rows(blR).forEach(r=>{ const s=String(r.setor); (mv.baseLevel[s]=mv.baseLevel[s]||{})[r.nivel]=+r.cbs; });\n  } else { mv.baseMetrics={}; mv.baseLevel={}; }\n\n  mv.dest.forEach(s=>{\n    if(!mv.baseMetrics[s]) mv.baseMetrics[s]={setor:s,cbs:0,ativas:0,receita:0,rec_nat:0,rec_avon:0,pontos:0,pedidos:0};\n    const infl=world.sectorInflow[s];\n    if(infl) Object.keys(blankM()).forEach(k=>{ mv.baseMetrics[s][k]=(+mv.baseMetrics[s][k]||0)+(infl[k]||0); });\n    const inflLv=world.sectorInflowLevel[s];\n    if(inflLv){ mv.baseLevel[s]=mv.baseLevel[s]||{}; Object.entries(inflLv).forEach(([nv,c])=>{ mv.baseLevel[s][nv]=(mv.baseLevel[s][nv]||0)+c; }); }\n  });\n\n  aggregateMovement(mv);\n  mv.assign=optimizeFor(mv);\n  return mv;\n}\n\n// ---------- cascade engine ----------\nasync function computeAt(i){\n  await ensurePinned();\n  const world=foldWorldState(SESS.timeline,i);\n  const sec=SESS.timeline[i].sector;\n  const mv=await computeMovement(sec,world);\n  SESS.timeline[i]=mv;\n}\nasync function recomputeFrom(i){\n  for(let k=i;k<SESS.timeline.length;k++){\n    loader(true,`recalculando etapa ${k+1} de ${SESS.timeline.length}…`);\n    try{ await computeAt(k); }\n    catch(e){\n      // A stage that failed to recompute still holds its PREVIOUS result, so the timeline would\n      // silently mix pre- and post-change etapas. Flag this stage and everything after it as stale\n      // (dashed chip + ⟳) so the state is visible and flushDirty retries from here.\n      SESS.dirtyFrom = SESS.dirtyFrom==null ? k : Math.min(SESS.dirtyFrom,k);\n      throw e;\n    }\n  }\n}\nasync function flushDirty(){\n  if(SESS.dirtyFrom==null) return;\n  const from=SESS.dirtyFrom; SESS.dirtyFrom=null;\n  loader(true,'recalculando etapas seguintes…');\n  try{ await recomputeFrom(from); }\n  catch(e){ $('#ds').textContent='erro ao recalcular cadeia: '+e.message; $('#ds').classList.add('err'); }\n  finally{ loader(false); }\n}\nasync function addMovement(sec){\n  sec=(sec==null?'':String(sec)).trim();\n  if(!sec) return;\n  const closedNow=new Set(SESS.timeline.map(mv=>mv.sector));\n  if(closedNow.has(sec)){ $('#ds').textContent='setor '+sec+' já fechado nesta timeline.'; $('#ds').classList.add('err'); return; }\n  if(!SESS.sectorsList.some(s=>s.setor===sec)){ $('#ds').textContent='setor \"'+sec+'\" não existe no snapshot congelado.'; $('#ds').classList.add('err'); return; }\n  await flushDirty();\n  loader(true,'fechando setor '+sec+' — puxando dado do snapshot congelado…');\n  $('#liveState').classList.remove('err');\n  try{\n    SESS.timeline.push({sector:String(sec)});\n    await computeAt(SESS.timeline.length-1);\n    SESS.selected=SESS.timeline.length-1;\n    $('#ds').classList.remove('err'); $('#ds').textContent='';\n  }catch(e){\n    SESS.timeline.pop();\n    $('#ds').textContent='erro ao fechar setor '+sec+': '+e.message; $('#ds').classList.add('err');\n  } finally { loader(false); renderAll(); }\n}\nfunction removeFrom(i){\n  SESS.timeline.length=i;\n  SESS.selected=Math.min(SESS.selected,Math.max(0,SESS.timeline.length-1));\n  if(SESS.dirtyFrom!=null && SESS.dirtyFrom>=SESS.timeline.length) SESS.dirtyFrom=null;\n  renderAll();\n}\nasync function editSelected(mutator){\n  const mv=SESS.timeline[SESS.selected]; if(!mv) return;\n  mutator(mv);\n  if(SESS.selected<SESS.timeline.length-1){\n    SESS.dirtyFrom = SESS.dirtyFrom==null ? SESS.selected+1 : Math.min(SESS.dirtyFrom, SESS.selected+1);\n  }\n  renderAll();\n}\n\n// ---------- sectors list / picker ----------\nasync function loadSectors(){\n  const sql=`SELECT CD_SETOR setor, MAX(DS_ESTADO) uf, COUNT(DISTINCT CD_CONSULTORA) cbs, COUNT(DISTINCT DS_MUNICIPIO) munis\n    FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR>0 AND DT_HISTORICO=(SELECT MAX(DT_HISTORICO) FROM ${T} WHERE CD_PAIS=1) GROUP BY CD_SETOR ORDER BY CD_SETOR`;\n  SESS.sectorsList=rows(await q(sql)).map(r=>({setor:String(r.setor),uf:r.uf,cbs:+r.cbs,munis:+r.munis}));\n}\nfunction renderSectorPicker(){\n  const closed=new Set(SESS.timeline.map(mv=>mv.sector));\n  const avail=SESS.sectorsList.filter(s=>!closed.has(s.setor));\n  const dl=$('#sectorPickList');\n  if(dl) dl.innerHTML=avail.map(s=>`<option value=\"${s.setor}\">${s.setor} · ${s.uf||'?'} · ${fmt(s.cbs)} CBs · ${s.munis} munic.</option>`).join('');\n  const ready=SESS.stage==='main';\n  $('#rand').disabled=!ready||!avail.length; $('#go').disabled=!ready||!avail.length; $('#sectorPick').disabled=!ready;\n}\nfunction renderStage(){\n  const isMain=SESS.stage==='main';\n  const cc=$('#confirmCard'), hb=$('#howtoBox'), mw=$('#mainWrap');\n  const hdr=$('#topHeader'), rl=$('#timelineRail');\n  if(hdr) hdr.classList.toggle('hidden', !isMain);\n  if(rl) rl.classList.toggle('hidden', !isMain);\n  if(cc) cc.classList.toggle('hidden', isMain);\n  if(hb) hb.classList.toggle('hidden', !isMain);\n  if(mw) mw.classList.toggle('hidden', !isMain);\n  const cb=$('#confirmBody');\n  if(cb && !isMain) cb.innerHTML = SESS.snapshotRaw\n    ? `Snapshot congelado · atualizado em <b>${fmtSyncedAt(SESS.snapshotSyncedAt)}</b> · <b>${SESS.sectorsList.length}</b> setor(es) disponível(eis) pra fechar. Nenhuma consulta de detalhe roda até você confirmar e escolher o primeiro setor.`\n    : 'congelando snapshot…';\n}\n\n// ---------- session persistence ----------\n// ONE table (`timeline-shared-sessions`) holds BOTH kinds of row, so SESSIONS_DS and SHARED_DS\n// deliberately resolve to the SAME DataSet — the two names mark intent, not two stores:\n//   · working session  — carries `movements`; saveSession updates it in place\n//   · shared snapshot  — carries `sharedAt` + `stages`; doShare CREATES it and nothing updates it\n// listSessions MUST exclude the shared rows. They are write-once by contract, and if one showed\n// up in the picker, loading it and pressing Salvar would fire ds.update() straight at a frozen\n// snapshot. Filtering here is what keeps that unreachable — it is the guard, not a cosmetic.\n// Both lookups stay because a policy-gated DataSet's Process resolves late; same race the reader\n// component polls for. SESSIONS_DS lives at module scope so no call site can hit it in the TDZ.\nasync function listSessions(){\n  const ds=(d2.data('sessionsDataset')||d2.data(SESSIONS_DS)); if(!ds) return [];\n  await ds.refresh();\n  const recs=ds.records()||[];\n  return [...recs].filter(r=>!r.sharedAt).sort((a,b)=>new Date(b.updatedAt||0)-new Date(a.updatedAt||0));\n}\nasync function refreshSessionPicker(){\n  const list=await listSessions().catch(()=>[]);\n  SESS.sessionsList=list;\n  const opts=list.map(s=>`<option value=\"${s._id}\">${esc(s.label||'sem nome')} · ${fmt((s.movements||[]).length)} etapa(s)</option>`).join('')+`<option value=\"\">+ Nova sessão</option>`;\n  const sel=$('#sessionPick'); if(sel){ sel.innerHTML=opts; sel.value=SESS.sessionId||''; }\n  const csel=$('#confirmSessionPick'); if(csel){ csel.innerHTML=opts; csel.value=SESS.sessionId||''; }\n}\nasync function saveSession(){\n  const ds=(d2.data('sessionsDataset')||d2.data(SESSIONS_DS));\n  if(!ds){ $('#sessStatus').textContent='dataset de sessões indisponível'; return; }\n  if(!SESS.timeline.length){ $('#sessStatus').textContent='nada pra salvar ainda'; return; }\n  await flushDirty();\n  const label=SESS.sessionLabel||('Sessão '+new Date().toLocaleString('pt-BR'));\n  const nowIso=new Date().toISOString();\n  const payload={\n    label,\n    settings:{...DEFAULT_SETTINGS,...(SESS.settings||{})},\n    snapshotRaw:SESS.snapshotRaw, snapshotSyncedAt:SESS.snapshotSyncedAt, snapLiteral:SESS.snapLiteral, eloMaxCycle:SESS.eloMaxCycle,\n    movements:SESS.timeline.map(mv=>({\n      sector:mv.sector, assign:mv.assign, policy:mv.policy,\n      matrix:mv.matrix, trend:mv.trend, levels:mv.levels, levelByMuni:mv.levelByMuni,\n      pureOwnMetrics:mv.pureOwnMetrics, domUF:mv.domUF, dest:mv.dest, color:mv.color,\n      gv:mv.gv, gvRejected:mv.gvRejected,\n      missingMunis:mv.missingMunis, csvMunisTotal:mv.csvMunisTotal, ufGuessed:mv.ufGuessed,\n      baseMetrics:mv.baseMetrics, baseLevel:mv.baseLevel, geoFeat:mv.geoFeat, nbrFeat:mv.nbrFeat,\n      nbrCurrentSector:mv.nbrCurrentSector, allowed:mv.allowed, allowedRaw:mv.allowedRaw, reachable:mv.reachable,\n      destRule:mv.destRule, destMinCbs:mv.destMinCbs, destRuleFallback:mv.destRuleFallback, optTier:mv.optTier,\n      cbsByMuni:mv.cbsByMuni, shapeMunis:mv.shapeMunis, excludedMunis:mv.excludedMunis, domCsvMunis:mv.domCsvMunis,\n      excludedCbs:mv.excludedCbs, noShapeMunis:mv.noShapeMunis, noShapeCbs:mv.noShapeCbs,\n      secCentroid:mv.secCentroid, muniCentroid:mv.muniCentroid, closeAdj:mv.closeAdj, optBadge:mv.optBadge,\n    })),\n    updatedAt:nowIso,\n  };\n  $('#sessStatus').textContent='salvando…';\n  try{\n    if(SESS.sessionId){\n      await ds.update({_id:SESS.sessionId,...payload});\n    } else {\n      payload.createdAt=nowIso;\n      const created=await ds.create(payload);\n      SESS.sessionId=(created&&created._id)||(created&&created.data&&created.data._id)||(ds.selected&&ds.selected()&&ds.selected()._id)||null;\n    }\n    SESS.sessionLabel=label;\n    await refreshSessionPicker();\n    $('#sessStatus').textContent='salvo ✓';\n  }catch(e){ $('#sessStatus').textContent='erro ao salvar: '+e.message; }\n  setTimeout(()=>{ if($('#sessStatus')) $('#sessStatus').textContent=''; },2200);\n}\n// Duplicate = drop sessionId so saveSession takes its CREATE branch instead of its update branch.\n// The source record is never written to, the copy gets a fresh _id and its own createdAt, and the\n// copy becomes the active session (so the next Salvar edits the copy, not the original).\nasync function duplicateSession(){\n  if(!SESS.timeline.length){ $('#sessStatus').textContent='nada pra duplicar ainda'; return; }\n  const prevId=SESS.sessionId, prevLabel=SESS.sessionLabel;\n  SESS.sessionId=null;\n  SESS.sessionLabel=(SESS.sessionLabel||'Sessão')+' (cópia)';\n  await saveSession();\n  if(!SESS.sessionId){\n    // saveSession swallows its own errors into #sessStatus, so a still-null id after the await is\n    // the only failure signal we get. Put the original identity back — otherwise a failed copy\n    // silently leaves the session detached, and the next Salvar would fork a new record instead\n    // of updating the one the user thought they were editing.\n    SESS.sessionId=prevId; SESS.sessionLabel=prevLabel;\n    await refreshSessionPicker().catch(()=>{});\n    return;\n  }\n  if($('#sessStatus')) $('#sessStatus').textContent='duplicado ✓';\n}\nasync function loadSession(id){\n  if(!id) return newSession();\n  const list=(SESS.sessionsList&&SESS.sessionsList.length)?SESS.sessionsList:await listSessions().catch(()=>[]);\n  const rec=list.find(s=>String(s._id)===String(id));\n  if(!rec) return newSession();\n  loader(true,'carregando sessão…');\n  SESS.sessionId=rec._id; SESS.sessionLabel=rec.label;\n  SESS.snapshotRaw=rec.snapshotRaw; SESS.snapshotSyncedAt=rec.snapshotSyncedAt||null; SESS.snapLiteral=rec.snapLiteral; SESS.eloMaxCycle=rec.eloMaxCycle;\n  SESS.settings={...DEFAULT_SETTINGS,...(rec.settings||{})};\n  SESS.timeline=(rec.movements||[]).map(m=>({sector:String(m.sector)}));\n  SESS.selected=0; SESS.sectorBaseCache={}; SESS.stage='main'; SESS.dirtyFrom=null;\n  try{\n    for(let i=0;i<SESS.timeline.length;i++){\n      const saved=(rec.movements||[])[i]||{};\n      // Sessions saved before the UF became part of the key hold bare-name keys in matrix rows,\n      // assign, geoFeat and closeAdj alike. Restoring that cache would mix key shapes the moment the\n      // stage is recomputed — and it would preserve the very collision this fixes — so those stages\n      // are replayed against the pinned snapshot and the manual assignment is remapped by name.\n      const legacyKeys=!!(saved.matrix&&saved.matrix.length&&saved.matrix.every(r=>r&&r.uf==null));\n      // Sessões salvas antes da regra de gerência podem carregar um destino de outra GV no cache.\n      // Restaurar esse cache manteria o setor proibido na tela para sempre, então essas etapas são\n      // reprocessadas contra o snapshot fixado — igual ao tratamento das chaves legadas.\n      const crossGv=await savedCrossesGv(saved);\n      if(saved.matrix&&!legacyKeys&&!crossGv){\n        loader(true,`restaurando etapa ${i+1}/${SESS.timeline.length} — setor ${SESS.timeline[i].sector} (cache, sem consulta)…`);\n        const mv={sector:String(saved.sector), policy:saved.policy||'fora', view:'tobe', selMuni:null, optBadge:saved.optBadge||''};\n        mv.matrix=saved.matrix; mv.trend=saved.trend||[]; mv.levels=saved.levels||[]; mv.levelByMuni=saved.levelByMuni||{};\n        mv.pureOwnMetrics=saved.pureOwnMetrics||blankM(); mv.domUF=saved.domUF; mv.dest=saved.dest||[]; mv.color=saved.color||{};\n        mv.baseMetrics=saved.baseMetrics||{}; mv.baseLevel=saved.baseLevel||{}; mv.geoFeat=saved.geoFeat||{}; mv.nbrFeat=saved.nbrFeat||[];\n        mv.nbrCurrentSector=saved.nbrCurrentSector||{}; mv.allowed=saved.allowed||{}; mv.reachable=saved.reachable||{};\n        mv.allowedRaw=saved.allowedRaw||saved.allowed||{};\n        mv.destRule=saved.destRule||SESS.settings.destRule; mv.destMinCbs=saved.destMinCbs||SESS.settings.destMinCbs; mv.destRuleFallback=!!saved.destRuleFallback;\n        mv.optTier=(saved.optTier==null?0:saved.optTier);\n        mv.gv=saved.gv||''; mv.gvRejected=saved.gvRejected||[];\n        mv.missingMunis=saved.missingMunis||[]; mv.csvMunisTotal=saved.csvMunisTotal||0;\n        mv.ufGuessed=saved.ufGuessed||{};\n        mv.cbsByMuni=saved.cbsByMuni||{}; mv.shapeMunis=saved.shapeMunis||[];\n        mv.excludedMunis=saved.excludedMunis||[]; mv.excludedCbs=saved.excludedCbs||0; mv.domCsvMunis=saved.domCsvMunis||0;\n        mv.noShapeMunis=saved.noShapeMunis||[]; mv.noShapeCbs=saved.noShapeCbs||0;\n        mv.secCentroid=saved.secCentroid||{}; mv.muniCentroid=saved.muniCentroid||{}; mv.closeAdj=saved.closeAdj||{};\n        aggregateMovement(mv);\n        mv.assign=saved.assign||{};\n        mv.dest.forEach(s=>{ if(!SESS.sectorBaseCache[s]) SESS.sectorBaseCache[s]=mv.baseMetrics[s]; });\n        SESS.timeline[i]=mv;\n      } else {\n        loader(true,`replay ${i+1}/${SESS.timeline.length} — setor ${SESS.timeline[i].sector}…`);\n        await computeAt(i);\n        if(saved.assign) SESS.timeline[i].assign=legacyKeys?remapAssign(SESS.timeline[i],saved.assign):saved.assign;\n        if(saved.policy) SESS.timeline[i].policy=saved.policy;\n      }\n    }\n    await loadSectors();\n  }catch(e){ $('#ds').textContent='erro ao carregar sessão: '+e.message; $('#ds').classList.add('err'); }\n  finally{ loader(false); }\n  renderAll();\n}\n// Re-points a legacy bare-name assignment at the NAME/UF key it can only mean. When a name resolves\n// to more than one município in the recomputed stage the manual choice is genuinely ambiguous —\n// dropping it lets the optimizer allocate instead of guessing on the operator's behalf.\n// True when a cached stage names a destination outside the closing sector's gerência de vendas.\n// Judges the cache by TODAY's rule, reading the (memoised) dominantes base rather than trusting what\n// the session was saved with. Unknown GV on the closing sector answers false: the stage then loads\n// from cache instead of being replayed into the hard throw in computeMovement, which would leave the\n// operator staring at a broken session with no way back.\nasync function savedCrossesGv(saved){\n  if(!saved||!saved.sector||!(saved.dest||[]).length) return false;\n  let gvBy={};\n  try{ await ensureDominantes(); gvBy=DOM.gvBySetor||{}; }catch(e){ return false; }\n  const own=gvBy[String(saved.sector)]||'';\n  if(!own) return false;\n  if(saved.dest.some(s=>(gvBy[String(s)]||'')!==own)) return true;\n  // A stage saved before foreign-GV neighbours stopped being drawn can hold a perfectly clean dest and\n  // STILL carry their shapes in nbrFeat/nbrCurrentSector — it would repaint the old map straight from\n  // cache. An unknown gerência is not evidence of a foreign one, so only a known, differing GV replays.\n  return Object.values(saved.nbrCurrentSector||{}).some(s=>{ const g=gvBy[String(s)]||''; return g&&g!==own; });\n}\nfunction remapAssign(mv,savedAssign){\n  const keys=Object.keys(mv.munis||{}).filter(k=>k!=='__OUTROS__');\n  const out={};\n  Object.entries(savedAssign||{}).forEach(([k,v])=>{\n    if(keys.indexOf(k)>=0){ out[k]=v; return; }\n    const cand=keys.filter(x=>mName(x)===mName(k));\n    if(cand.length===1) out[cand[0]]=v;\n  });\n  return out;\n}\nfunction newSession(){\n  SESS.sessionId=null; SESS.sessionLabel=null; SESS.timeline=[]; SESS.selected=0; SESS.sectorBaseCache={};\n  SESS.settings={...DEFAULT_SETTINGS};\n  SESS.snapshotRaw=null; SESS.snapshotSyncedAt=null; SESS.snapLiteral=null; SESS.eloMaxCycle=null; SESS.stage='loading'; SESS.dirtyFrom=null;\n  (async()=>{\n    loader(true,'iniciando nova sessão…');\n    try{ await Promise.all([ensurePinned(), loadSectors()]); SESS.stage='confirm'; }\n    catch(e){ setError('erro init: '+e.message); }\n    finally{ loader(false); renderAll(); }\n  })();\n}\n\n// ---------- snapshot refresh ----------\n// Deliberately breaks the frozen-snapshot guarantee, on demand: re-resolves DT_HISTORICO and\n// replays the whole timeline against the new one. Skips the replay when the snapshot has not\n// actually moved, so a stray click on a long timeline costs one cheap probe instead of ~8 queries\n// per etapa.\nasync function refreshSnapshot(){\n  if(SESS.stage!=='main' || SESS.snapBusy) return;\n  SESS.snapBusy=true;\n  const prevRaw=SESS.snapshotRaw;\n  const pill=$('#liveState'); if(pill){ pill.classList.add('busy'); pill.textContent='◌ atualizando snapshot…'; }\n  loader(true,'buscando o snapshot mais recente…');\n  let ok=false;\n  try{\n    const p=await resolveSnapshotPin();\n    if(!p.snapshotRaw) throw new Error('não foi possível resolver DT_HISTORICO');\n    const same=String(p.snapshotRaw)===String(prevRaw);\n    SESS.snapshotRaw=p.snapshotRaw; SESS.snapshotSyncedAt=p.syncedAt; SESS.snapLiteral=p.snapLiteral; SESS.eloMaxCycle=p.eloMaxCycle;\n    await loadSectors();   // the sector list follows the live max, so it can have moved too\n    if(same){\n      $('#ds').textContent=`snapshot já era o mais recente · atualizado em ${fmtSyncedAt(p.syncedAt)} — nada recalculado`;\n    } else if(SESS.timeline.length){\n      SESS.dirtyFrom=null;\n      SESS.sectorBaseCache={};   // baselines come from the snapshot, so every one of them changed\n      loader(true,'snapshot novo — recalculando a timeline…');\n      await recomputeFrom(0);\n      $('#ds').textContent=`snapshot atualizado em ${fmtSyncedAt(p.syncedAt)} · ${fmt(SESS.timeline.length)} etapa(s) recalculada(s)`;\n    } else {\n      $('#ds').textContent=`snapshot atualizado em ${fmtSyncedAt(p.syncedAt)}`;\n    }\n    $('#ds').classList.remove('err');\n    ok=true;\n  }catch(e){\n    const at=(SESS.dirtyFrom==null?null:SESS.dirtyFrom+1);\n    $('#ds').textContent='erro ao atualizar o snapshot'+(at?` na etapa ${at} — etapa ${at} em diante ficou desatualizada (⟳)`:'')+': '+e.message;\n    $('#ds').classList.add('err');\n  }finally{\n    SESS.snapBusy=false;\n    if(pill) pill.classList.remove('busy');\n    loader(false); renderAll();\n    if(ok) setTimeout(()=>{ const d=$('#ds'); if(d&&!d.classList.contains('err')) d.textContent=''; },7000);\n  }\n}\n\n// ---------- session options ----------\nfunction previewDest(mv,rule,minCbs){\n  if(!mv||!mv.allowedRaw||!mv.munis) return null;\n  const w={}; let relaxed=false;\n  const cbsOf=m=>(mv.cbsByMuni&&mv.cbsByMuni[m]!=null)?mv.cbsByMuni[m]:((mv.munis[m]&&mv.munis[m].cbs)||0);\n  const add=m=>Object.entries(mv.allowedRaw[m]||{}).forEach(([s,v])=>{ w[s]=(w[s]||0)+v; });\n  // allowedRaw only carries municipalities already inside the sector's dominance base, so there is\n  // nothing left to filter out here beyond the destination rule itself.\n  Object.keys(mv.allowedRaw).forEach(m=>{ const cbs=cbsOf(m);\n    if(rule==='dominant'&&cbs<minCbs) return; add(m); });\n  if(rule==='dominant'&&!Object.keys(w).length){ Object.keys(mv.allowedRaw).forEach(add); relaxed=true; }\n  return {dest:Object.keys(w).sort((a,b)=>w[b]-w[a]).slice(0,6),relaxed};\n}\nfunction readOptForm(){\n  const r=root.querySelector('input[name=\"destRule\"]:checked');\n  let n=Math.round(+$('#optMinCbs').value);\n  if(!(n>0)) n=DEFAULT_SETTINGS.destMinCbs;\n  return {destRule:(r&&r.value)||DEFAULT_SETTINGS.destRule, destMinCbs:n,\n          targetSpan:numOrNull($('#optTargetSpan').value),\n          maxSpan:numOrNull($('#optMaxSpan').value),\n          minSpan:numOrNull($('#optMinSpan').value)};\n}\nfunction spanFormError(f){\n  if(f.minSpan&&f.maxSpan&&f.minSpan>f.maxSpan) return `Span mínimo (${fmt(f.minSpan)}) não pode ser maior que o máximo (${fmt(f.maxSpan)}).`;\n  if(f.targetSpan&&f.maxSpan&&f.targetSpan>f.maxSpan) return `Span alvo (${fmt(f.targetSpan)}) não pode passar do máximo (${fmt(f.maxSpan)}).`;\n  if(f.targetSpan&&f.minSpan&&f.targetSpan<f.minSpan) return `Span alvo (${fmt(f.targetSpan)}) não pode ficar abaixo do mínimo (${fmt(f.minSpan)}).`;\n  return '';\n}\nfunction renderOptPreview(){\n  const el=$('#optPreview'); if(!el) return;\n  const f=readOptForm();\n  root.querySelectorAll('.opt-row').forEach(r=>{\n    if(r.dataset.r!=null) r.classList.toggle('on',r.dataset.r===f.destRule);\n  });\n  const wrap=$('#optMinCbsWrap'); if(wrap) wrap.classList.toggle('off',f.destRule!=='dominant');\n  const err=spanFormError(f), ee=$('#optSpanErr');\n  if(ee){ ee.textContent=err; ee.classList.toggle('hidden',!err); }\n  const ap=$('#optApply'); if(ap) ap.disabled=!!err;\n  const mv=SESS.timeline[SESS.selected];\n  if(!mv||!mv.munis){ el.innerHTML='Nenhuma etapa calculada ainda — as regras passam a valer no próximo fechamento.'; return; }\n  const cbsOf=m=>(mv.cbsByMuni&&mv.cbsByMuni[m]!=null)?mv.cbsByMuni[m]:((mv.munis[m]&&mv.munis[m].cbs)||0);\n  const ms=Object.keys(mv.geoFeat||{});\n  const ig=f.destRule==='dominant'?ms.filter(m=>cbsOf(m)<f.destMinCbs):[];\n  const pv=previewDest(mv,f.destRule,f.destMinCbs);\n  let h=`<b style=\"color:var(--ink)\">Prévia — etapa ${SESS.selected+1}, setor ${mv.sector}</b><br>`;\n  const exN=(mv.excludedMunis||[]).length;\n  if(exN) h+=`Base de dominantes: <b>${fmt(ms.length)}</b> município(s) no mapa · <span style=\"color:var(--closing)\">${fmt(exN)} fora da base — ${fmt(mv.excludedCbs||0)} CBs seguem suas líderes</span><br>`;\n  h+=`${fmt(ms.length-ig.length)} de ${fmt(ms.length)} município(s) valem como ponte`;\n  if(ig.length) h+=` · <span style=\"color:var(--closing)\">ignorados:</span> ${ig.slice(0,8).join(', ')}${ig.length>8?' +'+(ig.length-8):''}`;\n  if(pv){\n    h+=`<br>Setores destino com esta regra: <b style=\"color:var(--ink)\">${pv.dest.join(', ')||'–'}</b>`;\n    const cur=(mv.dest||[]).join(', ');\n    if(pv.dest.join(',')!==(mv.dest||[]).join(',')) h+=` <span style=\"color:var(--closing)\">(hoje: ${cur||'–'})</span>`;\n    if(pv.relaxed) h+=`<br><b style=\"color:var(--closing)\">⚠ nenhum município dominante nesta etapa — a regra relaxa pra \"qualquer município\" pra não deixar a etapa sem destino.</b>`;\n  }\n  if(f.targetSpan||f.maxSpan||f.minSpan){\n    const sp=spanMapFor(mv,mv.assign||{}), v=spanViolationsOf(sp,{target:f.targetSpan,max:f.maxSpan,min:f.minSpan});\n    h+=`<br><br>Span dos destinos como está hoje: ${mv.dest.map(s=>s+' <b>'+fmt(sp[s])+'</b>').join(' · ')||'–'}`;\n    if(v.over.length||v.under.length) h+=`<br><span style=\"color:var(--closing)\">Fora dos limites: ${[...v.over.map(s=>s+' ▲ acima do máx'),...v.under.map(s=>s+' ▼ abaixo do mín')].join(', ')}</span> — o modelo ÓTIMO tenta corrigir no recálculo.`;\n    else h+=` <span style=\"color:var(--ok)\">— já dentro dos limites</span>`;\n  }\n  if(SESS.timeline.length) h+=`<br><span style=\"margin-top:4px;display:inline-block\">Aplicar <b>recalcula as ${fmt(SESS.timeline.length)} etapa(s)</b> contra o snapshot congelado — os destinos ajustados à mão serão refeitos pelo modelo ÓTIMO.</span>`;\n  el.innerHTML=h;\n}\nfunction openOptions(){\n  const st={...DEFAULT_SETTINGS,...(SESS.settings||{})};\n  root.querySelectorAll('input[name=\"destRule\"]').forEach(r=>{ r.checked=(r.value===st.destRule); });\n  $('#optMinCbs').value=st.destMinCbs;\n  $('#optTargetSpan').value=st.targetSpan||'';\n  $('#optMaxSpan').value=st.maxSpan||'';\n  $('#optMinSpan').value=st.minSpan||'';\n  $('#optApply').disabled=false;\n  $('#optSessName').textContent=SESS.sessionLabel||'sessão não salva';\n  $('#optStatus').textContent='';\n  $('#optionsBg').classList.remove('hidden');\n  renderOptPreview();\n  const c=$('#optCancel'); if(c) c.focus();\n}\nfunction closeOptions(){ const b=$('#optionsBg'); if(b) b.classList.add('hidden'); }\nasync function applyOptions(){\n  const f=readOptForm();\n  if(spanFormError(f)) return;\n  const prev={...DEFAULT_SETTINGS,...(SESS.settings||{})};\n  const changed = prev.destRule!==f.destRule\n    || (f.destRule==='dominant' && prev.destMinCbs!==f.destMinCbs)\n    || numOrNull(prev.targetSpan)!==f.targetSpan\n    || numOrNull(prev.maxSpan)!==f.maxSpan\n    || numOrNull(prev.minSpan)!==f.minSpan;\n  SESS.settings={...prev,...f};\n  closeOptions();\n  if(!changed || !SESS.timeline.length){ renderAll(); return; }\n  SESS.dirtyFrom=null;\n  SESS.sectorBaseCache={};   // the recompute re-derives every baseline; keeping the old ones would\n                             // leave \"Impacto acumulado\" comparing against pre-change numbers\n  loader(true,'aplicando nova regra de destino — recalculando timeline…');\n  try{\n    await recomputeFrom(0);\n    $('#ds').textContent=''; $('#ds').classList.remove('err');\n  }catch(e){\n    const at=(SESS.dirtyFrom==null?0:SESS.dirtyFrom)+1;\n    $('#ds').textContent=`erro ao aplicar a regra na etapa ${at}: ${e.message} — etapa ${at} em diante ficou desatualizada (⟳)`;\n    $('#ds').classList.add('err');\n  }finally{ loader(false); renderAll(); }\n}\n\nconst SHARED_DS='timeline-shared-sessionsDataSet';\nconst AUTH_REF='timelineSimAuthFinal';   // single source of truth for the auth strategy reference\nlet SHARE={busy:false,url:null,last:null};\n// Serialise a PRESENTATION model, not the raw session, so the reader stays purely presentational\n// and never re-derives spans/desloc/orphans — no second copy of this engine to keep in sync.\n// NOTE: METRICS_DEF[2] is the money marker; read it as !!md[2] (a literal dollar sign in this\n// position trips the upsert's parse check).\nfunction buildShareStages(){\n  return SESS.timeline.map((mv,i)=>{\n    const c=computeDerived(mv);\n    const incBy={};\n    mv.dest.forEach(s=>{ incBy[s]=Object.fromEntries(METRICS_DEF.map(md=>[md[0],0])); });\n    Object.entries(mv.munis).forEach(([m,o])=>{\n      if(m==='__OUTROS__') return;\n      const s=mv.assign[m]; if(!s||!incBy[s]) return;\n      METRICS_DEF.forEach(md=>{ incBy[s][md[0]]+=o[md[0]]||0; });\n    });\n    const saiTot={};\n    METRICS_DEF.forEach(md=>{\n      const k=md[0];\n      saiTot[k]=Object.entries(mv.munis).filter(([m])=>m!=='__OUTROS__').reduce((a,p)=>a+((p[1][k])||0),0);\n    });\n    // orphans follow their leader's home: they enter that sector AND leave the closing one\n    c.leaders.forEach(L=>{\n      const om=mv.orphanMetricsByGroup&&mv.orphanMetricsByGroup[L.grupo];\n      if(!om||!L.home) return;\n      METRICS_DEF.forEach(md=>{ const k=md[0];\n        if(incBy[L.home]) incBy[L.home][k]+=om[k]||0;\n        saiTot[k]+=om[k]||0; });\n    });\n    const ms=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__').sort((a,b)=>mv.munis[b].cbs-mv.munis[a].cbs);\n    const sv=mv.dest.map(s=>c.span[s]);\n    const baseOf=(s,k)=>{ const b=mv.baseMetrics[s]||{}; return +(b[k]||0); };\n    return {\n      i:i, sector:mv.sector, policy:mv.policy, domUF:mv.domUF,\n      optTier:(mv.optTier==null?0:mv.optTier),\n      destRuleFallback:!!mv.destRuleFallback,\n      dest:mv.dest.slice(), color:Object.assign({},mv.color), assign:Object.assign({},mv.assign),\n      kpis:{ cbsRealocadas:closingCbsOf(mv), desloc:c.desloc,\n             spread:(sv.length?Math.max.apply(null,sv)-Math.min.apply(null,sv):0),\n             municipios:ms.length, lideres:mv.leaders.length },\n      destinos:mv.dest.map(s=>({ s:s, base:baseOf(s,'cbs'), inc:c.inc[s]||0, orph:c.orph[s]||0, span:c.span[s]||0, gained:c.gained[s]||0 })),\n      municipios:ms.map(m=>({ nome:mName(m), uf:mUf(m), cbs:mv.munis[m].cbs, destino:mv.assign[m]||null })),\n      excluidos:(mv.excludedMunis||[]).map(x=>({ muni:x.muni, cbs:x.cbs })),\n      orphanTotal:c.orphanTotal||0, orphanStranded:c.orphanStranded||0, noShapeCbs:mv.noShapeCbs||0,\n      lideres:c.leaders.map(L=>({ lider:(L.lider||'').split(' ').slice(0,2).join(' '), grupo:L.grupo,\n        total:L.total, home:L.home, desloc:L.desloc, orphan:L.orphan||0 })),\n      metricas:METRICS_DEF.map(md=>{ const k=md[0];\n        return { key:k, label:md[1], money:!!md[2],\n          rows:mv.dest.map(s=>({ s:s, antes:baseOf(s,k), depois:baseOf(s,k)+((incBy[s]&&incBy[s][k])||0) })),\n          sai:saiTot[k]||0 }; }),\n      geoFeat:mv.geoFeat, nbrFeat:mv.nbrFeat, excludedFeat:[]\n    };\n  });\n}\nfunction buildShareSummary(stages){\n  const world=foldWorldState(SESS.timeline,SESS.timeline.length);\n  const receivers=[];\n  SESS.timeline.forEach((mv,i)=>{\n    const own=mv.pureOwnMetrics||{};\n    receivers.push({ s:mv.sector, situacao:'fechado (etapa '+(i+1)+')', antes:+(own.cbs||0), depois:0 });\n  });\n  const seen={};\n  Object.values(world.muniOverride).forEach(s=>{\n    if(seen[s]) return; seen[s]=1;\n    const base=SESS.sectorBaseCache[s]||{}, infl=world.sectorInflow[s]||{};\n    receivers.push({ s:s, situacao:'recebeu território', antes:+(base.cbs||0), depois:(+(base.cbs||0))+(infl.cbs||0) });\n  });\n  return { stages:stages.length, sectors:SESS.timeline.map(mv=>mv.sector),\n    totalCbs:stages.reduce((a,s)=>a+(s.kpis.cbsRealocadas||0),0),\n    totalDesloc:stages.reduce((a,s)=>a+(s.kpis.desloc||0),0), receivers:receivers };\n}\nfunction renderShareBody(){\n  const el=$('#shareBody'); if(!el) return;\n  const go=$('#shareGo'), cp=$('#shareCopy'), op=$('#shareOpen'), cc=$('#shareCancel');\n  if(SHARE.url){\n    el.innerHTML=`<div class=\"opt-note\" style=\"margin-top:0\"><b style=\"color:var(--ink)\">Sessão compartilhada ✓</b><br>\n      Link de leitura desta simulação congelada. Quem abrir precisa ter login no simulador.\n      <div class=\"shareurl\">${esc(SHARE.url)}</div></div>`;\n    if(go) go.classList.add('hidden');\n    if(cp) cp.classList.remove('hidden');\n    if(op) op.classList.remove('hidden');\n    if(cc) cc.textContent='Fechar';\n    return;\n  }\n  if(go) go.classList.remove('hidden');\n  if(cp) cp.classList.add('hidden');\n  if(op) op.classList.add('hidden');\n  if(cc) cc.textContent='Cancelar';\n  const st={...DEFAULT_SETTINGS,...(SESS.settings||{})};\n  const desloc=SESS.timeline.reduce((a,mv)=>a+(mv.munis?computeDerived(mv).desloc:0),0);\n  const destTxt=st.destRule==='dominant'?('dominantes ≥'+fmt(st.destMinCbs)+' CBs'):'qualquer município';\n  el.innerHTML=`<div class=\"opt-lbl\">Confirmar compartilhamento</div>\n    <div class=\"opt-sub\">Publica uma <b>cópia congelada</b> desta sessão, exatamente no estado atual.</div>\n    <div class=\"opt-note\" style=\"margin-top:0\">\n      · <b>${fmt(SESS.timeline.length)}</b> etapa(s) — ${esc(SESS.timeline.map(mv=>mv.sector).join(' → '))}<br>\n      · snapshot atualizado em <b>${esc(fmtSyncedAt(SESS.snapshotSyncedAt))}</b><br>\n      · base: <b>municípios dominantes (CSV)</b> · destino: <b>${esc(destTxt)}</b> · span: <b>${esc(spanShort(st))}</b><br>\n      · <b>${fmt(desloc)}</b> CBs deslocadas somando a cadeia\n    </div>\n    <div class=\"opt-note\">A cópia <b>não</b> acompanha edições posteriores desta sessão — pra atualizar, compartilhe de novo e use o link novo. O link exige login no simulador; não é público.</div>\n    ${SHARE.last?`<div class=\"opt-note\"><b style=\"color:var(--ink)\">Último link gerado nesta sessão</b> — aponta pro estado de <b>antes</b> das edições feitas depois dele.<div class=\"shareurl\">${esc(SHARE.last)}</div></div>`:''}`;\n}\nasync function openShare(){\n  if(!SESS.timeline.length){ $('#ds').textContent='nada pra compartilhar — feche pelo menos um setor primeiro.'; $('#ds').classList.add('err'); return; }\n  await flushDirty();\n  SHARE.url=null;\n  const s=$('#shareStatus'); if(s){ s.textContent=''; s.classList.remove('err'); }\n  renderShareBody();\n  $('#shareBg').classList.remove('hidden');\n  const b=$('#shareCancel'); if(b) b.focus();\n}\nfunction closeShare(){ const b=$('#shareBg'); if(b) b.classList.add('hidden'); }\nasync function doShare(){\n  if(SHARE.busy) return;\n  const go=$('#shareGo'), stx=$('#shareStatus');\n  SHARE.busy=true;\n  if(go){ go.disabled=true; go.textContent='Compartilhando…'; }\n  if(stx){ stx.textContent=''; stx.classList.remove('err'); }\n  try{\n    // Resolved as a GLOBAL PROCESS, not a declared param — which only works because the block\n    // instance on the `main` artboard binds `sharedDataset: @timeline-shared-sessionsDataSet`.\n    // That binding is load-bearing: a Process is only define()d once something on the rendering\n    // tree references it, so without it this lookup returns null and sharing dies on the guard\n    // below. Do NOT remove the instance param because this file never reads d2.params.sharedDataset.\n    const ds=d2.data(SHARED_DS);\n    if(!ds) throw new Error('dataset de sessões compartilhadas indisponível');\n    await flushDirty();\n    const stages=buildShareStages();\n    const summary=buildShareSummary(stages);\n    let who='';\n    try{ const a=d2.auth(AUTH_REF); who=(a&&a.user&&(a.user.email||a.user.nome))||''; }catch(e){}\n    const created=await ds.create({\n      label:SESS.sessionLabel||('Sessão '+new Date().toLocaleString('pt-BR')),\n      snapshotRaw:SESS.snapshotRaw, snapshotSyncedAt:SESS.snapshotSyncedAt,\n      settings:{...DEFAULT_SETTINGS,...(SESS.settings||{})},\n      stages:stages, summary:summary, sharedBy:who, sharedAt:new Date().toISOString()\n    });\n    const id=(created&&created._id)||(created&&created.data&&created.data._id)||(ds.selected&&ds.selected()&&ds.selected()._id)||null;\n    if(!id) throw new Error('registro gravado, mas sem _id na resposta — não foi possível montar o link');\n    SHARE.url=window.location.origin+'/sessions/'+id;\n    SHARE.last=SHARE.url;\n    renderShareBody();\n  }catch(e){\n    if(stx){ stx.textContent='erro ao compartilhar: '+e.message; stx.classList.add('err'); }\n  }finally{\n    SHARE.busy=false;\n    if(go){ go.disabled=false; go.textContent='Compartilhar'; }\n  }\n}\n\n// ---------- rendering ----------\nfunction renderTimeline(){\n  const el=$('#movementChips'); if(!el) return;\n  if(!SESS.timeline.length){ el.innerHTML='<span class=\"empty\">Nenhuma etapa ainda — use \"Fechar setor ▶\" à direita.</span>'; return; }\n  el.innerHTML=SESS.timeline.map((mv,i)=>{\n    const ready=mv.dest!==undefined;\n    const c=ready?computeDerived(mv):null;\n    const stale=SESS.dirtyFrom!=null && i>=SESS.dirtyFrom;\n    return `<div class=\"tchip ${i===SESS.selected?'on':''} ${stale?'stale':''}\" data-i=\"${i}\">\n      <span class=\"tnum\">${i+1}</span><span class=\"tsec\">Setor ${mv.sector}</span>\n      <span class=\"tstat\">${ready?fmt(c.desloc)+' desloc.':'…'}</span>\n      ${stale?'<span class=\"tstale\" title=\"recalcula ao selecionar outra etapa\">⟳</span>':''}\n      <span class=\"trm\" data-rm=\"${i}\" title=\"remover esta etapa e as seguintes\">✕</span>\n    </div>`;\n  }).join('');\n  el.querySelectorAll('.tchip').forEach(ch=>{\n    ch.addEventListener('click',async (e)=>{\n      if(e.target.dataset.rm!=null && e.target.dataset.rm!==''){ removeFrom(+e.target.dataset.rm); return; }\n      const i=+ch.dataset.i;\n      if(i!==SESS.selected) await flushDirty();\n      SESS.selected=i; renderAll();\n    });\n  });\n}\nfunction renderRuleNote(){\n  const el=$('#ruleNote'); if(!el) return;\n  const st={...DEFAULT_SETTINGS,...(SESS.settings||{})};\n  const mv=SESS.timeline[SESS.selected];\n  let h='';\n  h+=`<b style=\"color:var(--ink)\">Base de municípios dominantes:</b> só os municípios que a base (CSV) atribui ao setor entram no mapa e na alocação`;\n  if(mv&&mv.domCsvMunis) h+=` · <b>${fmt(mv.domCsvMunis)}</b> na base do setor ${mv.sector}`;\n  if(mv&&mv.excludedCbs) h+=` · <b style=\"color:var(--closing)\">${fmt(mv.excludedMunis.length)} município(s) / ${fmt(mv.excludedCbs)} CBs</b> fora da base nesta etapa — não aparecem no mapa e as CBs seguem suas líderes (quebra de vínculo)`;\n  if(DOM.error) h+=` · <b style=\"color:var(--closing)\">⚠ base indisponível: ${esc(DOM.error)}</b>`;\n  h+=`<br>`;\n  h+=`<b style=\"color:var(--ink)\">Regra de destino:</b> `;\n  h+= st.destRule==='dominant'\n    ? `só municípios com <b>≥${fmt(st.destMinCbs)} CBs</b> trazem setor pra lista de destinos`\n    : `qualquer município do setor fechado vale como ponte <span style=\"opacity:.7\">(padrão)</span>`;\n  if(mv&&mv.munis&&st.destRule==='dominant'){\n    const ig=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__'&&mv.munis[m].cbs<st.destMinCbs);\n    if(ig.length) h+=` · <b style=\"color:var(--closing)\">${fmt(ig.length)}</b> ignorado(s) como ponte (ainda redistribuído(s)): ${ig.slice(0,5).join(', ')}${ig.length>5?' +'+(ig.length-5):''}`;\n    if(mv.destRuleFallback) h+=`<br><b style=\"color:var(--closing)\">⚠ nenhum município dominante nesta etapa — regra relaxada pra \"qualquer município\".</b>`;\n  }\n  el.innerHTML=h;\n}\nfunction renderSpanRule(){\n  const el=$('#spanRule'); if(!el) return;\n  const mv=SESS.timeline[SESS.selected], lim=spanLimits();\n  if(!mv||!mv.munis||mv.view==='asis'||!spanLimitsOn(lim)){ el.innerHTML=''; return; }\n  const sp=spanMapFor(mv,mv.assign||{}), v=spanViolationsOf(sp,lim);\n  const bits=[];\n  if(lim.target) bits.push(`alvo <b>${fmt(lim.target)}</b>`);\n  if(lim.max) bits.push(`máx <b>${fmt(lim.max)}</b>`);\n  if(lim.min) bits.push(`mín <b>${fmt(lim.min)}</b>`);\n  let h=`Pré-requisito de span: ${bits.join(' · ')} CBs — `;\n  if(v.over.length||v.under.length){\n    h+=`<b style=\"color:var(--closing)\">⚠ `;\n    if(v.over.length) h+=`acima do máximo: ${v.over.map(s=>s+' ('+fmt(sp[s])+')').join(', ')}`;\n    if(v.over.length&&v.under.length) h+=' · ';\n    if(v.under.length) h+=`abaixo do mínimo: ${v.under.map(s=>s+' ('+fmt(sp[s])+')').join(', ')}`;\n    h+=`</b>`;\n    if(mv.optTier===1) h+=`<br><span style=\"opacity:.85\">Nenhuma alocação contígua respeita o span mínimo nesta etapa — o modelo relaxou essa exigência.</span>`;\n    else if(mv.optTier===2) h+=`<br><span style=\"opacity:.85\">Nenhuma alocação contígua respeita os limites nesta etapa — o modelo relaxou essa exigência.</span>`;\n    else if(mv.optTier===-1) h+=`<br><span style=\"opacity:.85\">Etapa resolvida por heurística — os limites não são garantidos.</span>`;\n  } else h+=`<b style=\"color:var(--ok)\">✓ todos os setores receptores dentro dos limites</b>`;\n  el.innerHTML=`<div class=\"note\" style=\"margin:-2px 0 6px\">${h}</div>`;\n}\nfunction renderContig(){const mv=SESS.timeline[SESS.selected];const el=$('#contig');if(!el||!mv)return;\n  if(mv.view==='asis'){el.innerHTML='';return;}\n  const bad=contigBadFor(mv,mv.assign);\n  el.innerHTML=bad.length\n    ?`<div class=\"note\" style=\"color:var(--closing);font-weight:600;margin:-2px 0 6px\">⚠ Contiguidade quebrada em ${bad.join(', ')} — município(s) desconectado(s) do território do setor. Use ★ ÓTIMO ou reassocie no mapa.</div>`\n    :`<div class=\"note\" style=\"color:var(--ok);margin:-2px 0 6px\">✓ Contíguo — cada setor forma uma região conectada.</div>`;\n}\nfunction closingCbsOf(mv){ return Object.entries(mv.munis).filter(([m])=>m!=='__OUTROS__').reduce((a,[,o])=>a+o.cbs,0); }\nfunction sectorTotalCbs(mv){ return Object.values(mv.munis).reduce((a,o)=>a+o.cbs,0); }\nfunction renderKpis(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const c=computeDerived(mv);\n  if(mv.view==='asis'){const mc=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__').length;\n    $('#kpis').innerHTML=[\n      {n:fmt(sectorTotalCbs(mv)),l:`CBs no setor ${mv.sector} (antes desta etapa)`,t:'Total de CBs no setor hoje — já considerando o que etapas anteriores da timeline mandaram pra cá.'},\n      {n:mv.csvMunisTotal?`${fmt(mc)}/${fmt(mv.csvMunisTotal)}`:fmt(mc),l:'Municípios do setor',t:`Municípios desenhados nesta etapa${mv.csvMunisTotal?` de ${fmt(mv.csvMunisTotal)} que a base de dominantes atribui ao setor`:''}.${(mv.missingMunis||[]).length?' Fora do mapa: '+mv.missingMunis.map(x=>x.muni+' ('+x.reason+')').join(' · '):''}${Object.keys(mv.ufGuessed||{}).length?' UF inferida da UF dominante do setor (nome repetido em outra UF carregada): '+Object.entries(mv.ufGuessed).map(([nm,u])=>nm+'→'+u).join(', '):''}`},\n      {n:fmt(mv.leaders.length),l:'Líderes (grupos)',t:'Líderes presentes no setor nesta etapa.'},\n      {n:fmt(mv.dest.length),l:'Setores adjacentes',t:`Setores vizinhos (ainda abertos) da MESMA gerência de vendas (CD_GV ${mv.gv||'?'}) que poderiam receber os municípios.${(mv.gvRejected||[]).length?' Fora do mapa, por serem de outra gerência: '+mv.gvRejected.join(', ')+'.':''}`},\n    ].map(k=>`<div class=\"kpi\" title=\"${k.t}\"><div class=\"n\">${k.n}</div><div class=\"l\">${k.l}</div></div>`).join('');\n    return;}\n  const sv=mv.dest.map(s=>c.span[s]);const spread=sv.length?Math.max(...sv)-Math.min(...sv):0;\n  const zero=mv.dest.filter(s=>c.gained[s]===0);const totCbs=closingCbsOf(mv);\n  $('#kpis').innerHTML=[\n    {n:fmt(c.desloc),l:mv.policy==='fora'?'CBs fora do setor':'CBs c/ quebra de relação',cls:'warn',t:'CBs cuja líder acabou noutro setor nesta etapa.'},\n    {n:fmt(spread),l:'Desequilíbrio (máx−mín CBs)',cls:spread>800?'warn':'ok',t:'Diferença de tamanho entre o maior e o menor setor depois desta etapa.'},\n    {n:fmt(totCbs),l:'CBs realocadas',cls:'',t:`Total de CBs do setor ${mv.sector} sendo redistribuídas nesta etapa.`},\n    {n:zero.length?zero.join(', '):'nenhum',l:'Setor sem líder herdada',cls:zero.length?'warn':'ok',t:'Setor que recebe município(s) mas nenhuma líder nesta etapa.'},\n  ].concat(mv.excludedCbs?[{n:fmt(mv.excludedCbs),l:`CBs ignoradas · ${fmt(mv.excludedMunis.length)} município(s) fora da base`,cls:'warn',t:'CBs em municípios que a base de dominantes não atribui a este setor: ficam fora do mapa e da alocação geográfica e seguem a líder do seu grupo.'}]:[])\n   .concat((mv.missingMunis||[]).length?[{n:fmt(mv.missingMunis.length),l:`Município(s) da base fora do mapa · ${fmt(mv.csvMunisTotal)} na base`,cls:'warn',t:`A base de dominantes atribui ${fmt(mv.csvMunisTotal)} município(s) ao setor ${mv.sector} e ${fmt(mv.csvMunisTotal-mv.missingMunis.length)} chegaram ao mapa. Fora: ${mv.missingMunis.map(x=>x.muni+' — '+x.reason+(x.cbs?' ('+fmt(x.cbs)+' CBs)':'')).join(' · ')}`}]:[])\n   .map(k=>`<div class=\"kpi ${k.cls}\" title=\"${k.t}\"><div class=\"n\">${k.n}</div><div class=\"l\">${k.l}</div></div>`).join('');\n}\nfunction renderSpans(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const c=computeDerived(mv);\n  if(mv.view==='asis'){const items=[{s:mv.sector,val:sectorTotalCbs(mv),color:CLOSE_COLOR}].concat(mv.dest.map(s=>({s,val:+(mv.baseMetrics[s]?.cbs||0),color:mv.color[s]})));\n    const max=Math.max(...items.map(x=>x.val),1);\n    $('#spans').innerHTML=items.map(x=>`<div class=\"bar-row\"><div class=\"tag\" style=\"color:${x.color}\">${x.s}</div><div class=\"bar-track\">\n      <div class=\"bar-inc\" style=\"width:${x.val/max*100}%;background:${x.color}\"></div></div>\n      <div class=\"bar-val\">${fmt(x.val)}</div></div>`).join('')\n      +`<div class=\"note\">Estrutura antes desta etapa — o setor <b>${mv.sector}</b> ainda existe. Alterne pra <b>TOBE</b> pra ver a redistribuição.</div>`;\n    return;}\n  const lim=spanLimits(),on=spanLimitsOn(lim);\n  const rawMax=Math.max(...mv.dest.map(s=>c.span[s]),lim.target||0,lim.max||0,1);\n  const max=on?rawMax*1.04:rawMax;   // headroom so a marker sitting at the scale top stays visible\n  const mk=(v,color,label)=>v?`<div class=\"bar-mark\" style=\"left:${Math.min(99.6,v/max*100).toFixed(1)}%;background:${color}\" title=\"${label}\"></div>`:'';\n  const marks=mk(lim.min,'#ff9500','span mínimo '+fmt(lim.min))+mk(lim.target,'#007aff','span alvo '+fmt(lim.target))+mk(lim.max,'#ff3b30','span máximo '+fmt(lim.max));\n  $('#spans').innerHTML=mv.dest.map(s=>{const base=+(mv.baseMetrics[s]?.cbs||0),i=c.inc[s];\n    const over=lim.max&&c.span[s]>lim.max,under=lim.min&&c.span[s]<lim.min;\n    return `<div class=\"bar-row\"><div class=\"tag\" style=\"color:${mv.color[s]}\">${s}</div><div class=\"bar-track\">\n      <div class=\"bar-base\" style=\"width:${base/max*100}%;background:${mv.color[s]}\"></div>\n      <div class=\"bar-inc\" style=\"width:${i/max*100}%;background:${mv.color[s]}\"></div>${marks}</div>\n      <div class=\"bar-val\" style=\"${over?'color:var(--closing);font-weight:700':(under?'color:#ff9500;font-weight:700':'')}\">${fmt(c.span[s])} <span style=\"opacity:.6\">(+${fmt(i)})</span>${over?' ▲':''}${under?' ▼':''}</div></div>`;}).join('')\n    +`<div class=\"note\">Claro = base (já incluindo etapas anteriores) · cheio = CBs entrantes do ${mv.sector} nesta etapa.${c.orphanTotal?` Inclui <b>${fmt(c.orphanTotal-c.orphanStranded)}</b> CB(s) de municípios fora da base de dominantes que seguiram suas líderes.`:''}${on?' Marcas: <b style=\"color:#007aff\">│</b> alvo · <b style=\"color:#ff3b30\">│</b> máx · <b style=\"color:#ff9500\">│</b> mín.':''}</div>`;\n}\n// Two very different reasons land rows in the __OUTROS__ bucket — no IBGE shape, or outside the\n// sector's dominance base. Same bucket computationally, but they must not read as the same thing.\nfunction outsideNote(mv){\n  const bits=[];\n  if(mv.noShapeCbs) bits.push(`<b>${fmt(mv.noShapeCbs)}</b> CBs em ${fmt(mv.noShapeMunis.length)} município(s) sem shape na UF`);\n  if(mv.excludedCbs) bits.push(`<b>${fmt(mv.excludedCbs)}</b> CBs em ${fmt(mv.excludedMunis.length)} município(s) <b>fora da base de dominantes</b> deste setor — <b style=\"color:var(--closing)\">quebra de vínculo</b>`);\n  if(!bits.length) return '';\n  let h=`<div class=\"note\">Fora do mapa e da alocação geográfica: ${bits.join(' · ')}.`;\n  if(mv.excludedCbs){\n    const c=computeDerived(mv);\n    h+=` As <b>${fmt(mv.excludedCbs)}</b> CBs em quebra de vínculo <b>seguem a líder do seu grupo</b>`;\n    const byS=mv.dest.filter(s=>c.orph[s]).map(s=>`<b style=\"color:${mv.color[s]}\">${s}</b> (${fmt(c.orph[s])})`);\n    h+=byS.length?`: ${byS.join(' · ')}.`:'.';\n    if(c.orphanStranded) h+=` <b style=\"color:var(--closing)\">${fmt(c.orphanStranded)} CB(s) sem destino</b> — a líder não ficou com nenhum município realocado, então não há setor pra seguir.`;\n  }\n  if(mv.noShapeCbs) h+=` As CBs sem shape na UF continuam fora de qualquer setor destino.`;\n  if(mv.excludedMunis&&mv.excludedMunis.length) h+=`<br><span style=\"opacity:.85\">${mv.excludedMunis.slice(0,8).map(x=>x.muni+' ('+fmt(x.cbs)+')').join(', ')}${mv.excludedMunis.length>8?' +'+(mv.excludedMunis.length-8):''}</span>`;\n  return h+`</div>`;\n}\nfunction renderMuni(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const ms=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__').sort((a,b)=>mv.munis[b].cbs-mv.munis[a].cbs);\n  if(mv.view==='asis'){$('#muniList').innerHTML=ms.map(m=>`<div class=\"muni-item\"><div class=\"nm\">${m}</div><div class=\"ct\">${fmt(mv.munis[m].cbs)} CBs</div><span class=\"badge\" style=\"background:${CLOSE_COLOR};color:#fff;border-color:${CLOSE_COLOR}\">setor ${mv.sector}</span></div>`).join('')\n      +`<div class=\"note\">Hoje todos pertencem ao setor <b>${mv.sector}</b>. No <b>TOBE</b> cada um vira botões de destino.</div>`+outsideNote(mv);return;}\n  $('#muniList').innerHTML=ms.map(m=>`<div class=\"muni-item\"><div class=\"nm\">${m}</div><div class=\"ct\">${fmt(mv.munis[m].cbs)} CBs</div>\n    <div class=\"seg\" data-m=\"${m}\">${mv.dest.map(s=>`<button data-s=\"${s}\" class=\"${mv.assign[m]===s?'on':''}\" style=\"${mv.assign[m]===s?'background:'+mv.color[s]:''}\">${s}</button>`).join('')}</div></div>`).join('')\n    +outsideNote(mv);\n  $('#muniList').querySelectorAll('.seg button').forEach(b=>b.onclick=()=>{const m=b.parentElement.dataset.m,s=b.dataset.s;editSelected(m2=>{m2.assign[m]=s;});});\n}\nfunction renderLeaders(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const c=computeDerived(mv);\n  if(mv.view==='asis'){$('#leaders').innerHTML=`<thead><tr><th>Líder</th><th>Grupo</th><th>CBs</th><th>Setor</th></tr></thead><tbody>`\n    +mv.leaders.map(L=>`<tr><td>${(L.lider||'').split(' ').slice(0,2).join(' ')}</td><td>${L.grupo}</td><td>${fmt(L.total)}</td><td><span class=\"home\" style=\"background:${CLOSE_COLOR}\"></span>${mv.sector}</td></tr>`).join('')\n    +`<tr style=\"font-weight:700\"><td>TOTAL</td><td></td><td>${fmt(mv.leaders.reduce((a,L)=>a+L.total,0))}</td><td></td></tr></tbody>`;return;}\n  const showOrph=c.orphanTotal>0;\n  $('#leaders').innerHTML=`<thead><tr><th>Líder</th><th>CBs</th><th>Home</th>${mv.dest.map(s=>`<th>${s}</th>`).join('')}${showOrph?'<th title=\"CBs em municípios fora da base de dominantes que seguiram esta líder\">Órfãs</th>':''}<th>Desloc.</th></tr></thead><tbody>`\n   +c.leaders.map(L=>`<tr><td>${(L.lider||'').split(' ').slice(0,2).join(' ')}</td><td>${fmt(L.total)}</td>\n     <td>${L.home?`<span class=\"home\" style=\"background:${mv.color[L.home]}\"></span>${L.home}`:'–'}</td>\n     ${mv.dest.map(s=>`<td class=\"cell\" style=\"${s===L.home?'color:'+mv.color[s]+';font-weight:700':''}\">${L.byS[s]||'·'}</td>`).join('')}\n     ${showOrph?`<td class=\"cell\" style=\"${L.orphan&&!L.orphanHome?'color:var(--closing);font-weight:700':''}\" title=\"${L.orphan?(L.orphanHome?'seguem a líder para o setor '+L.orphanHome:'sem home — CBs sem setor pra seguir'):''}\">${L.orphan?fmt(L.orphan)+(L.orphanHome?'':' ⚠'):'·'}</td>`:''}\n     <td style=\"color:${L.desloc?'var(--closing)':'var(--mut)'};font-weight:${L.desloc?700:400}\">${L.desloc||'0'}</td></tr>`).join('')\n   +`<tr style=\"font-weight:700\"><td>TOTAL</td><td>${fmt(c.leaders.reduce((a,L)=>a+L.total,0))}</td><td></td>${mv.dest.map(s=>`<td>${fmt(c.leaders.reduce((a,L)=>a+L.byS[s],0))}</td>`).join('')}${showOrph?`<td>${fmt(c.orphanTotal)}</td>`:''}<td style=\"color:var(--closing)\">${fmt(c.desloc)}</td></tr></tbody>`;\n}\nfunction renderMatrix(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const ms=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__').sort((a,b)=>mv.munis[b].cbs-mv.munis[a].cbs);\n  // `_out` is a flag stamped on the ROW, and rows are shared between etapas (absorbed + inherited\n  // orphans), so the last etapa to aggregate wins and reading it here can describe the wrong etapa.\n  // Derive the bucket from THIS mv instead. Summing rather than .find() because several out-municípios\n  // of the same group all collapse into __OUTROS__, and only the first was being counted.\n  const outOf=x=>!mv.geoFeat[mkey(x.municipio,x.uf)];\n  const cell=(m,g)=>mv.matrix.reduce((a,x)=>a+((((outOf(x)?'__OUTROS__':mkey(x.municipio,x.uf))===m)&&String(x.grupo)===g)?+x.cbs:0),0);\n  const mx=Math.max(...ms.flatMap(m=>mv.leaders.map(L=>cell(m,L.grupo))),1);\n  // No destination column here. This is the AS-IS matrix: every município in it still belongs to the\n  // closing sector, so showing where it is HEADED mixed the two states of the world in one table and\n  // made the ASIS view read like a plan. The destination lives on the map and in \"Municípios → setor\n  // destino\", which are about the to-be.\n  $('#matrix').innerHTML=`<thead><tr><th>Município</th>${mv.leaders.map(L=>`<th title=\"${L.lider}\">${L.grupo}</th>`).join('')}<th>Tot</th></tr></thead><tbody>`\n   +ms.map(m=>`<tr><td>${m}</td>`\n     +mv.leaders.map(L=>{const v=cell(m,L.grupo);return `<td class=\"cell\" style=\"${v?`background:rgba(229,181,63,${.08+v/mx*.5})`:''}\">${v||'·'}</td>`;}).join('')\n     +`<td style=\"font-weight:700\">${fmt(mv.munis[m].cbs)}</td></tr>`).join('')+`</tbody>`;\n}\n// TOBE counterpart of the AS-IS matrix: the same município × grupo grid plus the two columns the AS-IS\n// view deliberately refuses to carry — where the município ends up, and under which líder.\n// \"Líder resultante\" is the líder holding the most CBs in that município. A município is served by several\n// grupos at once and the data names no single owner, so the dominant one is the honest answer and its\n// share is printed beside it instead of being hidden behind a single name.\nfunction renderMatrixTobe(){const mv=SESS.timeline[SESS.selected]; const el=$('#matrixTobe'); const nt=$('#tobeNote');\n  if(!el) return;\n  if(!mv||!mv.munis){ el.innerHTML=''; if(nt) nt.innerHTML=''; return; }\n  const c=computeDerived(mv);\n  const homeOf={}; c.leaders.forEach(L=>{ homeOf[L.grupo]=L.home; });\n  const ms=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__').sort((a,b)=>mv.munis[b].cbs-mv.munis[a].cbs);\n  // One pass over the matrix instead of a scan per cell: the AS-IS table can afford the naive version\n  // on six municípios, but this one asks for the dominant líder too, which multiplies the lookups.\n  const outOf=x=>!mv.geoFeat[mkey(x.municipio,x.uf)];\n  const cellBy={}; mv.matrix.forEach(x=>{ const k=(outOf(x)?'__OUTROS__':mkey(x.municipio,x.uf))+'|'+String(x.grupo);\n    cellBy[k]=(cellBy[k]||0)+ +x.cbs; });\n  const cell=(m,g)=>cellBy[m+'|'+g]||0;\n  const mx=Math.max(...ms.flatMap(m=>mv.leaders.map(L=>cell(m,L.grupo))),1);\n  const domLeader=m=>{ let best=null,bc=0;\n    mv.leaders.forEach(L=>{ const v=cell(m,L.grupo); if(v>bc){ bc=v; best=L; } });\n    return best?{L:best,cbs:bc}:null; };\n  const short=L=>(L.lider||'').split(' ').slice(0,2).join(' ')||('grupo '+L.grupo);\n  // NOT named `rows` — that is the module-level Databricks response helper, and shadowing it inside a\n  // render function is a trap for whoever adds a query here later.\n  const recs=ms.map(m=>{ const d=mv.assign[m]||null, dl=domLeader(m);\n    const home=dl?(homeOf[dl.L.grupo]||null):null;\n    // The mismatch worth seeing: the territory goes to one setor while the líder serving it ends up in\n    // another. Under \"manter vínculo\" those CBs stay with her, which is exactly what \"CBs fora do setor\"\n    // counts — so this column is where that KPI becomes a list of names.\n    return {m:m,d:d,dl:dl,home:home,off:!!(dl&&home&&d&&home!==d)}; });\n  el.innerHTML=`<thead><tr><th>Município</th><th>→ Setor</th><th>Líder resultante</th>${mv.leaders.map(L=>`<th title=\"${esc(L.lider||'')}\">${L.grupo}</th>`).join('')}<th>Tot</th></tr></thead><tbody>`\n   +recs.map(r=>`<tr><td>${r.m}</td>`\n     +`<td>${r.d?`<span class=\"home\" style=\"background:${mv.color[r.d]}\"></span>${r.d}`:'–'}</td>`\n     +`<td${r.off?' style=\"color:var(--closing)\"':''} title=\"${r.dl?esc(short(r.dl.L)+' · grupo '+r.dl.L.grupo+' · '+fmt(r.dl.cbs)+' CBs neste município'+(r.home?' · termina no setor '+r.home:' · sem setor de destino')):'nenhuma CB neste município'}\">`\n       +(r.dl?`${esc(short(r.dl.L))} <span class=\"badge\">${r.home||'sem setor'}</span>${r.off?' ⚠':''}`:'–')\n     +`</td>`\n     +mv.leaders.map(L=>{const v=cell(r.m,L.grupo);return `<td class=\"cell\" style=\"${v?`background:rgba(229,181,63,${.08+v/mx*.5})`:''}\">${v||'·'}</td>`;}).join('')\n     +`<td style=\"font-weight:700\">${fmt(mv.munis[r.m].cbs)}</td></tr>`).join('')+`</tbody>`;\n  if(nt){\n    const offN=recs.filter(r=>r.off).length;\n    nt.innerHTML=(mv.policy!=='fora')\n      ? `Política <b>quebrar relação</b>: as CBs deixam a líder atual e passam à estrutura do setor destino — a coluna mostra quem as atende <b>hoje</b>, não quem assume depois.`\n      : `<b>Líder resultante</b> = a líder com mais CBs no município; o chip é o setor onde ela termina. `\n        +(offN?`<span style=\"color:var(--closing)\">${fmt(offN)} município(s) ⚠</span> vão para um setor diferente do da sua líder — as CBs seguem a líder (é disso que o KPI “CBs fora do setor” é feito).`\n          :`Em todos os municípios a líder termina no mesmo setor que recebe o território.`);\n  }\n}\nfunction renderPolicy(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const c=computeDerived(mv);\n  $('#policyNote').innerHTML=mv.policy==='fora'\n    ?`<b style=\"color:var(--acc)\">Mantendo vínculo:</b> ${fmt(c.desloc)} CBs seguem com a líder mas ficam <b>fisicamente noutro setor</b>. Preserva relação; suja geografia.`\n    :`<b style=\"color:var(--acc)\">Quebrando vínculo:</b> ${fmt(c.desloc)} CBs <b>re-vinculam a uma líder do setor destino</b>. Geografia limpa; rompe relação.`;\n}\nfunction renderPlan(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const c=computeDerived(mv);const ms=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__').sort((a,b)=>a.localeCompare(b));\n  mv._plan=ms.map(m=>({municipio:mName(m),uf:mUf(m),cbs:mv.munis[m].cbs,destino:mv.assign[m]}));\n  $('#plan').innerHTML=`Etapa ${SESS.selected+1} · Setor <b>${mv.sector}</b> → ${ms.map(m=>`${m}→<b style=\"color:${mv.color[mv.assign[m]]}\">${mv.assign[m]||'–'}</b>`).join(' · ')}<br>\n   Política: <b>${mv.policy==='fora'?'manter vínculo (CBs fora do setor)':'quebrar relação'}</b> · ${fmt(c.desloc)} CBs impactadas nesta etapa.`\n   +(c.orphanTotal?`<br>Fora da base de dominantes: ${fmt(c.orphanTotal)} CB(s) seguem suas líderes — ${mv.dest.filter(s=>c.orph[s]).map(s=>`${s} (${fmt(c.orph[s])})`).join(' · ')||'–'}${c.orphanStranded?` · <b style=\"color:var(--closing)\">${fmt(c.orphanStranded)} sem líder com destino</b>`:''}. Não entram no CSV, que é por município.`:'');\n}\nfunction renderReport(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const c=computeDerived(mv);\n  mv.metric=mv.metric||'cbs';\n  const KEYS=METRICS_DEF.map(m=>m[0]);\n  const incBy={};mv.dest.forEach(s=>incBy[s]=Object.fromEntries(KEYS.map(k=>[k,0])));\n  Object.entries(mv.munis).forEach(([m,o])=>{if(m==='__OUTROS__')return;const s=mv.assign[m];if(!s||!incBy[s])return;KEYS.forEach(k=>incBy[s][k]+=o[k]||0);});\n  // orphan CBs land on their leader's home sector, not on a geographic destination\n  c.leaders.forEach(L=>{ const om=mv.orphanMetricsByGroup&&mv.orphanMetricsByGroup[L.grupo];\n    if(om&&L.home&&incBy[L.home]) KEYS.forEach(k=>incBy[L.home][k]+=om[k]||0); });\n  const closeTot={};KEYS.forEach(k=>closeTot[k]=Object.entries(mv.munis).filter(([m])=>m!=='__OUTROS__').reduce((a,[,o])=>a+(o[k]||0),0));\n  // they leave the closing sector too, so antes → depois still balances\n  c.leaders.forEach(L=>{ const om=mv.orphanMetricsByGroup&&mv.orphanMetricsByGroup[L.grupo];\n    if(om&&L.home) KEYS.forEach(k=>closeTot[k]+=om[k]||0); });\n  const trend=mv.trend.slice(-6);\n  const chartHTML=mk=>{\n    const isM=['receita','rec_nat','rec_avon'].includes(mk); const fN=isM?money:fmt;\n    const data=mv.dest.map(s=>({label:s,color:mv.color[s],antes:+(mv.baseMetrics[s]?.[mk]||0),depois:+(mv.baseMetrics[s]?.[mk]||0)+(incBy[s]?.[mk]||0)}));\n    data.push({label:mv.sector+'✕',color:'#ff3b30',antes:closeTot[mk]||0,depois:0});\n    const max=Math.max(...data.flatMap(d=>[d.antes,d.depois]),1);\n    const W=720,H=290,base=238,top=42,maxH=base-top,n=data.length,gw=(W-16)/n;\n    let g='';\n    data.forEach((d,i)=>{const cx=8+gw*i+gw/2,bw=Math.min(30,gw*0.30);\n      const ah=d.antes/max*maxH,dh=d.depois/max*maxH,ax=cx-bw-2,dx=cx+2;\n      g+=`<rect x=\"${ax.toFixed(1)}\" y=\"${(base-ah).toFixed(1)}\" width=\"${bw.toFixed(1)}\" height=\"${ah.toFixed(1)}\" rx=\"2.5\" fill=\"${d.color}\" opacity=\"0.35\"/>`;\n      g+=`<rect x=\"${dx.toFixed(1)}\" y=\"${(base-dh).toFixed(1)}\" width=\"${bw.toFixed(1)}\" height=\"${dh.toFixed(1)}\" rx=\"2.5\" fill=\"${d.color}\"/>`;\n      g+=`<text x=\"${(ax+bw/2).toFixed(1)}\" y=\"${(base-ah-4).toFixed(1)}\" text-anchor=\"middle\" font-size=\"9\" fill=\"#9a9aa8\">${fN(d.antes)}</text>`;\n      g+=`<text x=\"${(dx+bw/2).toFixed(1)}\" y=\"${(base-dh-4).toFixed(1)}\" text-anchor=\"middle\" font-size=\"9.5\" font-weight=\"700\" fill=\"${d.color}\">${fN(d.depois)}</text>`;\n      const dp=d.antes?((d.depois-d.antes)/d.antes*100):(d.depois?100:0);\n      g+=`<text x=\"${cx.toFixed(1)}\" y=\"16\" text-anchor=\"middle\" font-size=\"10.5\" font-weight=\"700\" fill=\"${dp>=0?'#34c759':'#ff3b30'}\">${dp>0?'+':''}${dp.toFixed(0)}%</text>`;\n      g+=`<text x=\"${cx.toFixed(1)}\" y=\"${base+16}\" text-anchor=\"middle\" font-size=\"10.5\" font-weight=\"700\" fill=\"#1c1c2b\">${d.label}</text>`;});\n    return `<svg viewBox=\"0 0 ${W} ${H}\" style=\"width:100%\"><line x1=\"8\" y1=\"${base}\" x2=\"${W-8}\" y2=\"${base}\" stroke=\"#e7e7ef\"/>${g}</svg>`;\n  };\n  let h=`<div style=\"display:flex;justify-content:space-between;align-items:center;gap:10px;flex-wrap:wrap\">\n      <h2 style=\"margin:0\">Impacto antes → depois desta etapa</h2>\n      <select id=\"metricSel\">${METRICS_DEF.map(m=>`<option value=\"${m[0]}\" ${m[0]===mv.metric?'selected':''}>${m[1]}</option>`).join('')}</select></div>\n    <div class=\"note\" style=\"margin:2px 0 4px\">Barra clara = <b>antes desta etapa</b> (já incluindo etapas anteriores) · barra cheia = <b>depois</b> · <b style=\"color:var(--acc)\">${mv.sector}✕</b> = setor fechado nesta etapa · % = variação</div>\n    ${chartHTML(mv.metric)}`;\n  h+=`<h2 style=\"margin-top:16px\">Antes → Depois por setor receptor (snapshot congelado)</h2>\n    <div class=\"scroll\"><table><thead><tr><th>Setor</th>${METRICS_DEF.map(m=>`<th>${m[1]}</th>`).join('')}</tr></thead><tbody>`;\n  mv.dest.forEach(s=>{const b=mv.baseMetrics[s]||{};const inc=incBy[s];\n    h+=`<tr><td><span class=\"home\" style=\"background:${mv.color[s]}\"></span>${s}</td>`+\n      METRICS_DEF.map(([k])=>{const bv=+b[k]||0,av=bv+(inc[k]||0);const d=bv?((av-bv)/bv*100):0;const f=METRICS_DEF.find(x=>x[0]===k)[2]==='$'?money:fmt;\n        return `<td>${f(av)}<div class=\"delta ${d>=0?'up':'dn'}\">${d>0?'+':''}${d.toFixed(0)}%</div></td>`;}).join('')+`</tr>`;});\n  h+=`<tr style=\"opacity:.8\"><td>${mv.sector} (sai)</td>`+METRICS_DEF.map(([k,,t])=>`<td>${(t==='$'?money:fmt)(closeTot[k]||0)}</td>`).join('')+`</tr>`;\n  h+=`</tbody></table></div>`;\n  const incLvl={};mv.dest.forEach(s=>incLvl[s]={});\n  Object.keys(mv.munis).forEach(m=>{if(m==='__OUTROS__')return;const s=mv.assign[m];if(!s||!incLvl[s])return;const lv=mv.levelByMuni[m]||{};for(const nv in lv)incLvl[s][nv]=(incLvl[s][nv]||0)+lv[nv];});\n  c.leaders.forEach(L=>{ const ol=mv.orphanLevelByGroup&&mv.orphanLevelByGroup[L.grupo];\n    if(ol&&L.home&&incLvl[L.home]) Object.entries(ol).forEach(([nv,n])=>incLvl[L.home][nv]=(incLvl[L.home][nv]||0)+n); });\n  h+=`<h2 style=\"margin-top:18px\">Consultoras por nível — antes → depois por setor receptor</h2>\n    <div class=\"scroll\"><table><thead><tr><th>Setor</th>${NIVEIS.map(n=>`<th>${n}</th>`).join('')}<th>Total</th></tr></thead><tbody>`;\n  mv.dest.forEach(s=>{const base=mv.baseLevel[s]||{},inc=incLvl[s]||{};let tb=0,ta=0;\n    h+=`<tr><td><span class=\"home\" style=\"background:${mv.color[s]}\"></span>${s}</td>`+\n      NIVEIS.map(nv=>{const b=base[nv]||0,i=inc[nv]||0,a=b+i;tb+=b;ta+=a;\n        return `<td>${a?fmt(a):'·'}${i?`<div class=\"delta up\">+${fmt(i)}</div>`:''}</td>`;}).join('')+\n      `<td style=\"font-weight:700\">${fmt(ta)}${ta-tb?`<div class=\"delta up\">+${fmt(ta-tb)}</div>`:''}</td></tr>`;});\n  h+=`</tbody></table></div><div class=\"note\">Número = CBs por nível <b>depois</b> desta etapa · <span style=\"color:var(--ok)\">+N</span> = entrantes do ${mv.sector}.</div>`;\n  const spk=(key)=>{const vals=trend.map(t=>+t[key]||0);const mx=Math.max(...vals,1);\n    return `<div class=\"spark\">${vals.map(v=>`<div class=\"b\" style=\"height:${(v/mx*100).toFixed(0)}%\" title=\"${fmt(v)}\"></div>`).join('')}</div>\n      <div class=\"note\">${trend.map(t=>String(t.ciclo).slice(-2)).join(' · ')}</div>`;};\n  h+=`<h2 style=\"margin-top:18px\">Setor ${mv.sector} — últimos ${trend.length} ciclos até o snapshot congelado</h2>\n    <div class=\"note\" style=\"margin:-4px 0 8px\">Tendência histórica <b>do próprio setor</b> — não ajustada pela absorção hipotética de etapas anteriores (limitação conhecida: tendência é por setor, não decomponível por município).</div>\n    <div style=\"display:grid;grid-template-columns:repeat(4,1fr);gap:10px\">\n    ${[['cbs','CBs'],['ativas','Ativas'],['receita','Receita'],['pontos','Pontos']].map(([k,l])=>`<div><div class=\"note\" style=\"margin:0 0 3px;font-weight:600;color:var(--ink)\">${l}</div>${spk(k)}</div>`).join('')}</div>`;\n  $('#tab-report').innerHTML=h;\n  const sel=$('#metricSel'); if(sel) sel.onchange=()=>{mv.metric=sel.value; renderReport();};\n}\nfunction renderCumulative(){\n  const el=$('#tab-cumulative'); if(!el) return;\n  if(!SESS.timeline.length){ el.innerHTML='<div class=\"note\">Nenhuma etapa na timeline ainda.</div>'; return; }\n  const ready=SESS.timeline.every(mv=>mv.munis);\n  if(!ready){ el.innerHTML='<div class=\"note\">Aguardando etapas terminarem de calcular…</div>'; return; }\n  const finalWorld=foldWorldState(SESS.timeline,SESS.timeline.length);\n  const openSectors=[...new Set(Object.values(finalWorld.muniOverride))];\n  let h=`<h2 style=\"margin:0 0 8px\">Linha do tempo — ${SESS.timeline.length} fechamento(s)</h2>\n    <div class=\"note\" style=\"margin:-2px 0 10px\">Setores fechados, em ordem: ${SESS.timeline.map(mv=>mv.sector).join(' → ')}. Cada linha abaixo soma o efeito de <b>toda a cadeia</b>, não apenas da última etapa.</div>`;\n  h+=`<div class=\"scroll\"><table><thead><tr><th>Setor</th><th>Situação</th>${METRICS_DEF.map(([,l])=>`<th>${l}</th>`).join('')}</tr></thead><tbody>`;\n  SESS.timeline.forEach((mv,i)=>{\n    h+=`<tr style=\"opacity:.75\"><td>${mv.sector}</td><td>fechado (etapa ${i+1})</td>`+METRICS_DEF.map(([k,,t])=>`<td>${(t==='$'?money:fmt)(mv.pureOwnMetrics?.[k]||0)}</td>`).join('')+`</tr>`;\n  });\n  openSectors.forEach(s=>{\n    const base=SESS.sectorBaseCache[s]||{};\n    const infl=finalWorld.sectorInflow[s]||{};\n    h+=`<tr><td>${s}</td><td>recebeu território</td>`+METRICS_DEF.map(([k,,t])=>{\n      const bv=+base[k]||0, av=bv+(infl[k]||0); const d=bv?((av-bv)/bv*100):0; const f=(t==='$'?money:fmt);\n      return `<td>${f(av)}<div class=\"delta ${d>=0?'up':'dn'}\">${d>0?'+':''}${d.toFixed(0)}%</div></td>`;\n    }).join('')+`</tr>`;\n  });\n  h+=`</tbody></table></div><div class=\"note\">\"Antes\" de um setor receptor é o snapshot congelado (sem nenhum fechamento aplicado); \"depois\" soma tudo que a cadeia inteira jogou pra ele.</div>`;\n  el.innerHTML=h;\n}\nfunction project(feats){let mnx=1/0,mny=1/0,mxx=-1/0,mxy=-1/0;\n  const each=cb=>feats.forEach(f=>{const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];ps.forEach(p=>p.forEach(r=>r.forEach(cb)));});\n  each(p=>{mnx=Math.min(mnx,p[0]);mxx=Math.max(mxx,p[0]);mny=Math.min(mny,p[1]);mxy=Math.max(mxy,p[1]);});\n  const mlat=(mny+mxy)/2,kx=Math.cos(mlat*Math.PI/180),W=700,H=500,pad=22;\n  const gw=(mxx-mnx)*kx,gh=(mxy-mny),sc=Math.min((W-2*pad)/gw,(H-2*pad)/gh);\n  const ox=(W-gw*sc)/2,oy=(H-gh*sc)/2;\n  return p=>[ox+(p[0]-mnx)*kx*sc, oy+(mxy-p[1])*sc];\n}\nfunction pathFor(f,pr){const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];\n  return ps.map(poly=>poly.map(r=>'M'+r.map(p=>{const q=pr(p);return q[0].toFixed(1)+','+q[1].toFixed(1);}).join('L')+'Z').join('')).join('');}\nfunction cxy(f,pr){let x=0,y=0,n=0;const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];ps.forEach(poly=>poly[0].forEach(p=>{const q=pr(p);x+=q[0];y+=q[1];n++;}));return[x/n,y/n];}\n// ---------- label placement ----------\n// Pole of inaccessibility: the interior point farthest from ANY boundary of the dissolved area. A\n// centroid is only a mean — on a concave sector, one split across a river, or a member whose vertex\n// average falls in a bay, it lands outside the very territory it is supposed to name, which is what\n// pushed the sector numbers off their own shapes. Even-odd across every ring of every member is a\n// correct union test here because municipalities tile rather than overlap.\n// The search box is clipped to the viewBox, so the result is inside the territory AND on screen.\n// Rings are decimated first — this is a label, not a measurement — which keeps a 20-município sector\n// to a few million ops, and the result is cached per stage: geometry never changes between renders,\n// only the fill does.\nfunction labelPointFor(fs,pr){\n  const rings=[];\n  (fs||[]).forEach(f=>{ if(!f||!f.geometry) return;\n    const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];\n    ps.forEach(poly=>poly.forEach(r=>{\n      if(!r||r.length<4) return;\n      const step=Math.max(1,Math.floor(r.length/120)),pts=[];\n      for(let i=0;i<r.length;i+=step) pts.push(pr(r[i]));\n      if(pts.length>3) rings.push(pts);\n    }));});\n  if(!rings.length) return null;\n  let mnx=1/0,mny=1/0,mxx=-1/0,mxy=-1/0;\n  rings.forEach(r=>r.forEach(p=>{ if(p[0]<mnx)mnx=p[0]; if(p[0]>mxx)mxx=p[0]; if(p[1]<mny)mny=p[1]; if(p[1]>mxy)mxy=p[1]; }));\n  mnx=Math.max(mnx,2); mny=Math.max(mny,2); mxx=Math.min(mxx,698); mxy=Math.min(mxy,498);\n  if(!(mxx>mnx&&mxy>mny)) return null;\n  const inside=(x,y)=>{ let c=false;\n    for(const r of rings) for(let i=0,j=r.length-1;i<r.length;j=i++){ const a=r[i],b=r[j];\n      if(((a[1]>y)!==(b[1]>y)) && (x<(b[0]-a[0])*(y-a[1])/(b[1]-a[1])+a[0])) c=!c; }\n    return c; };\n  const edgeDist=(x,y)=>{ let m=Infinity;\n    for(const r of rings) for(let i=0,j=r.length-1;i<r.length;j=i++){ const a=r[i],b=r[j];\n      const dx=b[0]-a[0],dy=b[1]-a[1],L=dx*dx+dy*dy;\n      let t=L?(((x-a[0])*dx+(y-a[1])*dy)/L):0; t=t<0?0:(t>1?1:t);\n      const ex=a[0]+t*dx-x,ey=a[1]+t*dy-y,d=ex*ex+ey*ey; if(d<m)m=d; }\n    return Math.sqrt(m); };\n  const W=mxx-mnx,H=mxy-mny,N=26;\n  let best=null,bd=-1;\n  for(let i=0;i<=N;i++) for(let j=0;j<=N;j++){\n    const x=mnx+W*i/N,y=mny+H*j/N;\n    if(!inside(x,y)) continue;\n    const d=edgeDist(x,y); if(d>bd){ bd=d; best=[x,y]; }\n  }\n  if(!best) return null;\n  // Hill-climb off the coarse grid: the grid only has to land somewhere in the right lobe, the\n  // refinement finds the deep point inside it — halving the step whenever no neighbour improves.\n  let step=Math.max(W,H)/N/2;\n  for(let k=0;k<7;k++){\n    let moved=false;\n    for(const o of [[1,0],[-1,0],[0,1],[0,-1],[1,1],[1,-1],[-1,1],[-1,-1]]){\n      const x=best[0]+o[0]*step,y=best[1]+o[1]*step;\n      if(x<mnx||x>mxx||y<mny||y>mxy||!inside(x,y)) continue;\n      const d=edgeDist(x,y); if(d>bd){ bd=d; best=[x,y]; moved=true; }\n    }\n    if(!moved) step/=2;\n  }\n  // The clearance travels with the point: it is the radius of the largest circle that fits inside the\n  // territory there, which is exactly the budget a caller needs to decide how much text will fit.\n  return {p:best,r:bd};\n}\nfunction labelPointOf(mv,key,fs,pr){\n  if(!mv._lbl) mv._lbl={};\n  if(!(key in mv._lbl)) mv._lbl[key]=labelPointFor(fs,pr);\n  return mv._lbl[key];\n}\nfunction drawMap(){\n  const mv=SESS.timeline[SESS.selected]; const svg=$('#map'); const ignNote=$('#mapIgnoredNote');\n  if(!mv){ svg.innerHTML=''; if(ignNote) ignNote.innerHTML=''; return; }\n  const c=computeDerived(mv);const NS='http://www.w3.org/2000/svg'; svg.innerHTML='';\n  const feats=[...mv.nbrFeat,...Object.values(mv.geoFeat)]; if(!feats.length) return;\n  const pr=project(feats);\n  const world=foldWorldState(SESS.timeline,SESS.selected);\n  // The context layer is ONE area per SECTOR, not one shape per município. The unit of this decision\n  // is the destination sector; a scatter of individually outlined municipalities carrying their own\n  // names invited exactly the wrong reading of the map. Members of a sector are filled AND stroked in\n  // the same colour, so the shared borders vanish and the group reads as a single dissolved\n  // territory — the IBGE shapes do not share vertices precisely enough to extract a clean union\n  // outline, and carrying a real polygon-clipping union for a context layer is not worth it.\n  // Labels are COLLECTED here and drawn last, after every path. Drawn inline they were buried by the\n  // next sector's fill, and placement cannot avoid a collision it has not seen yet.\n  const labels=[],placed=[];\n  const textW=(s,fs)=>String(s).length*fs*0.56;\n  // WCAG relative luminance of the fill a label sits on, so ink and halo can invert per label. \"Would\n  // white be better?\" has no single answer on this map: white reads on #5856d6 (L≈0.14) and disappears\n  // on #ff9500 and #34c759 (both L≈0.43, where black wins ~9:1 against white's ~2.2:1) and on every\n  // context fill, which is .32 opacity over white. Decided per label, never globally.\n  const lum=col=>{let h=String(col||'').replace('#','');\n    if(h.length===3) h=h[0]+h[0]+h[1]+h[1]+h[2]+h[2];\n    if(h.length!==6) return 1;\n    const c=[0,2,4].map(i=>parseInt(h.slice(i,i+2),16)/255)\n      .map(v=>v<=0.03928?v/12.92:Math.pow((v+0.055)/1.055,2.4));\n    return 0.2126*c[0]+0.7152*c[1]+0.0722*c[2];};\n  // Centred on (x,y) in BOTH axes. The old box hung off the first line's baseline, so every two-line\n  // label sat half its own height below the point it was supposed to mark.\n  const rectOf=(x,y,lines)=>{const w=Math.max.apply(null,lines.map(l=>textW(l.t,l.size)));\n    const h=lines.reduce((a,l)=>a+l.size*1.2,0);\n    return {x1:x-w/2-2.5,x2:x+w/2+2.5,y1:y-h/2-1.5,y2:y+h/2+1.5};};\n  const nbrBySec={};\n  mv.nbrFeat.forEach(f=>{\n    const nm=mkey(f.properties.name||f.properties.NOME||f.properties.nome||'',f.__uf);\n    const s=String((mv.nbrCurrentSector&&mv.nbrCurrentSector[nm])||'');\n    (nbrBySec[s]=nbrBySec[s]||[]).push(f);\n  });\n  Object.keys(nbrBySec).forEach(s=>{\n    const fs=nbrBySec[s];\n    const isDest=!!s&&mv.dest.includes(s);\n    const closedCtx=!!s&&world.closedSectors.has(s);\n    const col=isDest?(mv.color[s]||null):null;\n    fs.forEach(f=>{\n      const p=document.createElementNS(NS,'path');\n      p.setAttribute('d',pathFor(f,pr));\n      p.setAttribute('class','sect'+(isDest?'':(closedCtx?' closed-ctx':' plain')));\n      if(col){ p.setAttribute('fill',col); p.setAttribute('stroke',col); }\n      svg.appendChild(p);\n    });\n    if(!s) return;\n    // One number per sector, at the pole of inaccessibility of its DISSOLVED area — the whole group\n    // of members at once, not a representative member, so the number sits in the visual middle of the\n    // territory the operator actually sees.\n    const lp=labelPointOf(mv,'s:'+s,fs,pr);\n    // Context areas always read LIGHT — .sect paints dest colours at fill-opacity .32 over white, and\n    // plain/closed-ctx are near-white greys — so a sector number never wants white ink, whatever colour\n    // the sector itself was assigned.\n    if(lp&&lp.p) labels.push({anchor:lp.p,big:true,dark:false,lines:[{t:s,size:11.5,weight:700}]});\n  });\n  const asis=mv.view==='asis';\n  // The UF prefix is information only when the stage actually straddles a border. On a single-UF setor\n  // it is the same three characters repeated on every label — a large share of the clutter and none of\n  // the meaning. The hover tooltip carries the UF either way.\n  const showUf=new Set(Object.keys(mv.geoFeat).map(k=>mUf(k)).filter(Boolean)).size>1;\n  Object.entries(mv.geoFeat).forEach(([m,f])=>{const p=document.createElementNS(NS,'path');p.setAttribute('d',pathFor(f,pr));\n    const fillCol=asis?CLOSE_COLOR:(mv.color[mv.assign[m]]||'#444');\n    p.setAttribute('class','muni');p.setAttribute('fill',fillCol);\n    if(!asis) p.onclick=()=>{editSelected(m2=>{const i=m2.dest.indexOf(m2.assign[m]);if(m2.dest.length)m2.assign[m]=m2.dest[(i+1)%m2.dest.length];m2.selMuni=m;});};\n    p.style.cursor=asis?'default':'pointer';\n    p.onmousemove=e=>{const t=$('#tip');t.style.opacity=1;t.style.left=(e.clientX+12)+'px';t.style.top=(e.clientY+12)+'px';\n      t.innerHTML=asis?`<b>${mDisp(m)}</b><br>${fmt(mv.munis[m]?.cbs||0)} CBs · setor ${mv.sector}`:`<b>${mDisp(m)}</b><br>${fmt(mv.munis[m]?.cbs||0)} CBs → ${mv.assign[m]||'–'}<br><span style=\"color:var(--mut)\">clique p/ trocar</span>`;};\n    p.onmouseleave=()=>$('#tip').style.opacity=0;svg.appendChild(p);\n    // The name is never cut and never dropped. The pole of inaccessibility is still where the label\n    // WANTS to sit — the visual middle of the territory rather than a centroid that can fall outside a\n    // concave shape — but its clearance no longer gates anything: cutting BA-SAO SEBASTIAO DO PASSE\n    // down to BA-SAO SEBAST saved space by destroying the one thing the label existed to convey, and\n    // measuring the name against the inscribed circle rejected the centre for nearly every município.\n    const lp=labelPointOf(mv,'m:'+m,[f],pr);\n    const at=(lp&&lp.p)||cxy(f,pr);\n    const nmFull=(showUf&&mUf(m)?mUf(m)+'-':'')+mName(m);\n    const num=fmt(mv.munis[m]?.cbs||0)+(asis?'':'·'+(mv.assign[m]||'–'));\n    labels.push({anchor:at,cbs:+(mv.munis[m]?.cbs||0),dark:lum(fillCol)<0.18,\n      lines:[{t:nmFull,size:8.2,weight:700},{t:num,size:7,weight:500,mut:true}]});\n  });\n  // Placement, not de-cluttering. Every label IS drawn: it starts at its anchor and, if the text does\n  // not fit the territory or the slot is already taken, walks outward ring by ring until it finds\n  // clear canvas, trailing a hairline leader back to the shape it names. The previous pass dropped the\n  // loser of every collision outright, which is why municípios silently had no name at all.\n  // Order still matters — sector numbers first, then municípios by CB weight — because the earlier a\n  // label is placed the closer to home it lands.\n  const CW=700,CH=500,CPAD=2;\n  const inBounds=r=>r.x1>=CPAD&&r.x2<=CW-CPAD&&r.y1>=CPAD&&r.y2<=CH-CPAD;\n  const hits=r=>placed.reduce((a,q)=>a+((r.x2<q.x1||r.x1>q.x2||r.y2<q.y1||r.y1>q.y2)?0:1),0);\n  // Ring 0 is the anchor itself. Rings step 9u out over 16 directions, stretched horizontally because\n  // a label is wider than it is tall and sideways room is the room it actually needs.\n  const CAND=[[0,0]];\n  for(let ring=1;ring<=7;ring++){ const d=ring*9;\n    for(let a=0;a<16;a++){ const th=a*Math.PI/8; CAND.push([Math.cos(th)*d*1.35,Math.sin(th)*d]); } }\n  labels.sort((a,b)=>(b.big?1:0)-(a.big?1:0)||((b.cbs||0)-(a.cbs||0)));\n  labels.forEach(L=>{\n    let chosen=null,best=null,bestN=Infinity;\n    // Centred on the anchor is ALWAYS the first choice. An earlier cut here refused the anchor whenever\n    // the text was wider than the município's inscribed circle — true of almost every real name at this\n    // scale (BA-SAO SEBASTIAO DO PASSE is ~140u against ~80u of clearance), so every single label got\n    // nudged outside and nothing ended up centred on anything. Spilling past a border is normal on a\n    // choropleth and the halo keeps it readable; only a genuine COLLISION earns a move.\n    for(const off of CAND){\n      const x=L.anchor[0]+off[0], y=L.anchor[1]+off[1];\n      const r=rectOf(x,y,L.lines);\n      if(!inBounds(r)) continue;\n      const n=hits(r);\n      if(!n){ chosen={x,y,r,off}; break; }\n      // No clear slot yet — remember the LEAST crowded one. Falling back to the first in-bounds\n      // candidate meant falling back to the anchor every time, so a crowded map piled every loser onto\n      // the same point. CAND is ordered nearest-first and the compare is strict, so ties keep the\n      // closest slot.\n      if(n<bestN){ bestN=n; best={x,y,r,off}; }\n    }\n    // Canvas genuinely full: take the nearest in-bounds slot and accept the overlap. A label sitting\n    // on top of another is recoverable by eye; a name that was never drawn is not.\n    if(!chosen) chosen=best||{x:L.anchor[0],y:L.anchor[1],r:rectOf(L.anchor[0],L.anchor[1],L.lines),off:[0,0]};\n    placed.push(chosen.r);\n    const g=document.createElementNS(NS,'g'); g.setAttribute('class','lbl'+(L.big?' big':''));\n    if(Math.abs(chosen.off[0])>0.5||Math.abs(chosen.off[1])>0.5){\n      // The leader stops at the label's edge rather than its centre, so it never runs under the glyphs.\n      const cx=(chosen.r.x1+chosen.r.x2)/2, cy=(chosen.r.y1+chosen.r.y2)/2;\n      const hw=(chosen.r.x2-chosen.r.x1)/2, hh=(chosen.r.y2-chosen.r.y1)/2;\n      const dx=L.anchor[0]-cx, dy=L.anchor[1]-cy;\n      const tt=Math.min(dx?hw/Math.abs(dx):Infinity, dy?hh/Math.abs(dy):Infinity);\n      const ln=document.createElementNS(NS,'line'); ln.setAttribute('class','lead');\n      ln.style.stroke=L.dark?'#fff':'#1c1c1e';\n      ln.setAttribute('x1',L.anchor[0].toFixed(1)); ln.setAttribute('y1',L.anchor[1].toFixed(1));\n      ln.setAttribute('x2',(cx+dx*tt).toFixed(1)); ln.setAttribute('y2',(cy+dy*tt).toFixed(1));\n      g.appendChild(ln);\n    }\n    const hTot=L.lines.reduce((a,l)=>a+l.size*1.2,0);\n    let ty=chosen.y-hTot/2+L.lines[0].size*0.86;\n    // Inline style rather than a class: a stylesheet rule would outrank a presentation attribute and\n    // undo the per-label contrast decision made above.\n    const ink=L.dark?'#fff':'#1c1c1e', inkMut=L.dark?'rgba(255,255,255,.85)':'#48484d';\n    const halo=L.dark?'rgba(0,0,0,.6)':'#fff';\n    L.lines.forEach(l=>{ const t=document.createElementNS(NS,'text');\n      t.setAttribute('x',chosen.x.toFixed(1)); t.setAttribute('y',ty.toFixed(1));\n      t.setAttribute('font-size',l.size); t.setAttribute('font-weight',l.weight||600);\n      t.style.fill=l.mut?inkMut:ink; t.style.stroke=halo;\n      t.textContent=l.t; g.appendChild(t); ty+=l.size*1.2; });\n    svg.appendChild(g);\n  });\n  $('#legend').innerHTML=asis\n    ?`<span><b style=\"background:${CLOSE_COLOR}\"></b>Setor ${mv.sector} (estrutura antes desta etapa — ${Object.keys(mv.geoFeat).length} municípios)</span>`\n    // No \"vizinhos (contexto)\" or \"setor já fechado antes\" entry any more: every feature still drawn\n    // belongs to a destination sector, so .sect.plain and .sect.closed-ctx can no longer be produced\n    // and a legend key for them would point at nothing on the map.\n    :mv.dest.map(s=>`<span><b style=\"background:${mv.color[s]}\"></b>Setor ${s} — ${c.gained[s]} líder(es)</span>`).join('');\n  // Municipalities outside the dominance base are deliberately NOT drawn — no shape, no hover, no\n  // legend entry. They are reported in the panel instead, so the map only ever shows territory that\n  // is actually being reallocated.\n  if(ignNote) ignNote.innerHTML=(mv.excludedMunis&&mv.excludedMunis.length)\n    ? `<b style=\"color:var(--closing)\">${fmt(mv.excludedMunis.length)} município(s) / ${fmt(mv.excludedCbs||0)} CBs</b> fora da base de dominantes deste setor não são desenhados no mapa — as CBs seguem a líder do seu grupo (detalhe em “Municípios → setor destino”).`\n    : '';\n}\nasync function runSql(){const sql=$('#sqlIn').value.trim();$('#sqlStatus').textContent='rodando…';$('#sqlStatus').classList.remove('err');\n  try{ await ensurePinned(); const resp=await q(sql);const rs=rows(resp);const cols=(resp.manifest?.schema?.columns||[]).map(c=>c.name);\n    $('#sqlOut').innerHTML=`<thead><tr>${cols.map(c=>`<th>${c}</th>`).join('')}</tr></thead><tbody>`+rs.slice(0,200).map(r=>`<tr>${cols.map(c=>`<td>${r[c]??'·'}</td>`).join('')}</tr>`).join('')+`</tbody>`;\n    $('#sqlStatus').textContent=rs.length+' linha(s)';}\n  catch(e){$('#sqlStatus').textContent='bloqueado/erro: '+e.message;$('#sqlStatus').classList.add('err');}\n}\nfunction renderAll(){\n  renderStage();\n  renderTimeline(); renderSectorPicker();\n  const shb=$('#openShare'); if(shb) shb.disabled=!SESS.timeline.length;\n  const dpb=$('#dupSession'); if(dpb) dpb.disabled=!SESS.timeline.length;\n  const mv=SESS.timeline[SESS.selected];\n  // resolveSnapshotPin falls back to a live sub-select when it cannot pin a literal; saying\n  // \"congelado\" in that case would be a lie, so the pill reports what is actually in the SQL.\n  const pinned=SESS.snapLiteral && !/^\\(SELECT/i.test(SESS.snapLiteral);\n  $('#liveState').textContent = SESS.snapshotRaw\n    ? (pinned?'● snapshot congelado · ':'◍ snapshot ao vivo (não fixado) · ')+'atualizado em '+fmtSyncedAt(SESS.snapshotSyncedAt)+' · ↻'\n    : '● iniciando';\n  const mp=$('#basePill');\n  if(mp){\n    const warn=[];\n    if(DOM.bySetor&&!DOM.hasUf) warn.push('⚠ sem coluna UF');\n    if(DOM.badUf) warn.push('⚠ '+fmt(DOM.badUf)+' UF não reconhecida(s)');\n    if(DOM.clashes) warn.push('⚠ '+fmt(DOM.clashes)+' homônimo(s) no mesmo setor');\n    mp.textContent=DOM.bySetor?('◇ base dominantes: '+fmt(DOM.setores)+' setores · '+fmt(DOM.rows)+' municípios'+(warn.length?' · '+warn.join(' · '):'')):(DOM.error?'◇ base dominantes: indisponível':'◇ base dominantes: carregando…');\n    mp.title=DOM.error||(DOM.bySetor?((DOM.hasUf\n        ?('Coluna de UF usada: \"'+DOM.ufCol+'\".')\n        :('SEM coluna de UF. Colunas lidas: '+((DOM.headers||[]).join(' | ')||'?')+'. A UF de cada município vem desta base — sem ela, homônimos voltam a ser casados só pelo nome.'))\n      +(DOM.badUf?('\\n'+DOM.badUf+' linha(s) com UF irreconhecível — tratadas como desconhecida.'):'')\n      +(DOM.clashes?('\\n'+DOM.clashes+' município(s) aparecem no mesmo setor com UFs diferentes. O SQL agrupa só por DS_MUNICIPIO, então esses chegam somados numa linha única e não há como separá-los.'):'')\n      ):'')||DOM.url||''; }\n  const rp=$('#rulePill'); if(rp) rp.textContent='◈ destino: '+ruleShort(SESS.settings);\n  const sp=$('#spanPill'); if(sp) sp.textContent='◎ span: '+spanShort(SESS.settings);\n  renderRuleNote(); renderSpanRule();\n  if(!mv){ ['#map','#matrix','#matrixTobe','#tobeNote','#leaders'].forEach(s=>{const el=$(s);if(el)el.innerHTML='';}); $('#kpis').innerHTML=''; $('#spans').innerHTML=''; $('#muniList').innerHTML=''; $('#plan').innerHTML=''; return; }\n  $('#mapTitle').textContent=`Etapa ${SESS.selected+1}/${SESS.timeline.length} — fechando setor ${mv.sector}`;\n  $('#viewToggle').querySelectorAll('button').forEach(b=>b.classList.toggle('on',b.dataset.v===mv.view));\n  $('#policy').querySelectorAll('button').forEach(b=>b.classList.toggle('on',b.dataset.p===mv.policy));\n  $('#optBadge').textContent=mv.optBadge||'';\n  drawMap(); renderContig(); renderSpanRule(); renderKpis(); renderSpans(); renderMuni(); renderLeaders(); renderMatrix(); renderMatrixTobe(); renderPolicy(); renderPlan(); renderReport(); renderCumulative();\n}\n\n// ---------- event wiring ----------\n$('#go').onclick=()=>addMovement($('#sectorPick').value);\n$('#confirmSnap').onclick=()=>{ SESS.stage='main'; renderAll(); };\n$('#rand').onclick=()=>{\n  const closed=new Set(SESS.timeline.map(mv=>mv.sector));\n  const pool=SESS.sectorsList.filter(s=>!closed.has(s.setor));\n  const cand=pool.filter(s=>s.munis>=3&&s.munis<=10&&s.cbs>300);\n  const list=cand.length?cand:pool; if(!list.length) return;\n  const pick=list[Math.floor(Math.random()*list.length)];\n  $('#sectorPick').value=pick.setor;\n  addMovement(pick.setor);\n};\n$('#sectorPick').addEventListener('keydown',e=>{ if(e.key==='Enter') addMovement($('#sectorPick').value); });\n$('#confirmSessionPick').onchange=()=>loadSession($('#confirmSessionPick').value);\n$('#optim').onclick=()=>editSelected(mv=>{ mv.assign=optimizeFor(mv); });\n$('#autoTobe').onclick=()=>editSelected(mv=>{ mv.assign=autoAssignFor(mv); mv.optBadge='TOBE por adjacência'; });\n$('#viewToggle').querySelectorAll('button').forEach(b=>b.onclick=()=>{const mv=SESS.timeline[SESS.selected];if(!mv)return;mv.view=b.dataset.v;renderAll();});\n$('#policy').querySelectorAll('button').forEach(b=>b.onclick=()=>{const mv=SESS.timeline[SESS.selected];if(!mv)return;mv.policy=b.dataset.p;renderKpis();renderPolicy();renderPlan();});\nroot.querySelectorAll('.tabs button').forEach(b=>b.onclick=()=>{root.querySelectorAll('.tabs button').forEach(x=>x.classList.toggle('on',x===b));\n  ['matrix','tobe','report','cumulative','sql'].forEach(t=>$('#tab-'+t).classList.toggle('hidden',t!==b.dataset.tab));});\n$('#runSql').onclick=runSql;\n$('#copyPlan').onclick=()=>{const mv=SESS.timeline[SESS.selected];if(!mv)return;navigator.clipboard.writeText(JSON.stringify({setor:mv.sector,politica:mv.policy,plano:mv._plan},null,2));$('#copyPlan').textContent='copiado ✓';setTimeout(()=>$('#copyPlan').textContent='Copiar',1500);};\n$('#csvPlan').onclick=()=>{const mv=SESS.timeline[SESS.selected];if(!mv)return;const csv='municipio,uf,cbs,setor_destino\\n'+mv._plan.map(p=>`${p.municipio},${p.uf||''},${p.cbs},${p.destino}`).join('\\n');\n  const a=document.createElement('a');a.href=URL.createObjectURL(new Blob([csv],{type:'text/csv'}));a.download=`plano_migracao_setor_${mv.sector}.csv`;a.click();};\n$('#saveSession').onclick=saveSession;\n$('#dupSession').onclick=duplicateSession;\n$('#sessionPick').onchange=()=>loadSession($('#sessionPick').value);\n$('#liveState').onclick=refreshSnapshot;\n$('#liveState').addEventListener('keydown',e=>{ if(e.key==='Enter'||e.key===' '){ e.preventDefault(); refreshSnapshot(); } });\n$('#openOptions').onclick=openOptions;\n$('#optClose').onclick=closeOptions;\n$('#optCancel').onclick=closeOptions;\n$('#optApply').onclick=applyOptions;\n$('#optMinCbs').addEventListener('input',renderOptPreview);\n['#optTargetSpan','#optMaxSpan','#optMinSpan'].forEach(id=>$(id).addEventListener('input',renderOptPreview));\nroot.querySelectorAll('input[name=\"destRule\"]').forEach(r=>r.addEventListener('change',renderOptPreview));\n$('#optionsBg').addEventListener('click',e=>{ if(e.target.id==='optionsBg') closeOptions(); });\nroot.addEventListener('keydown',e=>{ if(e.key==='Escape'){ closeOptions(); closeShare(); } });\n\n$('#openShare').onclick=openShare;\n$('#shareX').onclick=closeShare;\n$('#shareCancel').onclick=closeShare;\n$('#shareGo').onclick=doShare;\n$('#shareCopy').onclick=()=>{ if(!SHARE.url) return; navigator.clipboard.writeText(SHARE.url);\n  const b=$('#shareCopy'); if(b){ b.textContent='copiado ✓'; setTimeout(()=>{ const x=$('#shareCopy'); if(x) x.textContent='Copiar link'; },1500); } };\n$('#shareOpen').onclick=()=>{ if(SHARE.url) window.open(SHARE.url,'_blank'); };\n$('#shareBg').addEventListener('click',e=>{ if(e.target.id==='shareBg') closeShare(); });\n\n// ---------- init ----------\n(async()=>{\n  loader(true,'congelando snapshot da sessão…');\n  try{\n    await Promise.all([ensurePinned(), loadSectors(), refreshSessionPicker()]);\n    SESS.stage='confirm';\n  }catch(e){ setError('erro init: '+e.message); }\n  finally{ loader(false); renderAll(); const rd=$('#ready'); if(rd) rd.setAttribute('data-loaded','1'); }\n})();\n\n  }\n}\n","at":"2026-08-11T19:44:40.133Z"}},"updatedAt":"2026-08-11T20:09:03.798Z","createdAt":"2026-08-10T20:46:51.055Z"},{"_id":"6a7ca2f7572546f02874bc0e","component":"data2-core-types@Component","system":"6a57cfe9673eb7e3c5e57784","params":{"component":"RhYKiJbwSgOb93uEW9R5f","package":"natura-geomarketing","title":"Timeline de fechamentos v2","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"sessionsDataset":{"component":"data2-core-types@InteractiveModuleReference"},"dominantesCsvUrl":{"component":"data2-core-types@FileComponentUrlReference"}}}},"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"const T='product.perfil_cb.crm_perfil_cb_diaria_historico';\nconst ELO='product.elo_modelo_combinado.commercial_consultant_index';\nconst PALETTE=['#5856d6','#ff9500','#34c759','#af52de','#ff2d55','#a2845e'];\nconst CLOSE_COLOR='#8e8e93';\nconst UF_CODE={RO:'11',AC:'12',AM:'13',RR:'14',PA:'15',AP:'16',TO:'17',MA:'21',PI:'22',CE:'23',RN:'24',PB:'25',PE:'26',AL:'27',SE:'28',BA:'29',MG:'31',ES:'32',RJ:'33',SP:'35',PR:'41',SC:'42',RS:'43',MS:'50',MT:'51',GO:'52',DF:'53'};\nconst UF_BORDERS={AC:['AM','RO'],AL:['BA','PE','SE'],AM:['AC','RO','RR','PA','MT'],AP:['PA'],\n BA:['AL','SE','PE','PI','TO','GO','MG','ES'],CE:['PI','PB','PE','RN'],DF:['GO','MG'],\n ES:['BA','MG','RJ'],GO:['DF','MT','MS','MG','BA','TO'],MA:['PA','TO','PI'],\n MG:['BA','GO','DF','MS','SP','RJ','ES'],MS:['MT','GO','MG','SP','PR'],MT:['RO','AM','PA','TO','GO','MS'],\n PA:['AP','AM','MT','TO','MA','RR'],PB:['RN','CE','PE'],PE:['PB','CE','PI','BA','AL'],\n PI:['MA','TO','BA','PE','CE'],PR:['SP','MS','SC'],RJ:['ES','MG','SP'],RN:['CE','PB'],\n RO:['AC','AM','MT'],RR:['AM','PA'],RS:['SC'],SC:['PR','RS'],SE:['BA','AL'],\n SP:['MG','RJ','PR','MS'],TO:['PA','MA','PI','BA','GO','MT']};\nconst NIVEIS=['Bronze','Cristal','Prata','Ouro','Diamante','Diamante+'];\nconst METRICS_DEF=[['cbs','CBs'],['ativas','Ativas'],['pedidos','Pedidos'],['pontos','Pontos'],['receita','Receita','$'],['rec_nat','Rec. Natura','$'],['rec_avon','Rec. Avon','$']];\nconst OPT_K=1.5;\nconst SESSIONS_DS='timeline-shared-sessionsDataSet';   // same table as SHARED_DS — see notes at listSessions()\n// Span defaults are the real operating band for a setor receptor, not placeholders: 2200 ≤ span ≤ 3500\n// with 2700 as the target. null meant \"sem limite\", so every new session started with the optimiser\n// balancing against nothing. Existing sessions are NOT touched — their persisted settings carry explicit\n// values that spread OVER these in openOptions/applyOptions, which is deliberate: their etapas were\n// computed under the old band and changing it silently would leave the stored result and the rule that\n// produced it out of sync.\nconst DEFAULT_SETTINGS={destRule:'any',destMinCbs:9,targetSpan:2700,maxSpan:3500,minSpan:2200};\nconst DOM_MEDIA_BASE='https://natura-geomarketing.data2.media/file/';\nconst DOM_CSV_FALLBACK=DOM_MEDIA_BASE+'yw_TQdp0QXEk6JsrliAqP'; \nconst numOrNull=v=>{const n=Math.round(+v);return (isFinite(n)&&n>0)?n:null;};\nconst spanShort=st=>{const p=[];if(st&&st.targetSpan)p.push('alvo '+st.targetSpan);if(st&&st.maxSpan)p.push('máx '+st.maxSpan);if(st&&st.minSpan)p.push('mín '+st.minSpan);return p.length?p.join(' · '):'livre';};\nconst ruleShort=st=>((st&&st.destRule)==='dominant')?('dominantes ≥'+((st&&st.destMinCbs)||DEFAULT_SETTINGS.destMinCbs)+' CBs'):'qualquer municipio';\n\nexport default {\n  css: `\n  :host{display:block;height:100%;--bg:#f5f5f7;--panel:#ffffff;--panel2:#f2f2f7;--line:#e5e5ea;--ink:#1c1c1e;--mut:#6e6e73;--acc:#007aff;--acc2:#0060df;--closing:#ff3b30;--ok:#34c759}\n  *{box-sizing:border-box}\n  .simroot{position:relative;height:100%;overflow:auto;font:13px/1.45 -apple-system,BlinkMacSystemFont,\"SF Pro Text\",\"Segoe UI\",Roboto,sans-serif;background:var(--bg);color:var(--ink);-webkit-font-smoothing:antialiased}\n  header{padding:10px 16px;background:rgba(246,246,248,.85);backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);border-bottom:1px solid var(--line);display:flex;align-items:center;gap:10px;flex-wrap:wrap}\n  header h1{font-size:14.5px;margin:0;font-weight:600;letter-spacing:-.1px;color:var(--ink)}\n  .mac-spacer{flex:1}\n  .howto{padding:8px 16px;background:var(--panel);border-bottom:1px solid var(--line);display:flex;gap:16px;flex-wrap:wrap;font-size:11.5px;color:var(--mut);align-items:center}\n  .howto b{color:var(--ink)} .howto span{max-width:340px}\n  .pill{font-size:10.5px;padding:2.5px 9px;border-radius:99px;border:1px solid var(--line);color:var(--mut);background:var(--panel2)}\n  .pill.live{color:var(--ink);cursor:pointer;user-select:none;transition:border-color .1s,color .1s,background .1s}\n  .pill.live:hover{border-color:var(--acc);color:var(--acc);background:#eaf3ff}\n  .pill.live:focus-visible{outline:2px solid rgba(0,122,255,.35);outline-offset:1px}\n  .pill.live.busy{border-color:var(--acc);color:var(--acc);cursor:progress}\n  .status{font-size:11px;color:var(--mut)}.status.err{color:var(--closing)}\n  select,input,textarea,button{font:inherit}\n  select,input{background:var(--panel);border:1px solid var(--line);color:var(--ink);border-radius:7px;padding:5.5px 9px}\n  select:focus,input:focus{outline:2px solid rgba(0,122,255,.35);outline-offset:0;border-color:var(--acc)}\n  button.act{background:var(--acc);color:#fff;border:1px solid transparent;border-radius:7px;padding:6px 13px;font-weight:600;cursor:pointer;box-shadow:0 1px 1px rgba(0,0,0,.08)}\n  button.act:hover{background:var(--acc2)}\n  button.ghost{background:var(--panel);color:var(--ink);border:1px solid var(--line);border-radius:7px;padding:5.5px 12px;cursor:pointer}\n  button.ghost:hover{background:var(--panel2)}\n  button.ghost.on{border-color:var(--acc);color:var(--acc);background:#eaf3ff}\n  button.ghost:disabled,button.act:disabled{opacity:.4;cursor:not-allowed}\n  .sessbar{padding:9px 20px;background:var(--panel2);border-bottom:1px solid var(--line);display:flex;gap:8px;flex-wrap:wrap;align-items:center}\n  .rail{padding:9px 16px;background:var(--panel);border-bottom:1px solid var(--line);display:flex;gap:8px;align-items:center;overflow-x:auto}\n  #movementChips{display:flex;gap:8px;flex:0 0 auto}\n  #addMovementGroup{display:flex;gap:8px;align-items:center;flex:0 0 auto;margin-left:auto;padding-left:12px;border-left:1px solid var(--line)}\n  #addMovementGroup input{min-width:150px}\n  .tchip{display:flex;align-items:center;gap:7px;background:var(--panel2);border:1px solid var(--line);border-radius:8px;padding:6px 10px;cursor:pointer;font-size:12px;flex:0 0 auto}\n  .tchip.on{border-color:var(--acc);background:#eaf3ff}\n  .tchip.stale{border-style:dashed;opacity:.85}\n  .tchip .tstale{color:#ff9500;font-weight:700}\n  .tchip .tnum{background:var(--ink);color:#fff;border-radius:99px;width:16px;height:16px;font-size:9.5px;display:flex;align-items:center;justify-content:center;font-weight:700}\n  .tchip .tsec{font-weight:600}\n  .tchip .tstat{color:var(--mut)}\n  .tchip .trm{color:var(--mut);font-weight:700;padding:0 3px}\n  .tchip .trm:hover{color:var(--closing)}\n  .rail .empty{color:var(--mut);font-size:12px}\n  .wrap{display:grid;grid-template-columns:minmax(360px,1fr) 430px;gap:14px;padding:14px 16px;align-items:start}\n  @media(max-width:1150px){.wrap{grid-template-columns:1fr}}\n  .card{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:14px 16px;margin-bottom:14px;box-shadow:0 1px 2px rgba(0,0,0,.04)}\n  .card h2{font-size:11px;text-transform:uppercase;letter-spacing:.4px;color:var(--mut);margin:0 0 9px;font-weight:600}\n  /* user-select, not pointer-events. .lbl already sets pointer-events:none, which stops the text from\n     RECEIVING clicks but does not exclude it from the browser's selection range — so cycling a\n     município's destination with repeated clicks kept dragging a double-click selection across the\n     labels. Nothing drawn in an svg here is text anyone needs to copy. */\n  svg{width:100%;height:auto;display:block;user-select:none;-webkit-user-select:none}\n  /* White hairlines inside the closing sector: the municipios read as one territory cut into parts\n     rather than as separate outlined units, and the saturated fills carry the grouping instead of the\n     ink. Neighbour sectors keep their own coloured strokes (.sect) — that contrast is what separates\n     what is being reallocated from what is only context. Selection no longer draws an outline; the\n     white border was the click affordance AND the default is now white, so it had nothing left to say. */\n  .muni{stroke:#fff;stroke-width:1.1;cursor:pointer;transition:filter .1s}.muni:hover{filter:brightness(1.15)}\n  .sect{stroke-width:1;fill-opacity:.32;stroke-opacity:.6}\n  .sect.plain{fill:#e8e8ec;stroke:#d4d4d9;fill-opacity:1;stroke-opacity:1}\n  .sect.closed-ctx{fill:#e2e2e7;stroke:#aeaeb2;stroke-dasharray:3 2;fill-opacity:1;stroke-opacity:1}\n  .lbl{pointer-events:none}\n  /* No plate behind the text: a halo painted UNDER the glyphs (paint-order) keeps a name legible on any\n     fill without stamping an opaque box over the territory it names. Ink and halo are chosen per label\n     from the luminance of the fill underneath, so they are deliberately NOT declared here — a\n     stylesheet rule outranks a presentation attribute and would silently override that choice. */\n  .lbl text{text-anchor:middle;paint-order:stroke fill;stroke-width:2.2px;stroke-linejoin:round;stroke-linecap:round}\n  .lbl.big text{stroke-width:2.9px}\n  .lbl line.lead{stroke-opacity:.5;stroke-width:.8}\n  .legend{display:flex;gap:12px;flex-wrap:wrap;margin-top:8px;font-size:12px}\n  .legend b{display:inline-block;width:11px;height:11px;border-radius:3px;margin-right:5px;vertical-align:-1px}\n  .kpis{display:grid;grid-template-columns:1fr 1fr;gap:9px;margin-bottom:12px}\n  .kpi{background:var(--panel2);border:1px solid var(--line);border-radius:10px;padding:9px 11px}\n  .kpi .n{font-size:19px;font-weight:700}.kpi .l{font-size:10.5px;color:var(--mut);margin-top:2px}\n  .kpi.warn{border-color:#ffd1cc}.kpi.warn .n{color:var(--closing)}.kpi.ok{border-color:#bdeecb}.kpi.ok .n{color:var(--ok)}\n  .bar-row{display:flex;align-items:center;gap:8px;margin:6px 0}\n  .bar-row .tag{width:42px;font-weight:600;font-size:12px}\n  .bar-track{flex:1;height:18px;background:var(--panel2);border-radius:5px;overflow:hidden;display:flex;position:relative}\n  .bar-mark{position:absolute;top:0;bottom:0;width:2px;opacity:.9;z-index:2}\n  .bar-base{height:100%;opacity:.4}.bar-inc{height:100%}\n  .bar-val{width:132px;text-align:right;font-size:11px;color:var(--mut);font-variant-numeric:tabular-nums}\n  table{border-collapse:collapse;width:100%;font-size:11.5px}\n  th,td{padding:5px 6px;text-align:right;border-bottom:1px solid var(--line);font-variant-numeric:tabular-nums}\n  th:first-child,td:first-child{text-align:left}\n  thead th{color:var(--mut);font-weight:600;font-size:10.5px;position:sticky;top:0;background:var(--panel)}\n  .home{display:inline-block;width:9px;height:9px;border-radius:2px;margin-right:4px}\n  .muni-item{display:flex;align-items:center;gap:8px;background:var(--panel2);border:1px solid var(--line);border-radius:8px;padding:5px 8px;margin-bottom:6px}\n  .muni-item .nm{flex:1;font-weight:600;font-size:12px}.muni-item .ct{color:var(--mut);font-size:11px}\n  .seg{display:flex;border:1px solid var(--line);border-radius:7px;overflow:hidden}\n  .seg button{border:0;background:transparent;color:var(--mut);padding:4px 8px;font-size:11px;font-weight:600;cursor:pointer}\n  .seg button.on{color:#fff}\n  .toolbar{display:flex;gap:8px;align-items:center;flex-wrap:wrap}\n  .toggle{display:flex;border:1px solid var(--line);border-radius:8px;overflow:hidden;font-size:12px}\n  .toggle button{background:transparent;border:0;color:var(--mut);padding:6px 10px;cursor:pointer;font-weight:600}\n  .toggle button.on{background:var(--panel2);color:var(--ink)}\n  .note{color:var(--mut);font-size:10.5px;margin-top:7px;line-height:1.5}\n  .cell{font-variant-numeric:tabular-nums}\n  .lider-foot td{background:var(--panel2);font-weight:600;font-size:11px;color:var(--ink);border-bottom:2px solid var(--line);padding:5px 6px;text-align:left}\n  .scroll{max-height:240px;overflow:auto}\n  /* Tables meant to be READ in full rather than sampled. Only the vertical cap is dropped — overflow\n     stays auto so the wide grupo grid can still scroll sideways inside its card, which is the one axis\n     that genuinely cannot fit. */\n  .scroll.grow{max-height:none}\n  .tip{position:fixed;pointer-events:none;background:#1c1c1e;color:#fff;border-radius:8px;padding:7px 9px;font-size:11px;opacity:0;transition:opacity .1s;z-index:9;max-width:230px}\n  .spark{display:flex;align-items:flex-end;gap:3px;height:44px}\n  .spark .b{flex:1;background:var(--acc);border-radius:2px 2px 0 0;min-height:2px;opacity:.85}\n  .delta{font-size:10px}.delta.up{color:var(--ok)}.delta.dn{color:var(--closing)}\n  .tabs{display:flex;gap:6px;margin-bottom:10px;flex-wrap:wrap}\n  .tabs button{background:transparent;border:1px solid var(--line);border-radius:8px;color:var(--mut);padding:6px 12px;cursor:pointer;font-weight:600}\n  .tabs button.on{background:var(--panel2);color:var(--ink);border-color:var(--acc)}\n  .hidden{display:none}\n  .sqlbox{width:100%;height:60px;font-family:ui-monospace,Menlo,monospace;font-size:11px;resize:vertical}\n  .load{position:absolute;inset:0;background:rgba(245,245,247,.85);backdrop-filter:blur(4px);display:flex;align-items:center;justify-content:center;z-index:20;font-size:13px;color:var(--acc);font-weight:600;text-align:center;padding:20px}\n  .load.hidden{display:none}\n  .badge{font-size:10px;padding:1px 6px;border-radius:5px;background:var(--panel2);border:1px solid var(--line);color:var(--mut)}\n  .sheet-bg{position:fixed;inset:0;background:rgba(28,28,30,.34);backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);display:flex;align-items:center;justify-content:center;z-index:40;padding:24px}\n  .sheet-bg.hidden{display:none}\n  .sheet{background:var(--panel);border:1px solid var(--line);border-radius:14px;box-shadow:0 24px 60px rgba(0,0,0,.22);width:min(580px,100%);max-height:100%;display:flex;flex-direction:column;overflow:hidden}\n  .sheet-hd{display:flex;align-items:center;gap:9px;padding:12px 16px;border-bottom:1px solid var(--line)}\n  .sheet-hd h3{margin:0;font-size:14px;font-weight:600;letter-spacing:-.1px}\n  .sheet-x{background:transparent;border:0;color:var(--mut);font-size:13px;cursor:pointer;padding:3px 7px;border-radius:6px}\n  .sheet-x:hover{background:var(--panel2);color:var(--ink)}\n  .sheet-bd{padding:14px 16px;overflow:auto}\n  .sheet-ft{display:flex;align-items:center;gap:8px;padding:11px 16px;border-top:1px solid var(--line);background:var(--panel2)}\n  .opt-lbl{font-size:11px;text-transform:uppercase;letter-spacing:.4px;color:var(--mut);font-weight:600}\n  .opt-sub{font-size:11.5px;color:var(--mut);margin:4px 0 10px;line-height:1.5}\n  .opt-row{display:flex;gap:10px;align-items:flex-start;border:1px solid var(--line);border-radius:10px;padding:10px 12px;margin-bottom:8px;cursor:pointer;background:var(--panel)}\n  .opt-row:hover{background:var(--panel2)}\n  .opt-row.on{border-color:var(--acc);background:#eaf3ff}\n  .opt-row input[type=radio]{margin:2px 0 0;accent-color:var(--acc);flex:0 0 auto}\n  .opt-t{font-size:12.5px;font-weight:600;display:flex;align-items:center;gap:6px;flex-wrap:wrap}\n  .opt-d{font-size:11.5px;color:var(--mut);margin-top:3px;line-height:1.55}\n  .opt-inline{font-size:11.5px;color:var(--mut);margin-top:9px;display:flex;align-items:center;gap:7px;flex-wrap:wrap}\n  .opt-inline.off{opacity:.4;pointer-events:none}\n  .opt-note{border:1px solid var(--line);background:var(--panel2);border-radius:10px;padding:9px 11px;font-size:11.5px;color:var(--mut);line-height:1.6;margin-top:12px}\n  .opt-grid{display:grid;grid-template-columns:1fr 1fr 1fr;gap:8px;margin-top:2px}\n  .opt-fld{display:flex;flex-direction:column;gap:5px;border:1px solid var(--line);border-radius:9px;padding:8px 10px;background:var(--panel2)}\n  .opt-fld span{font-size:11px;color:var(--mut);font-weight:600;line-height:1.35}\n  .opt-fld i{font-style:normal;font-weight:400;opacity:.72}\n  .opt-fld input{width:100%;background:var(--panel)}\n  .opt-err{margin-top:9px;font-size:11.5px;color:var(--closing);font-weight:600}\n  .opt-hr{height:1px;background:var(--line);margin:17px 0 0}\n  .shareurl{margin-top:9px;padding:9px 10px;border-radius:8px;background:var(--panel);border:1px solid var(--acc);\n    font-family:ui-monospace,Menlo,monospace;font-size:11px;color:var(--ink);word-break:break-all;user-select:all}\n`,\n  render(d2){\n    return `<div class=\"simroot\"><header id=\"topHeader\" class=\"hidden\">\n  <h1>Simulador de Timeline de Fechamentos</h1>\n  <span class=\"pill live\" id=\"liveState\" role=\"button\" tabindex=\"0\" title=\"Clique pra buscar o snapshot mais recente e recalcular a timeline inteira\">● iniciando</span>\n  <span class=\"pill ro\">read-only · nunca escreve</span>\n  <span class=\"pill\" id=\"basePill\"></span>\n  <span class=\"pill\" id=\"rulePill\"></span>\n  <span class=\"pill\" id=\"spanPill\"></span>\n  <span class=\"status\" id=\"ds\"></span>\n  <div class=\"mac-spacer\"></div>\n  <select id=\"sessionPick\" style=\"min-width:200px\"></select>\n  <button class=\"ghost\" id=\"openOptions\" title=\"Configurações desta sessão\">⚙ Opções</button>\n  <button class=\"act\" id=\"saveSession\">Salvar sessão</button>\n  <button class=\"ghost\" id=\"dupSession\" title=\"Cria uma cópia independente desta sessão — a original fica intacta e a cópia passa a ser a sessão ativa\">⧉ Duplicar</button>\n  <button class=\"ghost\" id=\"openShare\" title=\"Publicar uma cópia congelada desta sessão em modo leitura\">⇪ Compartilhar</button>\n  <span class=\"status\" id=\"sessStatus\"></span>\n</header>\n\n<div class=\"rail hidden\" id=\"timelineRail\">\n  <div id=\"movementChips\"></div>\n  <div id=\"addMovementGroup\">\n    <input id=\"sectorPick\" list=\"sectorPickList\" placeholder=\"código do setor\" style=\"min-width:150px\">\n    <datalist id=\"sectorPickList\"></datalist>\n    <button class=\"ghost\" id=\"rand\" title=\"Setor aleatório\">🎲</button>\n    <button class=\"act\" id=\"go\">Fechar setor ▶ (nova etapa)</button>\n  </div>\n</div>\n\n<div class=\"card\" id=\"confirmCard\" style=\"margin:14px 20px\">\n  <h2 style=\"margin:0 0 9px\">Confirmar snapshot antes de simular</h2>\n  <div class=\"note\" id=\"confirmBody\">congelando snapshot…</div>\n  <button class=\"act\" id=\"confirmSnap\" style=\"margin-top:12px\">Confirmar snapshot ▶ ir pra simulação</button>\n  <div class=\"note\" style=\"margin-top:16px\">ou continue uma sessão salva:</div>\n  <select id=\"confirmSessionPick\" style=\"min-width:260px;margin-top:4px\"></select>\n  <div class=\"status\" id=\"confirmStatus\" style=\"margin-top:8px\"></div>\n</div>\n\n<div class=\"howto hidden\" id=\"howtoBox\">\n  <b>Como usar &nbsp;→&nbsp;</b>\n  <span><b>1.</b> Escolha um setor pra <b>fechar</b> (ou 🎲) — isso cria a etapa 1 da timeline.</span>\n  <span><b>2.</b> Feche outro setor pra criar a etapa 2 — ela já considera pra onde a etapa 1 mandou cada município.</span>\n  <span><b>3.</b> Clique numa etapa (chip acima) pra revisitar/editar — editar uma etapa recalcula automaticamente todas as etapas seguintes.</span>\n  <span><b>4.</b> Veja o efeito acumulado da cadeia inteira na aba <b>Impacto acumulado</b>.</span>\n</div>\n<div class=\"wrap hidden\" id=\"mainWrap\">\n  <div>\n    <div class=\"card\">\n      <div style=\"display:flex;justify-content:space-between;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:9px\">\n        <h2 id=\"mapTitle\" style=\"margin:0\">Mapa — clique num município p/ trocar o setor destino</h2>\n        <div class=\"toggle\" id=\"viewToggle\" title=\"ASIS = estrutura do setor antes desta etapa (já considerando etapas anteriores) · TOBE = após a redistribuição desta etapa\">\n          <button data-v=\"asis\">◧ ASIS (antes desta etapa)</button>\n          <button data-v=\"tobe\" class=\"on\">◨ TOBE (simulação)</button>\n        </div>\n      </div>\n      <svg id=\"map\" viewBox=\"0 0 700 500\" preserveAspectRatio=\"xMidYMid meet\"></svg>\n      <div class=\"legend\" id=\"legend\"></div>\n      <div class=\"note\">Coloridos = municípios do setor fechado nesta etapa (cor = destino). Ao redor, cada área é um <b>setor vizinho inteiro</b> com o código no meio — não municípios soltos: cor = setor destino, cinza = contexto, cinza tracejado = setor já fechado numa etapa anterior. Shapes reais IBGE/tbrugz.</div>\n      <div class=\"note\" id=\"mapIgnoredNote\"></div>\n    </div>\n\n    <div class=\"card\">\n      <h2>Líderes — destino e CBs deslocadas (nesta etapa)</h2>\n      <div class=\"note\" style=\"margin:-4px 0 9px\"><b>Home</b> = setor que ficou com a maioria das CBs da líder. <b style=\"color:var(--closing)\">Deslocadas</b> = CBs dela que caíram noutro setor.</div>\n      <div class=\"scroll grow\"><table id=\"leaders\"></table></div>\n    </div>\n\n    <div class=\"card\">\n      <div class=\"tabs\">\n        <button data-tab=\"matrix\" class=\"on\">Matriz ASIS</button>\n        <button data-tab=\"tobe\">Matriz TOBE</button>\n        <button data-tab=\"report\">Relatório de impacto (etapa)</button>\n        <button data-tab=\"cumulative\">Impacto acumulado (timeline)</button>\n        <button data-tab=\"sql\">Console SQL</button>\n      </div>\n      <div id=\"tab-matrix\"><div class=\"scroll grow\"><table id=\"matrix\"></table></div></div>\n      <div id=\"tab-tobe\" class=\"hidden\"><div class=\"scroll grow\"><table id=\"matrixTobe\"></table></div>\n        <div class=\"note\" id=\"tobeNote\"></div></div>\n      <div id=\"tab-report\" class=\"hidden\"></div>\n      <div id=\"tab-cumulative\" class=\"hidden\"></div>\n      <div id=\"tab-sql\" class=\"hidden\">\n        <textarea class=\"sqlbox\" id=\"sqlIn\">SELECT DS_MUNICIPIO, COUNT(DISTINCT CD_CONSULTORA) qtd FROM product.perfil_cb.crm_perfil_cb_diaria_historico WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR=3504 GROUP BY DS_MUNICIPIO ORDER BY qtd DESC</textarea>\n        <div class=\"toolbar\" style=\"margin:8px 0\"><button class=\"act\" id=\"runSql\">▶ Rodar</button><span class=\"status\" id=\"sqlStatus\"></span></div>\n        <div class=\"note\" style=\"margin:-4px 0 8px\">Roda contra o snapshot congelado desta sessão (não \"ao vivo\") — mesma coerência da timeline.</div>\n        <div class=\"scroll\"><table id=\"sqlOut\"></table></div>\n      </div>\n    </div>\n  </div>\n\n  <div>\n    <div class=\"card\">\n      <div class=\"toolbar\" style=\"margin-bottom:11px\">\n        <button class=\"ghost\" id=\"optim\" title=\"testa todas alocações contíguas e escolhe a que equilibra a carga entre setores + minimiza a quebra (evita empilhar tudo num setor)\">★ Modelo ÓTIMO (equilíbrio + quebra)</button>\n        <button class=\"ghost\" id=\"autoTobe\" title=\"preenche cada município pelo setor vizinho mais próximo (geografia)\">TOBE por adjacência</button>\n        <span class=\"badge\" id=\"optBadge\"></span>\n      </div>\n      <div class=\"note\" style=\"margin:-4px 0 10px\"><b style=\"color:var(--ink)\">★ ÓTIMO</b> = equilibra a carga entre os setores <b>e</b> minimiza a quebra (contíguo; não empilha tudo num setor). <b style=\"color:var(--ink)\">TOBE</b> = sugestão por vizinhança. Editar esta etapa recalcula automaticamente as etapas seguintes da timeline.</div>\n      <div class=\"note\" id=\"ruleNote\" style=\"margin:-6px 0 11px;padding:7px 9px;background:var(--panel2);border:1px solid var(--line);border-radius:8px\"></div>\n      <div class=\"kpis\" id=\"kpis\"></div>\n      <div id=\"contig\"></div>\n      <div id=\"spanRule\"></div>\n      <h2>Span por setor (CBs) — base + entrantes</h2>\n      <div id=\"spans\"></div>\n      <div style=\"display:flex;justify-content:space-between;align-items:center;margin:14px 0 7px\">\n        <h2 style=\"margin:0\">CBs deslocadas</h2>\n        <div class=\"toggle\" id=\"policy\">\n          <button data-p=\"fora\" class=\"on\">= fora do setor</button>\n          <button data-p=\"quebra\">= quebra de relação</button>\n        </div>\n      </div>\n      <div class=\"note\" id=\"policyNote\"></div>\n    </div>\n\n    <div class=\"card\">\n      <h2>Municípios → setor destino</h2>\n      <div class=\"note\" style=\"margin:-4px 0 9px\">Clique no <b>código do setor</b> pra mandar o município <b>inteiro</b> pra lá (regra de negócio). A cor acompanha o mapa.</div>\n      <div id=\"muniList\"></div>\n    </div>\n\n    <div class=\"card\">\n      <div class=\"toolbar\" style=\"justify-content:space-between\">\n        <h2 style=\"margin:0\">Plano de migração (etapa selecionada)</h2>\n        <div><button class=\"ghost\" id=\"copyPlan\">Copiar</button> <button class=\"ghost\" id=\"csvPlan\">CSV</button></div>\n      </div>\n      <div id=\"plan\" class=\"note\"></div>\n    </div>\n  </div>\n</div>\n\n<div class=\"sheet-bg hidden\" id=\"shareBg\">\n  <div class=\"sheet\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"shareTitle\">\n    <div class=\"sheet-hd\"><h3 id=\"shareTitle\">Compartilhar sessão</h3><div class=\"mac-spacer\"></div><button class=\"sheet-x\" id=\"shareX\" title=\"Fechar\">✕</button></div>\n    <div class=\"sheet-bd\" id=\"shareBody\"></div>\n    <div class=\"sheet-ft\">\n      <span class=\"status\" id=\"shareStatus\"></span>\n      <div class=\"mac-spacer\"></div>\n      <button class=\"ghost hidden\" id=\"shareCopy\">Copiar link</button>\n      <button class=\"ghost hidden\" id=\"shareOpen\">Abrir</button>\n      <button class=\"ghost\" id=\"shareCancel\">Cancelar</button>\n      <button class=\"act\" id=\"shareGo\">Compartilhar</button>\n    </div>\n  </div>\n</div>\n\n<div class=\"sheet-bg hidden\" id=\"optionsBg\">\n  <div class=\"sheet\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"optTitle\">\n    <div class=\"sheet-hd\"><h3 id=\"optTitle\">Opções da sessão</h3><span class=\"badge\" id=\"optSessName\"></span><div class=\"mac-spacer\"></div><button class=\"sheet-x\" id=\"optClose\" title=\"Fechar\">✕</button></div>\n    <div class=\"sheet-bd\">\n      <div class=\"opt-lbl\">Regra rígida — seleção dos setores destino</div>\n      <div class=\"opt-sub\">Define quais setores vizinhos podem entrar na lista de destinos de cada etapa. Vale pra toda a timeline desta sessão.</div>\n      <label class=\"opt-row\" data-r=\"any\">\n        <input type=\"radio\" name=\"destRule\" value=\"any\">\n        <div>\n          <div class=\"opt-t\">Adjacente a qualquer município <span class=\"badge\">padrão</span></div>\n          <div class=\"opt-d\">Um setor entra na lista de destinos se tiver município vizinho a <b>qualquer</b> município do setor fechado — inclusive os menores. É o comportamento de hoje.</div>\n        </div>\n      </label>\n      <label class=\"opt-row\" data-r=\"dominant\">\n        <input type=\"radio\" name=\"destRule\" value=\"dominant\">\n        <div>\n          <div class=\"opt-t\">Adjacente a municípios dominantes</div>\n          <div class=\"opt-d\">Só os municípios do setor fechado com <b>CBs suficientes</b> valem como ponte. Os pequenos continuam sendo redistribuídos normalmente — só não trazem setor novo pra lista de destinos.</div>\n          <div class=\"opt-inline\" id=\"optMinCbsWrap\">Ignorar municípios com menos de <input type=\"number\" id=\"optMinCbs\" min=\"1\" max=\"9999\" step=\"1\" style=\"width:74px\"> CBs</div>\n        </div>\n      </label>\n      <div class=\"opt-hr\"></div>\n      <div class=\"opt-lbl\" style=\"margin-top:15px\">Pré-requisitos do setor destino — tamanho em CBs</div>\n      <div class=\"opt-sub\">Vale pro tamanho de cada setor receptor <b>depois</b> da redistribuição (base + entrantes). Em branco = desligado.</div>\n      <div class=\"opt-grid\">\n        <label class=\"opt-fld\"><span>Span alvo <i>(tamanho ideal)</i></span><input type=\"number\" id=\"optTargetSpan\" min=\"1\" max=\"99999\" step=\"1\" placeholder=\"livre\"></label>\n        <label class=\"opt-fld\"><span>Span máximo <i>(nenhum setor acima)</i></span><input type=\"number\" id=\"optMaxSpan\" min=\"1\" max=\"99999\" step=\"1\" placeholder=\"sem limite\"></label>\n        <label class=\"opt-fld\"><span>Span mínimo <i>(nenhum setor abaixo)</i></span><input type=\"number\" id=\"optMinSpan\" min=\"1\" max=\"99999\" step=\"1\" placeholder=\"sem limite\"></label>\n      </div>\n      <div class=\"opt-err hidden\" id=\"optSpanErr\"></div>\n      <div class=\"opt-note\" id=\"optPreview\"></div>\n    </div>\n    <div class=\"sheet-ft\"><span class=\"status\" id=\"optStatus\"></span><div class=\"mac-spacer\"></div><button class=\"ghost\" id=\"optCancel\">Cancelar</button><button class=\"act\" id=\"optApply\">Aplicar</button></div>\n  </div>\n</div>\n\n<div class=\"tip\" id=\"tip\"></div>\n<div class=\"load hidden\" id=\"loader\">carregando…</div>\n<span id=\"ready\" style=\"display:none\"></span></div>`;\n  },\n  mounted(d2, root){\n\nconst $=s=>root.querySelector(s);\nconst fmt=n=>n==null?'–':Math.round(+n).toLocaleString('pt-BR');\nconst money=n=>{n=+n||0;return n>=1e6?'R$'+(n/1e6).toFixed(1)+'M':n>=1e3?'R$'+(n/1e3).toFixed(0)+'k':'R$'+Math.round(n)};\nconst norm=s=>(s||'').normalize('NFKD').replace(/[̀-ͯ]/g,'').toUpperCase().replace(/[^A-Z0-9]+/g,' ').trim();\nconst esc=s=>(s==null?'':String(s)).replace(/[&<>]/g,c=>({'&':'&amp;','<':'&lt;','>':'&gt;'}[c]));\nconst blankM=()=>({cbs:0,receita:0,rec_nat:0,rec_avon:0,pontos:0,pedidos:0,ativas:0});\n// ---------- município identity ----------\n// Brazil has many municipalities sharing a name (Bom Jesus alone exists in PI, RN, RS, SC, PB, GO).\n// A stage loads the dominant UF PLUS every bordering UF, so those collisions land in the SAME\n// feature set routinely: keyed by name alone the last shape loaded won, the map could draw a\n// município from the wrong state, buildAdj merged two unrelated municipalities into one node, and\n// GROUP BY DS_MUNICIPIO summed two real municipalities into one row. The key is NAME/UF everywhere\n// — SQL rows, GeoJSON features, the dominantes base, assignments, persisted sessions. norm() maps\n// every non-alphanumeric to a space, so '/' can never occur inside a name and the split is exact.\n// A missing UF degrades to a bare NAME key rather than inventing one.\nconst mkey=(name,uf)=>{const n=norm(name),u=String(uf==null?'':uf).trim().toUpperCase();return u?n+'/'+u:n;};\nconst mName=k=>{const s=String(k==null?'':k),i=s.lastIndexOf('/');return i<0?s:s.slice(0,i);};\nconst mUf=k=>{const s=String(k==null?'':k),i=s.lastIndexOf('/');return i<0?'':s.slice(i+1);};\nconst mDisp=k=>{const u=mUf(k);return u?mName(k)+' ('+u+')':mName(k);};\n// The base CSV is the ONLY source of a município's UF now, so its column is accepted in whatever\n// shape the base is maintained in: sigla, IBGE numeric code, or full state name. Anything that does\n// not resolve to a real sigla is treated as UNKNOWN rather than passed through — a bogus UF would key\n// a município to a shape that does not exist and drop it off the map without a word.\nconst UF_OF_CODE={}; Object.keys(UF_CODE).forEach(k=>{ UF_OF_CODE[UF_CODE[k]]=k; });\nconst UF_OF_NAME={ACRE:'AC',ALAGOAS:'AL',AMAPA:'AP',AMAZONAS:'AM',BAHIA:'BA',CEARA:'CE','DISTRITO FEDERAL':'DF','ESPIRITO SANTO':'ES',GOIAS:'GO',MARANHAO:'MA','MATO GROSSO':'MT','MATO GROSSO DO SUL':'MS','MINAS GERAIS':'MG',PARA:'PA',PARAIBA:'PB',PARANA:'PR',PERNAMBUCO:'PE',PIAUI:'PI','RIO DE JANEIRO':'RJ','RIO GRANDE DO NORTE':'RN','RIO GRANDE DO SUL':'RS',RONDONIA:'RO',RORAIMA:'RR','SANTA CATARINA':'SC','SAO PAULO':'SP',SERGIPE:'SE',TOCANTINS:'TO'};\nconst ufNorm=v=>{const s=norm(v); if(!s) return '';\n  if(UF_CODE[s]) return s;\n  if(UF_OF_CODE[s]) return UF_OF_CODE[s];\n  return UF_OF_NAME[s]||'';};\nconst loader=(on,t)=>{const l=$('#loader');l.classList.toggle('hidden',!on);if(t)l.textContent=t;};\nconst setError=(msg)=>{ const t=$('#ds'); if(t){t.textContent=msg;t.classList.add('err');} const c=$('#confirmStatus'); if(c){c.textContent=msg;c.classList.add('err');} };\n\n// ---------- base de municípios dominantes (CSV) ----------\n// WHICH municipalities belong to a sector is a business fact, not something to infer from CB volume:\n// it comes from a maintained CSV (one row per setor x município) linked through the `dominantesCsvUrl`\n// param. Anything the closing sector has CBs in but that the base does NOT assign to it is spillover:\n// not realocated, not drawn on the map, and its CBs follow their leader. Loaded once per URL and\n// cached for the whole session; a failure is thrown, never swallowed — a silent fallback here would\n// quietly change every number on the screen.\nconst DOM={url:null,promise:null,bySetor:null,ufBySetorMuni:null,rows:0,setores:0,hasUf:false,ufCol:null,badUf:0,clashes:0,headers:null,error:null};\nfunction parseCsv(text){\n  const out=[]; let row=[],cur='',q=false;\n  const push=()=>{ row.push(cur); cur=''; };\n  const endRow=()=>{ push(); if(row.length>1||row[0]!=='') out.push(row); row=[]; };\n  for(let i=0;i<text.length;i++){ const ch=text[i];\n    if(q){ if(ch==='\"'){ if(text[i+1]==='\"'){ cur+='\"'; i++; } else q=false; } else cur+=ch; }\n    else if(ch==='\"') q=true;\n    else if(ch===',') push();\n    else if(ch==='\\n') endRow();\n    else if(ch!=='\\r') cur+=ch;\n  }\n  if(cur!==''||row.length) endRow();\n  return out;\n}\n// `dominantesCsvUrl` is declared as a FileComponentUrlReference, so the instance points at the Drive\n// FILE, not at a URL literal — the Drive is policy-gated behind the app's auth strategy and a baked\n// string would be both stale and unauthorised. What the resolver hands back varies by where it is\n// resolved (URL string / file record / bare reference), so accept every shape instead of silently\n// reading undefined and falling through to the fallback.\n// The Drive is gated by the app's AuthenticationStrategy, so this read has to travel as the LOGGED-IN\n// USER — an anonymous CDN GET is exactly what the policy is there to refuse. `<system>.data2.media` is\n// only a cache in front of the SSP: on a cache miss it 302s to `<system>.data2apis.com`, which is where\n// the policy is actually evaluated.\n// COOKIES CANNOT CARRY THAT SESSION, which is why the previous `credentials:'include'` attempt could\n// never have worked: the app runs on <app>.<system>.data2.app and the SSP on <system>.data2apis.com —\n// cross-site — and the SSP answers `Access-Control-Allow-Origin: *` with no `Allow-Credentials`, so the\n// browser rejects a credentialed CORS read before it ever leaves the page. What the SSP actually reads\n// is `Authorization: Bearer <token>`: the runtime keeps that token in localStorage under\n// `__data2-session-<systemDomain>` (`__data2-session-data2` inside the builder preview) and replays it\n// on every dataset and rush call — same token, same header, same session, so the Drive policy sees the\n// logged-in user. Preflight passes because the SSP echoes whatever header the request asks for.\nfunction d2SessionToken(sysDomain){\n  const read=k=>{ try{ return (k&&window.localStorage.getItem(k))||''; }catch(e){ return ''; } };\n  return read(sysDomain?('__data2-session-'+sysDomain):'')||read('__data2-session-data2')||'';\n}\nfunction domCsvSystemDomain(url){\n  const m=/^https?:\\/\\/([^.\\/]+)\\.data2\\.(?:media|app)\\//i.exec(url)||/^https?:\\/\\/([^.\\/]+)\\.data2apis\\.com\\//i.exec(url);\n  return m?m[1]:'';\n}\nfunction domCsvCandidates(url){\n  const out=[];\n  const isMedia=/^https?:\\/\\/[^.\\/]+\\.data2\\.media\\//i.test(url);\n  const api=isMedia?url.replace(/^(https?:\\/\\/[^.\\/]+)\\.data2\\.media\\//i,'$1.data2apis.com/'):null;\n  const tok=d2SessionToken(domCsvSystemDomain(url));\n  const auth=tok?{authorization:'Bearer '+tok}:null;\n  // Authenticated origin read first — the only candidate a GATED Drive can actually answer.\n  if(api&&auth) out.push({url:api,headers:auth,label:'api+sessão'});\n  if(!api&&auth) out.push({url:url,headers:auth,label:'origem+sessão'});\n  // Anonymous last: only ever succeeds on an UNGATED Drive — or on a stale CDN cache hit, which is NOT\n  // proof the file is public (the origin keeps answering 401 once the edge entry expires).\n  if(api) out.push({url:api,headers:null,label:'api anônimo'});\n  out.push({url:url,headers:null,label:'origem anônima'});\n  return out;\n}\nfunction domCsvUrl(){\n  const pick=v=>{\n    if(!v) return '';\n    if(typeof v==='string') return v;\n    const q=v.params||{};\n    const ref=q.reference||v.reference;\n    return q.fileUrl||q.url||v.fileUrl||v.url||(ref?DOM_MEDIA_BASE+ref:'');\n  };\n  return String(pick(d2.param('dominantesCsvUrl'))||DOM_CSV_FALLBACK||'').trim();\n}\nasync function ensureDominantes(){\n  const url=domCsvUrl();\n  if(!url) throw new Error('base de municípios dominantes não configurada — ligue o arquivo CSV no parâmetro dominantesCsvUrl da instância do componente');\n  if(DOM.url===url && DOM.bySetor) return DOM.bySetor;\n  if(DOM.url===url && DOM.promise) return DOM.promise;\n  DOM.url=url; DOM.error=null;\n  DOM.promise=(async()=>{\n    // Self-diagnosing on purpose: every candidate reports its own outcome and the message names the\n    // session it was carrying. \"Unauthorized\" alone cannot distinguish \"not logged into THIS strategy\"\n    // from \"cookie not sent cross-site\" from \"param never bound, so it tried the fallback URL\" — and\n    // guessing between those from the outside costs a round trip each time.\n    let r=null; const tried=[];\n    for(const c of domCsvCandidates(url)){\n      let res=null;\n      try{ res=await fetch(c.url,{cache:'no-store',credentials:'omit',headers:c.headers||undefined}); }\n      catch(e){ tried.push(c.label+' → rede/CORS'); continue; }\n      if(res.ok){ r=res; break; }\n      tried.push(c.label+' → '+res.status);\n    }\n    if(!r){\n      let sess='sessão desconhecida';\n      try{\n        const a=d2.auth(AUTH_REF);\n        sess=(a&&a.isAuthed)?('logado como '+((a.user&&(a.user.email||a.user.nome))||'?')):('NÃO logado na estratégia '+AUTH_REF);\n      }catch(e){ sess='estratégia '+AUTH_REF+' não resolvida'; }\n      const tk=d2SessionToken(domCsvSystemDomain(url));\n      throw new Error('base de municípios dominantes: não foi possível ler o arquivo — '+sess+' · token de sessão '+(tk?'presente':'AUSENTE no localStorage')+'. Tentativas: '+tried.join(' · '));\n    }\n    const table=parseCsv(await r.text());\n    if(table.length<2) throw new Error('base de municípios dominantes vazia');\n    const head=table[0].map(h=>norm(h));\n    const iS=head.indexOf('CD SETOR'), iM=head.indexOf('MUNICIPIO');\n    if(iS<0||iM<0) throw new Error('base de municípios dominantes sem as colunas CD_SETOR / MUNICIPIO');\n    // CD_GV is the gerência de vendas the setor answers to, and it is the authority for the hard rule\n    // that a closing sector only ever hands territory to sectors of its OWN gerência. Its absence is\n    // fatal rather than a warning: with no GV there is no way to PROVE two sectors share one, and\n    // falling through unchecked is exactly the leak this column exists to close.\n    const iG=['CD GV','CDGV','GV','CD GERENCIA','CD GERENCIA VENDAS','CD GERENCIA DE VENDAS','GERENCIA DE VENDAS','GERENCIA'].map(h=>head.indexOf(h)).find(i=>i>=0);\n    if(iG==null) throw new Error('base de municípios dominantes sem a coluna CD_GV — a regra de gerência de vendas não pode ser aplicada. Colunas lidas: '+head.slice(0,40).join(', '));\n    // The UF column is what the whole keying now rests on — SQL no longer carries DS_ESTADO — so its\n    // absence is a first-class finding, not a footnote. The header actually matched is reported on the\n    // base pill, and when nothing matches the pill lists every column read, because guessing a header\n    // name from the outside costs a round trip each time.\n    const iU=['UF','SIGLA UF','SG UF','CD UF','ESTADO','DS ESTADO','SIGLA','ESTADO SIGLA','UF MUNICIPIO'].map(h=>head.indexOf(h)).find(i=>i>=0);\n    const by={},ufBy={},gvBy={}; let n=0,bad=0; const clash={},gvClash={};\n    for(let i=1;i<table.length;i++){\n      const line=table[i]; if(!line) continue;\n      const s=String(line[iS]==null?'':line[iS]).trim(), m=norm(line[iM]);\n      if(!s||!m) continue;\n      // One setor spans many rows (one per município) and every one of them repeats its CD_GV. Two\n      // DIFFERENT values for the same setor means the base itself disagrees about which gerência owns\n      // it — counted and reported, never keyed to whichever row happened to be read last.\n      const gvv=String(line[iG]==null?'':line[iG]).trim();\n      if(gvv){ if(gvBy[s]!==undefined && gvBy[s]!==gvv) gvClash[s]=true; else gvBy[s]=gvv; }\n      const raw=(iU==null)?'':line[iU];\n      const u=(iU==null)?'':ufNorm(raw);\n      if(iU!=null && String(raw==null?'':raw).trim() && !u) bad++;\n      // The same name twice in ONE setor under two UFs is the single case the reverted SQL cannot\n      // survive: mSQL groups by DS_MUNICIPIO alone, so both municipalities arrive summed into one row\n      // and no lookup can split them again. Counted and reported — never quietly keyed to whichever\n      // UF happened to be read last.\n      const kk=s+'|'+m;\n      // An UNRESOLVED uf must never outrank a resolved one. Reading a blank/bogus UF row first wrote ''\n      // here, and the next row carrying the real sigla was then rejected as a clash — so the key stayed\n      // falsy for good, ufFor() fell through, and the município degraded to a bare NAME key that matches\n      // no shape and no dominance entry. With DISTRITO/ZONA in the base a município spans several rows,\n      // so which row lands first is pure luck. A clash is only two RESOLVED siglas that disagree.\n      if(!u){ if(ufBy[kk]===undefined) ufBy[kk]=''; }\n      else if(!ufBy[kk]) ufBy[kk]=u;\n      else if(ufBy[kk]!==u) clash[kk]=true;\n      (by[s]=by[s]||new Set()).add(u?m+'/'+u:m); n++;\n    }\n    if(!n) throw new Error('base de municípios dominantes sem linhas válidas');\n    DOM.bySetor=by; DOM.ufBySetorMuni=ufBy; DOM.rows=n; DOM.setores=Object.keys(by).length;\n    DOM.gvBySetor=gvBy; DOM.gvClashes=Object.keys(gvClash).length; DOM.gvCol=String(table[0][iG]||'').trim();\n    DOM.gvSetores=Object.keys(gvBy).length;\n    DOM.hasUf=(iU!=null); DOM.ufCol=(iU==null?null:String(table[0][iU]||'').trim());\n    DOM.badUf=bad; DOM.clashes=Object.keys(clash).length; DOM.headers=head.slice(0,40); DOM.error=null;\n    return by;\n  })();\n  DOM.promise.catch(e=>{ DOM.promise=null; DOM.bySetor=null; DOM.error=e.message; renderAll(); });\n  return DOM.promise;\n}\n\nlet SESS={ snapshotRaw:null, snapshotSyncedAt:null, snapLiteral:null, eloMaxCycle:null, timeline:[], selected:0,\n           sessionId:null, sessionLabel:null, sessionsList:[], sectorsList:[], sectorBaseCache:{}, stage:'loading', dirtyFrom:null,\n           snapBusy:false, settings:{...DEFAULT_SETTINGS} };\n\nasync function q(sql){\n  let dbx,res;\n  try{\n    res=await d2.rush('AwW_11Nkg-dKksP7ic8V8').invoke({sql});\n  }catch(e){\n    throw new Error('Databricks indisponível (rush AwW_11Nkg-dKksP7ic8V8): '+e.message);\n  }\n  // The listener answers 200 with {sql} and NO `result` when its upstream probe times out: the\n  // handler builds `result: $result.data`, so an empty upstream simply drops the key rather than\n  // failing. Reading straight through to res.data.result.data reported \"Cannot read properties of\n  // undefined (reading 'data')\" — which reads like a bug in THIS component and sent a debugging\n  // session after the wrong thing. Name the layer that actually failed instead.\n  const payload=res&&res.data;\n  if(!payload) throw new Error('rush AwW_11Nkg-dKksP7ic8V8 não devolveu corpo — listener fora do ar?');\n  if(!payload.result) throw new Error('a sonda Databricks não respondeu: o listener AwW_11Nkg-dKksP7ic8V8 devolveu 200 sem `result`, o que normalmente é timeout do upstream (natura-x-app). O SQL não chegou a rodar.');\n  dbx=payload.result.data;\n  if(!dbx) throw new Error('sonda Databricks respondeu sem dados (result.data vazio).');\n  if(dbx.state && dbx.state!=='SUCCEEDED') throw new Error('Databricks '+dbx.state+': '+(dbx.error?.message||JSON.stringify(dbx.error)||'erro desconhecido'));\n  return dbx;\n}\nfunction rows(resp){const c=(resp.columns||[]).map(x=>x.name);\n  return (resp.rows||[]).map(a=>Object.fromEntries(c.map((k,i)=>[k,a[i]])));}\n// Stamps the UF onto every feature at load: the fetch is per-UF, so this is the ONLY point where a\n// shape's state is known for certain. Downstream the features are flattened into one array and the\n// origin would be unrecoverable. Persisted with the feature in saved sessions.\nasync function geoUF(uf){const code=UF_CODE[uf]||uf;const r=await fetch('https://raw.githubusercontent.com/tbrugz/geodata-br/master/geojson/geojs-'+code+'-mun.json');if(!r.ok)throw new Error('geo '+uf);\n  const g=await r.json(); const U=String(uf).toUpperCase();\n  (g.features||[]).forEach(f=>{ f.__uf=U; });\n  return g;}\n\nfunction buildAdj(features){\n  const pts=f=>{const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates],s=new Set();\n    ps.forEach(poly=>poly.forEach(ring=>ring.forEach(p=>s.add(Math.round(p[0]*1000)/1000+','+Math.round(p[1]*1000)/1000))));return s;};\n  const feat={},idx={};\n  features.forEach(f=>{const nm=mkey(f.properties.name||f.properties.NOME||f.properties.nome,f.__uf);feat[nm]={f,pts:pts(f)};});\n  for(const nm in feat) feat[nm].pts.forEach(p=>(idx[p]=idx[p]||[]).push(nm));\n  const nbrs=nm=>{const c={};feat[nm].pts.forEach(p=>idx[p].forEach(o=>{if(o!==nm)c[o]=(c[o]||0)+1;}));\n    return Object.entries(c).filter(([,n])=>n>=2).map(([o,n])=>({o,w:n}));};\n  return {feat,nbrs};\n}\nfunction centroidLL(f){let x=0,y=0,n=0;const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];\n  ps.forEach(poly=>poly[0].forEach(p=>{x+=p[0];y+=p[1];n++;}));return[x/n,y/n];}\n\n// ---------- snapshot pinning ----------\nasync function resolveSnapshotPin(){\n  const [rawR,liveCountR,eloR]=await Promise.all([\n    q(`SELECT MAX(DT_HISTORICO) snap FROM ${T} WHERE CD_PAIS=1`).then(rows),\n    q(`SELECT COUNT(*) n FROM ${T} WHERE CD_PAIS=1 AND DT_HISTORICO=(SELECT MAX(DT_HISTORICO) FROM ${T} WHERE CD_PAIS=1)`).then(rows),\n    q(`SELECT MAX(operational_cycle) mx FROM ${ELO} WHERE country_code=1`).then(rows).catch(()=>[]),\n  ]);\n  const raw=rawR[0]&&rawR[0].snap;\n  const liveCount=+((liveCountR[0]||{}).n||0);\n  const eloMax=+((eloR[0]||{}).mx||0);\n  const LIVE_SUBQ=`(SELECT MAX(DT_HISTORICO) FROM ${T} WHERE CD_PAIS=1)`;\n  const dbTs=(raw||'').replace('T',' ').replace(/Z$/,'');\n  const candidates=[`TIMESTAMP'${dbTs}'`,`'${dbTs}'`,`DATE'${dbTs}'`];\n  const tests=await Promise.all(candidates.map(c=>\n    q(`SELECT COUNT(*) n FROM ${T} WHERE CD_PAIS=1 AND DT_HISTORICO=${c}`).then(rows).then(r=>+((r[0]||{}).n||0)).catch(()=>-1)\n  ));\n  let chosen=LIVE_SUBQ;\n  for(let i=0;i<candidates.length;i++){ if(liveCount>0 && tests[i]===liveCount){ chosen=candidates[i]; break; } }\n  return {snapshotRaw:raw, snapLiteral:chosen, eloMaxCycle:eloMax, syncedAt:new Date().toISOString()};\n}\n// DISPLAY CONTRACT: the UI never prints the snapshot's own DT_HISTORICO (snapshotRaw). What the user\n// sees is `snapshotSyncedAt` — the date AND hour at which THIS instance last pulled/pinned the\n// snapshot it is querying. snapshotRaw is still resolved, still drives every SQL literal, and is\n// still persisted by saveSession/doShare; it is only kept off the screen.\nfunction fmtSyncedAt(iso){\n  if(!iso) return '—';\n  const d=new Date(iso);\n  if(isNaN(d.getTime())) return String(iso);\n  return d.toLocaleString('pt-BR',{day:'2-digit',month:'2-digit',year:'numeric',hour:'2-digit',minute:'2-digit'});\n}\nasync function ensurePinned(){\n  if(SESS.snapLiteral) return;\n  const p=await resolveSnapshotPin();\n  SESS.snapshotRaw=p.snapshotRaw; SESS.snapLiteral=p.snapLiteral; SESS.eloMaxCycle=p.eloMaxCycle;\n  SESS.snapshotSyncedAt=p.syncedAt;\n}\n\n// ---------- world-state fold ----------\nfunction accMetrics(base,add){\n  const out=base?{...base}:blankM();\n  Object.keys(blankM()).forEach(k=>{ out[k]=(out[k]||0)+((add&&add[k])||0); });\n  return out;\n}\nfunction foldWorldState(timeline,uptoIdx){\n  const closedSectors=new Set(),muniOverride={},muniGeo={},muniRow={},muniLevel={},sectorInflow={},sectorInflowLevel={},sectorOrphanRows={};\n  for(let k=0;k<uptoIdx;k++){\n    const mv=timeline[k]; if(!mv||!mv.sector||!mv.munis) continue;\n    closedSectors.add(String(mv.sector));\n    Object.keys(mv.munis).forEach(m=>{\n      if(m==='__OUTROS__') return;\n      const dest=mv.assign[m]; if(!dest) return;\n      muniOverride[m]=String(dest);\n      if(mv.geoFeat&&mv.geoFeat[m]) muniGeo[m]=mv.geoFeat[m];\n      const rws=(mv.matrix||[]).filter(r=>mkey(r.municipio,r.uf)===m);\n      muniRow[m]=(muniRow[m]||[]).concat(rws);\n      if(mv.levelByMuni&&mv.levelByMuni[m]) muniLevel[m]={...(muniLevel[m]||{}),...mv.levelByMuni[m]};\n      sectorInflow[dest]=accMetrics(sectorInflow[dest],mv.munis[m]);\n      const lv=(mv.levelByMuni&&mv.levelByMuni[m])||{};\n      sectorInflowLevel[dest]=sectorInflowLevel[dest]||{};\n      Object.entries(lv).forEach(([nv,c])=>{ sectorInflowLevel[dest][nv]=(sectorInflowLevel[dest][nv]||0)+c; });\n    });\n    // Orphan CBs follow their leader's home sector, so later etapas must inherit them the same way\n    // the allocated municipalities are inherited — otherwise a stage's span would not match the\n    // base carried into the next one.\n    if(mv.orphanMetricsByGroup && Object.keys(mv.orphanMetricsByGroup).length){\n      const d=computeDerived(mv);\n      d.leaders.forEach(L=>{\n        if(!L.home) return;\n        const om=mv.orphanMetricsByGroup[L.grupo];\n        if(om) sectorInflow[L.home]=accMetrics(sectorInflow[L.home],om);\n        // sectorInflow only reaches a sector while it is a DESTINATION (it lands in baseMetrics).\n        // Keep the rows as well, so the sector still carries these CBs on the day it is the one\n        // being closed — that read goes through mv.matrix, which baseMetrics never touches.\n        const orws=mv.orphanRowsByGroup&&mv.orphanRowsByGroup[L.grupo];\n        if(orws&&orws.length) sectorOrphanRows[L.home]=(sectorOrphanRows[L.home]||[]).concat(orws);\n        const ol=mv.orphanLevelByGroup&&mv.orphanLevelByGroup[L.grupo];\n        if(ol){ sectorInflowLevel[L.home]=sectorInflowLevel[L.home]||{};\n          Object.entries(ol).forEach(([nv,c])=>{ sectorInflowLevel[L.home][nv]=(sectorInflowLevel[L.home][nv]||0)+c; }); }\n      });\n    }\n  }\n  return {closedSectors,muniOverride,muniGeo,muniRow,muniLevel,sectorInflow,sectorInflowLevel,sectorOrphanRows};\n}\n\n// ---------- per-movement compute ----------\nfunction aggregateMovement(mv){\n  const munis={},leaders={};\n  const exSet=new Set((mv.excludedMunis||[]).map(x=>x.muni));\n  const acc=(o,r)=>{o.cbs+=+r.cbs;o.receita+=+r.receita||0;o.rec_nat+=+r.rec_nat||0;o.rec_avon+=+r.rec_avon||0;o.pontos+=+r.pontos||0;o.pedidos+=+r.pedidos||0;o.ativas+=+r.ativas||0;};\n  // Orphans = CBs in municipalities outside the sector's dominance base. They are NOT allocated\n  // geographically; they follow their own leader's home sector. Kept per leader group so every\n  // consumer (span, cascade, impact report) can route them the same way.\n  mv.orphanByGroup={}; mv.orphanMetricsByGroup={}; mv.orphanRowsByGroup={};\n  mv.matrix.forEach(r=>{\n    const m=mkey(r.municipio,r.uf);\n    r._out=!mv.geoFeat[m];   // assign, never just set: absorbed rows are reused across etapas\n    const mm=r._out?'__OUTROS__':m;\n    munis[mm]=munis[mm]||{...blankM(),name:mm}; acc(munis[mm],r);\n    const g=String(r.grupo); leaders[g]=leaders[g]||{grupo:g,lider:r.lider,total:0,byMuni:{}};\n    leaders[g].total+=+r.cbs; leaders[g].byMuni[mm]=(leaders[g].byMuni[mm]||0)+ +r.cbs;\n    if(r._out && exSet.has(m)){\n      mv.orphanByGroup[g]=(mv.orphanByGroup[g]||0)+ +r.cbs;\n      // The ROW too, not just the totals: when the leader's home sector is itself closed in a later\n      // etapa, that etapa rebuilds its matrix from SQL + absorbed municípios, and these CBs are in\n      // neither (their município never moved). Without the row they silently vanish from the sector\n      // they were just credited to — see sectorOrphanRows in foldWorldState.\n      (mv.orphanRowsByGroup[g]=mv.orphanRowsByGroup[g]||[]).push(r);\n      mv.orphanMetricsByGroup[g]=accMetrics(mv.orphanMetricsByGroup[g],\n        {cbs:+r.cbs,receita:+r.receita||0,rec_nat:+r.rec_nat||0,rec_avon:+r.rec_avon||0,pontos:+r.pontos||0,pedidos:+r.pedidos||0,ativas:+r.ativas||0});\n    }\n  });\n  // Level counts only exist per municipality, never per leader, so an excluded municipality's level\n  // mix is credited to the group holding most of its CBs (sub-threshold by definition, so usually one).\n  mv.orphanLevelByGroup={};\n  (mv.excludedMunis||[]).forEach(({muni})=>{\n    const lv=(mv.levelByMuni&&mv.levelByMuni[muni])||{}; if(!Object.keys(lv).length) return;\n    let bg=null,bc=-1;\n    mv.matrix.forEach(r=>{ if(mkey(r.municipio,r.uf)!==muni) return; const cc=+r.cbs; if(cc>bc){bc=cc;bg=String(r.grupo);} });\n    if(!bg) return;\n    mv.orphanLevelByGroup[bg]=mv.orphanLevelByGroup[bg]||{};\n    Object.entries(lv).forEach(([nv,cc])=>{ mv.orphanLevelByGroup[bg][nv]=(mv.orphanLevelByGroup[bg][nv]||0)+cc; });\n  });\n  mv.munis=munis; mv.leaders=Object.values(leaders).sort((a,b)=>b.total-a.total);\n}\nfunction autoAssignFor(mv){\n  const a={};\n  Object.keys(mv.munis).forEach(m=>{ if(m==='__OUTROS__')return;\n    const v=mv.allowed[m]||{}; const votes=Object.keys(v);\n    if(votes.length){ let best=votes[0],bw=-1; for(const s of votes) if(v[s]>bw){bw=v[s];best=s;} a[m]=best; }\n    else if(mv.dest.length){ const c=mv.muniCentroid[m]; let best=mv.dest[0],bd=Infinity;\n      for(const s of mv.dest){ const sc=mv.secCentroid[s]; if(!sc||!c)continue; const d=(c[0]-sc[0])**2+(c[1]-sc[1])**2; if(d<bd){bd=d;best=s;} }\n      a[m]=best; }\n  });\n  return a;\n}\nfunction deslocFor(mv,assign){\n  let d=0;\n  mv.leaders.forEach(L=>{const byS={};let tot=0;\n    for(const [m,c] of Object.entries(L.byMuni)){if(m==='__OUTROS__')continue;const s=assign[m];if(s){byS[s]=(byS[s]||0)+c;tot+=c;}}\n    const home=mv.dest.reduce((a,s)=>(byS[s]||0)>(byS[a]||0)?s:a,mv.dest[0]);\n    d+=tot-(byS[home]||0);});\n  return d;\n}\nfunction spanMapFor(mv,a){const inc={};mv.dest.forEach(s=>inc[s]=0);\n  Object.entries(mv.munis).forEach(([m,o])=>{if(m==='__OUTROS__')return;const s=a[m];if(s&&inc[s]!=null)inc[s]+=o.cbs;});\n  // Orphan CBs follow their leader's home sector, and that home depends on THIS candidate\n  // assignment — so they have to be counted here, or the optimizer would score and constrain a\n  // span that differs from the one the UI shows. Skipped entirely when there are no orphans.\n  if(mv.orphanByGroup&&Object.keys(mv.orphanByGroup).length){\n    mv.leaders.forEach(L=>{\n      const orphan=mv.orphanByGroup[L.grupo]||0; if(!orphan) return;\n      const byS={}; let tot=0;\n      for(const [m,c] of Object.entries(L.byMuni)){ if(m==='__OUTROS__') continue; const s=a[m]; if(s&&inc[s]!=null){ byS[s]=(byS[s]||0)+c; tot+=c; } }\n      if(!tot) return;   // no home to follow -> stranded, counted nowhere\n      const home=mv.dest.reduce((x,s)=>(byS[s]||0)>(byS[x]||0)?s:x,mv.dest[0]);\n      if(inc[home]!=null) inc[home]+=orphan;\n    });\n  }\n  const sp={};mv.dest.forEach(s=>sp[s]=(+(mv.baseMetrics[s]?.cbs||0))+inc[s]);return sp;}\nfunction maxSpanOfFor(mv,a){return Math.max(...Object.values(spanMapFor(mv,a)),0);}\nfunction spanLimits(){const st={...DEFAULT_SETTINGS,...(SESS.settings||{})};\n  return {target:numOrNull(st.targetSpan),max:numOrNull(st.maxSpan),min:numOrNull(st.minSpan)};}\nfunction spanLimitsOn(lim){return !!(lim.target||lim.max||lim.min);}\nfunction spanViolationsOf(sp,lim){const over=[],under=[];\n  Object.entries(sp).forEach(([s,v])=>{ if(lim.max&&v>lim.max)over.push(s); if(lim.min&&v<lim.min)under.push(s); });\n  return {over,under};}\nfunction spanViolationsFor(mv,a){return spanViolationsOf(spanMapFor(mv,a),spanLimits());}\n// With a target span the objective becomes RMS distance from the ideal size (punishes too big AND\n// too small). With no target we keep the legacy objective: shave the biggest sector.\nfunction spanCostFor(mv,a){const lim=spanLimits(),vals=Object.values(spanMapFor(mv,a));\n  if(!vals.length) return 0;\n  if(lim.target) return Math.sqrt(vals.reduce((s,v)=>s+(v-lim.target)**2,0)/vals.length);\n  return Math.max(...vals);}\n// ---------- ÓTIMO: objetivo multi-critério ----------\n// Three normalised objectives, each 0..1, so the weights below are directly comparable. The old\n// score added a span cost measured in CBs to a desloc measured in CBs, so on a large sector the\n// balance term was numerically ~100x the desloc term and silently decided everything on its own.\n//   balance — RMS spread of the resulting spans (against the target span when one is set,\n//             otherwise against their own mean), over that reference. 0 = every destination\n//             sector ends up the same size.\n//   dist    — how far each município travels, CB-weighted: half from the share of its outer\n//             border that faces the sector it was given to, half from centroid distance. 0 =\n//             every município went to a sector it physically touches. Adjacency used to be a\n//             pure yes/no constraint (contiguity); this is what makes it a preference too.\n//   orphan  — stranded orphan CBs (leader left without a home sector, so they land nowhere at\n//             all) plus CBs split away from their leader's home, over the CBs at stake.\n//             Stranded ones count OPT_STRAND_K times: a stranded CB leaves the model entirely,\n//             a deslocated one merely changes hands.\nconst OPT_W={balance:1, dist:0.85, orphan:1};\nconst OPT_STRAND_K=3;\nconst OPT_SIMS=24;             // simultaneous simulations per run, scaled down on big stages\nconst OPT_PASSES=14;           // local-search sweeps inside one simulation\nconst OPT_EVAL_BUDGET=120000;  // total candidate evaluations across the whole portfolio\nconst OPT_EXHAUSTIVE_MAX=60000;\nfunction optDistPrep(mv){\n  let mx=0;\n  Object.keys(mv.munis).forEach(m=>{ if(m==='__OUTROS__') return; const c=mv.muniCentroid[m]; if(!c) return;\n    mv.dest.forEach(s=>{ const sc=mv.secCentroid[s]; if(!sc) return;\n      const d=Math.hypot(c[0]-sc[0],c[1]-sc[1]); if(d>mx) mx=d; }); });\n  return mx||1;\n}\nfunction optDistCost(mv,m,s,dmax){\n  const v=mv.allowed[m]||{}; let tot=0; for(const k in v) tot+=v[k];\n  const share=tot?((v[s]||0)/tot):0;\n  const c=mv.muniCentroid[m], sc=mv.secCentroid[s];\n  // Missing centroid on either side is neutral (0.5), never 0 — an unmeasurable move must not\n  // score as the cheapest one on the board.\n  const geo=(c&&sc)?Math.min(1,Math.hypot(c[0]-sc[0],c[1]-sc[1])/dmax):0.5;\n  return 0.5*(1-share)+0.5*geo;\n}\nfunction optEval(mv,a,dmax){\n  const lim=spanLimits();\n  const sp=spanMapFor(mv,a), vals=Object.values(sp);\n  let balance=0;\n  if(vals.length){\n    const ref=lim.target||(vals.reduce((x,y)=>x+y,0)/vals.length);\n    if(ref) balance=Math.min(1,Math.sqrt(vals.reduce((s,v)=>s+(v-ref)**2,0)/vals.length)/ref);\n  }\n  let cbs=0,dist=0;\n  for(const m in a){ const o=mv.munis[m]; if(!o) continue; const w=+o.cbs||0; cbs+=w; dist+=w*optDistCost(mv,m,a[m],dmax); }\n  dist=cbs?(dist/cbs):0;\n  let stranded=0,desloc=0,tot=0;\n  mv.leaders.forEach(L=>{\n    const byS={}; let t=0;\n    for(const [m,c] of Object.entries(L.byMuni)){ if(m==='__OUTROS__') continue; const s=a[m]; if(s){ byS[s]=(byS[s]||0)+c; t+=c; } }\n    const orphan=(mv.orphanByGroup&&mv.orphanByGroup[L.grupo])||0;\n    tot+=t+orphan;\n    if(!t){ stranded+=orphan; return; }   // no allocated CBs -> no home -> these orphans land nowhere\n    const home=mv.dest.reduce((x,s)=>(byS[s]||0)>(byS[x]||0)?s:x,mv.dest[0]);\n    desloc+=t-(byS[home]||0);\n  });\n  const orphanTerm=tot?Math.min(1,(desloc+OPT_STRAND_K*stranded)/tot):0;\n  return { cost:OPT_W.balance*balance+OPT_W.dist*dist+OPT_W.orphan*orphanTerm,\n           balance, dist, desloc, stranded, sp, viol:spanViolationsOf(sp,lim) };\n}\nfunction optScoreFor(mv,a){ return optEval(mv,a,mv.__optDmax||optDistPrep(mv)).cost; }\n// Seeded PRNG on purpose. computeMovement runs the optimizer for EVERY stage and recomputeFrom\n// re-runs every stage downstream of an edit, so a Math.random() portfolio would hand back a\n// different allocation on each pass and a saved timeline would never reproduce.\nfunction optRng(seed){ let a=seed>>>0;\n  return ()=>{ a=(a+0x6D2B79F5)>>>0; let t=Math.imul(a^(a>>>15),1|a);\n    t=(t+Math.imul(t^(t>>>7),61|t))^t; return ((t^(t>>>14))>>>0)/4294967296; }; }\nfunction optSeed(mv,ms){ let h=2166136261>>>0;\n  const s=String(mv.sector)+'|'+ms.join(',')+'|'+mv.dest.join(',');\n  for(let i=0;i<s.length;i++) h=Math.imul(h^s.charCodeAt(i),16777619);\n  return h>>>0; }\nfunction contigBadFor(mv,assign){\n  const bySec={}; for(const m in assign){(bySec[assign[m]]=bySec[assign[m]]||[]).push(m);}\n  const bad=[];\n  for(const s in bySec){const grp=bySec[s],inGrp=new Set(grp);\n    const seeds=grp.filter(m=>(mv.allowed[m]||{})[s]);\n    if(!seeds.length){bad.push(s);continue;}\n    const seen=new Set(seeds),st=[...seeds];\n    while(st.length){const m=st.pop();(mv.closeAdj[m]||[]).forEach(o=>{if(inGrp.has(o)&&!seen.has(o)){seen.add(o);st.push(o);}});}\n    if(seen.size!==grp.length)bad.push(s);}\n  return bad;\n}\nfunction greedyFor(mv,ms,opts){const lim=spanLimits();const a={};\n  ms.forEach((m,i)=>{let best=opts[i][0],bd=Infinity;\n    for(const s of opts[i]){a[m]=s;\n      // over-max only grows as we keep assigning, so it is safe to penalise mid-build;\n      // under-min shrinks, so penalising it here would just chase noise.\n      const over=lim.max?spanViolationsOf(spanMapFor(mv,a),{max:lim.max,min:null}).over.length:0;\n      const d=optScoreFor(mv,a)+(contigBadFor(mv,a).length?1e9:0)+over*1e6;\n      if(d<bd){bd=d;best=s;}}\n    a[m]=best;});\n  return a;}\nfunction optimizeFor(mv){\n  const ms=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__');\n  if(!ms.length||!mv.dest.length){ mv.optBadge=mv.dest.length?'':'sem setor destino identificado'; return {}; }\n  const opts=ms.map(m=>{const al=(mv.reachable[m]&&mv.reachable[m].length)?mv.reachable[m]:mv.dest.slice();return al.length?al:mv.dest.slice();});\n  const combos=opts.reduce((a,o)=>a*o.length,1);\n  const lim=spanLimits();\n  const dmax=optDistPrep(mv); mv.__optDmax=dmax;\n\n  // Feasibility ladder — same meaning as before, because renderSpanRule and the saved sessions\n  // both read mv.optTier: 0 = contíguo + max + min span, 1 = contíguo + max span, 2 = contíguo\n  // only. Every candidate any simulation produces is offered to all three tiers; we ship the\n  // strictest tier that got a solution, so an unreachable min/max relaxes loudly instead of\n  // stranding the stage with nothing.\n  const tier=[null,null,null],tSc=[Infinity,Infinity,Infinity],tEv=[null,null,null];\n  let feasible=0,evals=0;\n  const offer=(a,ev)=>{\n    if(contigBadFor(mv,a).length) return false;\n    feasible++;\n    const put=t=>{ if(ev.cost<tSc[t]){ tSc[t]=ev.cost; tier[t]={...a}; tEv[t]=ev; } };\n    put(2);\n    if(!ev.viol.over.length){ put(1); if(!ev.viol.under.length) put(0); }\n    return true;\n  };\n  const evalOf=a=>{ evals++; return optEval(mv,a,dmax); };\n\n  // Small enough to settle the question outright: enumerate every contiguous allocation and the\n  // winner is provably the best one under this objective. No search needed, so none is run.\n  const exhaustive=combos<=OPT_EXHAUSTIVE_MAX;\n  let sims=0;\n  if(exhaustive){\n    const cur={};\n    const rec=i=>{ if(i===ms.length){ offer(cur,evalOf(cur)); return; }\n      for(const s of opts[i]){ cur[ms[i]]=s; rec(i+1); } };\n    rec(0);\n  } else {\n    // Too big to enumerate, so run a portfolio of independent simulations instead. Each one is a\n    // seed assignment, then hill-climbing on single-município reassignments, then one perturbation\n    // and another climb to escape whatever local optimum it settled into. Different seeds land in\n    // different basins; the ladder above keeps the best across all of them.\n    const improve=a=>{\n      let ev=evalOf(a); offer(a,ev);\n      for(let pass=0;pass<OPT_PASSES;pass++){\n        let moved=false;\n        for(let i=0;i<ms.length;i++){\n          const m=ms[i],cur=a[m]; let best=cur,bev=ev;\n          for(const s of opts[i]){\n            if(s===cur) continue;\n            a[m]=s;\n            const e=evalOf(a);\n            // contiguity is a hard constraint, and the cheaper test runs first on purpose\n            if(e.cost<bev.cost-1e-12 && !contigBadFor(mv,a).length){ best=s; bev=e; }\n          }\n          a[m]=best;\n          if(best!==cur){ ev=bev; moved=true; offer(a,ev); }\n        }\n        if(!moved) break;\n      }\n    };\n    const rng=optRng(optSeed(mv,ms));\n    const perSim=Math.max(1,ms.length*Math.max(1,mv.dest.length)*OPT_PASSES);\n    const budget=Math.max(4,Math.min(OPT_SIMS,Math.floor(OPT_EVAL_BUDGET/perSim)||4));\n    const seeds=[];\n    if(mv.assign&&ms.every(m=>mv.assign[m])) seeds.push({...mv.assign});   // never regress on what is already on screen\n    seeds.push(autoAssignFor(mv));                                        // adjacency-first seed\n    seeds.push(greedyFor(mv,ms,opts));                                    // balance-first seed\n    while(seeds.length<budget){\n      // randomised construction biased toward nearby sectors — the bias keeps each seed sane, the\n      // randomness is what sends the runs into different basins\n      const a={};\n      ms.forEach((m,i)=>{ let bs=opts[i][0],bw=-Infinity;\n        for(const s of opts[i]){ const w=(1-optDistCost(mv,m,s,dmax))+rng()*0.9; if(w>bw){bw=w;bs=s;} }\n        a[m]=bs; });\n      seeds.push(a);\n    }\n    seeds.forEach(seed=>{\n      const a={...seed};\n      // a restored or legacy assign can still name a sector this stage no longer offers\n      ms.forEach((m,i)=>{ if(!opts[i].includes(a[m])) a[m]=opts[i][0]; });\n      improve(a);\n      const kick=Math.max(1,Math.round(ms.length*0.25));\n      for(let k=0;k<kick;k++){ const i=Math.floor(rng()*ms.length); a[ms[i]]=opts[i][Math.floor(rng()*opts[i].length)]; }\n      improve(a);\n    });\n    sims=seeds.length;\n  }\n\n  const t=tier.findIndex(x=>x);\n  if(t<0){ mv.optTier=-1; mv.optBadge='sem solução contígua — heurística'; return greedyFor(mv,ms,opts); }\n  const best=tier[t], ev=tEv[t]; mv.optTier=t;\n  const relax=[];\n  if(t>0 && lim.min) relax.push('span mínimo '+fmt(lim.min));\n  if(t>1 && lim.max) relax.push('span máximo '+fmt(lim.max));\n  mv.optStats={balance:ev.balance,dist:ev.dist,desloc:ev.desloc,stranded:ev.stranded,sims,evals,feasible,combos,exhaustive};\n  mv.optBadge=`ótimo · ${exhaustive?`espaço completo (${fmt(combos)})`:`${fmt(sims)} simulações`}`\n    +` · equilíbrio ±${Math.round(ev.balance*100)}% · adjacência ${Math.round((1-ev.dist)*100)}%`\n    +` · quebra ${fmt(ev.desloc)} CBs · órfãs sem destino ${fmt(ev.stranded)}`\n    +` · pico ${fmt(maxSpanOfFor(mv,best))} CBs`\n    +(lim.target?` · alvo ${fmt(lim.target)}`:'')\n    +(relax.length?` · ⚠ inatingível: ${relax.join(' + ')}`:(spanLimitsOn(lim)?' · limites ok':''));\n  return best;\n}\nfunction computeDerived(mv){\n  const inc={},gained={},orph={};mv.dest.forEach(s=>{inc[s]=0;gained[s]=0;orph[s]=0;});\n  Object.entries(mv.munis).forEach(([m,o])=>{if(m==='__OUTROS__')return;const s=mv.assign[m];if(s&&inc[s]!=null)inc[s]+=o.cbs;});\n  let desloc=0,orphanTotal=0,orphanStranded=0;\n  const L2=mv.leaders.map(L=>{const byS={};mv.dest.forEach(s=>byS[s]=0);let tot=0;\n    for(const [m,c] of Object.entries(L.byMuni)){if(m==='__OUTROS__')continue;const s=mv.assign[m];if(s&&byS[s]!=null){byS[s]+=c;tot+=c;}}\n    // no allocated CBs => no home. Picking dest[0] by default would silently dump this leader's\n    // orphan CBs into an arbitrary sector, so we leave it null and report them as stranded.\n    const home=(tot>0&&mv.dest.length)?mv.dest.reduce((a,s)=>byS[s]>byS[a]?s:a,mv.dest[0]):null;\n    const dl=tot-(home?byS[home]:0);desloc+=dl;if(home)gained[home]++;\n    const orphan=(mv.orphanByGroup&&mv.orphanByGroup[L.grupo])||0;\n    orphanTotal+=orphan;\n    if(orphan){ if(home&&orph[home]!=null) orph[home]+=orphan; else orphanStranded+=orphan; }\n    return {...L,byS,home,desloc:dl,assignedTotal:tot,orphan,orphanHome:(orphan&&home)?home:null};});\n  const span={};mv.dest.forEach(s=>span[s]=(+(mv.baseMetrics[s]?.cbs||0))+inc[s]+orph[s]);\n  return {inc,gained,desloc,leaders:L2,span,orph,orphanTotal,orphanStranded};\n}\n\nasync function computeMovement(sec,world){\n  sec=String(sec);\n  const mv={sector:sec,policy:'fora',view:'tobe',selMuni:null,optBadge:''};\n  const SNAP=SESS.snapLiteral;\n  const mSQL=`SELECT DS_MUNICIPIO municipio, CD_GRUPO grupo, MAX(DS_LEADER_NAME) lider,\n     COUNT(DISTINCT CD_CONSULTORA) cbs, ROUND(SUM(VL_PEDIDOS_CICLO),0) receita,\n     ROUND(SUM(VL_PEDIDOS_NATURA_CICLO),0) rec_nat, ROUND(SUM(VL_PEDIDOS_AVON_CICLO),0) rec_avon,\n     ROUND(SUM(QT_PONTOS_CICLO),0) pontos, ROUND(SUM(QT_PEDIDOS_CICLO),0) pedidos,\n     SUM(CASE WHEN ST_FEZ_PED_CICLO_ATUAL THEN 1 ELSE 0 END) ativas\n    FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR=${sec} AND DT_HISTORICO=${SNAP}\n    GROUP BY DS_MUNICIPIO, CD_GRUPO`;\n  const ufSQL=`SELECT DS_ESTADO uf, COUNT(*) n FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR=${sec} AND DT_HISTORICO=${SNAP} GROUP BY DS_ESTADO ORDER BY n DESC`;\n  const trendSQL=`SELECT operational_cycle ciclo, COUNT(DISTINCT person_code) cbs,\n     COUNT(DISTINCT CASE WHEN registered_bc_ind=1 THEN person_code END) ativas,\n     ROUND(SUM(revenue_nat_ss_amt),0) receita, ROUND(SUM(points_nat_ss_amt),0) pontos\n    FROM ${ELO} WHERE country_code=1 AND sector_code=${sec} AND operational_cycle<=${SESS.eloMaxCycle||999999} GROUP BY operational_cycle ORDER BY operational_cycle DESC LIMIT 8`;\n  const lvlSQL=`SELECT DS_NVL_PLAN_CRESC nivel, COUNT(DISTINCT CD_CONSULTORA) cbs,\n     ROUND(SUM(VL_PEDIDOS_NATURA_CICLO),0) rec_nat, ROUND(SUM(VL_PEDIDOS_AVON_CICLO),0) rec_avon\n    FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR=${sec} AND DS_NVL_PLAN_CRESC IS NOT NULL AND DT_HISTORICO=${SNAP} GROUP BY DS_NVL_PLAN_CRESC ORDER BY cbs DESC`;\n  const lvlMuniSQL=`SELECT DS_MUNICIPIO municipio, DS_NVL_PLAN_CRESC nivel, COUNT(DISTINCT CD_CONSULTORA) cbs\n    FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR=${sec} AND DS_NVL_PLAN_CRESC IS NOT NULL AND DT_HISTORICO=${SNAP} GROUP BY DS_MUNICIPIO, DS_NVL_PLAN_CRESC`;\n  const [mR,ufR,tR,lR,lmR]=await Promise.all([q(mSQL),q(ufSQL),q(trendSQL),q(lvlSQL),q(lvlMuniSQL)]);\n\n  const ownMatrix=rows(mR).filter(r=>+r.cbs>0);\n  mv.pureOwnMetrics=blankM();\n  ownMatrix.forEach(r=>{ mv.pureOwnMetrics.cbs+=+r.cbs; mv.pureOwnMetrics.receita+=+r.receita||0; mv.pureOwnMetrics.rec_nat+=+r.rec_nat||0; mv.pureOwnMetrics.rec_avon+=+r.rec_avon||0; mv.pureOwnMetrics.pontos+=+r.pontos||0; mv.pureOwnMetrics.pedidos+=+r.pedidos||0; mv.pureOwnMetrics.ativas+=+r.ativas||0; });\n\n  mv.levelByMuni={};\n  Object.entries(world.muniLevel||{}).forEach(([m,lv])=>{ if(world.muniOverride[m]===sec) mv.levelByMuni[m]={...lv}; });\n  // keyed further down, once the UF resolver exists — see the stamp block after buildAdj.\n\n  mv.trend=rows(tR).map(r=>({...r,cbs:+r.cbs,ativas:+r.ativas,receita:+r.receita,pontos:+r.pontos})).filter(r=>r.cbs>10).reverse();\n  mv.levels=rows(lR);\n\n  const absorbedRows=[];\n  Object.entries(world.muniOverride).forEach(([m,destSec])=>{ if(destSec===sec && world.muniRow[m]) absorbedRows.push(...world.muniRow[m]); });\n  // CBs an earlier etapa sent here by FOLLOWING THEIR LEADER (quebra de vínculo) carry no\n  // muniOverride — the município stayed where it was, only the CBs moved — so absorbedRows misses\n  // them. Leaving them out made this sector's ASIS total smaller than the span the previous etapa's\n  // TOBE promised for it, by exactly that etapa's \"CBs ignoradas\", and dropped those CBs from the\n  // redistribution as if they had never existed.\n  const inheritedOrphanRows=(world.sectorOrphanRows&&world.sectorOrphanRows[sec])||[];\n  mv.matrix=ownMatrix.concat(absorbedRows,inheritedOrphanRows);\n\n  const ufList=rows(ufR).map(r=>r.uf).filter(Boolean);\n  const domUF=ufList[0]||'PR';\n  mv.domUF=domUF;\n  const ufs=[domUF,...(UF_BORDERS[domUF]||[])];\n  const geos=await Promise.all(ufs.map(u=>geoUF(u).catch(()=>null)));\n  const allFeat=geos.filter(Boolean).flatMap(g=>g.features);\n  const adj=buildAdj(allFeat);\n\n  // ---- UF resolution ----\n  // SQL no longer selects DS_ESTADO. The base CSV is the authority on a município's UF, indexed by the\n  // (setor, município) pair it already maintains, and rows are stamped ONCE here so every consumer\n  // downstream keeps reading r.uf exactly as it did before.\n  // Fallback for a município the base does not carry — spillover, where the sector has CBs but no\n  // dominance: adopt the UF of the loaded shape when that name is unique across the UFs in this\n  // window. A name shared by two of them stays unresolved instead of guessed; it is spillover either\n  // way, and a guess would put a shape from the wrong state on the map.\n  const featUfByName={};\n  Object.keys(adj.feat).forEach(k=>{ const nm=mName(k),u=mUf(k);\n    if(!(nm in featUfByName)) featUfByName[nm]=u; else if(featUfByName[nm]!==u) featUfByName[nm]=null; });\n  const ufGuessed={};\n  const ufFor=(setorOf,muni)=>{const nm=norm(muni);\n    const fromCsv=DOM.ufBySetorMuni&&DOM.ufBySetorMuni[String(setorOf)+'|'+nm];\n    if(fromCsv) return fromCsv;\n    const uniq=featUfByName[nm];\n    if(uniq) return uniq;\n    // uniq===null means the name is shared by two of the LOADED UFs — Terra Nova exists in BA and in PE,\n    // and a BA sector loads PE as a border — so the unique-name fallback gave up. Giving up here too\n    // yields a bare NAME key, which matches NO shape: the município leaves the map without a word. The\n    // sector's own dominant UF is a real signal rather than a coin flip: when a shape of this name\n    // exists in domUF, that is the one this sector means. Recorded so the inference is never invisible.\n    if(uniq===null && adj.feat[mkey(nm,domUF)]){ ufGuessed[nm]=domUF; return domUF; }\n    return '';};\n  // Absorbed and orphan rows inherited from an earlier etapa were stamped when THAT etapa ran, under\n  // the setor they belonged to then; `if(!r.uf)` keeps that original resolution intact.\n  mv.matrix.forEach(r=>{ if(!r.uf) r.uf=ufFor(sec,r.municipio); });\n  rows(lmR).forEach(r=>{ const k=mkey(r.municipio,ufFor(sec,r.municipio)); (mv.levelByMuni[k]=mv.levelByMuni[k]||{})[r.nivel]=+r.cbs; });\n\n  const totBy={}; mv.matrix.forEach(r=>{const n=mkey(r.municipio,r.uf); totBy[n]=(totBy[n]||0)+ +r.cbs;});\n  const footprint=new Set(Object.entries(totBy).filter(([,c])=>c>0).map(([m])=>m));\n  const withShape=[...footprint].filter(n=>adj.feat[n]||world.muniGeo[n]);\n  mv.cbsByMuni={...totBy}; mv.shapeMunis=withShape.slice();\n  mv.noShapeMunis=[...footprint].filter(n=>!(adj.feat[n]||world.muniGeo[n])).map(n=>({muni:n,cbs:totBy[n]||0})).sort((a,b)=>b.cbs-a.cbs);\n  mv.noShapeCbs=mv.noShapeMunis.reduce((a,x)=>a+x.cbs,0);\n\n  // ---- RULE: which municipalities belong to this sector ----\n  // Comes from the dominantes CSV (setor x município), NOT from CB volume. A municipality where the\n  // closing sector happens to have a handful of CBs but which the base assigns to ANOTHER sector is\n  // spillover: it is not reallocated, it is not drawn, and its CBs follow their leader (quebra de\n  // vínculo). Municipalities an EARLIER etapa moved into this sector count as belonging to it too —\n  // otherwise the cascade would throw away the territory the sector just received.\n  const domBase=await ensureDominantes();\n  const domOwn=domBase[String(sec)];\n  const inherited=new Set(Object.keys(world.muniOverride).filter(m=>world.muniOverride[m]===sec));\n  if((!domOwn||!domOwn.size)&&!inherited.size) throw new Error('setor '+sec+' não existe na base de municípios dominantes (CSV) — atualize a base antes de fechar este setor');\n  const belongs=n=>(domOwn&&(domOwn.has(n)||(!DOM.hasUf&&domOwn.has(mName(n)))))||inherited.has(n);\n  mv.domCsvMunis=(domOwn&&domOwn.size)||0;\n  const dropped=withShape.filter(n=>!belongs(n));\n  if(withShape.length && dropped.length===withShape.length) throw new Error('setor '+sec+': nenhum dos municípios com CBs está na base de dominantes — nada pra realocar');\n  const droppedSet=new Set(dropped);\n  mv.excludedMunis=dropped.map(n=>({muni:n,cbs:totBy[n]||0})).sort((a,b)=>b.cbs-a.cbs);\n  mv.excludedCbs=dropped.reduce((a,n)=>a+(totBy[n]||0),0);\n\n  const closingNames=withShape.filter(n=>!droppedSet.has(n));\n  const closingSet=new Set(closingNames);\n  mv.geoFeat={}; closingNames.forEach(n=>{ mv.geoFeat[n]=(adj.feat[n]&&adj.feat[n].f)||world.muniGeo[n]; });\n\n  // ---- why is the map short of the base? ----\n  // Three gates drop a município between the CSV and the map: footprint (no CBs under this setor at\n  // the snapshot), withShape (no geometry in the loaded UFs) and belongs (key mismatch). Only the last\n  // two had a counter, so the FIRST one was invisible — the operator counted 5 shapes against a base\n  // that says 6 and had nothing on screen explaining the missing one. Named here, with its reason.\n  const drawnCsv=new Set(closingNames.map(n=>DOM.hasUf?n:mName(n)));\n  const footKeyOf=k=>DOM.hasUf?(footprint.has(k)?k:null):([...footprint].find(x=>mName(x)===k)||null);\n  mv.csvMunisTotal=(domOwn&&domOwn.size)||0;\n  mv.ufGuessed={...ufGuessed};\n  mv.missingMunis=[...(domOwn||[])].filter(k=>!drawnCsv.has(k)).map(k=>{\n    const fk=footKeyOf(k);\n    const hasShape=!!(adj.feat[fk||k]||world.muniGeo[fk||k]);\n    // The SAME name present in footprint under a DIFFERENT key means UF resolution disagreed with the\n    // base: the CBs are there, they just landed on a key that no shape and no dominance entry can\n    // match. That is a different failure from \"this município has no CBs\", and conflating the two sends\n    // the next investigation into the CB base when the answer is in the UF column.\n    const alias=[...footprint].filter(x=>x!==k&&mName(x)===mName(k));\n    let reason;\n    if(!fk&&alias.length) reason=`UF divergente — as CBs entraram na chave ${alias.join(' / ')} e a base diz ${k}`;\n    else if(!fk) reason=hasShape?'sem CBs neste setor no snapshot — desenhado como vizinho':'sem CBs neste setor no snapshot';\n    else if(!hasShape) reason='sem shape nas UFs carregadas';\n    else reason='chave não casou com a base de dominantes';\n    return {muni:k,cbs:(fk?totBy[fk]:alias.reduce((a,x)=>a+(totBy[x]||0),0))||0,reason:reason};\n  });\n\n  const extVotes={}; const nbrNames=new Set();\n  closingNames.forEach(n=>{\n    if(!adj.feat[n]) return;\n    // droppedSet is excluded too: a municipality outside this sector's dominance base must not\n    // nominate a destination sector, and it is not drawn on the map at all.\n    adj.nbrs(n).forEach(({o,w})=>{ if(!closingSet.has(o) && !droppedSet.has(o)){ nbrNames.add(o); (extVotes[n]=extVotes[n]||[]).push({o,w}); } });\n  });\n  // mv.nbrFeat is assembled far below, once mv.dest is final: the map draws only the closing sector's\n  // municípios and the destination sectors' territory, so the feature list cannot be built until the\n  // neighbour query has resolved each neighbour's sector AND the destination list has settled.\n  let neigh=[];\n  if(nbrNames.size){\n    // The IN-list carries bare names — that is what the column holds, and the query is back to not\n    // selecting DS_ESTADO. Every returned row names its own CD_SETOR, which is exactly the key the\n    // base CSV is indexed by, so each row's UF is resolved from the base right after the fetch.\n    const inList=[...new Set([...nbrNames].map(n=>mName(n)))].map(n=>`'${n.replace(/'/g,\"''\")}'`).join(',');\n    const nSQL=`SELECT DS_MUNICIPIO municipio, CD_SETOR setor, COUNT(DISTINCT CD_CONSULTORA) cbs\n      FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR<>${sec} AND CD_SETOR>0 AND DT_HISTORICO=${SNAP} AND DS_MUNICIPIO IN (${inList}) GROUP BY DS_MUNICIPIO, CD_SETOR`;\n    neigh=rows(await q(nSQL));\n  }\n  const domSecOf={};\n  neigh.forEach(r=>{ if(!r.uf) r.uf=ufFor(r.setor,r.municipio); });\n  const byM={}; neigh.forEach(r=>{const m=mkey(r.municipio,r.uf); if(!nbrNames.has(m)) return; (byM[m]=byM[m]||[]).push(r);});\n  Object.entries(byM).forEach(([m,rs])=>{ rs.sort((a,b)=>+b.cbs-+a.cbs); domSecOf[m]=String(rs[0].setor); });\n  nbrNames.forEach(n=>{ if(world.muniOverride[n]) domSecOf[n]=world.muniOverride[n]; });\n  mv.nbrCurrentSector=domSecOf;\n\n  // ---- HARD RULE: which sectors are eligible as destinations ----\n  // 'any'      = a sector qualifies if it borders ANY municipality of the closing sector (legacy default)\n  // 'dominant' = only municipalities with >= destMinCbs CBs act as a bridge; smaller ones are still\n  //              redistributed, they just cannot pull a new sector into the destination list.\n  //\n  // ---- HARD RULE (não negociável): destino tem de ser da MESMA gerência de vendas ----\n  // Território não atravessa fronteira de GV num fechamento real: outra gerência é outra gestora,\n  // outra meta e outro P&L, então oferecer um setor de fora produz um plano que ninguém pode\n  // executar. CD_GV da base de dominantes é a autoridade, e o filtro roda ANTES de qualquer peso,\n  // regra de ponte ou corte de top-6 — nenhum caminho a jusante pode reintroduzir um setor de fora.\n  const gvBySetor=DOM.gvBySetor||{};\n  const gvOf=s=>gvBySetor[String(s)]||'';\n  const ownGv=gvOf(sec);\n  if(!ownGv) throw new Error('setor '+sec+' não tem CD_GV na base de municípios dominantes — sem a gerência de vendas do setor que fecha não há como garantir que os destinos sejam da mesma gerência');\n  // Um candidato que a base não carrega NÃO pode ser provado como da mesma gerência, então é recusado\n  // em vez de presumido: a regra só vale se nunca vazar.\n  const sameGv=s=>gvOf(s)===ownGv;\n  mv.gv=ownGv;\n  // Foreign-GV neighbours are not drawn AT ALL. Filtering them only out of the destination list still\n  // left them sitting on the map as context, which invites the exact question the rule exists to\n  // settle — \"why is 3471 right there if nothing can be sent to it?\". A neighbour whose sector is\n  // UNKNOWN is not being asserted to be foreign, so it stays as plain geography.\n  // Dropping them also tightens the frame: project() fits the bounding box of whatever survives, so the\n  // closing sector is drawn larger once foreign territory stops padding the extent.\n  mv.gvRejected=[];\n  const gvHidden=new Set();\n  nbrNames.forEach(n=>{ const s=domSecOf[n];\n    if(s && !sameGv(s)){ gvHidden.add(n); if(mv.gvRejected.indexOf(s)<0) mv.gvRejected.push(s); } });\n  gvHidden.forEach(n=>{ nbrNames.delete(n); delete domSecOf[n]; });\n  Object.keys(extVotes).forEach(n=>{ extVotes[n]=extVotes[n].filter(v=>!gvHidden.has(v.o)); });\n  const destRule=(SESS.settings&&SESS.settings.destRule)||DEFAULT_SETTINGS.destRule;\n  const destMinCbs=Math.max(1,Math.round(+((SESS.settings||{}).destMinCbs)||DEFAULT_SETTINGS.destMinCbs));\n  mv.destRule=destRule; mv.destMinCbs=destMinCbs; mv.destRuleFallback=false;\n  const isBridge=n=>destRule!=='dominant'||(totBy[n]||0)>=destMinCbs;\n  mv.bridgeMunis=closingNames.filter(isBridge);\n  mv.ignoredBridges=closingNames.filter(n=>!isBridge(n));\n\n  mv.allowed={}; mv.allowedRaw={};\n  const wAny={}, wDom={};\n  closingNames.forEach(n=>{\n    const v={}, bridge=isBridge(n);\n    (extVotes[n]||[]).forEach(({o,w})=>{\n      const s=domSecOf[o];\n      if(!s || s===sec || world.closedSectors.has(s)) return;\n      // Belt to the braces above: domSecOf has already had every foreign-GV neighbour removed, so this\n      // cannot fire any more. It stays because it costs one comparison and the failure it guards — a\n      // destination in the wrong gerência — is the whole reason this code exists.\n      if(!sameGv(s)) return;\n      v[s]=(v[s]||0)+w;\n      wAny[s]=(wAny[s]||0)+w;\n      if(bridge) wDom[s]=(wDom[s]||0)+w;\n    });\n    mv.allowed[n]=v; mv.allowedRaw[n]={...v};\n  });\n  let secWeight=wAny;\n  if(destRule==='dominant'){\n    if(Object.keys(wDom).length) secWeight=wDom;\n    else { secWeight=wAny; mv.destRuleFallback=true; }   // no dominant municipality at all -> relax, never strand the stage\n  }\n  mv.dest=Object.keys(secWeight).sort((a,b)=>secWeight[b]-secWeight[a]).slice(0,6);\n  if(!mv.dest.length){\n    // O fallback de emergência lê domSecOf direto, contornando os votos — então repete o filtro de GV\n    // aqui. Sem isso a regra vazaria exatamente no caso em que ninguém está olhando.\n    mv.dest=[...new Set(Object.values(domSecOf))].filter(s=>s!==sec&&!world.closedSectors.has(s)&&sameGv(s)).slice(0,6);\n    closingNames.forEach(n=>{ if(!Object.keys(mv.allowed[n]).length){ mv.dest.forEach(s=>mv.allowed[n][s]=1); } });\n  }\n  // Cinto e suspensório: qualquer rota que tenha preenchido mv.dest (pesos, fallback, um branch novo\n  // amanhã) passa por esta linha, e nada de fora da gerência do setor que fecha sobrevive a ela.\n  mv.dest=mv.dest.filter(sameGv);\n  // WHAT GETS DRAWN — decided here because it depends on the final destination list. The closing\n  // sector's municípios draw as before. For each destination sector we now draw its WHOLE municipality\n  // set, not just the municípios that happened to border the closing sector — sourced from the SAME\n  // dominantes CSV (domBase) already used above for the closing sector's own municípios, never from\n  // CD_SETOR in the CRM table: that code is not a stable key there (reused across unrelated setores),\n  // so pulling by it drew scattered territory from the wrong parts of the country. The adjacency query\n  // above still decides WHICH sectors qualify as destinations (that vote is unchanged); this only\n  // widens what gets drawn once that list is settled, so a destination sector renders as its real CSV\n  // territory instead of a rim of border municípios.\n  // nbrCurrentSector deliberately keeps its full mapping: drawMap groups whatever survives in nbrFeat\n  // by it.\n  const drawSet=new Set(mv.dest);\n  mv.dest.forEach(s=>{\n    (domBase[String(s)]||new Set()).forEach(n=>{\n      if(nbrNames.has(n)) return;\n      nbrNames.add(n); domSecOf[n]=world.muniOverride[n]||s;\n    });\n  });\n  mv.nbrFeat=[...nbrNames].filter(n=>drawSet.has(domSecOf[n])).map(n=>adj.feat[n]&&adj.feat[n].f).filter(Boolean);\n  // votes may reference a sector that did not survive the rule / top-6 cut — drop them so\n  // autoAssign + contiguity seeds can never point at a sector outside mv.dest\n  closingNames.forEach(n=>{ Object.keys(mv.allowed[n]||{}).forEach(s=>{ if(!mv.dest.includes(s)) delete mv.allowed[n][s]; }); });\n  mv.color={}; mv.dest.forEach((s,i)=>mv.color[s]=PALETTE[i%PALETTE.length]);\n\n  const accC={}; Object.entries(domSecOf).forEach(([nb,s])=>{ if(!mv.dest.includes(s))return; const f=(adj.feat[nb]&&adj.feat[nb].f)||world.muniGeo[nb]; if(!f)return; const c=centroidLL(f); accC[s]=accC[s]||[0,0,0]; accC[s][0]+=c[0]; accC[s][1]+=c[1]; accC[s][2]++; });\n  mv.secCentroid={}; mv.dest.forEach(s=>{ if(accC[s]) mv.secCentroid[s]=[accC[s][0]/accC[s][2],accC[s][1]/accC[s][2]]; });\n  mv.muniCentroid={}; closingNames.forEach(n=>{ if(mv.geoFeat[n]) mv.muniCentroid[n]=centroidLL(mv.geoFeat[n]); });\n  mv.closeAdj={}; closingNames.forEach(n=>{ mv.closeAdj[n]=adj.feat[n]?adj.nbrs(n).filter(({o})=>closingSet.has(o)).map(({o})=>o):[]; });\n  const comp={}; let ci=0; closingNames.forEach(n=>{ if(comp[n]!=null)return; const st=[n]; comp[n]=ci; while(st.length){ const x=st.pop(); (mv.closeAdj[x]||[]).forEach(o=>{ if(comp[o]==null){ comp[o]=ci; st.push(o); } }); } ci++; });\n  const compAllowed={}; closingNames.forEach(n=>{ const cid=comp[n]; (compAllowed[cid]=compAllowed[cid]||new Set()); Object.keys(mv.allowed[n]||{}).forEach(s=>compAllowed[cid].add(s)); });\n  mv.reachable={}; closingNames.forEach(n=>{ mv.reachable[n]=[...(compAllowed[comp[n]]||[])].filter(s=>mv.dest.includes(s)); });\n\n  if(mv.dest.length){\n    const rList=mv.dest.join(',');\n    const bSQL=`SELECT CD_SETOR setor, COUNT(DISTINCT CD_CONSULTORA) cbs,\n       SUM(CASE WHEN ST_FEZ_PED_CICLO_ATUAL THEN 1 ELSE 0 END) ativas,\n       ROUND(SUM(VL_PEDIDOS_CICLO),0) receita, ROUND(SUM(VL_PEDIDOS_NATURA_CICLO),0) rec_nat,\n       ROUND(SUM(VL_PEDIDOS_AVON_CICLO),0) rec_avon, ROUND(SUM(QT_PONTOS_CICLO),0) pontos, ROUND(SUM(QT_PEDIDOS_CICLO),0) pedidos\n      FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR IN (${rList}) AND DT_HISTORICO=${SNAP} GROUP BY CD_SETOR`;\n    const blSQL=`SELECT CD_SETOR setor, DS_NVL_PLAN_CRESC nivel, COUNT(DISTINCT CD_CONSULTORA) cbs\n      FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR IN (${rList}) AND DS_NVL_PLAN_CRESC IS NOT NULL AND DT_HISTORICO=${SNAP} GROUP BY CD_SETOR, DS_NVL_PLAN_CRESC`;\n    const [bR,blR]=await Promise.all([q(bSQL),q(blSQL)]);\n    mv.baseMetrics={}; rows(bR).forEach(r=>{ mv.baseMetrics[String(r.setor)]=r; if(!SESS.sectorBaseCache[String(r.setor)]) SESS.sectorBaseCache[String(r.setor)]=r; });\n    mv.baseLevel={}; rows(blR).forEach(r=>{ const s=String(r.setor); (mv.baseLevel[s]=mv.baseLevel[s]||{})[r.nivel]=+r.cbs; });\n  } else { mv.baseMetrics={}; mv.baseLevel={}; }\n\n  mv.dest.forEach(s=>{\n    if(!mv.baseMetrics[s]) mv.baseMetrics[s]={setor:s,cbs:0,ativas:0,receita:0,rec_nat:0,rec_avon:0,pontos:0,pedidos:0};\n    const infl=world.sectorInflow[s];\n    if(infl) Object.keys(blankM()).forEach(k=>{ mv.baseMetrics[s][k]=(+mv.baseMetrics[s][k]||0)+(infl[k]||0); });\n    const inflLv=world.sectorInflowLevel[s];\n    if(inflLv){ mv.baseLevel[s]=mv.baseLevel[s]||{}; Object.entries(inflLv).forEach(([nv,c])=>{ mv.baseLevel[s][nv]=(mv.baseLevel[s][nv]||0)+c; }); }\n  });\n\n  aggregateMovement(mv);\n  mv.assign=optimizeFor(mv);\n  return mv;\n}\n\n// ---------- cascade engine ----------\nasync function computeAt(i){\n  await ensurePinned();\n  const world=foldWorldState(SESS.timeline,i);\n  const sec=SESS.timeline[i].sector;\n  const mv=await computeMovement(sec,world);\n  SESS.timeline[i]=mv;\n}\nasync function recomputeFrom(i){\n  for(let k=i;k<SESS.timeline.length;k++){\n    loader(true,`recalculando etapa ${k+1} de ${SESS.timeline.length}…`);\n    try{ await computeAt(k); }\n    catch(e){\n      // A stage that failed to recompute still holds its PREVIOUS result, so the timeline would\n      // silently mix pre- and post-change etapas. Flag this stage and everything after it as stale\n      // (dashed chip + ⟳) so the state is visible and flushDirty retries from here.\n      SESS.dirtyFrom = SESS.dirtyFrom==null ? k : Math.min(SESS.dirtyFrom,k);\n      throw e;\n    }\n  }\n}\nasync function flushDirty(){\n  if(SESS.dirtyFrom==null) return;\n  const from=SESS.dirtyFrom; SESS.dirtyFrom=null;\n  loader(true,'recalculando etapas seguintes…');\n  try{ await recomputeFrom(from); }\n  catch(e){ $('#ds').textContent='erro ao recalcular cadeia: '+e.message; $('#ds').classList.add('err'); }\n  finally{ loader(false); }\n}\nasync function addMovement(sec){\n  sec=(sec==null?'':String(sec)).trim();\n  if(!sec) return;\n  const closedNow=new Set(SESS.timeline.map(mv=>mv.sector));\n  if(closedNow.has(sec)){ $('#ds').textContent='setor '+sec+' já fechado nesta timeline.'; $('#ds').classList.add('err'); return; }\n  if(!SESS.sectorsList.some(s=>s.setor===sec)){ $('#ds').textContent='setor \"'+sec+'\" não existe no snapshot congelado.'; $('#ds').classList.add('err'); return; }\n  await flushDirty();\n  loader(true,'fechando setor '+sec+' — puxando dado do snapshot congelado…');\n  $('#liveState').classList.remove('err');\n  try{\n    SESS.timeline.push({sector:String(sec)});\n    await computeAt(SESS.timeline.length-1);\n    SESS.selected=SESS.timeline.length-1;\n    $('#ds').classList.remove('err'); $('#ds').textContent='';\n  }catch(e){\n    SESS.timeline.pop();\n    $('#ds').textContent='erro ao fechar setor '+sec+': '+e.message; $('#ds').classList.add('err');\n  } finally { loader(false); renderAll(); }\n}\nfunction removeFrom(i){\n  SESS.timeline.length=i;\n  SESS.selected=Math.min(SESS.selected,Math.max(0,SESS.timeline.length-1));\n  if(SESS.dirtyFrom!=null && SESS.dirtyFrom>=SESS.timeline.length) SESS.dirtyFrom=null;\n  renderAll();\n}\nasync function editSelected(mutator){\n  const mv=SESS.timeline[SESS.selected]; if(!mv) return;\n  mutator(mv);\n  if(SESS.selected<SESS.timeline.length-1){\n    SESS.dirtyFrom = SESS.dirtyFrom==null ? SESS.selected+1 : Math.min(SESS.dirtyFrom, SESS.selected+1);\n  }\n  renderAll();\n}\n\n// ---------- sectors list / picker ----------\nasync function loadSectors(){\n  const sql=`SELECT CD_SETOR setor, MAX(DS_ESTADO) uf, COUNT(DISTINCT CD_CONSULTORA) cbs, COUNT(DISTINCT DS_MUNICIPIO) munis\n    FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR>0 AND DT_HISTORICO=(SELECT MAX(DT_HISTORICO) FROM ${T} WHERE CD_PAIS=1) GROUP BY CD_SETOR ORDER BY CD_SETOR`;\n  SESS.sectorsList=rows(await q(sql)).map(r=>({setor:String(r.setor),uf:r.uf,cbs:+r.cbs,munis:+r.munis}));\n}\nfunction renderSectorPicker(){\n  const closed=new Set(SESS.timeline.map(mv=>mv.sector));\n  const avail=SESS.sectorsList.filter(s=>!closed.has(s.setor));\n  const dl=$('#sectorPickList');\n  if(dl) dl.innerHTML=avail.map(s=>`<option value=\"${s.setor}\">${s.setor} · ${s.uf||'?'} · ${fmt(s.cbs)} CBs · ${s.munis} munic.</option>`).join('');\n  const ready=SESS.stage==='main';\n  $('#rand').disabled=!ready||!avail.length; $('#go').disabled=!ready||!avail.length; $('#sectorPick').disabled=!ready;\n}\nfunction renderStage(){\n  const isMain=SESS.stage==='main';\n  const cc=$('#confirmCard'), hb=$('#howtoBox'), mw=$('#mainWrap');\n  const hdr=$('#topHeader'), rl=$('#timelineRail');\n  if(hdr) hdr.classList.toggle('hidden', !isMain);\n  if(rl) rl.classList.toggle('hidden', !isMain);\n  if(cc) cc.classList.toggle('hidden', isMain);\n  if(hb) hb.classList.toggle('hidden', !isMain);\n  if(mw) mw.classList.toggle('hidden', !isMain);\n  const cb=$('#confirmBody');\n  if(cb && !isMain) cb.innerHTML = SESS.snapshotRaw\n    ? `Snapshot congelado · atualizado em <b>${fmtSyncedAt(SESS.snapshotSyncedAt)}</b> · <b>${SESS.sectorsList.length}</b> setor(es) disponível(eis) pra fechar. Nenhuma consulta de detalhe roda até você confirmar e escolher o primeiro setor.`\n    : 'congelando snapshot…';\n}\n\n// ---------- session persistence ----------\n// ONE table (`timeline-shared-sessions`) holds BOTH kinds of row, so SESSIONS_DS and SHARED_DS\n// deliberately resolve to the SAME DataSet — the two names mark intent, not two stores:\n//   · working session  — carries `movements`; saveSession updates it in place\n//   · shared snapshot  — carries `sharedAt` + `stages`; doShare CREATES it and nothing updates it\n// listSessions MUST exclude the shared rows. They are write-once by contract, and if one showed\n// up in the picker, loading it and pressing Salvar would fire ds.update() straight at a frozen\n// snapshot. Filtering here is what keeps that unreachable — it is the guard, not a cosmetic.\n// Both lookups stay because a policy-gated DataSet's Process resolves late; same race the reader\n// component polls for. SESSIONS_DS lives at module scope so no call site can hit it in the TDZ.\nasync function listSessions(){\n  const ds=(d2.data('sessionsDataset')||d2.data(SESSIONS_DS)); if(!ds) return [];\n  await ds.refresh();\n  const recs=ds.records()||[];\n  return [...recs].filter(r=>!r.sharedAt).sort((a,b)=>new Date(b.updatedAt||0)-new Date(a.updatedAt||0));\n}\nasync function refreshSessionPicker(){\n  const list=await listSessions().catch(()=>[]);\n  SESS.sessionsList=list;\n  const opts=list.map(s=>`<option value=\"${s._id}\">${esc(s.label||'sem nome')} · ${fmt((s.movements||[]).length)} etapa(s)</option>`).join('')+`<option value=\"\">+ Nova sessão</option>`;\n  const sel=$('#sessionPick'); if(sel){ sel.innerHTML=opts; sel.value=SESS.sessionId||''; }\n  const csel=$('#confirmSessionPick'); if(csel){ csel.innerHTML=opts; csel.value=SESS.sessionId||''; }\n}\nasync function saveSession(){\n  const ds=(d2.data('sessionsDataset')||d2.data(SESSIONS_DS));\n  if(!ds){ $('#sessStatus').textContent='dataset de sessões indisponível'; return; }\n  if(!SESS.timeline.length){ $('#sessStatus').textContent='nada pra salvar ainda'; return; }\n  await flushDirty();\n  const label=SESS.sessionLabel||('Sessão '+new Date().toLocaleString('pt-BR'));\n  const nowIso=new Date().toISOString();\n  const payload={\n    label,\n    settings:{...DEFAULT_SETTINGS,...(SESS.settings||{})},\n    snapshotRaw:SESS.snapshotRaw, snapshotSyncedAt:SESS.snapshotSyncedAt, snapLiteral:SESS.snapLiteral, eloMaxCycle:SESS.eloMaxCycle,\n    movements:SESS.timeline.map(mv=>({\n      sector:mv.sector, assign:mv.assign, policy:mv.policy,\n      matrix:mv.matrix, trend:mv.trend, levels:mv.levels, levelByMuni:mv.levelByMuni,\n      pureOwnMetrics:mv.pureOwnMetrics, domUF:mv.domUF, dest:mv.dest, color:mv.color,\n      gv:mv.gv, gvRejected:mv.gvRejected,\n      missingMunis:mv.missingMunis, csvMunisTotal:mv.csvMunisTotal, ufGuessed:mv.ufGuessed,\n      baseMetrics:mv.baseMetrics, baseLevel:mv.baseLevel, geoFeat:mv.geoFeat, nbrFeat:mv.nbrFeat,\n      nbrCurrentSector:mv.nbrCurrentSector, allowed:mv.allowed, allowedRaw:mv.allowedRaw, reachable:mv.reachable,\n      destRule:mv.destRule, destMinCbs:mv.destMinCbs, destRuleFallback:mv.destRuleFallback, optTier:mv.optTier,\n      cbsByMuni:mv.cbsByMuni, shapeMunis:mv.shapeMunis, excludedMunis:mv.excludedMunis, domCsvMunis:mv.domCsvMunis,\n      excludedCbs:mv.excludedCbs, noShapeMunis:mv.noShapeMunis, noShapeCbs:mv.noShapeCbs,\n      secCentroid:mv.secCentroid, muniCentroid:mv.muniCentroid, closeAdj:mv.closeAdj, optBadge:mv.optBadge,\n    })),\n    updatedAt:nowIso,\n  };\n  $('#sessStatus').textContent='salvando…';\n  try{\n    if(SESS.sessionId){\n      await ds.update({_id:SESS.sessionId,...payload});\n    } else {\n      payload.createdAt=nowIso;\n      const created=await ds.create(payload);\n      SESS.sessionId=(created&&created._id)||(created&&created.data&&created.data._id)||(ds.selected&&ds.selected()&&ds.selected()._id)||null;\n    }\n    SESS.sessionLabel=label;\n    await refreshSessionPicker();\n    $('#sessStatus').textContent='salvo ✓';\n  }catch(e){ $('#sessStatus').textContent='erro ao salvar: '+e.message; }\n  setTimeout(()=>{ if($('#sessStatus')) $('#sessStatus').textContent=''; },2200);\n}\n// Duplicate = drop sessionId so saveSession takes its CREATE branch instead of its update branch.\n// The source record is never written to, the copy gets a fresh _id and its own createdAt, and the\n// copy becomes the active session (so the next Salvar edits the copy, not the original).\nasync function duplicateSession(){\n  if(!SESS.timeline.length){ $('#sessStatus').textContent='nada pra duplicar ainda'; return; }\n  const prevId=SESS.sessionId, prevLabel=SESS.sessionLabel;\n  SESS.sessionId=null;\n  SESS.sessionLabel=(SESS.sessionLabel||'Sessão')+' (cópia)';\n  await saveSession();\n  if(!SESS.sessionId){\n    // saveSession swallows its own errors into #sessStatus, so a still-null id after the await is\n    // the only failure signal we get. Put the original identity back — otherwise a failed copy\n    // silently leaves the session detached, and the next Salvar would fork a new record instead\n    // of updating the one the user thought they were editing.\n    SESS.sessionId=prevId; SESS.sessionLabel=prevLabel;\n    await refreshSessionPicker().catch(()=>{});\n    return;\n  }\n  if($('#sessStatus')) $('#sessStatus').textContent='duplicado ✓';\n}\nasync function loadSession(id){\n  if(!id) return newSession();\n  const list=(SESS.sessionsList&&SESS.sessionsList.length)?SESS.sessionsList:await listSessions().catch(()=>[]);\n  const rec=list.find(s=>String(s._id)===String(id));\n  if(!rec) return newSession();\n  loader(true,'carregando sessão…');\n  SESS.sessionId=rec._id; SESS.sessionLabel=rec.label;\n  SESS.snapshotRaw=rec.snapshotRaw; SESS.snapshotSyncedAt=rec.snapshotSyncedAt||null; SESS.snapLiteral=rec.snapLiteral; SESS.eloMaxCycle=rec.eloMaxCycle;\n  SESS.settings={...DEFAULT_SETTINGS,...(rec.settings||{})};\n  SESS.timeline=(rec.movements||[]).map(m=>({sector:String(m.sector)}));\n  SESS.selected=0; SESS.sectorBaseCache={}; SESS.stage='main'; SESS.dirtyFrom=null;\n  try{\n    for(let i=0;i<SESS.timeline.length;i++){\n      const saved=(rec.movements||[])[i]||{};\n      // Sessions saved before the UF became part of the key hold bare-name keys in matrix rows,\n      // assign, geoFeat and closeAdj alike. Restoring that cache would mix key shapes the moment the\n      // stage is recomputed — and it would preserve the very collision this fixes — so those stages\n      // are replayed against the pinned snapshot and the manual assignment is remapped by name.\n      const legacyKeys=!!(saved.matrix&&saved.matrix.length&&saved.matrix.every(r=>r&&r.uf==null));\n      // Sessões salvas antes da regra de gerência podem carregar um destino de outra GV no cache.\n      // Restaurar esse cache manteria o setor proibido na tela para sempre, então essas etapas são\n      // reprocessadas contra o snapshot fixado — igual ao tratamento das chaves legadas.\n      const crossGv=await savedCrossesGv(saved);\n      if(saved.matrix&&!legacyKeys&&!crossGv){\n        loader(true,`restaurando etapa ${i+1}/${SESS.timeline.length} — setor ${SESS.timeline[i].sector} (cache, sem consulta)…`);\n        const mv={sector:String(saved.sector), policy:saved.policy||'fora', view:'tobe', selMuni:null, optBadge:saved.optBadge||''};\n        mv.matrix=saved.matrix; mv.trend=saved.trend||[]; mv.levels=saved.levels||[]; mv.levelByMuni=saved.levelByMuni||{};\n        mv.pureOwnMetrics=saved.pureOwnMetrics||blankM(); mv.domUF=saved.domUF; mv.dest=saved.dest||[]; mv.color=saved.color||{};\n        mv.baseMetrics=saved.baseMetrics||{}; mv.baseLevel=saved.baseLevel||{}; mv.geoFeat=saved.geoFeat||{}; mv.nbrFeat=saved.nbrFeat||[];\n        mv.nbrCurrentSector=saved.nbrCurrentSector||{}; mv.allowed=saved.allowed||{}; mv.reachable=saved.reachable||{};\n        mv.allowedRaw=saved.allowedRaw||saved.allowed||{};\n        mv.destRule=saved.destRule||SESS.settings.destRule; mv.destMinCbs=saved.destMinCbs||SESS.settings.destMinCbs; mv.destRuleFallback=!!saved.destRuleFallback;\n        mv.optTier=(saved.optTier==null?0:saved.optTier);\n        mv.gv=saved.gv||''; mv.gvRejected=saved.gvRejected||[];\n        mv.missingMunis=saved.missingMunis||[]; mv.csvMunisTotal=saved.csvMunisTotal||0;\n        mv.ufGuessed=saved.ufGuessed||{};\n        mv.cbsByMuni=saved.cbsByMuni||{}; mv.shapeMunis=saved.shapeMunis||[];\n        mv.excludedMunis=saved.excludedMunis||[]; mv.excludedCbs=saved.excludedCbs||0; mv.domCsvMunis=saved.domCsvMunis||0;\n        mv.noShapeMunis=saved.noShapeMunis||[]; mv.noShapeCbs=saved.noShapeCbs||0;\n        mv.secCentroid=saved.secCentroid||{}; mv.muniCentroid=saved.muniCentroid||{}; mv.closeAdj=saved.closeAdj||{};\n        aggregateMovement(mv);\n        mv.assign=saved.assign||{};\n        mv.dest.forEach(s=>{ if(!SESS.sectorBaseCache[s]) SESS.sectorBaseCache[s]=mv.baseMetrics[s]; });\n        SESS.timeline[i]=mv;\n      } else {\n        loader(true,`replay ${i+1}/${SESS.timeline.length} — setor ${SESS.timeline[i].sector}…`);\n        await computeAt(i);\n        if(saved.assign) SESS.timeline[i].assign=legacyKeys?remapAssign(SESS.timeline[i],saved.assign):saved.assign;\n        if(saved.policy) SESS.timeline[i].policy=saved.policy;\n      }\n    }\n    await loadSectors();\n  }catch(e){ $('#ds').textContent='erro ao carregar sessão: '+e.message; $('#ds').classList.add('err'); }\n  finally{ loader(false); }\n  renderAll();\n}\n// Re-points a legacy bare-name assignment at the NAME/UF key it can only mean. When a name resolves\n// to more than one município in the recomputed stage the manual choice is genuinely ambiguous —\n// dropping it lets the optimizer allocate instead of guessing on the operator's behalf.\n// True when a cached stage names a destination outside the closing sector's gerência de vendas.\n// Judges the cache by TODAY's rule, reading the (memoised) dominantes base rather than trusting what\n// the session was saved with. Unknown GV on the closing sector answers false: the stage then loads\n// from cache instead of being replayed into the hard throw in computeMovement, which would leave the\n// operator staring at a broken session with no way back.\nasync function savedCrossesGv(saved){\n  if(!saved||!saved.sector||!(saved.dest||[]).length) return false;\n  let gvBy={};\n  try{ await ensureDominantes(); gvBy=DOM.gvBySetor||{}; }catch(e){ return false; }\n  const own=gvBy[String(saved.sector)]||'';\n  if(!own) return false;\n  if(saved.dest.some(s=>(gvBy[String(s)]||'')!==own)) return true;\n  // A stage saved before foreign-GV neighbours stopped being drawn can hold a perfectly clean dest and\n  // STILL carry their shapes in nbrFeat/nbrCurrentSector — it would repaint the old map straight from\n  // cache. An unknown gerência is not evidence of a foreign one, so only a known, differing GV replays.\n  return Object.values(saved.nbrCurrentSector||{}).some(s=>{ const g=gvBy[String(s)]||''; return g&&g!==own; });\n}\nfunction remapAssign(mv,savedAssign){\n  const keys=Object.keys(mv.munis||{}).filter(k=>k!=='__OUTROS__');\n  const out={};\n  Object.entries(savedAssign||{}).forEach(([k,v])=>{\n    if(keys.indexOf(k)>=0){ out[k]=v; return; }\n    const cand=keys.filter(x=>mName(x)===mName(k));\n    if(cand.length===1) out[cand[0]]=v;\n  });\n  return out;\n}\nfunction newSession(){\n  SESS.sessionId=null; SESS.sessionLabel=null; SESS.timeline=[]; SESS.selected=0; SESS.sectorBaseCache={};\n  SESS.settings={...DEFAULT_SETTINGS};\n  SESS.snapshotRaw=null; SESS.snapshotSyncedAt=null; SESS.snapLiteral=null; SESS.eloMaxCycle=null; SESS.stage='loading'; SESS.dirtyFrom=null;\n  (async()=>{\n    loader(true,'iniciando nova sessão…');\n    try{ await Promise.all([ensurePinned(), loadSectors()]); SESS.stage='confirm'; }\n    catch(e){ setError('erro init: '+e.message); }\n    finally{ loader(false); renderAll(); }\n  })();\n}\n\n// ---------- snapshot refresh ----------\n// Deliberately breaks the frozen-snapshot guarantee, on demand: re-resolves DT_HISTORICO and\n// replays the whole timeline against the new one. Skips the replay when the snapshot has not\n// actually moved, so a stray click on a long timeline costs one cheap probe instead of ~8 queries\n// per etapa.\nasync function refreshSnapshot(){\n  if(SESS.stage!=='main' || SESS.snapBusy) return;\n  SESS.snapBusy=true;\n  const prevRaw=SESS.snapshotRaw;\n  const pill=$('#liveState'); if(pill){ pill.classList.add('busy'); pill.textContent='◌ atualizando snapshot…'; }\n  loader(true,'buscando o snapshot mais recente…');\n  let ok=false;\n  try{\n    const p=await resolveSnapshotPin();\n    if(!p.snapshotRaw) throw new Error('não foi possível resolver DT_HISTORICO');\n    const same=String(p.snapshotRaw)===String(prevRaw);\n    SESS.snapshotRaw=p.snapshotRaw; SESS.snapshotSyncedAt=p.syncedAt; SESS.snapLiteral=p.snapLiteral; SESS.eloMaxCycle=p.eloMaxCycle;\n    await loadSectors();   // the sector list follows the live max, so it can have moved too\n    if(same){\n      $('#ds').textContent=`snapshot já era o mais recente · atualizado em ${fmtSyncedAt(p.syncedAt)} — nada recalculado`;\n    } else if(SESS.timeline.length){\n      SESS.dirtyFrom=null;\n      SESS.sectorBaseCache={};   // baselines come from the snapshot, so every one of them changed\n      loader(true,'snapshot novo — recalculando a timeline…');\n      await recomputeFrom(0);\n      $('#ds').textContent=`snapshot atualizado em ${fmtSyncedAt(p.syncedAt)} · ${fmt(SESS.timeline.length)} etapa(s) recalculada(s)`;\n    } else {\n      $('#ds').textContent=`snapshot atualizado em ${fmtSyncedAt(p.syncedAt)}`;\n    }\n    $('#ds').classList.remove('err');\n    ok=true;\n  }catch(e){\n    const at=(SESS.dirtyFrom==null?null:SESS.dirtyFrom+1);\n    $('#ds').textContent='erro ao atualizar o snapshot'+(at?` na etapa ${at} — etapa ${at} em diante ficou desatualizada (⟳)`:'')+': '+e.message;\n    $('#ds').classList.add('err');\n  }finally{\n    SESS.snapBusy=false;\n    if(pill) pill.classList.remove('busy');\n    loader(false); renderAll();\n    if(ok) setTimeout(()=>{ const d=$('#ds'); if(d&&!d.classList.contains('err')) d.textContent=''; },7000);\n  }\n}\n\n// ---------- session options ----------\nfunction previewDest(mv,rule,minCbs){\n  if(!mv||!mv.allowedRaw||!mv.munis) return null;\n  const w={}; let relaxed=false;\n  const cbsOf=m=>(mv.cbsByMuni&&mv.cbsByMuni[m]!=null)?mv.cbsByMuni[m]:((mv.munis[m]&&mv.munis[m].cbs)||0);\n  const add=m=>Object.entries(mv.allowedRaw[m]||{}).forEach(([s,v])=>{ w[s]=(w[s]||0)+v; });\n  // allowedRaw only carries municipalities already inside the sector's dominance base, so there is\n  // nothing left to filter out here beyond the destination rule itself.\n  Object.keys(mv.allowedRaw).forEach(m=>{ const cbs=cbsOf(m);\n    if(rule==='dominant'&&cbs<minCbs) return; add(m); });\n  if(rule==='dominant'&&!Object.keys(w).length){ Object.keys(mv.allowedRaw).forEach(add); relaxed=true; }\n  return {dest:Object.keys(w).sort((a,b)=>w[b]-w[a]).slice(0,6),relaxed};\n}\nfunction readOptForm(){\n  const r=root.querySelector('input[name=\"destRule\"]:checked');\n  let n=Math.round(+$('#optMinCbs').value);\n  if(!(n>0)) n=DEFAULT_SETTINGS.destMinCbs;\n  return {destRule:(r&&r.value)||DEFAULT_SETTINGS.destRule, destMinCbs:n,\n          targetSpan:numOrNull($('#optTargetSpan').value),\n          maxSpan:numOrNull($('#optMaxSpan').value),\n          minSpan:numOrNull($('#optMinSpan').value)};\n}\nfunction spanFormError(f){\n  if(f.minSpan&&f.maxSpan&&f.minSpan>f.maxSpan) return `Span mínimo (${fmt(f.minSpan)}) não pode ser maior que o máximo (${fmt(f.maxSpan)}).`;\n  if(f.targetSpan&&f.maxSpan&&f.targetSpan>f.maxSpan) return `Span alvo (${fmt(f.targetSpan)}) não pode passar do máximo (${fmt(f.maxSpan)}).`;\n  if(f.targetSpan&&f.minSpan&&f.targetSpan<f.minSpan) return `Span alvo (${fmt(f.targetSpan)}) não pode ficar abaixo do mínimo (${fmt(f.minSpan)}).`;\n  return '';\n}\nfunction renderOptPreview(){\n  const el=$('#optPreview'); if(!el) return;\n  const f=readOptForm();\n  root.querySelectorAll('.opt-row').forEach(r=>{\n    if(r.dataset.r!=null) r.classList.toggle('on',r.dataset.r===f.destRule);\n  });\n  const wrap=$('#optMinCbsWrap'); if(wrap) wrap.classList.toggle('off',f.destRule!=='dominant');\n  const err=spanFormError(f), ee=$('#optSpanErr');\n  if(ee){ ee.textContent=err; ee.classList.toggle('hidden',!err); }\n  const ap=$('#optApply'); if(ap) ap.disabled=!!err;\n  const mv=SESS.timeline[SESS.selected];\n  if(!mv||!mv.munis){ el.innerHTML='Nenhuma etapa calculada ainda — as regras passam a valer no próximo fechamento.'; return; }\n  const cbsOf=m=>(mv.cbsByMuni&&mv.cbsByMuni[m]!=null)?mv.cbsByMuni[m]:((mv.munis[m]&&mv.munis[m].cbs)||0);\n  const ms=Object.keys(mv.geoFeat||{});\n  const ig=f.destRule==='dominant'?ms.filter(m=>cbsOf(m)<f.destMinCbs):[];\n  const pv=previewDest(mv,f.destRule,f.destMinCbs);\n  let h=`<b style=\"color:var(--ink)\">Prévia — etapa ${SESS.selected+1}, setor ${mv.sector}</b><br>`;\n  const exN=(mv.excludedMunis||[]).length;\n  if(exN) h+=`Base de dominantes: <b>${fmt(ms.length)}</b> município(s) no mapa · <span style=\"color:var(--closing)\">${fmt(exN)} fora da base — ${fmt(mv.excludedCbs||0)} CBs seguem suas líderes</span><br>`;\n  h+=`${fmt(ms.length-ig.length)} de ${fmt(ms.length)} município(s) valem como ponte`;\n  if(ig.length) h+=` · <span style=\"color:var(--closing)\">ignorados:</span> ${ig.slice(0,8).join(', ')}${ig.length>8?' +'+(ig.length-8):''}`;\n  if(pv){\n    h+=`<br>Setores destino com esta regra: <b style=\"color:var(--ink)\">${pv.dest.join(', ')||'–'}</b>`;\n    const cur=(mv.dest||[]).join(', ');\n    if(pv.dest.join(',')!==(mv.dest||[]).join(',')) h+=` <span style=\"color:var(--closing)\">(hoje: ${cur||'–'})</span>`;\n    if(pv.relaxed) h+=`<br><b style=\"color:var(--closing)\">⚠ nenhum município dominante nesta etapa — a regra relaxa pra \"qualquer município\" pra não deixar a etapa sem destino.</b>`;\n  }\n  if(f.targetSpan||f.maxSpan||f.minSpan){\n    const sp=spanMapFor(mv,mv.assign||{}), v=spanViolationsOf(sp,{target:f.targetSpan,max:f.maxSpan,min:f.minSpan});\n    h+=`<br><br>Span dos destinos como está hoje: ${mv.dest.map(s=>s+' <b>'+fmt(sp[s])+'</b>').join(' · ')||'–'}`;\n    if(v.over.length||v.under.length) h+=`<br><span style=\"color:var(--closing)\">Fora dos limites: ${[...v.over.map(s=>s+' ▲ acima do máx'),...v.under.map(s=>s+' ▼ abaixo do mín')].join(', ')}</span> — o modelo ÓTIMO tenta corrigir no recálculo.`;\n    else h+=` <span style=\"color:var(--ok)\">— já dentro dos limites</span>`;\n  }\n  if(SESS.timeline.length) h+=`<br><span style=\"margin-top:4px;display:inline-block\">Aplicar <b>recalcula as ${fmt(SESS.timeline.length)} etapa(s)</b> contra o snapshot congelado — os destinos ajustados à mão serão refeitos pelo modelo ÓTIMO.</span>`;\n  el.innerHTML=h;\n}\nfunction openOptions(){\n  const st={...DEFAULT_SETTINGS,...(SESS.settings||{})};\n  root.querySelectorAll('input[name=\"destRule\"]').forEach(r=>{ r.checked=(r.value===st.destRule); });\n  $('#optMinCbs').value=st.destMinCbs;\n  $('#optTargetSpan').value=st.targetSpan||'';\n  $('#optMaxSpan').value=st.maxSpan||'';\n  $('#optMinSpan').value=st.minSpan||'';\n  $('#optApply').disabled=false;\n  $('#optSessName').textContent=SESS.sessionLabel||'sessão não salva';\n  $('#optStatus').textContent='';\n  $('#optionsBg').classList.remove('hidden');\n  renderOptPreview();\n  const c=$('#optCancel'); if(c) c.focus();\n}\nfunction closeOptions(){ const b=$('#optionsBg'); if(b) b.classList.add('hidden'); }\nasync function applyOptions(){\n  const f=readOptForm();\n  if(spanFormError(f)) return;\n  const prev={...DEFAULT_SETTINGS,...(SESS.settings||{})};\n  const changed = prev.destRule!==f.destRule\n    || (f.destRule==='dominant' && prev.destMinCbs!==f.destMinCbs)\n    || numOrNull(prev.targetSpan)!==f.targetSpan\n    || numOrNull(prev.maxSpan)!==f.maxSpan\n    || numOrNull(prev.minSpan)!==f.minSpan;\n  SESS.settings={...prev,...f};\n  closeOptions();\n  if(!changed || !SESS.timeline.length){ renderAll(); return; }\n  SESS.dirtyFrom=null;\n  SESS.sectorBaseCache={};   // the recompute re-derives every baseline; keeping the old ones would\n                             // leave \"Impacto acumulado\" comparing against pre-change numbers\n  loader(true,'aplicando nova regra de destino — recalculando timeline…');\n  try{\n    await recomputeFrom(0);\n    $('#ds').textContent=''; $('#ds').classList.remove('err');\n  }catch(e){\n    const at=(SESS.dirtyFrom==null?0:SESS.dirtyFrom)+1;\n    $('#ds').textContent=`erro ao aplicar a regra na etapa ${at}: ${e.message} — etapa ${at} em diante ficou desatualizada (⟳)`;\n    $('#ds').classList.add('err');\n  }finally{ loader(false); renderAll(); }\n}\n\nconst SHARED_DS='timeline-shared-sessionsDataSet';\nconst AUTH_REF='timelineSimAuthFinal';   // single source of truth for the auth strategy reference\nlet SHARE={busy:false,url:null,last:null};\n// Serialise a PRESENTATION model, not the raw session, so the reader stays purely presentational\n// and never re-derives spans/desloc/orphans — no second copy of this engine to keep in sync.\n// NOTE: METRICS_DEF[2] is the money marker; read it as !!md[2] (a literal dollar sign in this\n// position trips the upsert's parse check).\nfunction buildShareStages(){\n  return SESS.timeline.map((mv,i)=>{\n    const c=computeDerived(mv);\n    const incBy={};\n    mv.dest.forEach(s=>{ incBy[s]=Object.fromEntries(METRICS_DEF.map(md=>[md[0],0])); });\n    Object.entries(mv.munis).forEach(([m,o])=>{\n      if(m==='__OUTROS__') return;\n      const s=mv.assign[m]; if(!s||!incBy[s]) return;\n      METRICS_DEF.forEach(md=>{ incBy[s][md[0]]+=o[md[0]]||0; });\n    });\n    const saiTot={};\n    METRICS_DEF.forEach(md=>{\n      const k=md[0];\n      saiTot[k]=Object.entries(mv.munis).filter(([m])=>m!=='__OUTROS__').reduce((a,p)=>a+((p[1][k])||0),0);\n    });\n    // orphans follow their leader's home: they enter that sector AND leave the closing one\n    c.leaders.forEach(L=>{\n      const om=mv.orphanMetricsByGroup&&mv.orphanMetricsByGroup[L.grupo];\n      if(!om||!L.home) return;\n      METRICS_DEF.forEach(md=>{ const k=md[0];\n        if(incBy[L.home]) incBy[L.home][k]+=om[k]||0;\n        saiTot[k]+=om[k]||0; });\n    });\n    const ms=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__').sort((a,b)=>mv.munis[b].cbs-mv.munis[a].cbs);\n    const sv=mv.dest.map(s=>c.span[s]);\n    const baseOf=(s,k)=>{ const b=mv.baseMetrics[s]||{}; return +(b[k]||0); };\n    return {\n      i:i, sector:mv.sector, policy:mv.policy, domUF:mv.domUF,\n      optTier:(mv.optTier==null?0:mv.optTier),\n      destRuleFallback:!!mv.destRuleFallback,\n      dest:mv.dest.slice(), color:Object.assign({},mv.color), assign:Object.assign({},mv.assign),\n      kpis:{ cbsRealocadas:closingCbsOf(mv), desloc:c.desloc,\n             spread:(sv.length?Math.max.apply(null,sv)-Math.min.apply(null,sv):0),\n             municipios:ms.length, lideres:mv.leaders.length },\n      destinos:mv.dest.map(s=>({ s:s, base:baseOf(s,'cbs'), inc:c.inc[s]||0, orph:c.orph[s]||0, span:c.span[s]||0, gained:c.gained[s]||0 })),\n      municipios:ms.map(m=>({ nome:mName(m), uf:mUf(m), cbs:mv.munis[m].cbs, destino:mv.assign[m]||null })),\n      excluidos:(mv.excludedMunis||[]).map(x=>({ muni:x.muni, cbs:x.cbs })),\n      orphanTotal:c.orphanTotal||0, orphanStranded:c.orphanStranded||0, noShapeCbs:mv.noShapeCbs||0,\n      lideres:c.leaders.map(L=>({ lider:(L.lider||'').split(' ').slice(0,2).join(' '), grupo:L.grupo,\n        total:L.total, home:L.home, desloc:L.desloc, orphan:L.orphan||0 })),\n      metricas:METRICS_DEF.map(md=>{ const k=md[0];\n        return { key:k, label:md[1], money:!!md[2],\n          rows:mv.dest.map(s=>({ s:s, antes:baseOf(s,k), depois:baseOf(s,k)+((incBy[s]&&incBy[s][k])||0) })),\n          sai:saiTot[k]||0 }; }),\n      geoFeat:mv.geoFeat, nbrFeat:mv.nbrFeat, excludedFeat:[]\n    };\n  });\n}\nfunction buildShareSummary(stages){\n  const world=foldWorldState(SESS.timeline,SESS.timeline.length);\n  const receivers=[];\n  SESS.timeline.forEach((mv,i)=>{\n    const own=mv.pureOwnMetrics||{};\n    receivers.push({ s:mv.sector, situacao:'fechado (etapa '+(i+1)+')', antes:+(own.cbs||0), depois:0 });\n  });\n  const seen={};\n  Object.values(world.muniOverride).forEach(s=>{\n    if(seen[s]) return; seen[s]=1;\n    const base=SESS.sectorBaseCache[s]||{}, infl=world.sectorInflow[s]||{};\n    receivers.push({ s:s, situacao:'recebeu território', antes:+(base.cbs||0), depois:(+(base.cbs||0))+(infl.cbs||0) });\n  });\n  return { stages:stages.length, sectors:SESS.timeline.map(mv=>mv.sector),\n    totalCbs:stages.reduce((a,s)=>a+(s.kpis.cbsRealocadas||0),0),\n    totalDesloc:stages.reduce((a,s)=>a+(s.kpis.desloc||0),0), receivers:receivers };\n}\nfunction renderShareBody(){\n  const el=$('#shareBody'); if(!el) return;\n  const go=$('#shareGo'), cp=$('#shareCopy'), op=$('#shareOpen'), cc=$('#shareCancel');\n  if(SHARE.url){\n    el.innerHTML=`<div class=\"opt-note\" style=\"margin-top:0\"><b style=\"color:var(--ink)\">Sessão compartilhada ✓</b><br>\n      Link de leitura desta simulação congelada. Quem abrir precisa ter login no simulador.\n      <div class=\"shareurl\">${esc(SHARE.url)}</div></div>`;\n    if(go) go.classList.add('hidden');\n    if(cp) cp.classList.remove('hidden');\n    if(op) op.classList.remove('hidden');\n    if(cc) cc.textContent='Fechar';\n    return;\n  }\n  if(go) go.classList.remove('hidden');\n  if(cp) cp.classList.add('hidden');\n  if(op) op.classList.add('hidden');\n  if(cc) cc.textContent='Cancelar';\n  const st={...DEFAULT_SETTINGS,...(SESS.settings||{})};\n  const desloc=SESS.timeline.reduce((a,mv)=>a+(mv.munis?computeDerived(mv).desloc:0),0);\n  const destTxt=st.destRule==='dominant'?('dominantes ≥'+fmt(st.destMinCbs)+' CBs'):'qualquer município';\n  el.innerHTML=`<div class=\"opt-lbl\">Confirmar compartilhamento</div>\n    <div class=\"opt-sub\">Publica uma <b>cópia congelada</b> desta sessão, exatamente no estado atual.</div>\n    <div class=\"opt-note\" style=\"margin-top:0\">\n      · <b>${fmt(SESS.timeline.length)}</b> etapa(s) — ${esc(SESS.timeline.map(mv=>mv.sector).join(' → '))}<br>\n      · snapshot atualizado em <b>${esc(fmtSyncedAt(SESS.snapshotSyncedAt))}</b><br>\n      · base: <b>municípios dominantes (CSV)</b> · destino: <b>${esc(destTxt)}</b> · span: <b>${esc(spanShort(st))}</b><br>\n      · <b>${fmt(desloc)}</b> CBs deslocadas somando a cadeia\n    </div>\n    <div class=\"opt-note\">A cópia <b>não</b> acompanha edições posteriores desta sessão — pra atualizar, compartilhe de novo e use o link novo. O link exige login no simulador; não é público.</div>\n    ${SHARE.last?`<div class=\"opt-note\"><b style=\"color:var(--ink)\">Último link gerado nesta sessão</b> — aponta pro estado de <b>antes</b> das edições feitas depois dele.<div class=\"shareurl\">${esc(SHARE.last)}</div></div>`:''}`;\n}\nasync function openShare(){\n  if(!SESS.timeline.length){ $('#ds').textContent='nada pra compartilhar — feche pelo menos um setor primeiro.'; $('#ds').classList.add('err'); return; }\n  await flushDirty();\n  SHARE.url=null;\n  const s=$('#shareStatus'); if(s){ s.textContent=''; s.classList.remove('err'); }\n  renderShareBody();\n  $('#shareBg').classList.remove('hidden');\n  const b=$('#shareCancel'); if(b) b.focus();\n}\nfunction closeShare(){ const b=$('#shareBg'); if(b) b.classList.add('hidden'); }\nasync function doShare(){\n  if(SHARE.busy) return;\n  const go=$('#shareGo'), stx=$('#shareStatus');\n  SHARE.busy=true;\n  if(go){ go.disabled=true; go.textContent='Compartilhando…'; }\n  if(stx){ stx.textContent=''; stx.classList.remove('err'); }\n  try{\n    // Resolved as a GLOBAL PROCESS, not a declared param — which only works because the block\n    // instance on the `main` artboard binds `sharedDataset: @timeline-shared-sessionsDataSet`.\n    // That binding is load-bearing: a Process is only define()d once something on the rendering\n    // tree references it, so without it this lookup returns null and sharing dies on the guard\n    // below. Do NOT remove the instance param because this file never reads d2.params.sharedDataset.\n    const ds=d2.data(SHARED_DS);\n    if(!ds) throw new Error('dataset de sessões compartilhadas indisponível');\n    await flushDirty();\n    const stages=buildShareStages();\n    const summary=buildShareSummary(stages);\n    let who='';\n    try{ const a=d2.auth(AUTH_REF); who=(a&&a.user&&(a.user.email||a.user.nome))||''; }catch(e){}\n    const created=await ds.create({\n      label:SESS.sessionLabel||('Sessão '+new Date().toLocaleString('pt-BR')),\n      snapshotRaw:SESS.snapshotRaw, snapshotSyncedAt:SESS.snapshotSyncedAt,\n      settings:{...DEFAULT_SETTINGS,...(SESS.settings||{})},\n      stages:stages, summary:summary, sharedBy:who, sharedAt:new Date().toISOString()\n    });\n    const id=(created&&created._id)||(created&&created.data&&created.data._id)||(ds.selected&&ds.selected()&&ds.selected()._id)||null;\n    if(!id) throw new Error('registro gravado, mas sem _id na resposta — não foi possível montar o link');\n    SHARE.url=window.location.origin+'/sessions/'+id;\n    SHARE.last=SHARE.url;\n    renderShareBody();\n  }catch(e){\n    if(stx){ stx.textContent='erro ao compartilhar: '+e.message; stx.classList.add('err'); }\n  }finally{\n    SHARE.busy=false;\n    if(go){ go.disabled=false; go.textContent='Compartilhar'; }\n  }\n}\n\n// ---------- rendering ----------\nfunction renderTimeline(){\n  const el=$('#movementChips'); if(!el) return;\n  if(!SESS.timeline.length){ el.innerHTML='<span class=\"empty\">Nenhuma etapa ainda — use \"Fechar setor ▶\" à direita.</span>'; return; }\n  el.innerHTML=SESS.timeline.map((mv,i)=>{\n    const ready=mv.dest!==undefined;\n    const c=ready?computeDerived(mv):null;\n    const stale=SESS.dirtyFrom!=null && i>=SESS.dirtyFrom;\n    return `<div class=\"tchip ${i===SESS.selected?'on':''} ${stale?'stale':''}\" data-i=\"${i}\">\n      <span class=\"tnum\">${i+1}</span><span class=\"tsec\">Setor ${mv.sector}</span>\n      <span class=\"tstat\">${ready?fmt(c.desloc)+' desloc.':'…'}</span>\n      ${stale?'<span class=\"tstale\" title=\"recalcula ao selecionar outra etapa\">⟳</span>':''}\n      <span class=\"trm\" data-rm=\"${i}\" title=\"remover esta etapa e as seguintes\">✕</span>\n    </div>`;\n  }).join('');\n  el.querySelectorAll('.tchip').forEach(ch=>{\n    ch.addEventListener('click',async (e)=>{\n      if(e.target.dataset.rm!=null && e.target.dataset.rm!==''){ removeFrom(+e.target.dataset.rm); return; }\n      const i=+ch.dataset.i;\n      if(i!==SESS.selected) await flushDirty();\n      SESS.selected=i; renderAll();\n    });\n  });\n}\nfunction renderRuleNote(){\n  const el=$('#ruleNote'); if(!el) return;\n  const st={...DEFAULT_SETTINGS,...(SESS.settings||{})};\n  const mv=SESS.timeline[SESS.selected];\n  let h='';\n  h+=`<b style=\"color:var(--ink)\">Base de municípios dominantes:</b> só os municípios que a base (CSV) atribui ao setor entram no mapa e na alocação`;\n  if(mv&&mv.domCsvMunis) h+=` · <b>${fmt(mv.domCsvMunis)}</b> na base do setor ${mv.sector}`;\n  if(mv&&mv.excludedCbs) h+=` · <b style=\"color:var(--closing)\">${fmt(mv.excludedMunis.length)} município(s) / ${fmt(mv.excludedCbs)} CBs</b> fora da base nesta etapa — não aparecem no mapa e as CBs seguem suas líderes (quebra de vínculo)`;\n  if(DOM.error) h+=` · <b style=\"color:var(--closing)\">⚠ base indisponível: ${esc(DOM.error)}</b>`;\n  h+=`<br>`;\n  h+=`<b style=\"color:var(--ink)\">Regra de destino:</b> `;\n  h+= st.destRule==='dominant'\n    ? `só municípios com <b>≥${fmt(st.destMinCbs)} CBs</b> trazem setor pra lista de destinos`\n    : `qualquer município do setor fechado vale como ponte <span style=\"opacity:.7\">(padrão)</span>`;\n  if(mv&&mv.munis&&st.destRule==='dominant'){\n    const ig=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__'&&mv.munis[m].cbs<st.destMinCbs);\n    if(ig.length) h+=` · <b style=\"color:var(--closing)\">${fmt(ig.length)}</b> ignorado(s) como ponte (ainda redistribuído(s)): ${ig.slice(0,5).join(', ')}${ig.length>5?' +'+(ig.length-5):''}`;\n    if(mv.destRuleFallback) h+=`<br><b style=\"color:var(--closing)\">⚠ nenhum município dominante nesta etapa — regra relaxada pra \"qualquer município\".</b>`;\n  }\n  el.innerHTML=h;\n}\nfunction renderSpanRule(){\n  const el=$('#spanRule'); if(!el) return;\n  const mv=SESS.timeline[SESS.selected], lim=spanLimits();\n  if(!mv||!mv.munis||mv.view==='asis'||!spanLimitsOn(lim)){ el.innerHTML=''; return; }\n  const sp=spanMapFor(mv,mv.assign||{}), v=spanViolationsOf(sp,lim);\n  const bits=[];\n  if(lim.target) bits.push(`alvo <b>${fmt(lim.target)}</b>`);\n  if(lim.max) bits.push(`máx <b>${fmt(lim.max)}</b>`);\n  if(lim.min) bits.push(`mín <b>${fmt(lim.min)}</b>`);\n  let h=`Pré-requisito de span: ${bits.join(' · ')} CBs — `;\n  if(v.over.length||v.under.length){\n    h+=`<b style=\"color:var(--closing)\">⚠ `;\n    if(v.over.length) h+=`acima do máximo: ${v.over.map(s=>s+' ('+fmt(sp[s])+')').join(', ')}`;\n    if(v.over.length&&v.under.length) h+=' · ';\n    if(v.under.length) h+=`abaixo do mínimo: ${v.under.map(s=>s+' ('+fmt(sp[s])+')').join(', ')}`;\n    h+=`</b>`;\n    if(mv.optTier===1) h+=`<br><span style=\"opacity:.85\">Nenhuma alocação contígua respeita o span mínimo nesta etapa — o modelo relaxou essa exigência.</span>`;\n    else if(mv.optTier===2) h+=`<br><span style=\"opacity:.85\">Nenhuma alocação contígua respeita os limites nesta etapa — o modelo relaxou essa exigência.</span>`;\n    else if(mv.optTier===-1) h+=`<br><span style=\"opacity:.85\">Etapa resolvida por heurística — os limites não são garantidos.</span>`;\n  } else h+=`<b style=\"color:var(--ok)\">✓ todos os setores receptores dentro dos limites</b>`;\n  el.innerHTML=`<div class=\"note\" style=\"margin:-2px 0 6px\">${h}</div>`;\n}\nfunction renderContig(){const mv=SESS.timeline[SESS.selected];const el=$('#contig');if(!el||!mv)return;\n  if(mv.view==='asis'){el.innerHTML='';return;}\n  const bad=contigBadFor(mv,mv.assign);\n  el.innerHTML=bad.length\n    ?`<div class=\"note\" style=\"color:var(--closing);font-weight:600;margin:-2px 0 6px\">⚠ Contiguidade quebrada em ${bad.join(', ')} — município(s) desconectado(s) do território do setor. Use ★ ÓTIMO ou reassocie no mapa.</div>`\n    :`<div class=\"note\" style=\"color:var(--ok);margin:-2px 0 6px\">✓ Contíguo — cada setor forma uma região conectada.</div>`;\n}\nfunction closingCbsOf(mv){ return Object.entries(mv.munis).filter(([m])=>m!=='__OUTROS__').reduce((a,[,o])=>a+o.cbs,0); }\nfunction sectorTotalCbs(mv){ return Object.values(mv.munis).reduce((a,o)=>a+o.cbs,0); }\nfunction renderKpis(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const c=computeDerived(mv);\n  if(mv.view==='asis'){const mc=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__').length;\n    $('#kpis').innerHTML=[\n      {n:fmt(sectorTotalCbs(mv)),l:`CBs no setor ${mv.sector} (antes desta etapa)`,t:'Total de CBs no setor hoje — já considerando o que etapas anteriores da timeline mandaram pra cá.'},\n      {n:mv.csvMunisTotal?`${fmt(mc)}/${fmt(mv.csvMunisTotal)}`:fmt(mc),l:'Municípios do setor',t:`Municípios desenhados nesta etapa${mv.csvMunisTotal?` de ${fmt(mv.csvMunisTotal)} que a base de dominantes atribui ao setor`:''}.${(mv.missingMunis||[]).length?' Fora do mapa: '+mv.missingMunis.map(x=>x.muni+' ('+x.reason+')').join(' · '):''}${Object.keys(mv.ufGuessed||{}).length?' UF inferida da UF dominante do setor (nome repetido em outra UF carregada): '+Object.entries(mv.ufGuessed).map(([nm,u])=>nm+'→'+u).join(', '):''}`},\n      {n:fmt(mv.leaders.length),l:'Líderes (grupos)',t:'Líderes presentes no setor nesta etapa.'},\n      {n:fmt(mv.dest.length),l:'Setores adjacentes',t:`Setores vizinhos (ainda abertos) da MESMA gerência de vendas (CD_GV ${mv.gv||'?'}) que poderiam receber os municípios.${(mv.gvRejected||[]).length?' Fora do mapa, por serem de outra gerência: '+mv.gvRejected.join(', ')+'.':''}`},\n    ].map(k=>`<div class=\"kpi\" title=\"${k.t}\"><div class=\"n\">${k.n}</div><div class=\"l\">${k.l}</div></div>`).join('');\n    return;}\n  const sv=mv.dest.map(s=>c.span[s]);const spread=sv.length?Math.max(...sv)-Math.min(...sv):0;\n  const zero=mv.dest.filter(s=>c.gained[s]===0);const totCbs=closingCbsOf(mv);\n  $('#kpis').innerHTML=[\n    {n:fmt(c.desloc),l:mv.policy==='fora'?'CBs fora do setor':'CBs c/ quebra de relação',cls:'warn',t:'CBs cuja líder acabou noutro setor nesta etapa.'},\n    {n:fmt(spread),l:'Desequilíbrio (máx−mín CBs)',cls:spread>800?'warn':'ok',t:'Diferença de tamanho entre o maior e o menor setor depois desta etapa.'},\n    {n:fmt(totCbs),l:'CBs realocadas',cls:'',t:`Total de CBs do setor ${mv.sector} sendo redistribuídas nesta etapa.`},\n    {n:zero.length?zero.join(', '):'nenhum',l:'Setor sem líder herdada',cls:zero.length?'warn':'ok',t:'Setor que recebe município(s) mas nenhuma líder nesta etapa.'},\n  ].concat(mv.excludedCbs?[{n:fmt(mv.excludedCbs),l:`CBs ignoradas · ${fmt(mv.excludedMunis.length)} município(s) fora da base`,cls:'warn',t:'CBs em municípios que a base de dominantes não atribui a este setor: ficam fora do mapa e da alocação geográfica e seguem a líder do seu grupo.'}]:[])\n   .concat((mv.missingMunis||[]).length?[{n:fmt(mv.missingMunis.length),l:`Município(s) da base fora do mapa · ${fmt(mv.csvMunisTotal)} na base`,cls:'warn',t:`A base de dominantes atribui ${fmt(mv.csvMunisTotal)} município(s) ao setor ${mv.sector} e ${fmt(mv.csvMunisTotal-mv.missingMunis.length)} chegaram ao mapa. Fora: ${mv.missingMunis.map(x=>x.muni+' — '+x.reason+(x.cbs?' ('+fmt(x.cbs)+' CBs)':'')).join(' · ')}`}]:[])\n   .map(k=>`<div class=\"kpi ${k.cls}\" title=\"${k.t}\"><div class=\"n\">${k.n}</div><div class=\"l\">${k.l}</div></div>`).join('');\n}\nfunction renderSpans(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const c=computeDerived(mv);\n  if(mv.view==='asis'){const items=[{s:mv.sector,val:sectorTotalCbs(mv),color:CLOSE_COLOR}].concat(mv.dest.map(s=>({s,val:+(mv.baseMetrics[s]?.cbs||0),color:mv.color[s]})));\n    const max=Math.max(...items.map(x=>x.val),1);\n    $('#spans').innerHTML=items.map(x=>`<div class=\"bar-row\"><div class=\"tag\" style=\"color:${x.color}\">${x.s}</div><div class=\"bar-track\">\n      <div class=\"bar-inc\" style=\"width:${x.val/max*100}%;background:${x.color}\"></div></div>\n      <div class=\"bar-val\">${fmt(x.val)}</div></div>`).join('')\n      +`<div class=\"note\">Estrutura antes desta etapa — o setor <b>${mv.sector}</b> ainda existe. Alterne pra <b>TOBE</b> pra ver a redistribuição.</div>`;\n    return;}\n  const lim=spanLimits(),on=spanLimitsOn(lim);\n  const rawMax=Math.max(...mv.dest.map(s=>c.span[s]),lim.target||0,lim.max||0,1);\n  const max=on?rawMax*1.04:rawMax;   // headroom so a marker sitting at the scale top stays visible\n  const mk=(v,color,label)=>v?`<div class=\"bar-mark\" style=\"left:${Math.min(99.6,v/max*100).toFixed(1)}%;background:${color}\" title=\"${label}\"></div>`:'';\n  const marks=mk(lim.min,'#ff9500','span mínimo '+fmt(lim.min))+mk(lim.target,'#007aff','span alvo '+fmt(lim.target))+mk(lim.max,'#ff3b30','span máximo '+fmt(lim.max));\n  $('#spans').innerHTML=mv.dest.map(s=>{const base=+(mv.baseMetrics[s]?.cbs||0),i=c.inc[s];\n    const over=lim.max&&c.span[s]>lim.max,under=lim.min&&c.span[s]<lim.min;\n    return `<div class=\"bar-row\"><div class=\"tag\" style=\"color:${mv.color[s]}\">${s}</div><div class=\"bar-track\">\n      <div class=\"bar-base\" style=\"width:${base/max*100}%;background:${mv.color[s]}\"></div>\n      <div class=\"bar-inc\" style=\"width:${i/max*100}%;background:${mv.color[s]}\"></div>${marks}</div>\n      <div class=\"bar-val\" style=\"${over?'color:var(--closing);font-weight:700':(under?'color:#ff9500;font-weight:700':'')}\">${fmt(c.span[s])} <span style=\"opacity:.6\">(+${fmt(i)})</span>${over?' ▲':''}${under?' ▼':''}</div></div>`;}).join('')\n    +`<div class=\"note\">Claro = base (já incluindo etapas anteriores) · cheio = CBs entrantes do ${mv.sector} nesta etapa.${c.orphanTotal?` Inclui <b>${fmt(c.orphanTotal-c.orphanStranded)}</b> CB(s) de municípios fora da base de dominantes que seguiram suas líderes.`:''}${on?' Marcas: <b style=\"color:#007aff\">│</b> alvo · <b style=\"color:#ff3b30\">│</b> máx · <b style=\"color:#ff9500\">│</b> mín.':''}</div>`;\n}\n// Two very different reasons land rows in the __OUTROS__ bucket — no IBGE shape, or outside the\n// sector's dominance base. Same bucket computationally, but they must not read as the same thing.\nfunction outsideNote(mv){\n  const bits=[];\n  if(mv.noShapeCbs) bits.push(`<b>${fmt(mv.noShapeCbs)}</b> CBs em ${fmt(mv.noShapeMunis.length)} município(s) sem shape na UF`);\n  if(mv.excludedCbs) bits.push(`<b>${fmt(mv.excludedCbs)}</b> CBs em ${fmt(mv.excludedMunis.length)} município(s) <b>fora da base de dominantes</b> deste setor — <b style=\"color:var(--closing)\">quebra de vínculo</b>`);\n  if(!bits.length) return '';\n  let h=`<div class=\"note\">Fora do mapa e da alocação geográfica: ${bits.join(' · ')}.`;\n  if(mv.excludedCbs){\n    const c=computeDerived(mv);\n    h+=` As <b>${fmt(mv.excludedCbs)}</b> CBs em quebra de vínculo <b>seguem a líder do seu grupo</b>`;\n    const byS=mv.dest.filter(s=>c.orph[s]).map(s=>`<b style=\"color:${mv.color[s]}\">${s}</b> (${fmt(c.orph[s])})`);\n    h+=byS.length?`: ${byS.join(' · ')}.`:'.';\n    if(c.orphanStranded) h+=` <b style=\"color:var(--closing)\">${fmt(c.orphanStranded)} CB(s) sem destino</b> — a líder não ficou com nenhum município realocado, então não há setor pra seguir.`;\n  }\n  if(mv.noShapeCbs) h+=` As CBs sem shape na UF continuam fora de qualquer setor destino.`;\n  if(mv.excludedMunis&&mv.excludedMunis.length) h+=`<br><span style=\"opacity:.85\">${mv.excludedMunis.slice(0,8).map(x=>x.muni+' ('+fmt(x.cbs)+')').join(', ')}${mv.excludedMunis.length>8?' +'+(mv.excludedMunis.length-8):''}</span>`;\n  return h+`</div>`;\n}\nfunction renderMuni(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const ms=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__').sort((a,b)=>mv.munis[b].cbs-mv.munis[a].cbs);\n  if(mv.view==='asis'){$('#muniList').innerHTML=ms.map(m=>`<div class=\"muni-item\"><div class=\"nm\">${m}</div><div class=\"ct\">${fmt(mv.munis[m].cbs)} CBs</div><span class=\"badge\" style=\"background:${CLOSE_COLOR};color:#fff;border-color:${CLOSE_COLOR}\">setor ${mv.sector}</span></div>`).join('')\n      +`<div class=\"note\">Hoje todos pertencem ao setor <b>${mv.sector}</b>. No <b>TOBE</b> cada um vira botões de destino.</div>`+outsideNote(mv);return;}\n  $('#muniList').innerHTML=ms.map(m=>`<div class=\"muni-item\"><div class=\"nm\">${m}</div><div class=\"ct\">${fmt(mv.munis[m].cbs)} CBs</div>\n    <div class=\"seg\" data-m=\"${m}\">${mv.dest.map(s=>`<button data-s=\"${s}\" class=\"${mv.assign[m]===s?'on':''}\" style=\"${mv.assign[m]===s?'background:'+mv.color[s]:''}\">${s}</button>`).join('')}</div></div>`).join('')\n    +outsideNote(mv);\n  $('#muniList').querySelectorAll('.seg button').forEach(b=>b.onclick=()=>{const m=b.parentElement.dataset.m,s=b.dataset.s;editSelected(m2=>{m2.assign[m]=s;});});\n}\nfunction renderLeaders(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const c=computeDerived(mv);\n  if(mv.view==='asis'){$('#leaders').innerHTML=`<thead><tr><th>Líder</th><th>Grupo</th><th>CBs</th><th>Setor</th></tr></thead><tbody>`\n    +mv.leaders.map(L=>`<tr><td>${(L.lider||'').split(' ').slice(0,2).join(' ')}</td><td>${L.grupo}</td><td>${fmt(L.total)}</td><td><span class=\"home\" style=\"background:${CLOSE_COLOR}\"></span>${mv.sector}</td></tr>`).join('')\n    +`<tr style=\"font-weight:700\"><td>TOTAL</td><td></td><td>${fmt(mv.leaders.reduce((a,L)=>a+L.total,0))}</td><td></td></tr></tbody>`;return;}\n  const showOrph=c.orphanTotal>0;\n  $('#leaders').innerHTML=`<thead><tr><th>Líder</th><th>CBs</th><th>Home</th>${mv.dest.map(s=>`<th>${s}</th>`).join('')}${showOrph?'<th title=\"CBs em municípios fora da base de dominantes que seguiram esta líder\">Órfãs</th>':''}<th>Desloc.</th></tr></thead><tbody>`\n   +c.leaders.map(L=>`<tr><td>${(L.lider||'').split(' ').slice(0,2).join(' ')}</td><td>${fmt(L.total)}</td>\n     <td>${L.home?`<span class=\"home\" style=\"background:${mv.color[L.home]}\"></span>${L.home}`:'–'}</td>\n     ${mv.dest.map(s=>`<td class=\"cell\" style=\"${s===L.home?'color:'+mv.color[s]+';font-weight:700':''}\">${L.byS[s]||'·'}</td>`).join('')}\n     ${showOrph?`<td class=\"cell\" style=\"${L.orphan&&!L.orphanHome?'color:var(--closing);font-weight:700':''}\" title=\"${L.orphan?(L.orphanHome?'seguem a líder para o setor '+L.orphanHome:'sem home — CBs sem setor pra seguir'):''}\">${L.orphan?fmt(L.orphan)+(L.orphanHome?'':' ⚠'):'·'}</td>`:''}\n     <td style=\"color:${L.desloc?'var(--closing)':'var(--mut)'};font-weight:${L.desloc?700:400}\">${L.desloc||'0'}</td></tr>`).join('')\n   +`<tr style=\"font-weight:700\"><td>TOTAL</td><td>${fmt(c.leaders.reduce((a,L)=>a+L.total,0))}</td><td></td>${mv.dest.map(s=>`<td>${fmt(c.leaders.reduce((a,L)=>a+L.byS[s],0))}</td>`).join('')}${showOrph?`<td>${fmt(c.orphanTotal)}</td>`:''}<td style=\"color:var(--closing)\">${fmt(c.desloc)}</td></tr></tbody>`;\n}\nfunction renderMatrix(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const ms=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__').sort((a,b)=>mv.munis[b].cbs-mv.munis[a].cbs);\n  // `_out` is a flag stamped on the ROW, and rows are shared between etapas (absorbed + inherited\n  // orphans), so the last etapa to aggregate wins and reading it here can describe the wrong etapa.\n  // Derive the bucket from THIS mv instead. Summing rather than .find() because several out-municípios\n  // of the same group all collapse into __OUTROS__, and only the first was being counted.\n  const outOf=x=>!mv.geoFeat[mkey(x.municipio,x.uf)];\n  const cell=(m,g)=>mv.matrix.reduce((a,x)=>a+((((outOf(x)?'__OUTROS__':mkey(x.municipio,x.uf))===m)&&String(x.grupo)===g)?+x.cbs:0),0);\n  const mx=Math.max(...ms.flatMap(m=>mv.leaders.map(L=>cell(m,L.grupo))),1);\n  // No destination column here. This is the AS-IS matrix: every município in it still belongs to the\n  // closing sector, so showing where it is HEADED mixed the two states of the world in one table and\n  // made the ASIS view read like a plan. The destination lives on the map and in \"Municípios → setor\n  // destino\", which are about the to-be.\n  $('#matrix').innerHTML=`<thead><tr><th>Município</th>${mv.leaders.map(L=>`<th title=\"${L.lider}\">${L.grupo}</th>`).join('')}<th>Tot</th></tr></thead><tbody>`\n   +ms.map(m=>`<tr><td>${m}</td>`\n     +mv.leaders.map(L=>{const v=cell(m,L.grupo);return `<td class=\"cell\" style=\"${v?`background:rgba(229,181,63,${.08+v/mx*.5})`:''}\">${v||'·'}</td>`;}).join('')\n     +`<td style=\"font-weight:700\">${fmt(mv.munis[m].cbs)}</td></tr>`).join('')+`</tbody>`;\n}\n// TOBE counterpart of the AS-IS matrix: the same município × grupo grid plus the two columns the AS-IS\n// view deliberately refuses to carry — where the município ends up, and under which líder.\n// \"Líder resultante\" is the líder holding the most CBs in that município. A município is served by several\n// grupos at once and the data names no single owner, so the dominant one is the honest answer and its\n// share is printed beside it instead of being hidden behind a single name.\nfunction renderMatrixTobe(){const mv=SESS.timeline[SESS.selected]; const el=$('#matrixTobe'); const nt=$('#tobeNote');\n  if(!el) return;\n  if(!mv||!mv.munis){ el.innerHTML=''; if(nt) nt.innerHTML=''; return; }\n  const c=computeDerived(mv);\n  const homeOf={}; c.leaders.forEach(L=>{ homeOf[L.grupo]=L.home; });\n  const ms=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__').sort((a,b)=>mv.munis[b].cbs-mv.munis[a].cbs);\n  // One pass over the matrix instead of a scan per cell: the AS-IS table can afford the naive version\n  // on six municípios, but this one asks for the dominant líder too, which multiplies the lookups.\n  const outOf=x=>!mv.geoFeat[mkey(x.municipio,x.uf)];\n  const cellBy={}; mv.matrix.forEach(x=>{ const k=(outOf(x)?'__OUTROS__':mkey(x.municipio,x.uf))+'|'+String(x.grupo);\n    cellBy[k]=(cellBy[k]||0)+ +x.cbs; });\n  const cell=(m,g)=>cellBy[m+'|'+g]||0;\n  const mx=Math.max(...ms.flatMap(m=>mv.leaders.map(L=>cell(m,L.grupo))),1);\n  const domLeader=m=>{ let best=null,bc=0;\n    mv.leaders.forEach(L=>{ const v=cell(m,L.grupo); if(v>bc){ bc=v; best=L; } });\n    return best?{L:best,cbs:bc}:null; };\n  const short=L=>(L.lider||'').split(' ').slice(0,2).join(' ')||('grupo '+L.grupo);\n  // NOT named `rows` — that is the module-level Databricks response helper, and shadowing it inside a\n  // render function is a trap for whoever adds a query here later.\n  const recs=ms.map(m=>{ const d=mv.assign[m]||null, dl=domLeader(m);\n    const home=dl?(homeOf[dl.L.grupo]||null):null;\n    // The mismatch worth seeing: the territory goes to one setor while the líder serving it ends up in\n    // another. Under \"manter vínculo\" those CBs stay with her, which is exactly what \"CBs fora do setor\"\n    // counts — so the → Setor cell carries the warning; her identity lives in the líder-per-grupo\n    // footer below, not in a per-município column.\n    return {m:m,d:d,dl:dl,home:home,off:!!(dl&&home&&d&&home!==d)}; });\n  el.innerHTML=`<thead><tr><th>Município</th><th>→ Setor</th>${mv.leaders.map(L=>`<th title=\"${esc(L.lider||'')}\">${L.grupo}</th>`).join('')}<th>Tot</th></tr></thead><tbody>`\n   +recs.map(r=>`<tr><td>${r.m}</td>`\n     +`<td${r.off?' style=\"color:var(--closing)\"':''} title=\"${r.off?'a líder dominante deste município termina noutro setor':''}\">${r.d?`<span class=\"home\" style=\"background:${mv.color[r.d]}\"></span>${r.d}`:'–'}${r.off?' ⚠':''}</td>`\n     +mv.leaders.map(L=>{const v=cell(r.m,L.grupo);return `<td class=\"cell\" style=\"${v?`background:rgba(229,181,63,${.08+v/mx*.5})`:''}\">${v||'·'}</td>`;}).join('')\n     +`<td style=\"font-weight:700\">${fmt(mv.munis[r.m].cbs)}</td></tr>`).join('')\n   // One line at the very bottom of the table, not one per município: each grupo COLUMN belongs to\n   // exactly one líder — that is fixed per column, never varies row to row — so her name sits once,\n   // under her own column, instead of being repeated on every município she happens to dominate.\n   +`<tr class=\"lider-foot\"><td colspan=\"2\">Líder do grupo</td>`\n     +mv.leaders.map(L=>`<td title=\"${esc(L.lider||'')}\">${esc(short(L))}</td>`).join('')\n     +`<td></td></tr>`\n   +`</tbody>`;\n  if(nt){\n    const offN=recs.filter(r=>r.off).length;\n    nt.innerHTML=(mv.policy!=='fora')\n      ? `Política <b>quebrar relação</b>: as CBs deixam a líder atual e passam à estrutura do setor destino — a líder de cada grupo (rodapé) mostra quem as atende <b>hoje</b>, não quem assume depois.`\n      : `<b>Líder do grupo</b> = a líder titular de cada grupo (coluna), mostrada uma vez no rodapé da tabela. `\n        +(offN?`<span style=\"color:var(--closing)\">${fmt(offN)} município(s) ⚠</span> têm a líder dominante indo para um setor diferente do dela — as CBs seguem a líder (é disso que o KPI “CBs fora do setor” é feito).`\n          :`Em todos os municípios a líder dominante termina no mesmo setor que recebe o território.`);\n  }\n}\nfunction renderPolicy(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const c=computeDerived(mv);\n  $('#policyNote').innerHTML=mv.policy==='fora'\n    ?`<b style=\"color:var(--acc)\">Mantendo vínculo:</b> ${fmt(c.desloc)} CBs seguem com a líder mas ficam <b>fisicamente noutro setor</b>. Preserva relação; suja geografia.`\n    :`<b style=\"color:var(--acc)\">Quebrando vínculo:</b> ${fmt(c.desloc)} CBs <b>re-vinculam a uma líder do setor destino</b>. Geografia limpa; rompe relação.`;\n}\nfunction renderPlan(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const c=computeDerived(mv);const ms=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__').sort((a,b)=>a.localeCompare(b));\n  mv._plan=ms.map(m=>({municipio:mName(m),uf:mUf(m),cbs:mv.munis[m].cbs,destino:mv.assign[m]}));\n  $('#plan').innerHTML=`Etapa ${SESS.selected+1} · Setor <b>${mv.sector}</b> → ${ms.map(m=>`${m}→<b style=\"color:${mv.color[mv.assign[m]]}\">${mv.assign[m]||'–'}</b>`).join(' · ')}<br>\n   Política: <b>${mv.policy==='fora'?'manter vínculo (CBs fora do setor)':'quebrar relação'}</b> · ${fmt(c.desloc)} CBs impactadas nesta etapa.`\n   +(c.orphanTotal?`<br>Fora da base de dominantes: ${fmt(c.orphanTotal)} CB(s) seguem suas líderes — ${mv.dest.filter(s=>c.orph[s]).map(s=>`${s} (${fmt(c.orph[s])})`).join(' · ')||'–'}${c.orphanStranded?` · <b style=\"color:var(--closing)\">${fmt(c.orphanStranded)} sem líder com destino</b>`:''}. Não entram no CSV, que é por município.`:'');\n}\nfunction renderReport(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const c=computeDerived(mv);\n  mv.metric=mv.metric||'cbs';\n  const KEYS=METRICS_DEF.map(m=>m[0]);\n  const incBy={};mv.dest.forEach(s=>incBy[s]=Object.fromEntries(KEYS.map(k=>[k,0])));\n  Object.entries(mv.munis).forEach(([m,o])=>{if(m==='__OUTROS__')return;const s=mv.assign[m];if(!s||!incBy[s])return;KEYS.forEach(k=>incBy[s][k]+=o[k]||0);});\n  // orphan CBs land on their leader's home sector, not on a geographic destination\n  c.leaders.forEach(L=>{ const om=mv.orphanMetricsByGroup&&mv.orphanMetricsByGroup[L.grupo];\n    if(om&&L.home&&incBy[L.home]) KEYS.forEach(k=>incBy[L.home][k]+=om[k]||0); });\n  const closeTot={};KEYS.forEach(k=>closeTot[k]=Object.entries(mv.munis).filter(([m])=>m!=='__OUTROS__').reduce((a,[,o])=>a+(o[k]||0),0));\n  // they leave the closing sector too, so antes → depois still balances\n  c.leaders.forEach(L=>{ const om=mv.orphanMetricsByGroup&&mv.orphanMetricsByGroup[L.grupo];\n    if(om&&L.home) KEYS.forEach(k=>closeTot[k]+=om[k]||0); });\n  const trend=mv.trend.slice(-6);\n  const chartHTML=mk=>{\n    const isM=['receita','rec_nat','rec_avon'].includes(mk); const fN=isM?money:fmt;\n    const data=mv.dest.map(s=>({label:s,color:mv.color[s],antes:+(mv.baseMetrics[s]?.[mk]||0),depois:+(mv.baseMetrics[s]?.[mk]||0)+(incBy[s]?.[mk]||0)}));\n    data.push({label:mv.sector+'✕',color:'#ff3b30',antes:closeTot[mk]||0,depois:0});\n    const max=Math.max(...data.flatMap(d=>[d.antes,d.depois]),1);\n    const W=720,H=290,base=238,top=42,maxH=base-top,n=data.length,gw=(W-16)/n;\n    let g='';\n    data.forEach((d,i)=>{const cx=8+gw*i+gw/2,bw=Math.min(30,gw*0.30);\n      const ah=d.antes/max*maxH,dh=d.depois/max*maxH,ax=cx-bw-2,dx=cx+2;\n      g+=`<rect x=\"${ax.toFixed(1)}\" y=\"${(base-ah).toFixed(1)}\" width=\"${bw.toFixed(1)}\" height=\"${ah.toFixed(1)}\" rx=\"2.5\" fill=\"${d.color}\" opacity=\"0.35\"/>`;\n      g+=`<rect x=\"${dx.toFixed(1)}\" y=\"${(base-dh).toFixed(1)}\" width=\"${bw.toFixed(1)}\" height=\"${dh.toFixed(1)}\" rx=\"2.5\" fill=\"${d.color}\"/>`;\n      g+=`<text x=\"${(ax+bw/2).toFixed(1)}\" y=\"${(base-ah-4).toFixed(1)}\" text-anchor=\"middle\" font-size=\"9\" fill=\"#9a9aa8\">${fN(d.antes)}</text>`;\n      g+=`<text x=\"${(dx+bw/2).toFixed(1)}\" y=\"${(base-dh-4).toFixed(1)}\" text-anchor=\"middle\" font-size=\"9.5\" font-weight=\"700\" fill=\"${d.color}\">${fN(d.depois)}</text>`;\n      const dp=d.antes?((d.depois-d.antes)/d.antes*100):(d.depois?100:0);\n      g+=`<text x=\"${cx.toFixed(1)}\" y=\"16\" text-anchor=\"middle\" font-size=\"10.5\" font-weight=\"700\" fill=\"${dp>=0?'#34c759':'#ff3b30'}\">${dp>0?'+':''}${dp.toFixed(0)}%</text>`;\n      g+=`<text x=\"${cx.toFixed(1)}\" y=\"${base+16}\" text-anchor=\"middle\" font-size=\"10.5\" font-weight=\"700\" fill=\"#1c1c2b\">${d.label}</text>`;});\n    return `<svg viewBox=\"0 0 ${W} ${H}\" style=\"width:100%\"><line x1=\"8\" y1=\"${base}\" x2=\"${W-8}\" y2=\"${base}\" stroke=\"#e7e7ef\"/>${g}</svg>`;\n  };\n  let h=`<div style=\"display:flex;justify-content:space-between;align-items:center;gap:10px;flex-wrap:wrap\">\n      <h2 style=\"margin:0\">Impacto antes → depois desta etapa</h2>\n      <select id=\"metricSel\">${METRICS_DEF.map(m=>`<option value=\"${m[0]}\" ${m[0]===mv.metric?'selected':''}>${m[1]}</option>`).join('')}</select></div>\n    <div class=\"note\" style=\"margin:2px 0 4px\">Barra clara = <b>antes desta etapa</b> (já incluindo etapas anteriores) · barra cheia = <b>depois</b> · <b style=\"color:var(--acc)\">${mv.sector}✕</b> = setor fechado nesta etapa · % = variação</div>\n    ${chartHTML(mv.metric)}`;\n  h+=`<h2 style=\"margin-top:16px\">Antes → Depois por setor receptor (snapshot congelado)</h2>\n    <div class=\"scroll\"><table><thead><tr><th>Setor</th>${METRICS_DEF.map(m=>`<th>${m[1]}</th>`).join('')}</tr></thead><tbody>`;\n  mv.dest.forEach(s=>{const b=mv.baseMetrics[s]||{};const inc=incBy[s];\n    h+=`<tr><td><span class=\"home\" style=\"background:${mv.color[s]}\"></span>${s}</td>`+\n      METRICS_DEF.map(([k])=>{const bv=+b[k]||0,av=bv+(inc[k]||0);const d=bv?((av-bv)/bv*100):0;const f=METRICS_DEF.find(x=>x[0]===k)[2]==='$'?money:fmt;\n        return `<td>${f(av)}<div class=\"delta ${d>=0?'up':'dn'}\">${d>0?'+':''}${d.toFixed(0)}%</div></td>`;}).join('')+`</tr>`;});\n  h+=`<tr style=\"opacity:.8\"><td>${mv.sector} (sai)</td>`+METRICS_DEF.map(([k,,t])=>`<td>${(t==='$'?money:fmt)(closeTot[k]||0)}</td>`).join('')+`</tr>`;\n  h+=`</tbody></table></div>`;\n  const incLvl={};mv.dest.forEach(s=>incLvl[s]={});\n  Object.keys(mv.munis).forEach(m=>{if(m==='__OUTROS__')return;const s=mv.assign[m];if(!s||!incLvl[s])return;const lv=mv.levelByMuni[m]||{};for(const nv in lv)incLvl[s][nv]=(incLvl[s][nv]||0)+lv[nv];});\n  c.leaders.forEach(L=>{ const ol=mv.orphanLevelByGroup&&mv.orphanLevelByGroup[L.grupo];\n    if(ol&&L.home&&incLvl[L.home]) Object.entries(ol).forEach(([nv,n])=>incLvl[L.home][nv]=(incLvl[L.home][nv]||0)+n); });\n  h+=`<h2 style=\"margin-top:18px\">Consultoras por nível — antes → depois por setor receptor</h2>\n    <div class=\"scroll\"><table><thead><tr><th>Setor</th>${NIVEIS.map(n=>`<th>${n}</th>`).join('')}<th>Total</th></tr></thead><tbody>`;\n  mv.dest.forEach(s=>{const base=mv.baseLevel[s]||{},inc=incLvl[s]||{};let tb=0,ta=0;\n    h+=`<tr><td><span class=\"home\" style=\"background:${mv.color[s]}\"></span>${s}</td>`+\n      NIVEIS.map(nv=>{const b=base[nv]||0,i=inc[nv]||0,a=b+i;tb+=b;ta+=a;\n        return `<td>${a?fmt(a):'·'}${i?`<div class=\"delta up\">+${fmt(i)}</div>`:''}</td>`;}).join('')+\n      `<td style=\"font-weight:700\">${fmt(ta)}${ta-tb?`<div class=\"delta up\">+${fmt(ta-tb)}</div>`:''}</td></tr>`;});\n  h+=`</tbody></table></div><div class=\"note\">Número = CBs por nível <b>depois</b> desta etapa · <span style=\"color:var(--ok)\">+N</span> = entrantes do ${mv.sector}.</div>`;\n  const spk=(key)=>{const vals=trend.map(t=>+t[key]||0);const mx=Math.max(...vals,1);\n    return `<div class=\"spark\">${vals.map(v=>`<div class=\"b\" style=\"height:${(v/mx*100).toFixed(0)}%\" title=\"${fmt(v)}\"></div>`).join('')}</div>\n      <div class=\"note\">${trend.map(t=>String(t.ciclo).slice(-2)).join(' · ')}</div>`;};\n  h+=`<h2 style=\"margin-top:18px\">Setor ${mv.sector} — últimos ${trend.length} ciclos até o snapshot congelado</h2>\n    <div class=\"note\" style=\"margin:-4px 0 8px\">Tendência histórica <b>do próprio setor</b> — não ajustada pela absorção hipotética de etapas anteriores (limitação conhecida: tendência é por setor, não decomponível por município).</div>\n    <div style=\"display:grid;grid-template-columns:repeat(4,1fr);gap:10px\">\n    ${[['cbs','CBs'],['ativas','Ativas'],['receita','Receita'],['pontos','Pontos']].map(([k,l])=>`<div><div class=\"note\" style=\"margin:0 0 3px;font-weight:600;color:var(--ink)\">${l}</div>${spk(k)}</div>`).join('')}</div>`;\n  $('#tab-report').innerHTML=h;\n  const sel=$('#metricSel'); if(sel) sel.onchange=()=>{mv.metric=sel.value; renderReport();};\n}\nfunction renderCumulative(){\n  const el=$('#tab-cumulative'); if(!el) return;\n  if(!SESS.timeline.length){ el.innerHTML='<div class=\"note\">Nenhuma etapa na timeline ainda.</div>'; return; }\n  const ready=SESS.timeline.every(mv=>mv.munis);\n  if(!ready){ el.innerHTML='<div class=\"note\">Aguardando etapas terminarem de calcular…</div>'; return; }\n  const finalWorld=foldWorldState(SESS.timeline,SESS.timeline.length);\n  const openSectors=[...new Set(Object.values(finalWorld.muniOverride))];\n  let h=`<h2 style=\"margin:0 0 8px\">Linha do tempo — ${SESS.timeline.length} fechamento(s)</h2>\n    <div class=\"note\" style=\"margin:-2px 0 10px\">Setores fechados, em ordem: ${SESS.timeline.map(mv=>mv.sector).join(' → ')}. Cada linha abaixo soma o efeito de <b>toda a cadeia</b>, não apenas da última etapa.</div>`;\n  h+=`<div class=\"scroll\"><table><thead><tr><th>Setor</th><th>Situação</th>${METRICS_DEF.map(([,l])=>`<th>${l}</th>`).join('')}</tr></thead><tbody>`;\n  SESS.timeline.forEach((mv,i)=>{\n    h+=`<tr style=\"opacity:.75\"><td>${mv.sector}</td><td>fechado (etapa ${i+1})</td>`+METRICS_DEF.map(([k,,t])=>`<td>${(t==='$'?money:fmt)(mv.pureOwnMetrics?.[k]||0)}</td>`).join('')+`</tr>`;\n  });\n  openSectors.forEach(s=>{\n    const base=SESS.sectorBaseCache[s]||{};\n    const infl=finalWorld.sectorInflow[s]||{};\n    h+=`<tr><td>${s}</td><td>recebeu território</td>`+METRICS_DEF.map(([k,,t])=>{\n      const bv=+base[k]||0, av=bv+(infl[k]||0); const d=bv?((av-bv)/bv*100):0; const f=(t==='$'?money:fmt);\n      return `<td>${f(av)}<div class=\"delta ${d>=0?'up':'dn'}\">${d>0?'+':''}${d.toFixed(0)}%</div></td>`;\n    }).join('')+`</tr>`;\n  });\n  h+=`</tbody></table></div><div class=\"note\">\"Antes\" de um setor receptor é o snapshot congelado (sem nenhum fechamento aplicado); \"depois\" soma tudo que a cadeia inteira jogou pra ele.</div>`;\n  el.innerHTML=h;\n}\nfunction project(feats){let mnx=1/0,mny=1/0,mxx=-1/0,mxy=-1/0;\n  const each=cb=>feats.forEach(f=>{const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];ps.forEach(p=>p.forEach(r=>r.forEach(cb)));});\n  each(p=>{mnx=Math.min(mnx,p[0]);mxx=Math.max(mxx,p[0]);mny=Math.min(mny,p[1]);mxy=Math.max(mxy,p[1]);});\n  const mlat=(mny+mxy)/2,kx=Math.cos(mlat*Math.PI/180),W=700,H=500,pad=22;\n  const gw=(mxx-mnx)*kx,gh=(mxy-mny),sc=Math.min((W-2*pad)/gw,(H-2*pad)/gh);\n  const ox=(W-gw*sc)/2,oy=(H-gh*sc)/2;\n  return p=>[ox+(p[0]-mnx)*kx*sc, oy+(mxy-p[1])*sc];\n}\nfunction pathFor(f,pr){const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];\n  return ps.map(poly=>poly.map(r=>'M'+r.map(p=>{const q=pr(p);return q[0].toFixed(1)+','+q[1].toFixed(1);}).join('L')+'Z').join('')).join('');}\nfunction cxy(f,pr){let x=0,y=0,n=0;const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];ps.forEach(poly=>poly[0].forEach(p=>{const q=pr(p);x+=q[0];y+=q[1];n++;}));return[x/n,y/n];}\n// ---------- label placement ----------\n// Pole of inaccessibility: the interior point farthest from ANY boundary of the dissolved area. A\n// centroid is only a mean — on a concave sector, one split across a river, or a member whose vertex\n// average falls in a bay, it lands outside the very territory it is supposed to name, which is what\n// pushed the sector numbers off their own shapes. Even-odd across every ring of every member is a\n// correct union test here because municipalities tile rather than overlap.\n// The search box is clipped to the viewBox, so the result is inside the territory AND on screen.\n// Rings are decimated first — this is a label, not a measurement — which keeps a 20-município sector\n// to a few million ops, and the result is cached per stage: geometry never changes between renders,\n// only the fill does.\nfunction labelPointFor(fs,pr){\n  const rings=[];\n  (fs||[]).forEach(f=>{ if(!f||!f.geometry) return;\n    const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];\n    ps.forEach(poly=>poly.forEach(r=>{\n      if(!r||r.length<4) return;\n      const step=Math.max(1,Math.floor(r.length/120)),pts=[];\n      for(let i=0;i<r.length;i+=step) pts.push(pr(r[i]));\n      if(pts.length>3) rings.push(pts);\n    }));});\n  if(!rings.length) return null;\n  let mnx=1/0,mny=1/0,mxx=-1/0,mxy=-1/0;\n  rings.forEach(r=>r.forEach(p=>{ if(p[0]<mnx)mnx=p[0]; if(p[0]>mxx)mxx=p[0]; if(p[1]<mny)mny=p[1]; if(p[1]>mxy)mxy=p[1]; }));\n  mnx=Math.max(mnx,2); mny=Math.max(mny,2); mxx=Math.min(mxx,698); mxy=Math.min(mxy,498);\n  if(!(mxx>mnx&&mxy>mny)) return null;\n  const inside=(x,y)=>{ let c=false;\n    for(const r of rings) for(let i=0,j=r.length-1;i<r.length;j=i++){ const a=r[i],b=r[j];\n      if(((a[1]>y)!==(b[1]>y)) && (x<(b[0]-a[0])*(y-a[1])/(b[1]-a[1])+a[0])) c=!c; }\n    return c; };\n  const edgeDist=(x,y)=>{ let m=Infinity;\n    for(const r of rings) for(let i=0,j=r.length-1;i<r.length;j=i++){ const a=r[i],b=r[j];\n      const dx=b[0]-a[0],dy=b[1]-a[1],L=dx*dx+dy*dy;\n      let t=L?(((x-a[0])*dx+(y-a[1])*dy)/L):0; t=t<0?0:(t>1?1:t);\n      const ex=a[0]+t*dx-x,ey=a[1]+t*dy-y,d=ex*ex+ey*ey; if(d<m)m=d; }\n    return Math.sqrt(m); };\n  const W=mxx-mnx,H=mxy-mny,N=26;\n  let best=null,bd=-1;\n  for(let i=0;i<=N;i++) for(let j=0;j<=N;j++){\n    const x=mnx+W*i/N,y=mny+H*j/N;\n    if(!inside(x,y)) continue;\n    const d=edgeDist(x,y); if(d>bd){ bd=d; best=[x,y]; }\n  }\n  if(!best) return null;\n  // Hill-climb off the coarse grid: the grid only has to land somewhere in the right lobe, the\n  // refinement finds the deep point inside it — halving the step whenever no neighbour improves.\n  let step=Math.max(W,H)/N/2;\n  for(let k=0;k<7;k++){\n    let moved=false;\n    for(const o of [[1,0],[-1,0],[0,1],[0,-1],[1,1],[1,-1],[-1,1],[-1,-1]]){\n      const x=best[0]+o[0]*step,y=best[1]+o[1]*step;\n      if(x<mnx||x>mxx||y<mny||y>mxy||!inside(x,y)) continue;\n      const d=edgeDist(x,y); if(d>bd){ bd=d; best=[x,y]; moved=true; }\n    }\n    if(!moved) step/=2;\n  }\n  // The clearance travels with the point: it is the radius of the largest circle that fits inside the\n  // territory there, which is exactly the budget a caller needs to decide how much text will fit.\n  return {p:best,r:bd};\n}\nfunction labelPointOf(mv,key,fs,pr){\n  if(!mv._lbl) mv._lbl={};\n  if(!(key in mv._lbl)) mv._lbl[key]=labelPointFor(fs,pr);\n  return mv._lbl[key];\n}\nfunction drawMap(){\n  const mv=SESS.timeline[SESS.selected]; const svg=$('#map'); const ignNote=$('#mapIgnoredNote');\n  if(!mv){ svg.innerHTML=''; if(ignNote) ignNote.innerHTML=''; return; }\n  const c=computeDerived(mv);const NS='http://www.w3.org/2000/svg'; svg.innerHTML='';\n  const feats=[...mv.nbrFeat,...Object.values(mv.geoFeat)]; if(!feats.length) return;\n  const pr=project(feats);\n  const world=foldWorldState(SESS.timeline,SESS.selected);\n  // The context layer is ONE area per SECTOR, not one shape per município. The unit of this decision\n  // is the destination sector; a scatter of individually outlined municipalities carrying their own\n  // names invited exactly the wrong reading of the map. Members of a sector are filled AND stroked in\n  // the same colour, so the shared borders vanish and the group reads as a single dissolved\n  // territory — the IBGE shapes do not share vertices precisely enough to extract a clean union\n  // outline, and carrying a real polygon-clipping union for a context layer is not worth it.\n  // Labels are COLLECTED here and drawn last, after every path. Drawn inline they were buried by the\n  // next sector's fill, and placement cannot avoid a collision it has not seen yet.\n  const labels=[],placed=[];\n  const textW=(s,fs)=>String(s).length*fs*0.56;\n  // WCAG relative luminance of the fill a label sits on, so ink and halo can invert per label. \"Would\n  // white be better?\" has no single answer on this map: white reads on #5856d6 (L≈0.14) and disappears\n  // on #ff9500 and #34c759 (both L≈0.43, where black wins ~9:1 against white's ~2.2:1) and on every\n  // context fill, which is .32 opacity over white. Decided per label, never globally.\n  const lum=col=>{let h=String(col||'').replace('#','');\n    if(h.length===3) h=h[0]+h[0]+h[1]+h[1]+h[2]+h[2];\n    if(h.length!==6) return 1;\n    const c=[0,2,4].map(i=>parseInt(h.slice(i,i+2),16)/255)\n      .map(v=>v<=0.03928?v/12.92:Math.pow((v+0.055)/1.055,2.4));\n    return 0.2126*c[0]+0.7152*c[1]+0.0722*c[2];};\n  // Centred on (x,y) in BOTH axes. The old box hung off the first line's baseline, so every two-line\n  // label sat half its own height below the point it was supposed to mark.\n  const rectOf=(x,y,lines)=>{const w=Math.max.apply(null,lines.map(l=>textW(l.t,l.size)));\n    const h=lines.reduce((a,l)=>a+l.size*1.2,0);\n    return {x1:x-w/2-2.5,x2:x+w/2+2.5,y1:y-h/2-1.5,y2:y+h/2+1.5};};\n  const nbrBySec={};\n  mv.nbrFeat.forEach(f=>{\n    const nm=mkey(f.properties.name||f.properties.NOME||f.properties.nome||'',f.__uf);\n    const s=String((mv.nbrCurrentSector&&mv.nbrCurrentSector[nm])||'');\n    (nbrBySec[s]=nbrBySec[s]||[]).push(f);\n  });\n  Object.keys(nbrBySec).forEach(s=>{\n    const fs=nbrBySec[s];\n    const isDest=!!s&&mv.dest.includes(s);\n    const closedCtx=!!s&&world.closedSectors.has(s);\n    const col=isDest?(mv.color[s]||null):null;\n    fs.forEach(f=>{\n      const p=document.createElementNS(NS,'path');\n      p.setAttribute('d',pathFor(f,pr));\n      p.setAttribute('class','sect'+(isDest?'':(closedCtx?' closed-ctx':' plain')));\n      if(col){ p.setAttribute('fill',col); p.setAttribute('stroke',col); }\n      svg.appendChild(p);\n    });\n    if(!s) return;\n    // One number per sector, at the pole of inaccessibility of its DISSOLVED area — the whole group\n    // of members at once, not a representative member, so the number sits in the visual middle of the\n    // territory the operator actually sees.\n    const lp=labelPointOf(mv,'s:'+s,fs,pr);\n    // Context areas always read LIGHT — .sect paints dest colours at fill-opacity .32 over white, and\n    // plain/closed-ctx are near-white greys — so a sector number never wants white ink, whatever colour\n    // the sector itself was assigned.\n    if(lp&&lp.p) labels.push({anchor:lp.p,big:true,dark:false,lines:[{t:s,size:11.5,weight:700}]});\n  });\n  const asis=mv.view==='asis';\n  // The UF prefix is information only when the stage actually straddles a border. On a single-UF setor\n  // it is the same three characters repeated on every label — a large share of the clutter and none of\n  // the meaning. The hover tooltip carries the UF either way.\n  const showUf=new Set(Object.keys(mv.geoFeat).map(k=>mUf(k)).filter(Boolean)).size>1;\n  Object.entries(mv.geoFeat).forEach(([m,f])=>{const p=document.createElementNS(NS,'path');p.setAttribute('d',pathFor(f,pr));\n    const fillCol=asis?CLOSE_COLOR:(mv.color[mv.assign[m]]||'#444');\n    p.setAttribute('class','muni');p.setAttribute('fill',fillCol);\n    if(!asis) p.onclick=()=>{editSelected(m2=>{const i=m2.dest.indexOf(m2.assign[m]);if(m2.dest.length)m2.assign[m]=m2.dest[(i+1)%m2.dest.length];m2.selMuni=m;});};\n    p.style.cursor=asis?'default':'pointer';\n    p.onmousemove=e=>{const t=$('#tip');t.style.opacity=1;t.style.left=(e.clientX+12)+'px';t.style.top=(e.clientY+12)+'px';\n      t.innerHTML=asis?`<b>${mDisp(m)}</b><br>${fmt(mv.munis[m]?.cbs||0)} CBs · setor ${mv.sector}`:`<b>${mDisp(m)}</b><br>${fmt(mv.munis[m]?.cbs||0)} CBs → ${mv.assign[m]||'–'}<br><span style=\"color:var(--mut)\">clique p/ trocar</span>`;};\n    p.onmouseleave=()=>$('#tip').style.opacity=0;svg.appendChild(p);\n    // The name is never cut and never dropped. The pole of inaccessibility is still where the label\n    // WANTS to sit — the visual middle of the territory rather than a centroid that can fall outside a\n    // concave shape — but its clearance no longer gates anything: cutting BA-SAO SEBASTIAO DO PASSE\n    // down to BA-SAO SEBAST saved space by destroying the one thing the label existed to convey, and\n    // measuring the name against the inscribed circle rejected the centre for nearly every município.\n    const lp=labelPointOf(mv,'m:'+m,[f],pr);\n    const at=(lp&&lp.p)||cxy(f,pr);\n    const nmFull=(showUf&&mUf(m)?mUf(m)+'-':'')+mName(m);\n    const num=fmt(mv.munis[m]?.cbs||0)+(asis?'':'·'+(mv.assign[m]||'–'));\n    labels.push({anchor:at,cbs:+(mv.munis[m]?.cbs||0),dark:lum(fillCol)<0.18,\n      lines:[{t:nmFull,size:8.2,weight:700},{t:num,size:7,weight:500,mut:true}]});\n  });\n  // Placement, not de-cluttering. Every label IS drawn: it starts at its anchor and, if the text does\n  // not fit the territory or the slot is already taken, walks outward ring by ring until it finds\n  // clear canvas, trailing a hairline leader back to the shape it names. The previous pass dropped the\n  // loser of every collision outright, which is why municípios silently had no name at all.\n  // Order still matters — sector numbers first, then municípios by CB weight — because the earlier a\n  // label is placed the closer to home it lands.\n  const CW=700,CH=500,CPAD=2;\n  const inBounds=r=>r.x1>=CPAD&&r.x2<=CW-CPAD&&r.y1>=CPAD&&r.y2<=CH-CPAD;\n  const hits=r=>placed.reduce((a,q)=>a+((r.x2<q.x1||r.x1>q.x2||r.y2<q.y1||r.y1>q.y2)?0:1),0);\n  // Ring 0 is the anchor itself. Rings step 9u out over 16 directions, stretched horizontally because\n  // a label is wider than it is tall and sideways room is the room it actually needs.\n  const CAND=[[0,0]];\n  for(let ring=1;ring<=7;ring++){ const d=ring*9;\n    for(let a=0;a<16;a++){ const th=a*Math.PI/8; CAND.push([Math.cos(th)*d*1.35,Math.sin(th)*d]); } }\n  labels.sort((a,b)=>(b.big?1:0)-(a.big?1:0)||((b.cbs||0)-(a.cbs||0)));\n  labels.forEach(L=>{\n    let chosen=null,best=null,bestN=Infinity;\n    // Centred on the anchor is ALWAYS the first choice. An earlier cut here refused the anchor whenever\n    // the text was wider than the município's inscribed circle — true of almost every real name at this\n    // scale (BA-SAO SEBASTIAO DO PASSE is ~140u against ~80u of clearance), so every single label got\n    // nudged outside and nothing ended up centred on anything. Spilling past a border is normal on a\n    // choropleth and the halo keeps it readable; only a genuine COLLISION earns a move.\n    for(const off of CAND){\n      const x=L.anchor[0]+off[0], y=L.anchor[1]+off[1];\n      const r=rectOf(x,y,L.lines);\n      if(!inBounds(r)) continue;\n      const n=hits(r);\n      if(!n){ chosen={x,y,r,off}; break; }\n      // No clear slot yet — remember the LEAST crowded one. Falling back to the first in-bounds\n      // candidate meant falling back to the anchor every time, so a crowded map piled every loser onto\n      // the same point. CAND is ordered nearest-first and the compare is strict, so ties keep the\n      // closest slot.\n      if(n<bestN){ bestN=n; best={x,y,r,off}; }\n    }\n    // Canvas genuinely full: take the nearest in-bounds slot and accept the overlap. A label sitting\n    // on top of another is recoverable by eye; a name that was never drawn is not.\n    if(!chosen) chosen=best||{x:L.anchor[0],y:L.anchor[1],r:rectOf(L.anchor[0],L.anchor[1],L.lines),off:[0,0]};\n    placed.push(chosen.r);\n    const g=document.createElementNS(NS,'g'); g.setAttribute('class','lbl'+(L.big?' big':''));\n    if(Math.abs(chosen.off[0])>0.5||Math.abs(chosen.off[1])>0.5){\n      // The leader stops at the label's edge rather than its centre, so it never runs under the glyphs.\n      const cx=(chosen.r.x1+chosen.r.x2)/2, cy=(chosen.r.y1+chosen.r.y2)/2;\n      const hw=(chosen.r.x2-chosen.r.x1)/2, hh=(chosen.r.y2-chosen.r.y1)/2;\n      const dx=L.anchor[0]-cx, dy=L.anchor[1]-cy;\n      const tt=Math.min(dx?hw/Math.abs(dx):Infinity, dy?hh/Math.abs(dy):Infinity);\n      const ln=document.createElementNS(NS,'line'); ln.setAttribute('class','lead');\n      ln.style.stroke=L.dark?'#fff':'#1c1c1e';\n      ln.setAttribute('x1',L.anchor[0].toFixed(1)); ln.setAttribute('y1',L.anchor[1].toFixed(1));\n      ln.setAttribute('x2',(cx+dx*tt).toFixed(1)); ln.setAttribute('y2',(cy+dy*tt).toFixed(1));\n      g.appendChild(ln);\n    }\n    const hTot=L.lines.reduce((a,l)=>a+l.size*1.2,0);\n    let ty=chosen.y-hTot/2+L.lines[0].size*0.86;\n    // Inline style rather than a class: a stylesheet rule would outrank a presentation attribute and\n    // undo the per-label contrast decision made above.\n    const ink=L.dark?'#fff':'#1c1c1e', inkMut=L.dark?'rgba(255,255,255,.85)':'#48484d';\n    const halo=L.dark?'rgba(0,0,0,.6)':'#fff';\n    L.lines.forEach(l=>{ const t=document.createElementNS(NS,'text');\n      t.setAttribute('x',chosen.x.toFixed(1)); t.setAttribute('y',ty.toFixed(1));\n      t.setAttribute('font-size',l.size); t.setAttribute('font-weight',l.weight||600);\n      t.style.fill=l.mut?inkMut:ink; t.style.stroke=halo;\n      t.textContent=l.t; g.appendChild(t); ty+=l.size*1.2; });\n    svg.appendChild(g);\n  });\n  $('#legend').innerHTML=asis\n    ?`<span><b style=\"background:${CLOSE_COLOR}\"></b>Setor ${mv.sector} (estrutura antes desta etapa — ${Object.keys(mv.geoFeat).length} municípios)</span>`\n    // No \"vizinhos (contexto)\" or \"setor já fechado antes\" entry any more: every feature still drawn\n    // belongs to a destination sector, so .sect.plain and .sect.closed-ctx can no longer be produced\n    // and a legend key for them would point at nothing on the map.\n    :mv.dest.map(s=>`<span><b style=\"background:${mv.color[s]}\"></b>Setor ${s} — ${c.gained[s]} líder(es)</span>`).join('');\n  // Municipalities outside the dominance base are deliberately NOT drawn — no shape, no hover, no\n  // legend entry. They are reported in the panel instead, so the map only ever shows territory that\n  // is actually being reallocated.\n  if(ignNote) ignNote.innerHTML=(mv.excludedMunis&&mv.excludedMunis.length)\n    ? `<b style=\"color:var(--closing)\">${fmt(mv.excludedMunis.length)} município(s) / ${fmt(mv.excludedCbs||0)} CBs</b> fora da base de dominantes deste setor não são desenhados no mapa — as CBs seguem a líder do seu grupo (detalhe em “Municípios → setor destino”).`\n    : '';\n}\nasync function runSql(){const sql=$('#sqlIn').value.trim();$('#sqlStatus').textContent='rodando…';$('#sqlStatus').classList.remove('err');\n  try{ await ensurePinned(); const resp=await q(sql);const rs=rows(resp);const cols=(resp.manifest?.schema?.columns||[]).map(c=>c.name);\n    $('#sqlOut').innerHTML=`<thead><tr>${cols.map(c=>`<th>${c}</th>`).join('')}</tr></thead><tbody>`+rs.slice(0,200).map(r=>`<tr>${cols.map(c=>`<td>${r[c]??'·'}</td>`).join('')}</tr>`).join('')+`</tbody>`;\n    $('#sqlStatus').textContent=rs.length+' linha(s)';}\n  catch(e){$('#sqlStatus').textContent='bloqueado/erro: '+e.message;$('#sqlStatus').classList.add('err');}\n}\nfunction renderAll(){\n  renderStage();\n  renderTimeline(); renderSectorPicker();\n  const shb=$('#openShare'); if(shb) shb.disabled=!SESS.timeline.length;\n  const dpb=$('#dupSession'); if(dpb) dpb.disabled=!SESS.timeline.length;\n  const mv=SESS.timeline[SESS.selected];\n  // resolveSnapshotPin falls back to a live sub-select when it cannot pin a literal; saying\n  // \"congelado\" in that case would be a lie, so the pill reports what is actually in the SQL.\n  const pinned=SESS.snapLiteral && !/^\\(SELECT/i.test(SESS.snapLiteral);\n  $('#liveState').textContent = SESS.snapshotRaw\n    ? (pinned?'● snapshot congelado · ':'◍ snapshot ao vivo (não fixado) · ')+'atualizado em '+fmtSyncedAt(SESS.snapshotSyncedAt)+' · ↻'\n    : '● iniciando';\n  const mp=$('#basePill');\n  if(mp){\n    const warn=[];\n    if(DOM.bySetor&&!DOM.hasUf) warn.push('⚠ sem coluna UF');\n    if(DOM.badUf) warn.push('⚠ '+fmt(DOM.badUf)+' UF não reconhecida(s)');\n    if(DOM.clashes) warn.push('⚠ '+fmt(DOM.clashes)+' homônimo(s) no mesmo setor');\n    mp.textContent=DOM.bySetor?('◇ base dominantes: '+fmt(DOM.setores)+' setores · '+fmt(DOM.rows)+' municípios'+(warn.length?' · '+warn.join(' · '):'')):(DOM.error?'◇ base dominantes: indisponível':'◇ base dominantes: carregando…');\n    mp.title=DOM.error||(DOM.bySetor?((DOM.hasUf\n        ?('Coluna de UF usada: \"'+DOM.ufCol+'\".')\n        :('SEM coluna de UF. Colunas lidas: '+((DOM.headers||[]).join(' | ')||'?')+'. A UF de cada município vem desta base — sem ela, homônimos voltam a ser casados só pelo nome.'))\n      +(DOM.badUf?('\\n'+DOM.badUf+' linha(s) com UF irreconhecível — tratadas como desconhecida.'):'')\n      +(DOM.clashes?('\\n'+DOM.clashes+' município(s) aparecem no mesmo setor com UFs diferentes. O SQL agrupa só por DS_MUNICIPIO, então esses chegam somados numa linha única e não há como separá-los.'):'')\n      ):'')||DOM.url||''; }\n  const rp=$('#rulePill'); if(rp) rp.textContent='◈ destino: '+ruleShort(SESS.settings);\n  const sp=$('#spanPill'); if(sp) sp.textContent='◎ span: '+spanShort(SESS.settings);\n  renderRuleNote(); renderSpanRule();\n  if(!mv){ ['#map','#matrix','#matrixTobe','#tobeNote','#leaders'].forEach(s=>{const el=$(s);if(el)el.innerHTML='';}); $('#kpis').innerHTML=''; $('#spans').innerHTML=''; $('#muniList').innerHTML=''; $('#plan').innerHTML=''; return; }\n  $('#mapTitle').textContent=`Etapa ${SESS.selected+1}/${SESS.timeline.length} — fechando setor ${mv.sector}`;\n  $('#viewToggle').querySelectorAll('button').forEach(b=>b.classList.toggle('on',b.dataset.v===mv.view));\n  $('#policy').querySelectorAll('button').forEach(b=>b.classList.toggle('on',b.dataset.p===mv.policy));\n  $('#optBadge').textContent=mv.optBadge||'';\n  drawMap(); renderContig(); renderSpanRule(); renderKpis(); renderSpans(); renderMuni(); renderLeaders(); renderMatrix(); renderMatrixTobe(); renderPolicy(); renderPlan(); renderReport(); renderCumulative();\n}\n\n// ---------- event wiring ----------\n$('#go').onclick=()=>addMovement($('#sectorPick').value);\n$('#confirmSnap').onclick=()=>{ SESS.stage='main'; renderAll(); };\n$('#rand').onclick=()=>{\n  const closed=new Set(SESS.timeline.map(mv=>mv.sector));\n  const pool=SESS.sectorsList.filter(s=>!closed.has(s.setor));\n  const cand=pool.filter(s=>s.munis>=3&&s.munis<=10&&s.cbs>300);\n  const list=cand.length?cand:pool; if(!list.length) return;\n  const pick=list[Math.floor(Math.random()*list.length)];\n  $('#sectorPick').value=pick.setor;\n  addMovement(pick.setor);\n};\n$('#sectorPick').addEventListener('keydown',e=>{ if(e.key==='Enter') addMovement($('#sectorPick').value); });\n$('#confirmSessionPick').onchange=()=>loadSession($('#confirmSessionPick').value);\n$('#optim').onclick=()=>editSelected(mv=>{ mv.assign=optimizeFor(mv); });\n$('#autoTobe').onclick=()=>editSelected(mv=>{ mv.assign=autoAssignFor(mv); mv.optBadge='TOBE por adjacência'; });\n$('#viewToggle').querySelectorAll('button').forEach(b=>b.onclick=()=>{const mv=SESS.timeline[SESS.selected];if(!mv)return;mv.view=b.dataset.v;renderAll();});\n$('#policy').querySelectorAll('button').forEach(b=>b.onclick=()=>{const mv=SESS.timeline[SESS.selected];if(!mv)return;mv.policy=b.dataset.p;renderKpis();renderPolicy();renderPlan();});\nroot.querySelectorAll('.tabs button').forEach(b=>b.onclick=()=>{root.querySelectorAll('.tabs button').forEach(x=>x.classList.toggle('on',x===b));\n  ['matrix','tobe','report','cumulative','sql'].forEach(t=>$('#tab-'+t).classList.toggle('hidden',t!==b.dataset.tab));});\n$('#runSql').onclick=runSql;\n$('#copyPlan').onclick=()=>{const mv=SESS.timeline[SESS.selected];if(!mv)return;navigator.clipboard.writeText(JSON.stringify({setor:mv.sector,politica:mv.policy,plano:mv._plan},null,2));$('#copyPlan').textContent='copiado ✓';setTimeout(()=>$('#copyPlan').textContent='Copiar',1500);};\n$('#csvPlan').onclick=()=>{const mv=SESS.timeline[SESS.selected];if(!mv)return;const csv='municipio,uf,cbs,setor_destino\\n'+mv._plan.map(p=>`${p.municipio},${p.uf||''},${p.cbs},${p.destino}`).join('\\n');\n  const a=document.createElement('a');a.href=URL.createObjectURL(new Blob([csv],{type:'text/csv'}));a.download=`plano_migracao_setor_${mv.sector}.csv`;a.click();};\n$('#saveSession').onclick=saveSession;\n$('#dupSession').onclick=duplicateSession;\n$('#sessionPick').onchange=()=>loadSession($('#sessionPick').value);\n$('#liveState').onclick=refreshSnapshot;\n$('#liveState').addEventListener('keydown',e=>{ if(e.key==='Enter'||e.key===' '){ e.preventDefault(); refreshSnapshot(); } });\n$('#openOptions').onclick=openOptions;\n$('#optClose').onclick=closeOptions;\n$('#optCancel').onclick=closeOptions;\n$('#optApply').onclick=applyOptions;\n$('#optMinCbs').addEventListener('input',renderOptPreview);\n['#optTargetSpan','#optMaxSpan','#optMinSpan'].forEach(id=>$(id).addEventListener('input',renderOptPreview));\nroot.querySelectorAll('input[name=\"destRule\"]').forEach(r=>r.addEventListener('change',renderOptPreview));\n$('#optionsBg').addEventListener('click',e=>{ if(e.target.id==='optionsBg') closeOptions(); });\nroot.addEventListener('keydown',e=>{ if(e.key==='Escape'){ closeOptions(); closeShare(); } });\n\n$('#openShare').onclick=openShare;\n$('#shareX').onclick=closeShare;\n$('#shareCancel').onclick=closeShare;\n$('#shareGo').onclick=doShare;\n$('#shareCopy').onclick=()=>{ if(!SHARE.url) return; navigator.clipboard.writeText(SHARE.url);\n  const b=$('#shareCopy'); if(b){ b.textContent='copiado ✓'; setTimeout(()=>{ const x=$('#shareCopy'); if(x) x.textContent='Copiar link'; },1500); } };\n$('#shareOpen').onclick=()=>{ if(SHARE.url) window.open(SHARE.url,'_blank'); };\n$('#shareBg').addEventListener('click',e=>{ if(e.target.id==='shareBg') closeShare(); });\n\n// ---------- init ----------\n(async()=>{\n  loader(true,'congelando snapshot da sessão…');\n  try{\n    await Promise.all([ensurePinned(), loadSectors(), refreshSessionPicker()]);\n    SESS.stage='confirm';\n  }catch(e){ setError('erro init: '+e.message); }\n  finally{ loader(false); renderAll(); const rd=$('#ready'); if(rd) rd.setAttribute('data-loaded','1'); }\n})();\n\n  }\n}\n"}},"sessionsDataset":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"sessionsDataset"}}}},"dominantesCsvUrl":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"dominantesCsvUrl"}}}}}}}},"__d2PrevCode":{"code":"const T='product.perfil_cb.crm_perfil_cb_diaria_historico';\nconst ELO='product.elo_modelo_combinado.commercial_consultant_index';\nconst PALETTE=['#5856d6','#ff9500','#34c759','#af52de','#ff2d55','#a2845e'];\nconst CLOSE_COLOR='#8e8e93';\nconst UF_CODE={RO:'11',AC:'12',AM:'13',RR:'14',PA:'15',AP:'16',TO:'17',MA:'21',PI:'22',CE:'23',RN:'24',PB:'25',PE:'26',AL:'27',SE:'28',BA:'29',MG:'31',ES:'32',RJ:'33',SP:'35',PR:'41',SC:'42',RS:'43',MS:'50',MT:'51',GO:'52',DF:'53'};\nconst UF_BORDERS={AC:['AM','RO'],AL:['BA','PE','SE'],AM:['AC','RO','RR','PA','MT'],AP:['PA'],\n BA:['AL','SE','PE','PI','TO','GO','MG','ES'],CE:['PI','PB','PE','RN'],DF:['GO','MG'],\n ES:['BA','MG','RJ'],GO:['DF','MT','MS','MG','BA','TO'],MA:['PA','TO','PI'],\n MG:['BA','GO','DF','MS','SP','RJ','ES'],MS:['MT','GO','MG','SP','PR'],MT:['RO','AM','PA','TO','GO','MS'],\n PA:['AP','AM','MT','TO','MA','RR'],PB:['RN','CE','PE'],PE:['PB','CE','PI','BA','AL'],\n PI:['MA','TO','BA','PE','CE'],PR:['SP','MS','SC'],RJ:['ES','MG','SP'],RN:['CE','PB'],\n RO:['AC','AM','MT'],RR:['AM','PA'],RS:['SC'],SC:['PR','RS'],SE:['BA','AL'],\n SP:['MG','RJ','PR','MS'],TO:['PA','MA','PI','BA','GO','MT']};\nconst NIVEIS=['Bronze','Cristal','Prata','Ouro','Diamante','Diamante+'];\nconst METRICS_DEF=[['cbs','CBs'],['ativas','Ativas'],['pedidos','Pedidos'],['pontos','Pontos'],['receita','Receita','$'],['rec_nat','Rec. Natura','$'],['rec_avon','Rec. Avon','$']];\nconst OPT_K=1.5;\nconst SESSIONS_DS='timeline-shared-sessionsDataSet';   // same table as SHARED_DS — see notes at listSessions()\n// Span defaults are the real operating band for a setor receptor, not placeholders: 2200 ≤ span ≤ 3500\n// with 2700 as the target. null meant \"sem limite\", so every new session started with the optimiser\n// balancing against nothing. Existing sessions are NOT touched — their persisted settings carry explicit\n// values that spread OVER these in openOptions/applyOptions, which is deliberate: their etapas were\n// computed under the old band and changing it silently would leave the stored result and the rule that\n// produced it out of sync.\nconst DEFAULT_SETTINGS={destRule:'any',destMinCbs:9,targetSpan:2700,maxSpan:3500,minSpan:2200};\nconst DOM_MEDIA_BASE='https://natura-geomarketing.data2.media/file/';\nconst DOM_CSV_FALLBACK=DOM_MEDIA_BASE+'yw_TQdp0QXEk6JsrliAqP'; \nconst numOrNull=v=>{const n=Math.round(+v);return (isFinite(n)&&n>0)?n:null;};\nconst spanShort=st=>{const p=[];if(st&&st.targetSpan)p.push('alvo '+st.targetSpan);if(st&&st.maxSpan)p.push('máx '+st.maxSpan);if(st&&st.minSpan)p.push('mín '+st.minSpan);return p.length?p.join(' · '):'livre';};\nconst ruleShort=st=>((st&&st.destRule)==='dominant')?('dominantes ≥'+((st&&st.destMinCbs)||DEFAULT_SETTINGS.destMinCbs)+' CBs'):'qualquer municipio';\n\nexport default {\n  css: `\n  :host{display:block;height:100%;--bg:#f5f5f7;--panel:#ffffff;--panel2:#f2f2f7;--line:#e5e5ea;--ink:#1c1c1e;--mut:#6e6e73;--acc:#007aff;--acc2:#0060df;--closing:#ff3b30;--ok:#34c759}\n  *{box-sizing:border-box}\n  .simroot{position:relative;height:100%;overflow:auto;font:13px/1.45 -apple-system,BlinkMacSystemFont,\"SF Pro Text\",\"Segoe UI\",Roboto,sans-serif;background:var(--bg);color:var(--ink);-webkit-font-smoothing:antialiased}\n  header{padding:10px 16px;background:rgba(246,246,248,.85);backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);border-bottom:1px solid var(--line);display:flex;align-items:center;gap:10px;flex-wrap:wrap}\n  header h1{font-size:14.5px;margin:0;font-weight:600;letter-spacing:-.1px;color:var(--ink)}\n  .mac-spacer{flex:1}\n  .howto{padding:8px 16px;background:var(--panel);border-bottom:1px solid var(--line);display:flex;gap:16px;flex-wrap:wrap;font-size:11.5px;color:var(--mut);align-items:center}\n  .howto b{color:var(--ink)} .howto span{max-width:340px}\n  .pill{font-size:10.5px;padding:2.5px 9px;border-radius:99px;border:1px solid var(--line);color:var(--mut);background:var(--panel2)}\n  .pill.live{color:var(--ink);cursor:pointer;user-select:none;transition:border-color .1s,color .1s,background .1s}\n  .pill.live:hover{border-color:var(--acc);color:var(--acc);background:#eaf3ff}\n  .pill.live:focus-visible{outline:2px solid rgba(0,122,255,.35);outline-offset:1px}\n  .pill.live.busy{border-color:var(--acc);color:var(--acc);cursor:progress}\n  .status{font-size:11px;color:var(--mut)}.status.err{color:var(--closing)}\n  select,input,textarea,button{font:inherit}\n  select,input{background:var(--panel);border:1px solid var(--line);color:var(--ink);border-radius:7px;padding:5.5px 9px}\n  select:focus,input:focus{outline:2px solid rgba(0,122,255,.35);outline-offset:0;border-color:var(--acc)}\n  button.act{background:var(--acc);color:#fff;border:1px solid transparent;border-radius:7px;padding:6px 13px;font-weight:600;cursor:pointer;box-shadow:0 1px 1px rgba(0,0,0,.08)}\n  button.act:hover{background:var(--acc2)}\n  button.ghost{background:var(--panel);color:var(--ink);border:1px solid var(--line);border-radius:7px;padding:5.5px 12px;cursor:pointer}\n  button.ghost:hover{background:var(--panel2)}\n  button.ghost.on{border-color:var(--acc);color:var(--acc);background:#eaf3ff}\n  button.ghost:disabled,button.act:disabled{opacity:.4;cursor:not-allowed}\n  .sessbar{padding:9px 20px;background:var(--panel2);border-bottom:1px solid var(--line);display:flex;gap:8px;flex-wrap:wrap;align-items:center}\n  .rail{padding:9px 16px;background:var(--panel);border-bottom:1px solid var(--line);display:flex;gap:8px;align-items:center;overflow-x:auto}\n  #movementChips{display:flex;gap:8px;flex:0 0 auto}\n  #addMovementGroup{display:flex;gap:8px;align-items:center;flex:0 0 auto;margin-left:auto;padding-left:12px;border-left:1px solid var(--line)}\n  #addMovementGroup input{min-width:150px}\n  .tchip{display:flex;align-items:center;gap:7px;background:var(--panel2);border:1px solid var(--line);border-radius:8px;padding:6px 10px;cursor:pointer;font-size:12px;flex:0 0 auto}\n  .tchip.on{border-color:var(--acc);background:#eaf3ff}\n  .tchip.stale{border-style:dashed;opacity:.85}\n  .tchip .tstale{color:#ff9500;font-weight:700}\n  .tchip .tnum{background:var(--ink);color:#fff;border-radius:99px;width:16px;height:16px;font-size:9.5px;display:flex;align-items:center;justify-content:center;font-weight:700}\n  .tchip .tsec{font-weight:600}\n  .tchip .tstat{color:var(--mut)}\n  .tchip .trm{color:var(--mut);font-weight:700;padding:0 3px}\n  .tchip .trm:hover{color:var(--closing)}\n  .rail .empty{color:var(--mut);font-size:12px}\n  .wrap{display:grid;grid-template-columns:minmax(360px,1fr) 430px;gap:14px;padding:14px 16px;align-items:start}\n  @media(max-width:1150px){.wrap{grid-template-columns:1fr}}\n  .card{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:14px 16px;margin-bottom:14px;box-shadow:0 1px 2px rgba(0,0,0,.04)}\n  .card h2{font-size:11px;text-transform:uppercase;letter-spacing:.4px;color:var(--mut);margin:0 0 9px;font-weight:600}\n  /* user-select, not pointer-events. .lbl already sets pointer-events:none, which stops the text from\n     RECEIVING clicks but does not exclude it from the browser's selection range — so cycling a\n     município's destination with repeated clicks kept dragging a double-click selection across the\n     labels. Nothing drawn in an svg here is text anyone needs to copy. */\n  svg{width:100%;height:auto;display:block;user-select:none;-webkit-user-select:none}\n  /* White hairlines inside the closing sector: the municipios read as one territory cut into parts\n     rather than as separate outlined units, and the saturated fills carry the grouping instead of the\n     ink. Neighbour sectors keep their own coloured strokes (.sect) — that contrast is what separates\n     what is being reallocated from what is only context. Selection no longer draws an outline; the\n     white border was the click affordance AND the default is now white, so it had nothing left to say. */\n  .muni{stroke:#fff;stroke-width:1.1;cursor:pointer;transition:filter .1s}.muni:hover{filter:brightness(1.15)}\n  .sect{stroke-width:1;fill-opacity:.32;stroke-opacity:.6}\n  .sect.plain{fill:#e8e8ec;stroke:#d4d4d9;fill-opacity:1;stroke-opacity:1}\n  .sect.closed-ctx{fill:#e2e2e7;stroke:#aeaeb2;stroke-dasharray:3 2;fill-opacity:1;stroke-opacity:1}\n  .lbl{pointer-events:none}\n  /* No plate behind the text: a halo painted UNDER the glyphs (paint-order) keeps a name legible on any\n     fill without stamping an opaque box over the territory it names. Ink and halo are chosen per label\n     from the luminance of the fill underneath, so they are deliberately NOT declared here — a\n     stylesheet rule outranks a presentation attribute and would silently override that choice. */\n  .lbl text{text-anchor:middle;paint-order:stroke fill;stroke-width:2.2px;stroke-linejoin:round;stroke-linecap:round}\n  .lbl.big text{stroke-width:2.9px}\n  .lbl line.lead{stroke-opacity:.5;stroke-width:.8}\n  .legend{display:flex;gap:12px;flex-wrap:wrap;margin-top:8px;font-size:12px}\n  .legend b{display:inline-block;width:11px;height:11px;border-radius:3px;margin-right:5px;vertical-align:-1px}\n  .kpis{display:grid;grid-template-columns:1fr 1fr;gap:9px;margin-bottom:12px}\n  .kpi{background:var(--panel2);border:1px solid var(--line);border-radius:10px;padding:9px 11px}\n  .kpi .n{font-size:19px;font-weight:700}.kpi .l{font-size:10.5px;color:var(--mut);margin-top:2px}\n  .kpi.warn{border-color:#ffd1cc}.kpi.warn .n{color:var(--closing)}.kpi.ok{border-color:#bdeecb}.kpi.ok .n{color:var(--ok)}\n  .bar-row{display:flex;align-items:center;gap:8px;margin:6px 0}\n  .bar-row .tag{width:42px;font-weight:600;font-size:12px}\n  .bar-track{flex:1;height:18px;background:var(--panel2);border-radius:5px;overflow:hidden;display:flex;position:relative}\n  .bar-mark{position:absolute;top:0;bottom:0;width:2px;opacity:.9;z-index:2}\n  .bar-base{height:100%;opacity:.4}.bar-inc{height:100%}\n  .bar-val{width:132px;text-align:right;font-size:11px;color:var(--mut);font-variant-numeric:tabular-nums}\n  table{border-collapse:collapse;width:100%;font-size:11.5px}\n  th,td{padding:5px 6px;text-align:right;border-bottom:1px solid var(--line);font-variant-numeric:tabular-nums}\n  th:first-child,td:first-child{text-align:left}\n  thead th{color:var(--mut);font-weight:600;font-size:10.5px;position:sticky;top:0;background:var(--panel)}\n  .home{display:inline-block;width:9px;height:9px;border-radius:2px;margin-right:4px}\n  .muni-item{display:flex;align-items:center;gap:8px;background:var(--panel2);border:1px solid var(--line);border-radius:8px;padding:5px 8px;margin-bottom:6px}\n  .muni-item .nm{flex:1;font-weight:600;font-size:12px}.muni-item .ct{color:var(--mut);font-size:11px}\n  .seg{display:flex;border:1px solid var(--line);border-radius:7px;overflow:hidden}\n  .seg button{border:0;background:transparent;color:var(--mut);padding:4px 8px;font-size:11px;font-weight:600;cursor:pointer}\n  .seg button.on{color:#fff}\n  .toolbar{display:flex;gap:8px;align-items:center;flex-wrap:wrap}\n  .toggle{display:flex;border:1px solid var(--line);border-radius:8px;overflow:hidden;font-size:12px}\n  .toggle button{background:transparent;border:0;color:var(--mut);padding:6px 10px;cursor:pointer;font-weight:600}\n  .toggle button.on{background:var(--panel2);color:var(--ink)}\n  .note{color:var(--mut);font-size:10.5px;margin-top:7px;line-height:1.5}\n  .cell{font-variant-numeric:tabular-nums}\n  .lider-foot td{background:var(--panel2);font-weight:600;font-size:11px;color:var(--ink);border-bottom:2px solid var(--line);padding:5px 6px;text-align:left}\n  .scroll{max-height:240px;overflow:auto}\n  /* Tables meant to be READ in full rather than sampled. Only the vertical cap is dropped — overflow\n     stays auto so the wide grupo grid can still scroll sideways inside its card, which is the one axis\n     that genuinely cannot fit. */\n  .scroll.grow{max-height:none}\n  .tip{position:fixed;pointer-events:none;background:#1c1c1e;color:#fff;border-radius:8px;padding:7px 9px;font-size:11px;opacity:0;transition:opacity .1s;z-index:9;max-width:230px}\n  .spark{display:flex;align-items:flex-end;gap:3px;height:44px}\n  .spark .b{flex:1;background:var(--acc);border-radius:2px 2px 0 0;min-height:2px;opacity:.85}\n  .delta{font-size:10px}.delta.up{color:var(--ok)}.delta.dn{color:var(--closing)}\n  .tabs{display:flex;gap:6px;margin-bottom:10px;flex-wrap:wrap}\n  .tabs button{background:transparent;border:1px solid var(--line);border-radius:8px;color:var(--mut);padding:6px 12px;cursor:pointer;font-weight:600}\n  .tabs button.on{background:var(--panel2);color:var(--ink);border-color:var(--acc)}\n  .hidden{display:none}\n  .sqlbox{width:100%;height:60px;font-family:ui-monospace,Menlo,monospace;font-size:11px;resize:vertical}\n  .load{position:absolute;inset:0;background:rgba(245,245,247,.85);backdrop-filter:blur(4px);display:flex;align-items:center;justify-content:center;z-index:20;font-size:13px;color:var(--acc);font-weight:600;text-align:center;padding:20px}\n  .load.hidden{display:none}\n  .badge{font-size:10px;padding:1px 6px;border-radius:5px;background:var(--panel2);border:1px solid var(--line);color:var(--mut)}\n  .sheet-bg{position:fixed;inset:0;background:rgba(28,28,30,.34);backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);display:flex;align-items:center;justify-content:center;z-index:40;padding:24px}\n  .sheet-bg.hidden{display:none}\n  .sheet{background:var(--panel);border:1px solid var(--line);border-radius:14px;box-shadow:0 24px 60px rgba(0,0,0,.22);width:min(580px,100%);max-height:100%;display:flex;flex-direction:column;overflow:hidden}\n  .sheet-hd{display:flex;align-items:center;gap:9px;padding:12px 16px;border-bottom:1px solid var(--line)}\n  .sheet-hd h3{margin:0;font-size:14px;font-weight:600;letter-spacing:-.1px}\n  .sheet-x{background:transparent;border:0;color:var(--mut);font-size:13px;cursor:pointer;padding:3px 7px;border-radius:6px}\n  .sheet-x:hover{background:var(--panel2);color:var(--ink)}\n  .sheet-bd{padding:14px 16px;overflow:auto}\n  .sheet-ft{display:flex;align-items:center;gap:8px;padding:11px 16px;border-top:1px solid var(--line);background:var(--panel2)}\n  .opt-lbl{font-size:11px;text-transform:uppercase;letter-spacing:.4px;color:var(--mut);font-weight:600}\n  .opt-sub{font-size:11.5px;color:var(--mut);margin:4px 0 10px;line-height:1.5}\n  .opt-row{display:flex;gap:10px;align-items:flex-start;border:1px solid var(--line);border-radius:10px;padding:10px 12px;margin-bottom:8px;cursor:pointer;background:var(--panel)}\n  .opt-row:hover{background:var(--panel2)}\n  .opt-row.on{border-color:var(--acc);background:#eaf3ff}\n  .opt-row input[type=radio]{margin:2px 0 0;accent-color:var(--acc);flex:0 0 auto}\n  .opt-t{font-size:12.5px;font-weight:600;display:flex;align-items:center;gap:6px;flex-wrap:wrap}\n  .opt-d{font-size:11.5px;color:var(--mut);margin-top:3px;line-height:1.55}\n  .opt-inline{font-size:11.5px;color:var(--mut);margin-top:9px;display:flex;align-items:center;gap:7px;flex-wrap:wrap}\n  .opt-inline.off{opacity:.4;pointer-events:none}\n  .opt-note{border:1px solid var(--line);background:var(--panel2);border-radius:10px;padding:9px 11px;font-size:11.5px;color:var(--mut);line-height:1.6;margin-top:12px}\n  .opt-grid{display:grid;grid-template-columns:1fr 1fr 1fr;gap:8px;margin-top:2px}\n  .opt-fld{display:flex;flex-direction:column;gap:5px;border:1px solid var(--line);border-radius:9px;padding:8px 10px;background:var(--panel2)}\n  .opt-fld span{font-size:11px;color:var(--mut);font-weight:600;line-height:1.35}\n  .opt-fld i{font-style:normal;font-weight:400;opacity:.72}\n  .opt-fld input{width:100%;background:var(--panel)}\n  .opt-err{margin-top:9px;font-size:11.5px;color:var(--closing);font-weight:600}\n  .opt-hr{height:1px;background:var(--line);margin:17px 0 0}\n  .shareurl{margin-top:9px;padding:9px 10px;border-radius:8px;background:var(--panel);border:1px solid var(--acc);\n    font-family:ui-monospace,Menlo,monospace;font-size:11px;color:var(--ink);word-break:break-all;user-select:all}\n`,\n  render(d2){\n    return `<div class=\"simroot\"><header id=\"topHeader\" class=\"hidden\">\n  <h1>Simulador de Timeline de Fechamentos</h1>\n  <span class=\"pill live\" id=\"liveState\" role=\"button\" tabindex=\"0\" title=\"Clique pra buscar o snapshot mais recente e recalcular a timeline inteira\">● iniciando</span>\n  <span class=\"pill ro\">read-only · nunca escreve</span>\n  <span class=\"pill\" id=\"basePill\"></span>\n  <span class=\"pill\" id=\"rulePill\"></span>\n  <span class=\"pill\" id=\"spanPill\"></span>\n  <span class=\"status\" id=\"ds\"></span>\n  <div class=\"mac-spacer\"></div>\n  <select id=\"sessionPick\" style=\"min-width:200px\"></select>\n  <button class=\"ghost\" id=\"openOptions\" title=\"Configurações desta sessão\">⚙ Opções</button>\n  <button class=\"act\" id=\"saveSession\">Salvar sessão</button>\n  <button class=\"ghost\" id=\"dupSession\" title=\"Cria uma cópia independente desta sessão — a original fica intacta e a cópia passa a ser a sessão ativa\">⧉ Duplicar</button>\n  <button class=\"ghost\" id=\"openShare\" title=\"Publicar uma cópia congelada desta sessão em modo leitura\">⇪ Compartilhar</button>\n  <span class=\"status\" id=\"sessStatus\"></span>\n</header>\n\n<div class=\"rail hidden\" id=\"timelineRail\">\n  <div id=\"movementChips\"></div>\n  <div id=\"addMovementGroup\">\n    <input id=\"sectorPick\" list=\"sectorPickList\" placeholder=\"código do setor\" style=\"min-width:150px\">\n    <datalist id=\"sectorPickList\"></datalist>\n    <button class=\"ghost\" id=\"rand\" title=\"Setor aleatório\">🎲</button>\n    <button class=\"act\" id=\"go\">Fechar setor ▶ (nova etapa)</button>\n  </div>\n</div>\n\n<div class=\"card\" id=\"confirmCard\" style=\"margin:14px 20px\">\n  <h2 style=\"margin:0 0 9px\">Confirmar snapshot antes de simular</h2>\n  <div class=\"note\" id=\"confirmBody\">congelando snapshot…</div>\n  <button class=\"act\" id=\"confirmSnap\" style=\"margin-top:12px\">Confirmar snapshot ▶ ir pra simulação</button>\n  <div class=\"note\" style=\"margin-top:16px\">ou continue uma sessão salva:</div>\n  <select id=\"confirmSessionPick\" style=\"min-width:260px;margin-top:4px\"></select>\n  <div class=\"status\" id=\"confirmStatus\" style=\"margin-top:8px\"></div>\n</div>\n\n<div class=\"howto hidden\" id=\"howtoBox\">\n  <b>Como usar &nbsp;→&nbsp;</b>\n  <span><b>1.</b> Escolha um setor pra <b>fechar</b> (ou 🎲) — isso cria a etapa 1 da timeline.</span>\n  <span><b>2.</b> Feche outro setor pra criar a etapa 2 — ela já considera pra onde a etapa 1 mandou cada município.</span>\n  <span><b>3.</b> Clique numa etapa (chip acima) pra revisitar/editar — editar uma etapa recalcula automaticamente todas as etapas seguintes.</span>\n  <span><b>4.</b> Veja o efeito acumulado da cadeia inteira na aba <b>Impacto acumulado</b>.</span>\n</div>\n<div class=\"wrap hidden\" id=\"mainWrap\">\n  <div>\n    <div class=\"card\">\n      <div style=\"display:flex;justify-content:space-between;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:9px\">\n        <h2 id=\"mapTitle\" style=\"margin:0\">Mapa — clique num município p/ trocar o setor destino</h2>\n        <div class=\"toggle\" id=\"viewToggle\" title=\"ASIS = estrutura do setor antes desta etapa (já considerando etapas anteriores) · TOBE = após a redistribuição desta etapa\">\n          <button data-v=\"asis\">◧ ASIS (antes desta etapa)</button>\n          <button data-v=\"tobe\" class=\"on\">◨ TOBE (simulação)</button>\n        </div>\n      </div>\n      <svg id=\"map\" viewBox=\"0 0 700 500\" preserveAspectRatio=\"xMidYMid meet\"></svg>\n      <div class=\"legend\" id=\"legend\"></div>\n      <div class=\"note\">Coloridos = municípios do setor fechado nesta etapa (cor = destino). Ao redor, cada área é um <b>setor vizinho inteiro</b> com o código no meio — não municípios soltos: cor = setor destino, cinza = contexto, cinza tracejado = setor já fechado numa etapa anterior. Shapes reais IBGE/tbrugz.</div>\n      <div class=\"note\" id=\"mapIgnoredNote\"></div>\n    </div>\n\n    <div class=\"card\">\n      <h2>Líderes — destino e CBs deslocadas (nesta etapa)</h2>\n      <div class=\"note\" style=\"margin:-4px 0 9px\"><b>Home</b> = setor que ficou com a maioria das CBs da líder. <b style=\"color:var(--closing)\">Deslocadas</b> = CBs dela que caíram noutro setor.</div>\n      <div class=\"scroll grow\"><table id=\"leaders\"></table></div>\n    </div>\n\n    <div class=\"card\">\n      <div class=\"tabs\">\n        <button data-tab=\"matrix\" class=\"on\">Matriz ASIS</button>\n        <button data-tab=\"tobe\">Matriz TOBE</button>\n        <button data-tab=\"report\">Relatório de impacto (etapa)</button>\n        <button data-tab=\"cumulative\">Impacto acumulado (timeline)</button>\n        <button data-tab=\"sql\">Console SQL</button>\n      </div>\n      <div id=\"tab-matrix\"><div class=\"scroll grow\"><table id=\"matrix\"></table></div></div>\n      <div id=\"tab-tobe\" class=\"hidden\"><div class=\"scroll grow\"><table id=\"matrixTobe\"></table></div>\n        <div class=\"note\" id=\"tobeNote\"></div></div>\n      <div id=\"tab-report\" class=\"hidden\"></div>\n      <div id=\"tab-cumulative\" class=\"hidden\"></div>\n      <div id=\"tab-sql\" class=\"hidden\">\n        <textarea class=\"sqlbox\" id=\"sqlIn\">SELECT DS_MUNICIPIO, COUNT(DISTINCT CD_CONSULTORA) qtd FROM product.perfil_cb.crm_perfil_cb_diaria_historico WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR=3504 GROUP BY DS_MUNICIPIO ORDER BY qtd DESC</textarea>\n        <div class=\"toolbar\" style=\"margin:8px 0\"><button class=\"act\" id=\"runSql\">▶ Rodar</button><span class=\"status\" id=\"sqlStatus\"></span></div>\n        <div class=\"note\" style=\"margin:-4px 0 8px\">Roda contra o snapshot congelado desta sessão (não \"ao vivo\") — mesma coerência da timeline.</div>\n        <div class=\"scroll\"><table id=\"sqlOut\"></table></div>\n      </div>\n    </div>\n  </div>\n\n  <div>\n    <div class=\"card\">\n      <div class=\"toolbar\" style=\"margin-bottom:11px\">\n        <button class=\"ghost\" id=\"optim\" title=\"testa todas alocações contíguas e escolhe a que equilibra a carga entre setores + minimiza a quebra (evita empilhar tudo num setor)\">★ Modelo ÓTIMO (equilíbrio + quebra)</button>\n        <button class=\"ghost\" id=\"autoTobe\" title=\"preenche cada município pelo setor vizinho mais próximo (geografia)\">TOBE por adjacência</button>\n        <span class=\"badge\" id=\"optBadge\"></span>\n      </div>\n      <div class=\"note\" style=\"margin:-4px 0 10px\"><b style=\"color:var(--ink)\">★ ÓTIMO</b> = equilibra a carga entre os setores <b>e</b> minimiza a quebra (contíguo; não empilha tudo num setor). <b style=\"color:var(--ink)\">TOBE</b> = sugestão por vizinhança. Editar esta etapa recalcula automaticamente as etapas seguintes da timeline.</div>\n      <div class=\"note\" id=\"ruleNote\" style=\"margin:-6px 0 11px;padding:7px 9px;background:var(--panel2);border:1px solid var(--line);border-radius:8px\"></div>\n      <div class=\"kpis\" id=\"kpis\"></div>\n      <div id=\"contig\"></div>\n      <div id=\"spanRule\"></div>\n      <h2>Span por setor (CBs) — base + entrantes</h2>\n      <div id=\"spans\"></div>\n      <div style=\"display:flex;justify-content:space-between;align-items:center;margin:14px 0 7px\">\n        <h2 style=\"margin:0\">CBs deslocadas</h2>\n        <div class=\"toggle\" id=\"policy\">\n          <button data-p=\"fora\" class=\"on\">= fora do setor</button>\n          <button data-p=\"quebra\">= quebra de relação</button>\n        </div>\n      </div>\n      <div class=\"note\" id=\"policyNote\"></div>\n    </div>\n\n    <div class=\"card\">\n      <h2>Municípios → setor destino</h2>\n      <div class=\"note\" style=\"margin:-4px 0 9px\">Clique no <b>código do setor</b> pra mandar o município <b>inteiro</b> pra lá (regra de negócio). A cor acompanha o mapa.</div>\n      <div id=\"muniList\"></div>\n    </div>\n\n    <div class=\"card\">\n      <div class=\"toolbar\" style=\"justify-content:space-between\">\n        <h2 style=\"margin:0\">Plano de migração (etapa selecionada)</h2>\n        <div><button class=\"ghost\" id=\"copyPlan\">Copiar</button> <button class=\"ghost\" id=\"csvPlan\">CSV</button></div>\n      </div>\n      <div id=\"plan\" class=\"note\"></div>\n    </div>\n  </div>\n</div>\n\n<div class=\"sheet-bg hidden\" id=\"shareBg\">\n  <div class=\"sheet\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"shareTitle\">\n    <div class=\"sheet-hd\"><h3 id=\"shareTitle\">Compartilhar sessão</h3><div class=\"mac-spacer\"></div><button class=\"sheet-x\" id=\"shareX\" title=\"Fechar\">✕</button></div>\n    <div class=\"sheet-bd\" id=\"shareBody\"></div>\n    <div class=\"sheet-ft\">\n      <span class=\"status\" id=\"shareStatus\"></span>\n      <div class=\"mac-spacer\"></div>\n      <button class=\"ghost hidden\" id=\"shareCopy\">Copiar link</button>\n      <button class=\"ghost hidden\" id=\"shareOpen\">Abrir</button>\n      <button class=\"ghost\" id=\"shareCancel\">Cancelar</button>\n      <button class=\"act\" id=\"shareGo\">Compartilhar</button>\n    </div>\n  </div>\n</div>\n\n<div class=\"sheet-bg hidden\" id=\"optionsBg\">\n  <div class=\"sheet\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"optTitle\">\n    <div class=\"sheet-hd\"><h3 id=\"optTitle\">Opções da sessão</h3><span class=\"badge\" id=\"optSessName\"></span><div class=\"mac-spacer\"></div><button class=\"sheet-x\" id=\"optClose\" title=\"Fechar\">✕</button></div>\n    <div class=\"sheet-bd\">\n      <div class=\"opt-lbl\">Regra rígida — seleção dos setores destino</div>\n      <div class=\"opt-sub\">Define quais setores vizinhos podem entrar na lista de destinos de cada etapa. Vale pra toda a timeline desta sessão.</div>\n      <label class=\"opt-row\" data-r=\"any\">\n        <input type=\"radio\" name=\"destRule\" value=\"any\">\n        <div>\n          <div class=\"opt-t\">Adjacente a qualquer município <span class=\"badge\">padrão</span></div>\n          <div class=\"opt-d\">Um setor entra na lista de destinos se tiver município vizinho a <b>qualquer</b> município do setor fechado — inclusive os menores. É o comportamento de hoje.</div>\n        </div>\n      </label>\n      <label class=\"opt-row\" data-r=\"dominant\">\n        <input type=\"radio\" name=\"destRule\" value=\"dominant\">\n        <div>\n          <div class=\"opt-t\">Adjacente a municípios dominantes</div>\n          <div class=\"opt-d\">Só os municípios do setor fechado com <b>CBs suficientes</b> valem como ponte. Os pequenos continuam sendo redistribuídos normalmente — só não trazem setor novo pra lista de destinos.</div>\n          <div class=\"opt-inline\" id=\"optMinCbsWrap\">Ignorar municípios com menos de <input type=\"number\" id=\"optMinCbs\" min=\"1\" max=\"9999\" step=\"1\" style=\"width:74px\"> CBs</div>\n        </div>\n      </label>\n      <div class=\"opt-hr\"></div>\n      <div class=\"opt-lbl\" style=\"margin-top:15px\">Pré-requisitos do setor destino — tamanho em CBs</div>\n      <div class=\"opt-sub\">Vale pro tamanho de cada setor receptor <b>depois</b> da redistribuição (base + entrantes). Em branco = desligado.</div>\n      <div class=\"opt-grid\">\n        <label class=\"opt-fld\"><span>Span alvo <i>(tamanho ideal)</i></span><input type=\"number\" id=\"optTargetSpan\" min=\"1\" max=\"99999\" step=\"1\" placeholder=\"livre\"></label>\n        <label class=\"opt-fld\"><span>Span máximo <i>(nenhum setor acima)</i></span><input type=\"number\" id=\"optMaxSpan\" min=\"1\" max=\"99999\" step=\"1\" placeholder=\"sem limite\"></label>\n        <label class=\"opt-fld\"><span>Span mínimo <i>(nenhum setor abaixo)</i></span><input type=\"number\" id=\"optMinSpan\" min=\"1\" max=\"99999\" step=\"1\" placeholder=\"sem limite\"></label>\n      </div>\n      <div class=\"opt-err hidden\" id=\"optSpanErr\"></div>\n      <div class=\"opt-note\" id=\"optPreview\"></div>\n    </div>\n    <div class=\"sheet-ft\"><span class=\"status\" id=\"optStatus\"></span><div class=\"mac-spacer\"></div><button class=\"ghost\" id=\"optCancel\">Cancelar</button><button class=\"act\" id=\"optApply\">Aplicar</button></div>\n  </div>\n</div>\n\n<div class=\"tip\" id=\"tip\"></div>\n<div class=\"load hidden\" id=\"loader\">carregando…</div>\n<span id=\"ready\" style=\"display:none\"></span></div>`;\n  },\n  mounted(d2, root){\n\nconst $=s=>root.querySelector(s);\nconst fmt=n=>n==null?'–':Math.round(+n).toLocaleString('pt-BR');\nconst money=n=>{n=+n||0;return n>=1e6?'R$'+(n/1e6).toFixed(1)+'M':n>=1e3?'R$'+(n/1e3).toFixed(0)+'k':'R$'+Math.round(n)};\nconst norm=s=>(s||'').normalize('NFKD').replace(/[̀-ͯ]/g,'').toUpperCase().replace(/[^A-Z0-9]+/g,' ').trim();\nconst esc=s=>(s==null?'':String(s)).replace(/[&<>]/g,c=>({'&':'&amp;','<':'&lt;','>':'&gt;'}[c]));\nconst blankM=()=>({cbs:0,receita:0,rec_nat:0,rec_avon:0,pontos:0,pedidos:0,ativas:0});\n// ---------- município identity ----------\n// Brazil has many municipalities sharing a name (Bom Jesus alone exists in PI, RN, RS, SC, PB, GO).\n// A stage loads the dominant UF PLUS every bordering UF, so those collisions land in the SAME\n// feature set routinely: keyed by name alone the last shape loaded won, the map could draw a\n// município from the wrong state, buildAdj merged two unrelated municipalities into one node, and\n// GROUP BY DS_MUNICIPIO summed two real municipalities into one row. The key is NAME/UF everywhere\n// — SQL rows, GeoJSON features, the dominantes base, assignments, persisted sessions. norm() maps\n// every non-alphanumeric to a space, so '/' can never occur inside a name and the split is exact.\n// A missing UF degrades to a bare NAME key rather than inventing one.\nconst mkey=(name,uf)=>{const n=norm(name),u=String(uf==null?'':uf).trim().toUpperCase();return u?n+'/'+u:n;};\nconst mName=k=>{const s=String(k==null?'':k),i=s.lastIndexOf('/');return i<0?s:s.slice(0,i);};\nconst mUf=k=>{const s=String(k==null?'':k),i=s.lastIndexOf('/');return i<0?'':s.slice(i+1);};\nconst mDisp=k=>{const u=mUf(k);return u?mName(k)+' ('+u+')':mName(k);};\n// The base CSV is the ONLY source of a município's UF now, so its column is accepted in whatever\n// shape the base is maintained in: sigla, IBGE numeric code, or full state name. Anything that does\n// not resolve to a real sigla is treated as UNKNOWN rather than passed through — a bogus UF would key\n// a município to a shape that does not exist and drop it off the map without a word.\nconst UF_OF_CODE={}; Object.keys(UF_CODE).forEach(k=>{ UF_OF_CODE[UF_CODE[k]]=k; });\nconst UF_OF_NAME={ACRE:'AC',ALAGOAS:'AL',AMAPA:'AP',AMAZONAS:'AM',BAHIA:'BA',CEARA:'CE','DISTRITO FEDERAL':'DF','ESPIRITO SANTO':'ES',GOIAS:'GO',MARANHAO:'MA','MATO GROSSO':'MT','MATO GROSSO DO SUL':'MS','MINAS GERAIS':'MG',PARA:'PA',PARAIBA:'PB',PARANA:'PR',PERNAMBUCO:'PE',PIAUI:'PI','RIO DE JANEIRO':'RJ','RIO GRANDE DO NORTE':'RN','RIO GRANDE DO SUL':'RS',RONDONIA:'RO',RORAIMA:'RR','SANTA CATARINA':'SC','SAO PAULO':'SP',SERGIPE:'SE',TOCANTINS:'TO'};\nconst ufNorm=v=>{const s=norm(v); if(!s) return '';\n  if(UF_CODE[s]) return s;\n  if(UF_OF_CODE[s]) return UF_OF_CODE[s];\n  return UF_OF_NAME[s]||'';};\nconst loader=(on,t)=>{const l=$('#loader');l.classList.toggle('hidden',!on);if(t)l.textContent=t;};\nconst setError=(msg)=>{ const t=$('#ds'); if(t){t.textContent=msg;t.classList.add('err');} const c=$('#confirmStatus'); if(c){c.textContent=msg;c.classList.add('err');} };\n\n// ---------- base de municípios dominantes (CSV) ----------\n// WHICH municipalities belong to a sector is a business fact, not something to infer from CB volume:\n// it comes from a maintained CSV (one row per setor x município) linked through the `dominantesCsvUrl`\n// param. Anything the closing sector has CBs in but that the base does NOT assign to it is spillover:\n// not realocated, not drawn on the map, and its CBs follow their leader. Loaded once per URL and\n// cached for the whole session; a failure is thrown, never swallowed — a silent fallback here would\n// quietly change every number on the screen.\nconst DOM={url:null,promise:null,bySetor:null,ufBySetorMuni:null,rows:0,setores:0,hasUf:false,ufCol:null,badUf:0,clashes:0,headers:null,error:null};\nfunction parseCsv(text){\n  const out=[]; let row=[],cur='',q=false;\n  const push=()=>{ row.push(cur); cur=''; };\n  const endRow=()=>{ push(); if(row.length>1||row[0]!=='') out.push(row); row=[]; };\n  for(let i=0;i<text.length;i++){ const ch=text[i];\n    if(q){ if(ch==='\"'){ if(text[i+1]==='\"'){ cur+='\"'; i++; } else q=false; } else cur+=ch; }\n    else if(ch==='\"') q=true;\n    else if(ch===',') push();\n    else if(ch==='\\n') endRow();\n    else if(ch!=='\\r') cur+=ch;\n  }\n  if(cur!==''||row.length) endRow();\n  return out;\n}\n// `dominantesCsvUrl` is declared as a FileComponentUrlReference, so the instance points at the Drive\n// FILE, not at a URL literal — the Drive is policy-gated behind the app's auth strategy and a baked\n// string would be both stale and unauthorised. What the resolver hands back varies by where it is\n// resolved (URL string / file record / bare reference), so accept every shape instead of silently\n// reading undefined and falling through to the fallback.\n// The Drive is gated by the app's AuthenticationStrategy, so this read has to travel as the LOGGED-IN\n// USER — an anonymous CDN GET is exactly what the policy is there to refuse. `<system>.data2.media` is\n// only a cache in front of the SSP: on a cache miss it 302s to `<system>.data2apis.com`, which is where\n// the policy is actually evaluated.\n// COOKIES CANNOT CARRY THAT SESSION, which is why the previous `credentials:'include'` attempt could\n// never have worked: the app runs on <app>.<system>.data2.app and the SSP on <system>.data2apis.com —\n// cross-site — and the SSP answers `Access-Control-Allow-Origin: *` with no `Allow-Credentials`, so the\n// browser rejects a credentialed CORS read before it ever leaves the page. What the SSP actually reads\n// is `Authorization: Bearer <token>`: the runtime keeps that token in localStorage under\n// `__data2-session-<systemDomain>` (`__data2-session-data2` inside the builder preview) and replays it\n// on every dataset and rush call — same token, same header, same session, so the Drive policy sees the\n// logged-in user. Preflight passes because the SSP echoes whatever header the request asks for.\nfunction d2SessionToken(sysDomain){\n  const read=k=>{ try{ return (k&&window.localStorage.getItem(k))||''; }catch(e){ return ''; } };\n  return read(sysDomain?('__data2-session-'+sysDomain):'')||read('__data2-session-data2')||'';\n}\nfunction domCsvSystemDomain(url){\n  const m=/^https?:\\/\\/([^.\\/]+)\\.data2\\.(?:media|app)\\//i.exec(url)||/^https?:\\/\\/([^.\\/]+)\\.data2apis\\.com\\//i.exec(url);\n  return m?m[1]:'';\n}\nfunction domCsvCandidates(url){\n  const out=[];\n  const isMedia=/^https?:\\/\\/[^.\\/]+\\.data2\\.media\\//i.test(url);\n  const api=isMedia?url.replace(/^(https?:\\/\\/[^.\\/]+)\\.data2\\.media\\//i,'$1.data2apis.com/'):null;\n  const tok=d2SessionToken(domCsvSystemDomain(url));\n  const auth=tok?{authorization:'Bearer '+tok}:null;\n  // Authenticated origin read first — the only candidate a GATED Drive can actually answer.\n  if(api&&auth) out.push({url:api,headers:auth,label:'api+sessão'});\n  if(!api&&auth) out.push({url:url,headers:auth,label:'origem+sessão'});\n  // Anonymous last: only ever succeeds on an UNGATED Drive — or on a stale CDN cache hit, which is NOT\n  // proof the file is public (the origin keeps answering 401 once the edge entry expires).\n  if(api) out.push({url:api,headers:null,label:'api anônimo'});\n  out.push({url:url,headers:null,label:'origem anônima'});\n  return out;\n}\nfunction domCsvUrl(){\n  const pick=v=>{\n    if(!v) return '';\n    if(typeof v==='string') return v;\n    const q=v.params||{};\n    const ref=q.reference||v.reference;\n    return q.fileUrl||q.url||v.fileUrl||v.url||(ref?DOM_MEDIA_BASE+ref:'');\n  };\n  return String(pick(d2.param('dominantesCsvUrl'))||DOM_CSV_FALLBACK||'').trim();\n}\nasync function ensureDominantes(){\n  const url=domCsvUrl();\n  if(!url) throw new Error('base de municípios dominantes não configurada — ligue o arquivo CSV no parâmetro dominantesCsvUrl da instância do componente');\n  if(DOM.url===url && DOM.bySetor) return DOM.bySetor;\n  if(DOM.url===url && DOM.promise) return DOM.promise;\n  DOM.url=url; DOM.error=null;\n  DOM.promise=(async()=>{\n    // Self-diagnosing on purpose: every candidate reports its own outcome and the message names the\n    // session it was carrying. \"Unauthorized\" alone cannot distinguish \"not logged into THIS strategy\"\n    // from \"cookie not sent cross-site\" from \"param never bound, so it tried the fallback URL\" — and\n    // guessing between those from the outside costs a round trip each time.\n    let r=null; const tried=[];\n    for(const c of domCsvCandidates(url)){\n      let res=null;\n      try{ res=await fetch(c.url,{cache:'no-store',credentials:'omit',headers:c.headers||undefined}); }\n      catch(e){ tried.push(c.label+' → rede/CORS'); continue; }\n      if(res.ok){ r=res; break; }\n      tried.push(c.label+' → '+res.status);\n    }\n    if(!r){\n      let sess='sessão desconhecida';\n      try{\n        const a=d2.auth(AUTH_REF);\n        sess=(a&&a.isAuthed)?('logado como '+((a.user&&(a.user.email||a.user.nome))||'?')):('NÃO logado na estratégia '+AUTH_REF);\n      }catch(e){ sess='estratégia '+AUTH_REF+' não resolvida'; }\n      const tk=d2SessionToken(domCsvSystemDomain(url));\n      throw new Error('base de municípios dominantes: não foi possível ler o arquivo — '+sess+' · token de sessão '+(tk?'presente':'AUSENTE no localStorage')+'. Tentativas: '+tried.join(' · '));\n    }\n    const table=parseCsv(await r.text());\n    if(table.length<2) throw new Error('base de municípios dominantes vazia');\n    const head=table[0].map(h=>norm(h));\n    const iS=head.indexOf('CD SETOR'), iM=head.indexOf('MUNICIPIO');\n    if(iS<0||iM<0) throw new Error('base de municípios dominantes sem as colunas CD_SETOR / MUNICIPIO');\n    // CD_GV is the gerência de vendas the setor answers to, and it is the authority for the hard rule\n    // that a closing sector only ever hands territory to sectors of its OWN gerência. Its absence is\n    // fatal rather than a warning: with no GV there is no way to PROVE two sectors share one, and\n    // falling through unchecked is exactly the leak this column exists to close.\n    const iG=['CD GV','CDGV','GV','CD GERENCIA','CD GERENCIA VENDAS','CD GERENCIA DE VENDAS','GERENCIA DE VENDAS','GERENCIA'].map(h=>head.indexOf(h)).find(i=>i>=0);\n    if(iG==null) throw new Error('base de municípios dominantes sem a coluna CD_GV — a regra de gerência de vendas não pode ser aplicada. Colunas lidas: '+head.slice(0,40).join(', '));\n    // The UF column is what the whole keying now rests on — SQL no longer carries DS_ESTADO — so its\n    // absence is a first-class finding, not a footnote. The header actually matched is reported on the\n    // base pill, and when nothing matches the pill lists every column read, because guessing a header\n    // name from the outside costs a round trip each time.\n    const iU=['UF','SIGLA UF','SG UF','CD UF','ESTADO','DS ESTADO','SIGLA','ESTADO SIGLA','UF MUNICIPIO'].map(h=>head.indexOf(h)).find(i=>i>=0);\n    const by={},ufBy={},gvBy={}; let n=0,bad=0; const clash={},gvClash={};\n    for(let i=1;i<table.length;i++){\n      const line=table[i]; if(!line) continue;\n      const s=String(line[iS]==null?'':line[iS]).trim(), m=norm(line[iM]);\n      if(!s||!m) continue;\n      // One setor spans many rows (one per município) and every one of them repeats its CD_GV. Two\n      // DIFFERENT values for the same setor means the base itself disagrees about which gerência owns\n      // it — counted and reported, never keyed to whichever row happened to be read last.\n      const gvv=String(line[iG]==null?'':line[iG]).trim();\n      if(gvv){ if(gvBy[s]!==undefined && gvBy[s]!==gvv) gvClash[s]=true; else gvBy[s]=gvv; }\n      const raw=(iU==null)?'':line[iU];\n      const u=(iU==null)?'':ufNorm(raw);\n      if(iU!=null && String(raw==null?'':raw).trim() && !u) bad++;\n      // The same name twice in ONE setor under two UFs is the single case the reverted SQL cannot\n      // survive: mSQL groups by DS_MUNICIPIO alone, so both municipalities arrive summed into one row\n      // and no lookup can split them again. Counted and reported — never quietly keyed to whichever\n      // UF happened to be read last.\n      const kk=s+'|'+m;\n      // An UNRESOLVED uf must never outrank a resolved one. Reading a blank/bogus UF row first wrote ''\n      // here, and the next row carrying the real sigla was then rejected as a clash — so the key stayed\n      // falsy for good, ufFor() fell through, and the município degraded to a bare NAME key that matches\n      // no shape and no dominance entry. With DISTRITO/ZONA in the base a município spans several rows,\n      // so which row lands first is pure luck. A clash is only two RESOLVED siglas that disagree.\n      if(!u){ if(ufBy[kk]===undefined) ufBy[kk]=''; }\n      else if(!ufBy[kk]) ufBy[kk]=u;\n      else if(ufBy[kk]!==u) clash[kk]=true;\n      (by[s]=by[s]||new Set()).add(u?m+'/'+u:m); n++;\n    }\n    if(!n) throw new Error('base de municípios dominantes sem linhas válidas');\n    DOM.bySetor=by; DOM.ufBySetorMuni=ufBy; DOM.rows=n; DOM.setores=Object.keys(by).length;\n    DOM.gvBySetor=gvBy; DOM.gvClashes=Object.keys(gvClash).length; DOM.gvCol=String(table[0][iG]||'').trim();\n    DOM.gvSetores=Object.keys(gvBy).length;\n    DOM.hasUf=(iU!=null); DOM.ufCol=(iU==null?null:String(table[0][iU]||'').trim());\n    DOM.badUf=bad; DOM.clashes=Object.keys(clash).length; DOM.headers=head.slice(0,40); DOM.error=null;\n    return by;\n  })();\n  DOM.promise.catch(e=>{ DOM.promise=null; DOM.bySetor=null; DOM.error=e.message; renderAll(); });\n  return DOM.promise;\n}\n\nlet SESS={ snapshotRaw:null, snapshotSyncedAt:null, snapLiteral:null, eloMaxCycle:null, timeline:[], selected:0,\n           sessionId:null, sessionLabel:null, sessionsList:[], sectorsList:[], sectorBaseCache:{}, stage:'loading', dirtyFrom:null,\n           snapBusy:false, settings:{...DEFAULT_SETTINGS} };\n\nasync function q(sql){\n  let dbx,res;\n  try{\n    res=await d2.rush('AwW_11Nkg-dKksP7ic8V8').invoke({sql});\n  }catch(e){\n    throw new Error('Databricks indisponível (rush AwW_11Nkg-dKksP7ic8V8): '+e.message);\n  }\n  // The listener answers 200 with {sql} and NO `result` when its upstream probe times out: the\n  // handler builds `result: $result.data`, so an empty upstream simply drops the key rather than\n  // failing. Reading straight through to res.data.result.data reported \"Cannot read properties of\n  // undefined (reading 'data')\" — which reads like a bug in THIS component and sent a debugging\n  // session after the wrong thing. Name the layer that actually failed instead.\n  const payload=res&&res.data;\n  if(!payload) throw new Error('rush AwW_11Nkg-dKksP7ic8V8 não devolveu corpo — listener fora do ar?');\n  if(!payload.result) throw new Error('a sonda Databricks não respondeu: o listener AwW_11Nkg-dKksP7ic8V8 devolveu 200 sem `result`, o que normalmente é timeout do upstream (natura-x-app). O SQL não chegou a rodar.');\n  dbx=payload.result.data;\n  if(!dbx) throw new Error('sonda Databricks respondeu sem dados (result.data vazio).');\n  if(dbx.state && dbx.state!=='SUCCEEDED') throw new Error('Databricks '+dbx.state+': '+(dbx.error?.message||JSON.stringify(dbx.error)||'erro desconhecido'));\n  return dbx;\n}\nfunction rows(resp){const c=(resp.columns||[]).map(x=>x.name);\n  return (resp.rows||[]).map(a=>Object.fromEntries(c.map((k,i)=>[k,a[i]])));}\n// Stamps the UF onto every feature at load: the fetch is per-UF, so this is the ONLY point where a\n// shape's state is known for certain. Downstream the features are flattened into one array and the\n// origin would be unrecoverable. Persisted with the feature in saved sessions.\nasync function geoUF(uf){const code=UF_CODE[uf]||uf;const r=await fetch('https://raw.githubusercontent.com/tbrugz/geodata-br/master/geojson/geojs-'+code+'-mun.json');if(!r.ok)throw new Error('geo '+uf);\n  const g=await r.json(); const U=String(uf).toUpperCase();\n  (g.features||[]).forEach(f=>{ f.__uf=U; });\n  return g;}\n\nfunction buildAdj(features){\n  const pts=f=>{const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates],s=new Set();\n    ps.forEach(poly=>poly.forEach(ring=>ring.forEach(p=>s.add(Math.round(p[0]*1000)/1000+','+Math.round(p[1]*1000)/1000))));return s;};\n  const feat={},idx={};\n  features.forEach(f=>{const nm=mkey(f.properties.name||f.properties.NOME||f.properties.nome,f.__uf);feat[nm]={f,pts:pts(f)};});\n  for(const nm in feat) feat[nm].pts.forEach(p=>(idx[p]=idx[p]||[]).push(nm));\n  const nbrs=nm=>{const c={};feat[nm].pts.forEach(p=>idx[p].forEach(o=>{if(o!==nm)c[o]=(c[o]||0)+1;}));\n    return Object.entries(c).filter(([,n])=>n>=2).map(([o,n])=>({o,w:n}));};\n  return {feat,nbrs};\n}\nfunction centroidLL(f){let x=0,y=0,n=0;const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];\n  ps.forEach(poly=>poly[0].forEach(p=>{x+=p[0];y+=p[1];n++;}));return[x/n,y/n];}\n\n// ---------- snapshot pinning ----------\nasync function resolveSnapshotPin(){\n  const [rawR,liveCountR,eloR]=await Promise.all([\n    q(`SELECT MAX(DT_HISTORICO) snap FROM ${T} WHERE CD_PAIS=1`).then(rows),\n    q(`SELECT COUNT(*) n FROM ${T} WHERE CD_PAIS=1 AND DT_HISTORICO=(SELECT MAX(DT_HISTORICO) FROM ${T} WHERE CD_PAIS=1)`).then(rows),\n    q(`SELECT MAX(operational_cycle) mx FROM ${ELO} WHERE country_code=1`).then(rows).catch(()=>[]),\n  ]);\n  const raw=rawR[0]&&rawR[0].snap;\n  const liveCount=+((liveCountR[0]||{}).n||0);\n  const eloMax=+((eloR[0]||{}).mx||0);\n  const LIVE_SUBQ=`(SELECT MAX(DT_HISTORICO) FROM ${T} WHERE CD_PAIS=1)`;\n  const dbTs=(raw||'').replace('T',' ').replace(/Z$/,'');\n  const candidates=[`TIMESTAMP'${dbTs}'`,`'${dbTs}'`,`DATE'${dbTs}'`];\n  const tests=await Promise.all(candidates.map(c=>\n    q(`SELECT COUNT(*) n FROM ${T} WHERE CD_PAIS=1 AND DT_HISTORICO=${c}`).then(rows).then(r=>+((r[0]||{}).n||0)).catch(()=>-1)\n  ));\n  let chosen=LIVE_SUBQ;\n  for(let i=0;i<candidates.length;i++){ if(liveCount>0 && tests[i]===liveCount){ chosen=candidates[i]; break; } }\n  return {snapshotRaw:raw, snapLiteral:chosen, eloMaxCycle:eloMax, syncedAt:new Date().toISOString()};\n}\n// DISPLAY CONTRACT: the UI never prints the snapshot's own DT_HISTORICO (snapshotRaw). What the user\n// sees is `snapshotSyncedAt` — the date AND hour at which THIS instance last pulled/pinned the\n// snapshot it is querying. snapshotRaw is still resolved, still drives every SQL literal, and is\n// still persisted by saveSession/doShare; it is only kept off the screen.\nfunction fmtSyncedAt(iso){\n  if(!iso) return '—';\n  const d=new Date(iso);\n  if(isNaN(d.getTime())) return String(iso);\n  return d.toLocaleString('pt-BR',{day:'2-digit',month:'2-digit',year:'numeric',hour:'2-digit',minute:'2-digit'});\n}\nasync function ensurePinned(){\n  if(SESS.snapLiteral) return;\n  const p=await resolveSnapshotPin();\n  SESS.snapshotRaw=p.snapshotRaw; SESS.snapLiteral=p.snapLiteral; SESS.eloMaxCycle=p.eloMaxCycle;\n  SESS.snapshotSyncedAt=p.syncedAt;\n}\n\n// ---------- world-state fold ----------\nfunction accMetrics(base,add){\n  const out=base?{...base}:blankM();\n  Object.keys(blankM()).forEach(k=>{ out[k]=(out[k]||0)+((add&&add[k])||0); });\n  return out;\n}\nfunction foldWorldState(timeline,uptoIdx){\n  const closedSectors=new Set(),muniOverride={},muniGeo={},muniRow={},muniLevel={},sectorInflow={},sectorInflowLevel={},sectorOrphanRows={};\n  for(let k=0;k<uptoIdx;k++){\n    const mv=timeline[k]; if(!mv||!mv.sector||!mv.munis) continue;\n    closedSectors.add(String(mv.sector));\n    Object.keys(mv.munis).forEach(m=>{\n      if(m==='__OUTROS__') return;\n      const dest=mv.assign[m]; if(!dest) return;\n      muniOverride[m]=String(dest);\n      if(mv.geoFeat&&mv.geoFeat[m]) muniGeo[m]=mv.geoFeat[m];\n      const rws=(mv.matrix||[]).filter(r=>mkey(r.municipio,r.uf)===m);\n      muniRow[m]=(muniRow[m]||[]).concat(rws);\n      if(mv.levelByMuni&&mv.levelByMuni[m]) muniLevel[m]={...(muniLevel[m]||{}),...mv.levelByMuni[m]};\n      sectorInflow[dest]=accMetrics(sectorInflow[dest],mv.munis[m]);\n      const lv=(mv.levelByMuni&&mv.levelByMuni[m])||{};\n      sectorInflowLevel[dest]=sectorInflowLevel[dest]||{};\n      Object.entries(lv).forEach(([nv,c])=>{ sectorInflowLevel[dest][nv]=(sectorInflowLevel[dest][nv]||0)+c; });\n    });\n    // Orphan CBs follow their leader's home sector, so later etapas must inherit them the same way\n    // the allocated municipalities are inherited — otherwise a stage's span would not match the\n    // base carried into the next one.\n    if(mv.orphanMetricsByGroup && Object.keys(mv.orphanMetricsByGroup).length){\n      const d=computeDerived(mv);\n      d.leaders.forEach(L=>{\n        if(!L.home) return;\n        const om=mv.orphanMetricsByGroup[L.grupo];\n        if(om) sectorInflow[L.home]=accMetrics(sectorInflow[L.home],om);\n        // sectorInflow only reaches a sector while it is a DESTINATION (it lands in baseMetrics).\n        // Keep the rows as well, so the sector still carries these CBs on the day it is the one\n        // being closed — that read goes through mv.matrix, which baseMetrics never touches.\n        const orws=mv.orphanRowsByGroup&&mv.orphanRowsByGroup[L.grupo];\n        if(orws&&orws.length) sectorOrphanRows[L.home]=(sectorOrphanRows[L.home]||[]).concat(orws);\n        const ol=mv.orphanLevelByGroup&&mv.orphanLevelByGroup[L.grupo];\n        if(ol){ sectorInflowLevel[L.home]=sectorInflowLevel[L.home]||{};\n          Object.entries(ol).forEach(([nv,c])=>{ sectorInflowLevel[L.home][nv]=(sectorInflowLevel[L.home][nv]||0)+c; }); }\n      });\n    }\n  }\n  return {closedSectors,muniOverride,muniGeo,muniRow,muniLevel,sectorInflow,sectorInflowLevel,sectorOrphanRows};\n}\n\n// ---------- per-movement compute ----------\nfunction aggregateMovement(mv){\n  const munis={},leaders={};\n  const exSet=new Set((mv.excludedMunis||[]).map(x=>x.muni));\n  const acc=(o,r)=>{o.cbs+=+r.cbs;o.receita+=+r.receita||0;o.rec_nat+=+r.rec_nat||0;o.rec_avon+=+r.rec_avon||0;o.pontos+=+r.pontos||0;o.pedidos+=+r.pedidos||0;o.ativas+=+r.ativas||0;};\n  // Orphans = CBs in municipalities outside the sector's dominance base. They are NOT allocated\n  // geographically; they follow their own leader's home sector. Kept per leader group so every\n  // consumer (span, cascade, impact report) can route them the same way.\n  mv.orphanByGroup={}; mv.orphanMetricsByGroup={}; mv.orphanRowsByGroup={};\n  mv.matrix.forEach(r=>{\n    const m=mkey(r.municipio,r.uf);\n    r._out=!mv.geoFeat[m];   // assign, never just set: absorbed rows are reused across etapas\n    const mm=r._out?'__OUTROS__':m;\n    munis[mm]=munis[mm]||{...blankM(),name:mm}; acc(munis[mm],r);\n    const g=String(r.grupo); leaders[g]=leaders[g]||{grupo:g,lider:r.lider,total:0,byMuni:{}};\n    leaders[g].total+=+r.cbs; leaders[g].byMuni[mm]=(leaders[g].byMuni[mm]||0)+ +r.cbs;\n    if(r._out && exSet.has(m)){\n      mv.orphanByGroup[g]=(mv.orphanByGroup[g]||0)+ +r.cbs;\n      // The ROW too, not just the totals: when the leader's home sector is itself closed in a later\n      // etapa, that etapa rebuilds its matrix from SQL + absorbed municípios, and these CBs are in\n      // neither (their município never moved). Without the row they silently vanish from the sector\n      // they were just credited to — see sectorOrphanRows in foldWorldState.\n      (mv.orphanRowsByGroup[g]=mv.orphanRowsByGroup[g]||[]).push(r);\n      mv.orphanMetricsByGroup[g]=accMetrics(mv.orphanMetricsByGroup[g],\n        {cbs:+r.cbs,receita:+r.receita||0,rec_nat:+r.rec_nat||0,rec_avon:+r.rec_avon||0,pontos:+r.pontos||0,pedidos:+r.pedidos||0,ativas:+r.ativas||0});\n    }\n  });\n  // Level counts only exist per municipality, never per leader, so an excluded municipality's level\n  // mix is credited to the group holding most of its CBs (sub-threshold by definition, so usually one).\n  mv.orphanLevelByGroup={};\n  (mv.excludedMunis||[]).forEach(({muni})=>{\n    const lv=(mv.levelByMuni&&mv.levelByMuni[muni])||{}; if(!Object.keys(lv).length) return;\n    let bg=null,bc=-1;\n    mv.matrix.forEach(r=>{ if(mkey(r.municipio,r.uf)!==muni) return; const cc=+r.cbs; if(cc>bc){bc=cc;bg=String(r.grupo);} });\n    if(!bg) return;\n    mv.orphanLevelByGroup[bg]=mv.orphanLevelByGroup[bg]||{};\n    Object.entries(lv).forEach(([nv,cc])=>{ mv.orphanLevelByGroup[bg][nv]=(mv.orphanLevelByGroup[bg][nv]||0)+cc; });\n  });\n  mv.munis=munis; mv.leaders=Object.values(leaders).sort((a,b)=>b.total-a.total);\n}\nfunction autoAssignFor(mv){\n  const a={};\n  Object.keys(mv.munis).forEach(m=>{ if(m==='__OUTROS__')return;\n    const v=mv.allowed[m]||{}; const votes=Object.keys(v);\n    if(votes.length){ let best=votes[0],bw=-1; for(const s of votes) if(v[s]>bw){bw=v[s];best=s;} a[m]=best; }\n    else if(mv.dest.length){ const c=mv.muniCentroid[m]; let best=mv.dest[0],bd=Infinity;\n      for(const s of mv.dest){ const sc=mv.secCentroid[s]; if(!sc||!c)continue; const d=(c[0]-sc[0])**2+(c[1]-sc[1])**2; if(d<bd){bd=d;best=s;} }\n      a[m]=best; }\n  });\n  return a;\n}\nfunction deslocFor(mv,assign){\n  let d=0;\n  mv.leaders.forEach(L=>{const byS={};let tot=0;\n    for(const [m,c] of Object.entries(L.byMuni)){if(m==='__OUTROS__')continue;const s=assign[m];if(s){byS[s]=(byS[s]||0)+c;tot+=c;}}\n    const home=mv.dest.reduce((a,s)=>(byS[s]||0)>(byS[a]||0)?s:a,mv.dest[0]);\n    d+=tot-(byS[home]||0);});\n  return d;\n}\nfunction spanMapFor(mv,a){const inc={};mv.dest.forEach(s=>inc[s]=0);\n  Object.entries(mv.munis).forEach(([m,o])=>{if(m==='__OUTROS__')return;const s=a[m];if(s&&inc[s]!=null)inc[s]+=o.cbs;});\n  // Orphan CBs follow their leader's home sector, and that home depends on THIS candidate\n  // assignment — so they have to be counted here, or the optimizer would score and constrain a\n  // span that differs from the one the UI shows. Skipped entirely when there are no orphans.\n  if(mv.orphanByGroup&&Object.keys(mv.orphanByGroup).length){\n    mv.leaders.forEach(L=>{\n      const orphan=mv.orphanByGroup[L.grupo]||0; if(!orphan) return;\n      const byS={}; let tot=0;\n      for(const [m,c] of Object.entries(L.byMuni)){ if(m==='__OUTROS__') continue; const s=a[m]; if(s&&inc[s]!=null){ byS[s]=(byS[s]||0)+c; tot+=c; } }\n      if(!tot) return;   // no home to follow -> stranded, counted nowhere\n      const home=mv.dest.reduce((x,s)=>(byS[s]||0)>(byS[x]||0)?s:x,mv.dest[0]);\n      if(inc[home]!=null) inc[home]+=orphan;\n    });\n  }\n  const sp={};mv.dest.forEach(s=>sp[s]=(+(mv.baseMetrics[s]?.cbs||0))+inc[s]);return sp;}\nfunction maxSpanOfFor(mv,a){return Math.max(...Object.values(spanMapFor(mv,a)),0);}\nfunction spanLimits(){const st={...DEFAULT_SETTINGS,...(SESS.settings||{})};\n  return {target:numOrNull(st.targetSpan),max:numOrNull(st.maxSpan),min:numOrNull(st.minSpan)};}\nfunction spanLimitsOn(lim){return !!(lim.target||lim.max||lim.min);}\nfunction spanViolationsOf(sp,lim){const over=[],under=[];\n  Object.entries(sp).forEach(([s,v])=>{ if(lim.max&&v>lim.max)over.push(s); if(lim.min&&v<lim.min)under.push(s); });\n  return {over,under};}\nfunction spanViolationsFor(mv,a){return spanViolationsOf(spanMapFor(mv,a),spanLimits());}\n// With a target span the objective becomes RMS distance from the ideal size (punishes too big AND\n// too small). With no target we keep the legacy objective: shave the biggest sector.\nfunction spanCostFor(mv,a){const lim=spanLimits(),vals=Object.values(spanMapFor(mv,a));\n  if(!vals.length) return 0;\n  if(lim.target) return Math.sqrt(vals.reduce((s,v)=>s+(v-lim.target)**2,0)/vals.length);\n  return Math.max(...vals);}\n// ---------- ÓTIMO: objetivo multi-critério ----------\n// Three normalised objectives, each 0..1, so the weights below are directly comparable. The old\n// score added a span cost measured in CBs to a desloc measured in CBs, so on a large sector the\n// balance term was numerically ~100x the desloc term and silently decided everything on its own.\n//   balance — RMS spread of the resulting spans (against the target span when one is set,\n//             otherwise against their own mean), over that reference. 0 = every destination\n//             sector ends up the same size.\n//   dist    — how far each município travels, CB-weighted: half from the share of its outer\n//             border that faces the sector it was given to, half from centroid distance. 0 =\n//             every município went to a sector it physically touches. Adjacency used to be a\n//             pure yes/no constraint (contiguity); this is what makes it a preference too.\n//   orphan  — stranded orphan CBs (leader left without a home sector, so they land nowhere at\n//             all) plus CBs split away from their leader's home, over the CBs at stake.\n//             Stranded ones count OPT_STRAND_K times: a stranded CB leaves the model entirely,\n//             a deslocated one merely changes hands.\nconst OPT_W={balance:1, dist:0.85, orphan:1};\nconst OPT_STRAND_K=3;\nconst OPT_SIMS=24;             // simultaneous simulations per run, scaled down on big stages\nconst OPT_PASSES=14;           // local-search sweeps inside one simulation\nconst OPT_EVAL_BUDGET=120000;  // total candidate evaluations across the whole portfolio\nconst OPT_EXHAUSTIVE_MAX=60000;\nfunction optDistPrep(mv){\n  let mx=0;\n  Object.keys(mv.munis).forEach(m=>{ if(m==='__OUTROS__') return; const c=mv.muniCentroid[m]; if(!c) return;\n    mv.dest.forEach(s=>{ const sc=mv.secCentroid[s]; if(!sc) return;\n      const d=Math.hypot(c[0]-sc[0],c[1]-sc[1]); if(d>mx) mx=d; }); });\n  return mx||1;\n}\nfunction optDistCost(mv,m,s,dmax){\n  const v=mv.allowed[m]||{}; let tot=0; for(const k in v) tot+=v[k];\n  const share=tot?((v[s]||0)/tot):0;\n  const c=mv.muniCentroid[m], sc=mv.secCentroid[s];\n  // Missing centroid on either side is neutral (0.5), never 0 — an unmeasurable move must not\n  // score as the cheapest one on the board.\n  const geo=(c&&sc)?Math.min(1,Math.hypot(c[0]-sc[0],c[1]-sc[1])/dmax):0.5;\n  return 0.5*(1-share)+0.5*geo;\n}\nfunction optEval(mv,a,dmax){\n  const lim=spanLimits();\n  const sp=spanMapFor(mv,a), vals=Object.values(sp);\n  let balance=0;\n  if(vals.length){\n    const ref=lim.target||(vals.reduce((x,y)=>x+y,0)/vals.length);\n    if(ref) balance=Math.min(1,Math.sqrt(vals.reduce((s,v)=>s+(v-ref)**2,0)/vals.length)/ref);\n  }\n  let cbs=0,dist=0;\n  for(const m in a){ const o=mv.munis[m]; if(!o) continue; const w=+o.cbs||0; cbs+=w; dist+=w*optDistCost(mv,m,a[m],dmax); }\n  dist=cbs?(dist/cbs):0;\n  let stranded=0,desloc=0,tot=0;\n  mv.leaders.forEach(L=>{\n    const byS={}; let t=0;\n    for(const [m,c] of Object.entries(L.byMuni)){ if(m==='__OUTROS__') continue; const s=a[m]; if(s){ byS[s]=(byS[s]||0)+c; t+=c; } }\n    const orphan=(mv.orphanByGroup&&mv.orphanByGroup[L.grupo])||0;\n    tot+=t+orphan;\n    if(!t){ stranded+=orphan; return; }   // no allocated CBs -> no home -> these orphans land nowhere\n    const home=mv.dest.reduce((x,s)=>(byS[s]||0)>(byS[x]||0)?s:x,mv.dest[0]);\n    desloc+=t-(byS[home]||0);\n  });\n  const orphanTerm=tot?Math.min(1,(desloc+OPT_STRAND_K*stranded)/tot):0;\n  return { cost:OPT_W.balance*balance+OPT_W.dist*dist+OPT_W.orphan*orphanTerm,\n           balance, dist, desloc, stranded, sp, viol:spanViolationsOf(sp,lim) };\n}\nfunction optScoreFor(mv,a){ return optEval(mv,a,mv.__optDmax||optDistPrep(mv)).cost; }\n// Seeded PRNG on purpose. computeMovement runs the optimizer for EVERY stage and recomputeFrom\n// re-runs every stage downstream of an edit, so a Math.random() portfolio would hand back a\n// different allocation on each pass and a saved timeline would never reproduce.\nfunction optRng(seed){ let a=seed>>>0;\n  return ()=>{ a=(a+0x6D2B79F5)>>>0; let t=Math.imul(a^(a>>>15),1|a);\n    t=(t+Math.imul(t^(t>>>7),61|t))^t; return ((t^(t>>>14))>>>0)/4294967296; }; }\nfunction optSeed(mv,ms){ let h=2166136261>>>0;\n  const s=String(mv.sector)+'|'+ms.join(',')+'|'+mv.dest.join(',');\n  for(let i=0;i<s.length;i++) h=Math.imul(h^s.charCodeAt(i),16777619);\n  return h>>>0; }\nfunction contigBadFor(mv,assign){\n  const bySec={}; for(const m in assign){(bySec[assign[m]]=bySec[assign[m]]||[]).push(m);}\n  const bad=[];\n  for(const s in bySec){const grp=bySec[s],inGrp=new Set(grp);\n    const seeds=grp.filter(m=>(mv.allowed[m]||{})[s]);\n    if(!seeds.length){bad.push(s);continue;}\n    const seen=new Set(seeds),st=[...seeds];\n    while(st.length){const m=st.pop();(mv.closeAdj[m]||[]).forEach(o=>{if(inGrp.has(o)&&!seen.has(o)){seen.add(o);st.push(o);}});}\n    if(seen.size!==grp.length)bad.push(s);}\n  return bad;\n}\nfunction greedyFor(mv,ms,opts){const lim=spanLimits();const a={};\n  ms.forEach((m,i)=>{let best=opts[i][0],bd=Infinity;\n    for(const s of opts[i]){a[m]=s;\n      // over-max only grows as we keep assigning, so it is safe to penalise mid-build;\n      // under-min shrinks, so penalising it here would just chase noise.\n      const over=lim.max?spanViolationsOf(spanMapFor(mv,a),{max:lim.max,min:null}).over.length:0;\n      const d=optScoreFor(mv,a)+(contigBadFor(mv,a).length?1e9:0)+over*1e6;\n      if(d<bd){bd=d;best=s;}}\n    a[m]=best;});\n  return a;}\nfunction optimizeFor(mv){\n  const ms=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__');\n  if(!ms.length||!mv.dest.length){ mv.optBadge=mv.dest.length?'':'sem setor destino identificado'; return {}; }\n  const opts=ms.map(m=>{const al=(mv.reachable[m]&&mv.reachable[m].length)?mv.reachable[m]:mv.dest.slice();return al.length?al:mv.dest.slice();});\n  const combos=opts.reduce((a,o)=>a*o.length,1);\n  const lim=spanLimits();\n  const dmax=optDistPrep(mv); mv.__optDmax=dmax;\n\n  // Feasibility ladder — same meaning as before, because renderSpanRule and the saved sessions\n  // both read mv.optTier: 0 = contíguo + max + min span, 1 = contíguo + max span, 2 = contíguo\n  // only. Every candidate any simulation produces is offered to all three tiers; we ship the\n  // strictest tier that got a solution, so an unreachable min/max relaxes loudly instead of\n  // stranding the stage with nothing.\n  const tier=[null,null,null],tSc=[Infinity,Infinity,Infinity],tEv=[null,null,null];\n  let feasible=0,evals=0;\n  const offer=(a,ev)=>{\n    if(contigBadFor(mv,a).length) return false;\n    feasible++;\n    const put=t=>{ if(ev.cost<tSc[t]){ tSc[t]=ev.cost; tier[t]={...a}; tEv[t]=ev; } };\n    put(2);\n    if(!ev.viol.over.length){ put(1); if(!ev.viol.under.length) put(0); }\n    return true;\n  };\n  const evalOf=a=>{ evals++; return optEval(mv,a,dmax); };\n\n  // Small enough to settle the question outright: enumerate every contiguous allocation and the\n  // winner is provably the best one under this objective. No search needed, so none is run.\n  const exhaustive=combos<=OPT_EXHAUSTIVE_MAX;\n  let sims=0;\n  if(exhaustive){\n    const cur={};\n    const rec=i=>{ if(i===ms.length){ offer(cur,evalOf(cur)); return; }\n      for(const s of opts[i]){ cur[ms[i]]=s; rec(i+1); } };\n    rec(0);\n  } else {\n    // Too big to enumerate, so run a portfolio of independent simulations instead. Each one is a\n    // seed assignment, then hill-climbing on single-município reassignments, then one perturbation\n    // and another climb to escape whatever local optimum it settled into. Different seeds land in\n    // different basins; the ladder above keeps the best across all of them.\n    const improve=a=>{\n      let ev=evalOf(a); offer(a,ev);\n      for(let pass=0;pass<OPT_PASSES;pass++){\n        let moved=false;\n        for(let i=0;i<ms.length;i++){\n          const m=ms[i],cur=a[m]; let best=cur,bev=ev;\n          for(const s of opts[i]){\n            if(s===cur) continue;\n            a[m]=s;\n            const e=evalOf(a);\n            // contiguity is a hard constraint, and the cheaper test runs first on purpose\n            if(e.cost<bev.cost-1e-12 && !contigBadFor(mv,a).length){ best=s; bev=e; }\n          }\n          a[m]=best;\n          if(best!==cur){ ev=bev; moved=true; offer(a,ev); }\n        }\n        if(!moved) break;\n      }\n    };\n    const rng=optRng(optSeed(mv,ms));\n    const perSim=Math.max(1,ms.length*Math.max(1,mv.dest.length)*OPT_PASSES);\n    const budget=Math.max(4,Math.min(OPT_SIMS,Math.floor(OPT_EVAL_BUDGET/perSim)||4));\n    const seeds=[];\n    if(mv.assign&&ms.every(m=>mv.assign[m])) seeds.push({...mv.assign});   // never regress on what is already on screen\n    seeds.push(autoAssignFor(mv));                                        // adjacency-first seed\n    seeds.push(greedyFor(mv,ms,opts));                                    // balance-first seed\n    while(seeds.length<budget){\n      // randomised construction biased toward nearby sectors — the bias keeps each seed sane, the\n      // randomness is what sends the runs into different basins\n      const a={};\n      ms.forEach((m,i)=>{ let bs=opts[i][0],bw=-Infinity;\n        for(const s of opts[i]){ const w=(1-optDistCost(mv,m,s,dmax))+rng()*0.9; if(w>bw){bw=w;bs=s;} }\n        a[m]=bs; });\n      seeds.push(a);\n    }\n    seeds.forEach(seed=>{\n      const a={...seed};\n      // a restored or legacy assign can still name a sector this stage no longer offers\n      ms.forEach((m,i)=>{ if(!opts[i].includes(a[m])) a[m]=opts[i][0]; });\n      improve(a);\n      const kick=Math.max(1,Math.round(ms.length*0.25));\n      for(let k=0;k<kick;k++){ const i=Math.floor(rng()*ms.length); a[ms[i]]=opts[i][Math.floor(rng()*opts[i].length)]; }\n      improve(a);\n    });\n    sims=seeds.length;\n  }\n\n  const t=tier.findIndex(x=>x);\n  if(t<0){ mv.optTier=-1; mv.optBadge='sem solução contígua — heurística'; return greedyFor(mv,ms,opts); }\n  const best=tier[t], ev=tEv[t]; mv.optTier=t;\n  const relax=[];\n  if(t>0 && lim.min) relax.push('span mínimo '+fmt(lim.min));\n  if(t>1 && lim.max) relax.push('span máximo '+fmt(lim.max));\n  mv.optStats={balance:ev.balance,dist:ev.dist,desloc:ev.desloc,stranded:ev.stranded,sims,evals,feasible,combos,exhaustive};\n  mv.optBadge=`ótimo · ${exhaustive?`espaço completo (${fmt(combos)})`:`${fmt(sims)} simulações`}`\n    +` · equilíbrio ±${Math.round(ev.balance*100)}% · adjacência ${Math.round((1-ev.dist)*100)}%`\n    +` · quebra ${fmt(ev.desloc)} CBs · órfãs sem destino ${fmt(ev.stranded)}`\n    +` · pico ${fmt(maxSpanOfFor(mv,best))} CBs`\n    +(lim.target?` · alvo ${fmt(lim.target)}`:'')\n    +(relax.length?` · ⚠ inatingível: ${relax.join(' + ')}`:(spanLimitsOn(lim)?' · limites ok':''));\n  return best;\n}\nfunction computeDerived(mv){\n  const inc={},gained={},orph={};mv.dest.forEach(s=>{inc[s]=0;gained[s]=0;orph[s]=0;});\n  Object.entries(mv.munis).forEach(([m,o])=>{if(m==='__OUTROS__')return;const s=mv.assign[m];if(s&&inc[s]!=null)inc[s]+=o.cbs;});\n  let desloc=0,orphanTotal=0,orphanStranded=0;\n  const L2=mv.leaders.map(L=>{const byS={};mv.dest.forEach(s=>byS[s]=0);let tot=0;\n    for(const [m,c] of Object.entries(L.byMuni)){if(m==='__OUTROS__')continue;const s=mv.assign[m];if(s&&byS[s]!=null){byS[s]+=c;tot+=c;}}\n    // no allocated CBs => no home. Picking dest[0] by default would silently dump this leader's\n    // orphan CBs into an arbitrary sector, so we leave it null and report them as stranded.\n    const home=(tot>0&&mv.dest.length)?mv.dest.reduce((a,s)=>byS[s]>byS[a]?s:a,mv.dest[0]):null;\n    const dl=tot-(home?byS[home]:0);desloc+=dl;if(home)gained[home]++;\n    const orphan=(mv.orphanByGroup&&mv.orphanByGroup[L.grupo])||0;\n    orphanTotal+=orphan;\n    if(orphan){ if(home&&orph[home]!=null) orph[home]+=orphan; else orphanStranded+=orphan; }\n    return {...L,byS,home,desloc:dl,assignedTotal:tot,orphan,orphanHome:(orphan&&home)?home:null};});\n  const span={};mv.dest.forEach(s=>span[s]=(+(mv.baseMetrics[s]?.cbs||0))+inc[s]+orph[s]);\n  return {inc,gained,desloc,leaders:L2,span,orph,orphanTotal,orphanStranded};\n}\n\nasync function computeMovement(sec,world){\n  sec=String(sec);\n  const mv={sector:sec,policy:'fora',view:'tobe',selMuni:null,optBadge:''};\n  const SNAP=SESS.snapLiteral;\n  const mSQL=`SELECT DS_MUNICIPIO municipio, CD_GRUPO grupo, MAX(DS_LEADER_NAME) lider,\n     COUNT(DISTINCT CD_CONSULTORA) cbs, ROUND(SUM(VL_PEDIDOS_CICLO),0) receita,\n     ROUND(SUM(VL_PEDIDOS_NATURA_CICLO),0) rec_nat, ROUND(SUM(VL_PEDIDOS_AVON_CICLO),0) rec_avon,\n     ROUND(SUM(QT_PONTOS_CICLO),0) pontos, ROUND(SUM(QT_PEDIDOS_CICLO),0) pedidos,\n     SUM(CASE WHEN ST_FEZ_PED_CICLO_ATUAL THEN 1 ELSE 0 END) ativas\n    FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR=${sec} AND DT_HISTORICO=${SNAP}\n    GROUP BY DS_MUNICIPIO, CD_GRUPO`;\n  const ufSQL=`SELECT DS_ESTADO uf, COUNT(*) n FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR=${sec} AND DT_HISTORICO=${SNAP} GROUP BY DS_ESTADO ORDER BY n DESC`;\n  const trendSQL=`SELECT operational_cycle ciclo, COUNT(DISTINCT person_code) cbs,\n     COUNT(DISTINCT CASE WHEN registered_bc_ind=1 THEN person_code END) ativas,\n     ROUND(SUM(revenue_nat_ss_amt),0) receita, ROUND(SUM(points_nat_ss_amt),0) pontos\n    FROM ${ELO} WHERE country_code=1 AND sector_code=${sec} AND operational_cycle<=${SESS.eloMaxCycle||999999} GROUP BY operational_cycle ORDER BY operational_cycle DESC LIMIT 8`;\n  const lvlSQL=`SELECT DS_NVL_PLAN_CRESC nivel, COUNT(DISTINCT CD_CONSULTORA) cbs,\n     ROUND(SUM(VL_PEDIDOS_NATURA_CICLO),0) rec_nat, ROUND(SUM(VL_PEDIDOS_AVON_CICLO),0) rec_avon\n    FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR=${sec} AND DS_NVL_PLAN_CRESC IS NOT NULL AND DT_HISTORICO=${SNAP} GROUP BY DS_NVL_PLAN_CRESC ORDER BY cbs DESC`;\n  const lvlMuniSQL=`SELECT DS_MUNICIPIO municipio, DS_NVL_PLAN_CRESC nivel, COUNT(DISTINCT CD_CONSULTORA) cbs\n    FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR=${sec} AND DS_NVL_PLAN_CRESC IS NOT NULL AND DT_HISTORICO=${SNAP} GROUP BY DS_MUNICIPIO, DS_NVL_PLAN_CRESC`;\n  const [mR,ufR,tR,lR,lmR]=await Promise.all([q(mSQL),q(ufSQL),q(trendSQL),q(lvlSQL),q(lvlMuniSQL)]);\n\n  const ownMatrix=rows(mR).filter(r=>+r.cbs>0);\n  mv.pureOwnMetrics=blankM();\n  ownMatrix.forEach(r=>{ mv.pureOwnMetrics.cbs+=+r.cbs; mv.pureOwnMetrics.receita+=+r.receita||0; mv.pureOwnMetrics.rec_nat+=+r.rec_nat||0; mv.pureOwnMetrics.rec_avon+=+r.rec_avon||0; mv.pureOwnMetrics.pontos+=+r.pontos||0; mv.pureOwnMetrics.pedidos+=+r.pedidos||0; mv.pureOwnMetrics.ativas+=+r.ativas||0; });\n\n  mv.levelByMuni={};\n  Object.entries(world.muniLevel||{}).forEach(([m,lv])=>{ if(world.muniOverride[m]===sec) mv.levelByMuni[m]={...lv}; });\n  // keyed further down, once the UF resolver exists — see the stamp block after buildAdj.\n\n  mv.trend=rows(tR).map(r=>({...r,cbs:+r.cbs,ativas:+r.ativas,receita:+r.receita,pontos:+r.pontos})).filter(r=>r.cbs>10).reverse();\n  mv.levels=rows(lR);\n\n  const absorbedRows=[];\n  Object.entries(world.muniOverride).forEach(([m,destSec])=>{ if(destSec===sec && world.muniRow[m]) absorbedRows.push(...world.muniRow[m]); });\n  // CBs an earlier etapa sent here by FOLLOWING THEIR LEADER (quebra de vínculo) carry no\n  // muniOverride — the município stayed where it was, only the CBs moved — so absorbedRows misses\n  // them. Leaving them out made this sector's ASIS total smaller than the span the previous etapa's\n  // TOBE promised for it, by exactly that etapa's \"CBs ignoradas\", and dropped those CBs from the\n  // redistribution as if they had never existed.\n  const inheritedOrphanRows=(world.sectorOrphanRows&&world.sectorOrphanRows[sec])||[];\n  mv.matrix=ownMatrix.concat(absorbedRows,inheritedOrphanRows);\n\n  const ufList=rows(ufR).map(r=>r.uf).filter(Boolean);\n  const domUF=ufList[0]||'PR';\n  mv.domUF=domUF;\n  const ufs=[domUF,...(UF_BORDERS[domUF]||[])];\n  const geos=await Promise.all(ufs.map(u=>geoUF(u).catch(()=>null)));\n  const allFeat=geos.filter(Boolean).flatMap(g=>g.features);\n  const adj=buildAdj(allFeat);\n\n  // ---- UF resolution ----\n  // SQL no longer selects DS_ESTADO. The base CSV is the authority on a município's UF, indexed by the\n  // (setor, município) pair it already maintains, and rows are stamped ONCE here so every consumer\n  // downstream keeps reading r.uf exactly as it did before.\n  // Fallback for a município the base does not carry — spillover, where the sector has CBs but no\n  // dominance: adopt the UF of the loaded shape when that name is unique across the UFs in this\n  // window. A name shared by two of them stays unresolved instead of guessed; it is spillover either\n  // way, and a guess would put a shape from the wrong state on the map.\n  const featUfByName={};\n  Object.keys(adj.feat).forEach(k=>{ const nm=mName(k),u=mUf(k);\n    if(!(nm in featUfByName)) featUfByName[nm]=u; else if(featUfByName[nm]!==u) featUfByName[nm]=null; });\n  const ufGuessed={};\n  const ufFor=(setorOf,muni)=>{const nm=norm(muni);\n    const fromCsv=DOM.ufBySetorMuni&&DOM.ufBySetorMuni[String(setorOf)+'|'+nm];\n    if(fromCsv) return fromCsv;\n    const uniq=featUfByName[nm];\n    if(uniq) return uniq;\n    // uniq===null means the name is shared by two of the LOADED UFs — Terra Nova exists in BA and in PE,\n    // and a BA sector loads PE as a border — so the unique-name fallback gave up. Giving up here too\n    // yields a bare NAME key, which matches NO shape: the município leaves the map without a word. The\n    // sector's own dominant UF is a real signal rather than a coin flip: when a shape of this name\n    // exists in domUF, that is the one this sector means. Recorded so the inference is never invisible.\n    if(uniq===null && adj.feat[mkey(nm,domUF)]){ ufGuessed[nm]=domUF; return domUF; }\n    return '';};\n  // Absorbed and orphan rows inherited from an earlier etapa were stamped when THAT etapa ran, under\n  // the setor they belonged to then; `if(!r.uf)` keeps that original resolution intact.\n  mv.matrix.forEach(r=>{ if(!r.uf) r.uf=ufFor(sec,r.municipio); });\n  rows(lmR).forEach(r=>{ const k=mkey(r.municipio,ufFor(sec,r.municipio)); (mv.levelByMuni[k]=mv.levelByMuni[k]||{})[r.nivel]=+r.cbs; });\n\n  const totBy={}; mv.matrix.forEach(r=>{const n=mkey(r.municipio,r.uf); totBy[n]=(totBy[n]||0)+ +r.cbs;});\n  const footprint=new Set(Object.entries(totBy).filter(([,c])=>c>0).map(([m])=>m));\n  const withShape=[...footprint].filter(n=>adj.feat[n]||world.muniGeo[n]);\n  mv.cbsByMuni={...totBy}; mv.shapeMunis=withShape.slice();\n  mv.noShapeMunis=[...footprint].filter(n=>!(adj.feat[n]||world.muniGeo[n])).map(n=>({muni:n,cbs:totBy[n]||0})).sort((a,b)=>b.cbs-a.cbs);\n  mv.noShapeCbs=mv.noShapeMunis.reduce((a,x)=>a+x.cbs,0);\n\n  // ---- RULE: which municipalities belong to this sector ----\n  // Comes from the dominantes CSV (setor x município), NOT from CB volume. A municipality where the\n  // closing sector happens to have a handful of CBs but which the base assigns to ANOTHER sector is\n  // spillover: it is not reallocated, it is not drawn, and its CBs follow their leader (quebra de\n  // vínculo). Municipalities an EARLIER etapa moved into this sector count as belonging to it too —\n  // otherwise the cascade would throw away the territory the sector just received.\n  const domBase=await ensureDominantes();\n  const domOwn=domBase[String(sec)];\n  const inherited=new Set(Object.keys(world.muniOverride).filter(m=>world.muniOverride[m]===sec));\n  if((!domOwn||!domOwn.size)&&!inherited.size) throw new Error('setor '+sec+' não existe na base de municípios dominantes (CSV) — atualize a base antes de fechar este setor');\n  const belongs=n=>(domOwn&&(domOwn.has(n)||(!DOM.hasUf&&domOwn.has(mName(n)))))||inherited.has(n);\n  mv.domCsvMunis=(domOwn&&domOwn.size)||0;\n  const dropped=withShape.filter(n=>!belongs(n));\n  if(withShape.length && dropped.length===withShape.length) throw new Error('setor '+sec+': nenhum dos municípios com CBs está na base de dominantes — nada pra realocar');\n  const droppedSet=new Set(dropped);\n  mv.excludedMunis=dropped.map(n=>({muni:n,cbs:totBy[n]||0})).sort((a,b)=>b.cbs-a.cbs);\n  mv.excludedCbs=dropped.reduce((a,n)=>a+(totBy[n]||0),0);\n\n  const closingNames=withShape.filter(n=>!droppedSet.has(n));\n  const closingSet=new Set(closingNames);\n  mv.geoFeat={}; closingNames.forEach(n=>{ mv.geoFeat[n]=(adj.feat[n]&&adj.feat[n].f)||world.muniGeo[n]; });\n\n  // ---- why is the map short of the base? ----\n  // Three gates drop a município between the CSV and the map: footprint (no CBs under this setor at\n  // the snapshot), withShape (no geometry in the loaded UFs) and belongs (key mismatch). Only the last\n  // two had a counter, so the FIRST one was invisible — the operator counted 5 shapes against a base\n  // that says 6 and had nothing on screen explaining the missing one. Named here, with its reason.\n  const drawnCsv=new Set(closingNames.map(n=>DOM.hasUf?n:mName(n)));\n  const footKeyOf=k=>DOM.hasUf?(footprint.has(k)?k:null):([...footprint].find(x=>mName(x)===k)||null);\n  mv.csvMunisTotal=(domOwn&&domOwn.size)||0;\n  mv.ufGuessed={...ufGuessed};\n  mv.missingMunis=[...(domOwn||[])].filter(k=>!drawnCsv.has(k)).map(k=>{\n    const fk=footKeyOf(k);\n    const hasShape=!!(adj.feat[fk||k]||world.muniGeo[fk||k]);\n    // The SAME name present in footprint under a DIFFERENT key means UF resolution disagreed with the\n    // base: the CBs are there, they just landed on a key that no shape and no dominance entry can\n    // match. That is a different failure from \"this município has no CBs\", and conflating the two sends\n    // the next investigation into the CB base when the answer is in the UF column.\n    const alias=[...footprint].filter(x=>x!==k&&mName(x)===mName(k));\n    let reason;\n    if(!fk&&alias.length) reason=`UF divergente — as CBs entraram na chave ${alias.join(' / ')} e a base diz ${k}`;\n    else if(!fk) reason=hasShape?'sem CBs neste setor no snapshot — desenhado como vizinho':'sem CBs neste setor no snapshot';\n    else if(!hasShape) reason='sem shape nas UFs carregadas';\n    else reason='chave não casou com a base de dominantes';\n    return {muni:k,cbs:(fk?totBy[fk]:alias.reduce((a,x)=>a+(totBy[x]||0),0))||0,reason:reason};\n  });\n\n  const extVotes={}; const nbrNames=new Set();\n  closingNames.forEach(n=>{\n    if(!adj.feat[n]) return;\n    // droppedSet is excluded too: a municipality outside this sector's dominance base must not\n    // nominate a destination sector, and it is not drawn on the map at all.\n    adj.nbrs(n).forEach(({o,w})=>{ if(!closingSet.has(o) && !droppedSet.has(o)){ nbrNames.add(o); (extVotes[n]=extVotes[n]||[]).push({o,w}); } });\n  });\n  // mv.nbrFeat is assembled far below, once mv.dest is final: the map draws only the closing sector's\n  // municípios and the destination sectors' territory, so the feature list cannot be built until the\n  // neighbour query has resolved each neighbour's sector AND the destination list has settled.\n  let neigh=[];\n  if(nbrNames.size){\n    // The IN-list carries bare names — that is what the column holds, and the query is back to not\n    // selecting DS_ESTADO. Every returned row names its own CD_SETOR, which is exactly the key the\n    // base CSV is indexed by, so each row's UF is resolved from the base right after the fetch.\n    const inList=[...new Set([...nbrNames].map(n=>mName(n)))].map(n=>`'${n.replace(/'/g,\"''\")}'`).join(',');\n    const nSQL=`SELECT DS_MUNICIPIO municipio, CD_SETOR setor, COUNT(DISTINCT CD_CONSULTORA) cbs\n      FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR<>${sec} AND CD_SETOR>0 AND DT_HISTORICO=${SNAP} AND DS_MUNICIPIO IN (${inList}) GROUP BY DS_MUNICIPIO, CD_SETOR`;\n    neigh=rows(await q(nSQL));\n  }\n  const domSecOf={};\n  neigh.forEach(r=>{ if(!r.uf) r.uf=ufFor(r.setor,r.municipio); });\n  const byM={}; neigh.forEach(r=>{const m=mkey(r.municipio,r.uf); if(!nbrNames.has(m)) return; (byM[m]=byM[m]||[]).push(r);});\n  Object.entries(byM).forEach(([m,rs])=>{ rs.sort((a,b)=>+b.cbs-+a.cbs); domSecOf[m]=String(rs[0].setor); });\n  nbrNames.forEach(n=>{ if(world.muniOverride[n]) domSecOf[n]=world.muniOverride[n]; });\n  mv.nbrCurrentSector=domSecOf;\n\n  // ---- HARD RULE: which sectors are eligible as destinations ----\n  // 'any'      = a sector qualifies if it borders ANY municipality of the closing sector (legacy default)\n  // 'dominant' = only municipalities with >= destMinCbs CBs act as a bridge; smaller ones are still\n  //              redistributed, they just cannot pull a new sector into the destination list.\n  //\n  // ---- HARD RULE (não negociável): destino tem de ser da MESMA gerência de vendas ----\n  // Território não atravessa fronteira de GV num fechamento real: outra gerência é outra gestora,\n  // outra meta e outro P&L, então oferecer um setor de fora produz um plano que ninguém pode\n  // executar. CD_GV da base de dominantes é a autoridade, e o filtro roda ANTES de qualquer peso,\n  // regra de ponte ou corte de top-6 — nenhum caminho a jusante pode reintroduzir um setor de fora.\n  const gvBySetor=DOM.gvBySetor||{};\n  const gvOf=s=>gvBySetor[String(s)]||'';\n  const ownGv=gvOf(sec);\n  if(!ownGv) throw new Error('setor '+sec+' não tem CD_GV na base de municípios dominantes — sem a gerência de vendas do setor que fecha não há como garantir que os destinos sejam da mesma gerência');\n  // Um candidato que a base não carrega NÃO pode ser provado como da mesma gerência, então é recusado\n  // em vez de presumido: a regra só vale se nunca vazar.\n  const sameGv=s=>gvOf(s)===ownGv;\n  mv.gv=ownGv;\n  // Foreign-GV neighbours are not drawn AT ALL. Filtering them only out of the destination list still\n  // left them sitting on the map as context, which invites the exact question the rule exists to\n  // settle — \"why is 3471 right there if nothing can be sent to it?\". A neighbour whose sector is\n  // UNKNOWN is not being asserted to be foreign, so it stays as plain geography.\n  // Dropping them also tightens the frame: project() fits the bounding box of whatever survives, so the\n  // closing sector is drawn larger once foreign territory stops padding the extent.\n  mv.gvRejected=[];\n  const gvHidden=new Set();\n  nbrNames.forEach(n=>{ const s=domSecOf[n];\n    if(s && !sameGv(s)){ gvHidden.add(n); if(mv.gvRejected.indexOf(s)<0) mv.gvRejected.push(s); } });\n  gvHidden.forEach(n=>{ nbrNames.delete(n); delete domSecOf[n]; });\n  Object.keys(extVotes).forEach(n=>{ extVotes[n]=extVotes[n].filter(v=>!gvHidden.has(v.o)); });\n  const destRule=(SESS.settings&&SESS.settings.destRule)||DEFAULT_SETTINGS.destRule;\n  const destMinCbs=Math.max(1,Math.round(+((SESS.settings||{}).destMinCbs)||DEFAULT_SETTINGS.destMinCbs));\n  mv.destRule=destRule; mv.destMinCbs=destMinCbs; mv.destRuleFallback=false;\n  const isBridge=n=>destRule!=='dominant'||(totBy[n]||0)>=destMinCbs;\n  mv.bridgeMunis=closingNames.filter(isBridge);\n  mv.ignoredBridges=closingNames.filter(n=>!isBridge(n));\n\n  mv.allowed={}; mv.allowedRaw={};\n  const wAny={}, wDom={};\n  closingNames.forEach(n=>{\n    const v={}, bridge=isBridge(n);\n    (extVotes[n]||[]).forEach(({o,w})=>{\n      const s=domSecOf[o];\n      if(!s || s===sec || world.closedSectors.has(s)) return;\n      // Belt to the braces above: domSecOf has already had every foreign-GV neighbour removed, so this\n      // cannot fire any more. It stays because it costs one comparison and the failure it guards — a\n      // destination in the wrong gerência — is the whole reason this code exists.\n      if(!sameGv(s)) return;\n      v[s]=(v[s]||0)+w;\n      wAny[s]=(wAny[s]||0)+w;\n      if(bridge) wDom[s]=(wDom[s]||0)+w;\n    });\n    mv.allowed[n]=v; mv.allowedRaw[n]={...v};\n  });\n  let secWeight=wAny;\n  if(destRule==='dominant'){\n    if(Object.keys(wDom).length) secWeight=wDom;\n    else { secWeight=wAny; mv.destRuleFallback=true; }   // no dominant municipality at all -> relax, never strand the stage\n  }\n  mv.dest=Object.keys(secWeight).sort((a,b)=>secWeight[b]-secWeight[a]).slice(0,6);\n  if(!mv.dest.length){\n    // O fallback de emergência lê domSecOf direto, contornando os votos — então repete o filtro de GV\n    // aqui. Sem isso a regra vazaria exatamente no caso em que ninguém está olhando.\n    mv.dest=[...new Set(Object.values(domSecOf))].filter(s=>s!==sec&&!world.closedSectors.has(s)&&sameGv(s)).slice(0,6);\n    closingNames.forEach(n=>{ if(!Object.keys(mv.allowed[n]).length){ mv.dest.forEach(s=>mv.allowed[n][s]=1); } });\n  }\n  // Cinto e suspensório: qualquer rota que tenha preenchido mv.dest (pesos, fallback, um branch novo\n  // amanhã) passa por esta linha, e nada de fora da gerência do setor que fecha sobrevive a ela.\n  mv.dest=mv.dest.filter(sameGv);\n  // WHAT GETS DRAWN — decided here because it depends on the final destination list. The closing\n  // sector's municípios draw as before. For each destination sector we now draw its WHOLE municipality\n  // set, not just the municípios that happened to border the closing sector — sourced from the SAME\n  // dominantes CSV (domBase) already used above for the closing sector's own municípios, never from\n  // CD_SETOR in the CRM table: that code is not a stable key there (reused across unrelated setores),\n  // so pulling by it drew scattered territory from the wrong parts of the country. The adjacency query\n  // above still decides WHICH sectors qualify as destinations (that vote is unchanged); this only\n  // widens what gets drawn once that list is settled, so a destination sector renders as its real CSV\n  // territory instead of a rim of border municípios.\n  // nbrCurrentSector deliberately keeps its full mapping: drawMap groups whatever survives in nbrFeat\n  // by it.\n  const drawSet=new Set(mv.dest);\n  mv.dest.forEach(s=>{\n    (domBase[String(s)]||new Set()).forEach(n=>{\n      if(nbrNames.has(n)) return;\n      nbrNames.add(n); domSecOf[n]=world.muniOverride[n]||s;\n    });\n  });\n  mv.nbrFeat=[...nbrNames].filter(n=>drawSet.has(domSecOf[n])).map(n=>adj.feat[n]&&adj.feat[n].f).filter(Boolean);\n  // votes may reference a sector that did not survive the rule / top-6 cut — drop them so\n  // autoAssign + contiguity seeds can never point at a sector outside mv.dest\n  closingNames.forEach(n=>{ Object.keys(mv.allowed[n]||{}).forEach(s=>{ if(!mv.dest.includes(s)) delete mv.allowed[n][s]; }); });\n  mv.color={}; mv.dest.forEach((s,i)=>mv.color[s]=PALETTE[i%PALETTE.length]);\n\n  const accC={}; Object.entries(domSecOf).forEach(([nb,s])=>{ if(!mv.dest.includes(s))return; const f=(adj.feat[nb]&&adj.feat[nb].f)||world.muniGeo[nb]; if(!f)return; const c=centroidLL(f); accC[s]=accC[s]||[0,0,0]; accC[s][0]+=c[0]; accC[s][1]+=c[1]; accC[s][2]++; });\n  mv.secCentroid={}; mv.dest.forEach(s=>{ if(accC[s]) mv.secCentroid[s]=[accC[s][0]/accC[s][2],accC[s][1]/accC[s][2]]; });\n  mv.muniCentroid={}; closingNames.forEach(n=>{ if(mv.geoFeat[n]) mv.muniCentroid[n]=centroidLL(mv.geoFeat[n]); });\n  mv.closeAdj={}; closingNames.forEach(n=>{ mv.closeAdj[n]=adj.feat[n]?adj.nbrs(n).filter(({o})=>closingSet.has(o)).map(({o})=>o):[]; });\n  const comp={}; let ci=0; closingNames.forEach(n=>{ if(comp[n]!=null)return; const st=[n]; comp[n]=ci; while(st.length){ const x=st.pop(); (mv.closeAdj[x]||[]).forEach(o=>{ if(comp[o]==null){ comp[o]=ci; st.push(o); } }); } ci++; });\n  const compAllowed={}; closingNames.forEach(n=>{ const cid=comp[n]; (compAllowed[cid]=compAllowed[cid]||new Set()); Object.keys(mv.allowed[n]||{}).forEach(s=>compAllowed[cid].add(s)); });\n  mv.reachable={}; closingNames.forEach(n=>{ mv.reachable[n]=[...(compAllowed[comp[n]]||[])].filter(s=>mv.dest.includes(s)); });\n\n  if(mv.dest.length){\n    const rList=mv.dest.join(',');\n    const bSQL=`SELECT CD_SETOR setor, COUNT(DISTINCT CD_CONSULTORA) cbs,\n       SUM(CASE WHEN ST_FEZ_PED_CICLO_ATUAL THEN 1 ELSE 0 END) ativas,\n       ROUND(SUM(VL_PEDIDOS_CICLO),0) receita, ROUND(SUM(VL_PEDIDOS_NATURA_CICLO),0) rec_nat,\n       ROUND(SUM(VL_PEDIDOS_AVON_CICLO),0) rec_avon, ROUND(SUM(QT_PONTOS_CICLO),0) pontos, ROUND(SUM(QT_PEDIDOS_CICLO),0) pedidos\n      FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR IN (${rList}) AND DT_HISTORICO=${SNAP} GROUP BY CD_SETOR`;\n    const blSQL=`SELECT CD_SETOR setor, DS_NVL_PLAN_CRESC nivel, COUNT(DISTINCT CD_CONSULTORA) cbs\n      FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR IN (${rList}) AND DS_NVL_PLAN_CRESC IS NOT NULL AND DT_HISTORICO=${SNAP} GROUP BY CD_SETOR, DS_NVL_PLAN_CRESC`;\n    const [bR,blR]=await Promise.all([q(bSQL),q(blSQL)]);\n    mv.baseMetrics={}; rows(bR).forEach(r=>{ mv.baseMetrics[String(r.setor)]=r; if(!SESS.sectorBaseCache[String(r.setor)]) SESS.sectorBaseCache[String(r.setor)]=r; });\n    mv.baseLevel={}; rows(blR).forEach(r=>{ const s=String(r.setor); (mv.baseLevel[s]=mv.baseLevel[s]||{})[r.nivel]=+r.cbs; });\n  } else { mv.baseMetrics={}; mv.baseLevel={}; }\n\n  mv.dest.forEach(s=>{\n    if(!mv.baseMetrics[s]) mv.baseMetrics[s]={setor:s,cbs:0,ativas:0,receita:0,rec_nat:0,rec_avon:0,pontos:0,pedidos:0};\n    const infl=world.sectorInflow[s];\n    if(infl) Object.keys(blankM()).forEach(k=>{ mv.baseMetrics[s][k]=(+mv.baseMetrics[s][k]||0)+(infl[k]||0); });\n    const inflLv=world.sectorInflowLevel[s];\n    if(inflLv){ mv.baseLevel[s]=mv.baseLevel[s]||{}; Object.entries(inflLv).forEach(([nv,c])=>{ mv.baseLevel[s][nv]=(mv.baseLevel[s][nv]||0)+c; }); }\n  });\n\n  aggregateMovement(mv);\n  mv.assign=optimizeFor(mv);\n  return mv;\n}\n\n// ---------- cascade engine ----------\nasync function computeAt(i){\n  await ensurePinned();\n  const world=foldWorldState(SESS.timeline,i);\n  const sec=SESS.timeline[i].sector;\n  const mv=await computeMovement(sec,world);\n  SESS.timeline[i]=mv;\n}\nasync function recomputeFrom(i){\n  for(let k=i;k<SESS.timeline.length;k++){\n    loader(true,`recalculando etapa ${k+1} de ${SESS.timeline.length}…`);\n    try{ await computeAt(k); }\n    catch(e){\n      // A stage that failed to recompute still holds its PREVIOUS result, so the timeline would\n      // silently mix pre- and post-change etapas. Flag this stage and everything after it as stale\n      // (dashed chip + ⟳) so the state is visible and flushDirty retries from here.\n      SESS.dirtyFrom = SESS.dirtyFrom==null ? k : Math.min(SESS.dirtyFrom,k);\n      throw e;\n    }\n  }\n}\nasync function flushDirty(){\n  if(SESS.dirtyFrom==null) return;\n  const from=SESS.dirtyFrom; SESS.dirtyFrom=null;\n  loader(true,'recalculando etapas seguintes…');\n  try{ await recomputeFrom(from); }\n  catch(e){ $('#ds').textContent='erro ao recalcular cadeia: '+e.message; $('#ds').classList.add('err'); }\n  finally{ loader(false); }\n}\nasync function addMovement(sec){\n  sec=(sec==null?'':String(sec)).trim();\n  if(!sec) return;\n  const closedNow=new Set(SESS.timeline.map(mv=>mv.sector));\n  if(closedNow.has(sec)){ $('#ds').textContent='setor '+sec+' já fechado nesta timeline.'; $('#ds').classList.add('err'); return; }\n  if(!SESS.sectorsList.some(s=>s.setor===sec)){ $('#ds').textContent='setor \"'+sec+'\" não existe no snapshot congelado.'; $('#ds').classList.add('err'); return; }\n  await flushDirty();\n  loader(true,'fechando setor '+sec+' — puxando dado do snapshot congelado…');\n  $('#liveState').classList.remove('err');\n  try{\n    SESS.timeline.push({sector:String(sec)});\n    await computeAt(SESS.timeline.length-1);\n    SESS.selected=SESS.timeline.length-1;\n    $('#ds').classList.remove('err'); $('#ds').textContent='';\n  }catch(e){\n    SESS.timeline.pop();\n    $('#ds').textContent='erro ao fechar setor '+sec+': '+e.message; $('#ds').classList.add('err');\n  } finally { loader(false); renderAll(); }\n}\nfunction removeFrom(i){\n  SESS.timeline.length=i;\n  SESS.selected=Math.min(SESS.selected,Math.max(0,SESS.timeline.length-1));\n  if(SESS.dirtyFrom!=null && SESS.dirtyFrom>=SESS.timeline.length) SESS.dirtyFrom=null;\n  renderAll();\n}\nasync function editSelected(mutator){\n  const mv=SESS.timeline[SESS.selected]; if(!mv) return;\n  mutator(mv);\n  if(SESS.selected<SESS.timeline.length-1){\n    SESS.dirtyFrom = SESS.dirtyFrom==null ? SESS.selected+1 : Math.min(SESS.dirtyFrom, SESS.selected+1);\n  }\n  renderAll();\n}\n\n// ---------- sectors list / picker ----------\nasync function loadSectors(){\n  const sql=`SELECT CD_SETOR setor, MAX(DS_ESTADO) uf, COUNT(DISTINCT CD_CONSULTORA) cbs, COUNT(DISTINCT DS_MUNICIPIO) munis\n    FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR>0 AND DT_HISTORICO=(SELECT MAX(DT_HISTORICO) FROM ${T} WHERE CD_PAIS=1) GROUP BY CD_SETOR ORDER BY CD_SETOR`;\n  SESS.sectorsList=rows(await q(sql)).map(r=>({setor:String(r.setor),uf:r.uf,cbs:+r.cbs,munis:+r.munis}));\n}\nfunction renderSectorPicker(){\n  const closed=new Set(SESS.timeline.map(mv=>mv.sector));\n  const avail=SESS.sectorsList.filter(s=>!closed.has(s.setor));\n  const dl=$('#sectorPickList');\n  if(dl) dl.innerHTML=avail.map(s=>`<option value=\"${s.setor}\">${s.setor} · ${s.uf||'?'} · ${fmt(s.cbs)} CBs · ${s.munis} munic.</option>`).join('');\n  const ready=SESS.stage==='main';\n  $('#rand').disabled=!ready||!avail.length; $('#go').disabled=!ready||!avail.length; $('#sectorPick').disabled=!ready;\n}\nfunction renderStage(){\n  const isMain=SESS.stage==='main';\n  const cc=$('#confirmCard'), hb=$('#howtoBox'), mw=$('#mainWrap');\n  const hdr=$('#topHeader'), rl=$('#timelineRail');\n  if(hdr) hdr.classList.toggle('hidden', !isMain);\n  if(rl) rl.classList.toggle('hidden', !isMain);\n  if(cc) cc.classList.toggle('hidden', isMain);\n  if(hb) hb.classList.toggle('hidden', !isMain);\n  if(mw) mw.classList.toggle('hidden', !isMain);\n  const cb=$('#confirmBody');\n  if(cb && !isMain) cb.innerHTML = SESS.snapshotRaw\n    ? `Snapshot congelado · atualizado em <b>${fmtSyncedAt(SESS.snapshotSyncedAt)}</b> · <b>${SESS.sectorsList.length}</b> setor(es) disponível(eis) pra fechar. Nenhuma consulta de detalhe roda até você confirmar e escolher o primeiro setor.`\n    : 'congelando snapshot…';\n}\n\n// ---------- session persistence ----------\n// ONE table (`timeline-shared-sessions`) holds BOTH kinds of row, so SESSIONS_DS and SHARED_DS\n// deliberately resolve to the SAME DataSet — the two names mark intent, not two stores:\n//   · working session  — carries `movements`; saveSession updates it in place\n//   · shared snapshot  — carries `sharedAt` + `stages`; doShare CREATES it and nothing updates it\n// listSessions MUST exclude the shared rows. They are write-once by contract, and if one showed\n// up in the picker, loading it and pressing Salvar would fire ds.update() straight at a frozen\n// snapshot. Filtering here is what keeps that unreachable — it is the guard, not a cosmetic.\n// Both lookups stay because a policy-gated DataSet's Process resolves late; same race the reader\n// component polls for. SESSIONS_DS lives at module scope so no call site can hit it in the TDZ.\nasync function listSessions(){\n  const ds=(d2.data('sessionsDataset')||d2.data(SESSIONS_DS)); if(!ds) return [];\n  await ds.refresh();\n  const recs=ds.records()||[];\n  return [...recs].filter(r=>!r.sharedAt).sort((a,b)=>new Date(b.updatedAt||0)-new Date(a.updatedAt||0));\n}\nasync function refreshSessionPicker(){\n  const list=await listSessions().catch(()=>[]);\n  SESS.sessionsList=list;\n  const opts=list.map(s=>`<option value=\"${s._id}\">${esc(s.label||'sem nome')} · ${fmt((s.movements||[]).length)} etapa(s)</option>`).join('')+`<option value=\"\">+ Nova sessão</option>`;\n  const sel=$('#sessionPick'); if(sel){ sel.innerHTML=opts; sel.value=SESS.sessionId||''; }\n  const csel=$('#confirmSessionPick'); if(csel){ csel.innerHTML=opts; csel.value=SESS.sessionId||''; }\n}\nasync function saveSession(){\n  const ds=(d2.data('sessionsDataset')||d2.data(SESSIONS_DS));\n  if(!ds){ $('#sessStatus').textContent='dataset de sessões indisponível'; return; }\n  if(!SESS.timeline.length){ $('#sessStatus').textContent='nada pra salvar ainda'; return; }\n  await flushDirty();\n  const label=SESS.sessionLabel||('Sessão '+new Date().toLocaleString('pt-BR'));\n  const nowIso=new Date().toISOString();\n  const payload={\n    label,\n    settings:{...DEFAULT_SETTINGS,...(SESS.settings||{})},\n    snapshotRaw:SESS.snapshotRaw, snapshotSyncedAt:SESS.snapshotSyncedAt, snapLiteral:SESS.snapLiteral, eloMaxCycle:SESS.eloMaxCycle,\n    movements:SESS.timeline.map(mv=>({\n      sector:mv.sector, assign:mv.assign, policy:mv.policy,\n      matrix:mv.matrix, trend:mv.trend, levels:mv.levels, levelByMuni:mv.levelByMuni,\n      pureOwnMetrics:mv.pureOwnMetrics, domUF:mv.domUF, dest:mv.dest, color:mv.color,\n      gv:mv.gv, gvRejected:mv.gvRejected,\n      missingMunis:mv.missingMunis, csvMunisTotal:mv.csvMunisTotal, ufGuessed:mv.ufGuessed,\n      baseMetrics:mv.baseMetrics, baseLevel:mv.baseLevel, geoFeat:mv.geoFeat, nbrFeat:mv.nbrFeat,\n      nbrCurrentSector:mv.nbrCurrentSector, allowed:mv.allowed, allowedRaw:mv.allowedRaw, reachable:mv.reachable,\n      destRule:mv.destRule, destMinCbs:mv.destMinCbs, destRuleFallback:mv.destRuleFallback, optTier:mv.optTier,\n      cbsByMuni:mv.cbsByMuni, shapeMunis:mv.shapeMunis, excludedMunis:mv.excludedMunis, domCsvMunis:mv.domCsvMunis,\n      excludedCbs:mv.excludedCbs, noShapeMunis:mv.noShapeMunis, noShapeCbs:mv.noShapeCbs,\n      secCentroid:mv.secCentroid, muniCentroid:mv.muniCentroid, closeAdj:mv.closeAdj, optBadge:mv.optBadge,\n    })),\n    updatedAt:nowIso,\n  };\n  $('#sessStatus').textContent='salvando…';\n  try{\n    if(SESS.sessionId){\n      await ds.update({_id:SESS.sessionId,...payload});\n    } else {\n      payload.createdAt=nowIso;\n      const created=await ds.create(payload);\n      SESS.sessionId=(created&&created._id)||(created&&created.data&&created.data._id)||(ds.selected&&ds.selected()&&ds.selected()._id)||null;\n    }\n    SESS.sessionLabel=label;\n    await refreshSessionPicker();\n    $('#sessStatus').textContent='salvo ✓';\n  }catch(e){ $('#sessStatus').textContent='erro ao salvar: '+e.message; }\n  setTimeout(()=>{ if($('#sessStatus')) $('#sessStatus').textContent=''; },2200);\n}\n// Duplicate = drop sessionId so saveSession takes its CREATE branch instead of its update branch.\n// The source record is never written to, the copy gets a fresh _id and its own createdAt, and the\n// copy becomes the active session (so the next Salvar edits the copy, not the original).\nasync function duplicateSession(){\n  if(!SESS.timeline.length){ $('#sessStatus').textContent='nada pra duplicar ainda'; return; }\n  const prevId=SESS.sessionId, prevLabel=SESS.sessionLabel;\n  SESS.sessionId=null;\n  SESS.sessionLabel=(SESS.sessionLabel||'Sessão')+' (cópia)';\n  await saveSession();\n  if(!SESS.sessionId){\n    // saveSession swallows its own errors into #sessStatus, so a still-null id after the await is\n    // the only failure signal we get. Put the original identity back — otherwise a failed copy\n    // silently leaves the session detached, and the next Salvar would fork a new record instead\n    // of updating the one the user thought they were editing.\n    SESS.sessionId=prevId; SESS.sessionLabel=prevLabel;\n    await refreshSessionPicker().catch(()=>{});\n    return;\n  }\n  if($('#sessStatus')) $('#sessStatus').textContent='duplicado ✓';\n}\nasync function loadSession(id){\n  if(!id) return newSession();\n  const list=(SESS.sessionsList&&SESS.sessionsList.length)?SESS.sessionsList:await listSessions().catch(()=>[]);\n  const rec=list.find(s=>String(s._id)===String(id));\n  if(!rec) return newSession();\n  loader(true,'carregando sessão…');\n  SESS.sessionId=rec._id; SESS.sessionLabel=rec.label;\n  SESS.snapshotRaw=rec.snapshotRaw; SESS.snapshotSyncedAt=rec.snapshotSyncedAt||null; SESS.snapLiteral=rec.snapLiteral; SESS.eloMaxCycle=rec.eloMaxCycle;\n  SESS.settings={...DEFAULT_SETTINGS,...(rec.settings||{})};\n  SESS.timeline=(rec.movements||[]).map(m=>({sector:String(m.sector)}));\n  SESS.selected=0; SESS.sectorBaseCache={}; SESS.stage='main'; SESS.dirtyFrom=null;\n  try{\n    for(let i=0;i<SESS.timeline.length;i++){\n      const saved=(rec.movements||[])[i]||{};\n      // Sessions saved before the UF became part of the key hold bare-name keys in matrix rows,\n      // assign, geoFeat and closeAdj alike. Restoring that cache would mix key shapes the moment the\n      // stage is recomputed — and it would preserve the very collision this fixes — so those stages\n      // are replayed against the pinned snapshot and the manual assignment is remapped by name.\n      const legacyKeys=!!(saved.matrix&&saved.matrix.length&&saved.matrix.every(r=>r&&r.uf==null));\n      // Sessões salvas antes da regra de gerência podem carregar um destino de outra GV no cache.\n      // Restaurar esse cache manteria o setor proibido na tela para sempre, então essas etapas são\n      // reprocessadas contra o snapshot fixado — igual ao tratamento das chaves legadas.\n      const crossGv=await savedCrossesGv(saved);\n      if(saved.matrix&&!legacyKeys&&!crossGv){\n        loader(true,`restaurando etapa ${i+1}/${SESS.timeline.length} — setor ${SESS.timeline[i].sector} (cache, sem consulta)…`);\n        const mv={sector:String(saved.sector), policy:saved.policy||'fora', view:'tobe', selMuni:null, optBadge:saved.optBadge||''};\n        mv.matrix=saved.matrix; mv.trend=saved.trend||[]; mv.levels=saved.levels||[]; mv.levelByMuni=saved.levelByMuni||{};\n        mv.pureOwnMetrics=saved.pureOwnMetrics||blankM(); mv.domUF=saved.domUF; mv.dest=saved.dest||[]; mv.color=saved.color||{};\n        mv.baseMetrics=saved.baseMetrics||{}; mv.baseLevel=saved.baseLevel||{}; mv.geoFeat=saved.geoFeat||{}; mv.nbrFeat=saved.nbrFeat||[];\n        mv.nbrCurrentSector=saved.nbrCurrentSector||{}; mv.allowed=saved.allowed||{}; mv.reachable=saved.reachable||{};\n        mv.allowedRaw=saved.allowedRaw||saved.allowed||{};\n        mv.destRule=saved.destRule||SESS.settings.destRule; mv.destMinCbs=saved.destMinCbs||SESS.settings.destMinCbs; mv.destRuleFallback=!!saved.destRuleFallback;\n        mv.optTier=(saved.optTier==null?0:saved.optTier);\n        mv.gv=saved.gv||''; mv.gvRejected=saved.gvRejected||[];\n        mv.missingMunis=saved.missingMunis||[]; mv.csvMunisTotal=saved.csvMunisTotal||0;\n        mv.ufGuessed=saved.ufGuessed||{};\n        mv.cbsByMuni=saved.cbsByMuni||{}; mv.shapeMunis=saved.shapeMunis||[];\n        mv.excludedMunis=saved.excludedMunis||[]; mv.excludedCbs=saved.excludedCbs||0; mv.domCsvMunis=saved.domCsvMunis||0;\n        mv.noShapeMunis=saved.noShapeMunis||[]; mv.noShapeCbs=saved.noShapeCbs||0;\n        mv.secCentroid=saved.secCentroid||{}; mv.muniCentroid=saved.muniCentroid||{}; mv.closeAdj=saved.closeAdj||{};\n        aggregateMovement(mv);\n        mv.assign=saved.assign||{};\n        mv.dest.forEach(s=>{ if(!SESS.sectorBaseCache[s]) SESS.sectorBaseCache[s]=mv.baseMetrics[s]; });\n        SESS.timeline[i]=mv;\n      } else {\n        loader(true,`replay ${i+1}/${SESS.timeline.length} — setor ${SESS.timeline[i].sector}…`);\n        await computeAt(i);\n        if(saved.assign) SESS.timeline[i].assign=legacyKeys?remapAssign(SESS.timeline[i],saved.assign):saved.assign;\n        if(saved.policy) SESS.timeline[i].policy=saved.policy;\n      }\n    }\n    await loadSectors();\n  }catch(e){ $('#ds').textContent='erro ao carregar sessão: '+e.message; $('#ds').classList.add('err'); }\n  finally{ loader(false); }\n  renderAll();\n}\n// Re-points a legacy bare-name assignment at the NAME/UF key it can only mean. When a name resolves\n// to more than one município in the recomputed stage the manual choice is genuinely ambiguous —\n// dropping it lets the optimizer allocate instead of guessing on the operator's behalf.\n// True when a cached stage names a destination outside the closing sector's gerência de vendas.\n// Judges the cache by TODAY's rule, reading the (memoised) dominantes base rather than trusting what\n// the session was saved with. Unknown GV on the closing sector answers false: the stage then loads\n// from cache instead of being replayed into the hard throw in computeMovement, which would leave the\n// operator staring at a broken session with no way back.\nasync function savedCrossesGv(saved){\n  if(!saved||!saved.sector||!(saved.dest||[]).length) return false;\n  let gvBy={};\n  try{ await ensureDominantes(); gvBy=DOM.gvBySetor||{}; }catch(e){ return false; }\n  const own=gvBy[String(saved.sector)]||'';\n  if(!own) return false;\n  if(saved.dest.some(s=>(gvBy[String(s)]||'')!==own)) return true;\n  // A stage saved before foreign-GV neighbours stopped being drawn can hold a perfectly clean dest and\n  // STILL carry their shapes in nbrFeat/nbrCurrentSector — it would repaint the old map straight from\n  // cache. An unknown gerência is not evidence of a foreign one, so only a known, differing GV replays.\n  return Object.values(saved.nbrCurrentSector||{}).some(s=>{ const g=gvBy[String(s)]||''; return g&&g!==own; });\n}\nfunction remapAssign(mv,savedAssign){\n  const keys=Object.keys(mv.munis||{}).filter(k=>k!=='__OUTROS__');\n  const out={};\n  Object.entries(savedAssign||{}).forEach(([k,v])=>{\n    if(keys.indexOf(k)>=0){ out[k]=v; return; }\n    const cand=keys.filter(x=>mName(x)===mName(k));\n    if(cand.length===1) out[cand[0]]=v;\n  });\n  return out;\n}\nfunction newSession(){\n  SESS.sessionId=null; SESS.sessionLabel=null; SESS.timeline=[]; SESS.selected=0; SESS.sectorBaseCache={};\n  SESS.settings={...DEFAULT_SETTINGS};\n  SESS.snapshotRaw=null; SESS.snapshotSyncedAt=null; SESS.snapLiteral=null; SESS.eloMaxCycle=null; SESS.stage='loading'; SESS.dirtyFrom=null;\n  (async()=>{\n    loader(true,'iniciando nova sessão…');\n    try{ await Promise.all([ensurePinned(), loadSectors()]); SESS.stage='confirm'; }\n    catch(e){ setError('erro init: '+e.message); }\n    finally{ loader(false); renderAll(); }\n  })();\n}\n\n// ---------- snapshot refresh ----------\n// Deliberately breaks the frozen-snapshot guarantee, on demand: re-resolves DT_HISTORICO and\n// replays the whole timeline against the new one. Skips the replay when the snapshot has not\n// actually moved, so a stray click on a long timeline costs one cheap probe instead of ~8 queries\n// per etapa.\nasync function refreshSnapshot(){\n  if(SESS.stage!=='main' || SESS.snapBusy) return;\n  SESS.snapBusy=true;\n  const prevRaw=SESS.snapshotRaw;\n  const pill=$('#liveState'); if(pill){ pill.classList.add('busy'); pill.textContent='◌ atualizando snapshot…'; }\n  loader(true,'buscando o snapshot mais recente…');\n  let ok=false;\n  try{\n    const p=await resolveSnapshotPin();\n    if(!p.snapshotRaw) throw new Error('não foi possível resolver DT_HISTORICO');\n    const same=String(p.snapshotRaw)===String(prevRaw);\n    SESS.snapshotRaw=p.snapshotRaw; SESS.snapshotSyncedAt=p.syncedAt; SESS.snapLiteral=p.snapLiteral; SESS.eloMaxCycle=p.eloMaxCycle;\n    await loadSectors();   // the sector list follows the live max, so it can have moved too\n    if(same){\n      $('#ds').textContent=`snapshot já era o mais recente · atualizado em ${fmtSyncedAt(p.syncedAt)} — nada recalculado`;\n    } else if(SESS.timeline.length){\n      SESS.dirtyFrom=null;\n      SESS.sectorBaseCache={};   // baselines come from the snapshot, so every one of them changed\n      loader(true,'snapshot novo — recalculando a timeline…');\n      await recomputeFrom(0);\n      $('#ds').textContent=`snapshot atualizado em ${fmtSyncedAt(p.syncedAt)} · ${fmt(SESS.timeline.length)} etapa(s) recalculada(s)`;\n    } else {\n      $('#ds').textContent=`snapshot atualizado em ${fmtSyncedAt(p.syncedAt)}`;\n    }\n    $('#ds').classList.remove('err');\n    ok=true;\n  }catch(e){\n    const at=(SESS.dirtyFrom==null?null:SESS.dirtyFrom+1);\n    $('#ds').textContent='erro ao atualizar o snapshot'+(at?` na etapa ${at} — etapa ${at} em diante ficou desatualizada (⟳)`:'')+': '+e.message;\n    $('#ds').classList.add('err');\n  }finally{\n    SESS.snapBusy=false;\n    if(pill) pill.classList.remove('busy');\n    loader(false); renderAll();\n    if(ok) setTimeout(()=>{ const d=$('#ds'); if(d&&!d.classList.contains('err')) d.textContent=''; },7000);\n  }\n}\n\n// ---------- session options ----------\nfunction previewDest(mv,rule,minCbs){\n  if(!mv||!mv.allowedRaw||!mv.munis) return null;\n  const w={}; let relaxed=false;\n  const cbsOf=m=>(mv.cbsByMuni&&mv.cbsByMuni[m]!=null)?mv.cbsByMuni[m]:((mv.munis[m]&&mv.munis[m].cbs)||0);\n  const add=m=>Object.entries(mv.allowedRaw[m]||{}).forEach(([s,v])=>{ w[s]=(w[s]||0)+v; });\n  // allowedRaw only carries municipalities already inside the sector's dominance base, so there is\n  // nothing left to filter out here beyond the destination rule itself.\n  Object.keys(mv.allowedRaw).forEach(m=>{ const cbs=cbsOf(m);\n    if(rule==='dominant'&&cbs<minCbs) return; add(m); });\n  if(rule==='dominant'&&!Object.keys(w).length){ Object.keys(mv.allowedRaw).forEach(add); relaxed=true; }\n  return {dest:Object.keys(w).sort((a,b)=>w[b]-w[a]).slice(0,6),relaxed};\n}\nfunction readOptForm(){\n  const r=root.querySelector('input[name=\"destRule\"]:checked');\n  let n=Math.round(+$('#optMinCbs').value);\n  if(!(n>0)) n=DEFAULT_SETTINGS.destMinCbs;\n  return {destRule:(r&&r.value)||DEFAULT_SETTINGS.destRule, destMinCbs:n,\n          targetSpan:numOrNull($('#optTargetSpan').value),\n          maxSpan:numOrNull($('#optMaxSpan').value),\n          minSpan:numOrNull($('#optMinSpan').value)};\n}\nfunction spanFormError(f){\n  if(f.minSpan&&f.maxSpan&&f.minSpan>f.maxSpan) return `Span mínimo (${fmt(f.minSpan)}) não pode ser maior que o máximo (${fmt(f.maxSpan)}).`;\n  if(f.targetSpan&&f.maxSpan&&f.targetSpan>f.maxSpan) return `Span alvo (${fmt(f.targetSpan)}) não pode passar do máximo (${fmt(f.maxSpan)}).`;\n  if(f.targetSpan&&f.minSpan&&f.targetSpan<f.minSpan) return `Span alvo (${fmt(f.targetSpan)}) não pode ficar abaixo do mínimo (${fmt(f.minSpan)}).`;\n  return '';\n}\nfunction renderOptPreview(){\n  const el=$('#optPreview'); if(!el) return;\n  const f=readOptForm();\n  root.querySelectorAll('.opt-row').forEach(r=>{\n    if(r.dataset.r!=null) r.classList.toggle('on',r.dataset.r===f.destRule);\n  });\n  const wrap=$('#optMinCbsWrap'); if(wrap) wrap.classList.toggle('off',f.destRule!=='dominant');\n  const err=spanFormError(f), ee=$('#optSpanErr');\n  if(ee){ ee.textContent=err; ee.classList.toggle('hidden',!err); }\n  const ap=$('#optApply'); if(ap) ap.disabled=!!err;\n  const mv=SESS.timeline[SESS.selected];\n  if(!mv||!mv.munis){ el.innerHTML='Nenhuma etapa calculada ainda — as regras passam a valer no próximo fechamento.'; return; }\n  const cbsOf=m=>(mv.cbsByMuni&&mv.cbsByMuni[m]!=null)?mv.cbsByMuni[m]:((mv.munis[m]&&mv.munis[m].cbs)||0);\n  const ms=Object.keys(mv.geoFeat||{});\n  const ig=f.destRule==='dominant'?ms.filter(m=>cbsOf(m)<f.destMinCbs):[];\n  const pv=previewDest(mv,f.destRule,f.destMinCbs);\n  let h=`<b style=\"color:var(--ink)\">Prévia — etapa ${SESS.selected+1}, setor ${mv.sector}</b><br>`;\n  const exN=(mv.excludedMunis||[]).length;\n  if(exN) h+=`Base de dominantes: <b>${fmt(ms.length)}</b> município(s) no mapa · <span style=\"color:var(--closing)\">${fmt(exN)} fora da base — ${fmt(mv.excludedCbs||0)} CBs seguem suas líderes</span><br>`;\n  h+=`${fmt(ms.length-ig.length)} de ${fmt(ms.length)} município(s) valem como ponte`;\n  if(ig.length) h+=` · <span style=\"color:var(--closing)\">ignorados:</span> ${ig.slice(0,8).join(', ')}${ig.length>8?' +'+(ig.length-8):''}`;\n  if(pv){\n    h+=`<br>Setores destino com esta regra: <b style=\"color:var(--ink)\">${pv.dest.join(', ')||'–'}</b>`;\n    const cur=(mv.dest||[]).join(', ');\n    if(pv.dest.join(',')!==(mv.dest||[]).join(',')) h+=` <span style=\"color:var(--closing)\">(hoje: ${cur||'–'})</span>`;\n    if(pv.relaxed) h+=`<br><b style=\"color:var(--closing)\">⚠ nenhum município dominante nesta etapa — a regra relaxa pra \"qualquer município\" pra não deixar a etapa sem destino.</b>`;\n  }\n  if(f.targetSpan||f.maxSpan||f.minSpan){\n    const sp=spanMapFor(mv,mv.assign||{}), v=spanViolationsOf(sp,{target:f.targetSpan,max:f.maxSpan,min:f.minSpan});\n    h+=`<br><br>Span dos destinos como está hoje: ${mv.dest.map(s=>s+' <b>'+fmt(sp[s])+'</b>').join(' · ')||'–'}`;\n    if(v.over.length||v.under.length) h+=`<br><span style=\"color:var(--closing)\">Fora dos limites: ${[...v.over.map(s=>s+' ▲ acima do máx'),...v.under.map(s=>s+' ▼ abaixo do mín')].join(', ')}</span> — o modelo ÓTIMO tenta corrigir no recálculo.`;\n    else h+=` <span style=\"color:var(--ok)\">— já dentro dos limites</span>`;\n  }\n  if(SESS.timeline.length) h+=`<br><span style=\"margin-top:4px;display:inline-block\">Aplicar <b>recalcula as ${fmt(SESS.timeline.length)} etapa(s)</b> contra o snapshot congelado — os destinos ajustados à mão serão refeitos pelo modelo ÓTIMO.</span>`;\n  el.innerHTML=h;\n}\nfunction openOptions(){\n  const st={...DEFAULT_SETTINGS,...(SESS.settings||{})};\n  root.querySelectorAll('input[name=\"destRule\"]').forEach(r=>{ r.checked=(r.value===st.destRule); });\n  $('#optMinCbs').value=st.destMinCbs;\n  $('#optTargetSpan').value=st.targetSpan||'';\n  $('#optMaxSpan').value=st.maxSpan||'';\n  $('#optMinSpan').value=st.minSpan||'';\n  $('#optApply').disabled=false;\n  $('#optSessName').textContent=SESS.sessionLabel||'sessão não salva';\n  $('#optStatus').textContent='';\n  $('#optionsBg').classList.remove('hidden');\n  renderOptPreview();\n  const c=$('#optCancel'); if(c) c.focus();\n}\nfunction closeOptions(){ const b=$('#optionsBg'); if(b) b.classList.add('hidden'); }\nasync function applyOptions(){\n  const f=readOptForm();\n  if(spanFormError(f)) return;\n  const prev={...DEFAULT_SETTINGS,...(SESS.settings||{})};\n  const changed = prev.destRule!==f.destRule\n    || (f.destRule==='dominant' && prev.destMinCbs!==f.destMinCbs)\n    || numOrNull(prev.targetSpan)!==f.targetSpan\n    || numOrNull(prev.maxSpan)!==f.maxSpan\n    || numOrNull(prev.minSpan)!==f.minSpan;\n  SESS.settings={...prev,...f};\n  closeOptions();\n  if(!changed || !SESS.timeline.length){ renderAll(); return; }\n  SESS.dirtyFrom=null;\n  SESS.sectorBaseCache={};   // the recompute re-derives every baseline; keeping the old ones would\n                             // leave \"Impacto acumulado\" comparing against pre-change numbers\n  loader(true,'aplicando nova regra de destino — recalculando timeline…');\n  try{\n    await recomputeFrom(0);\n    $('#ds').textContent=''; $('#ds').classList.remove('err');\n  }catch(e){\n    const at=(SESS.dirtyFrom==null?0:SESS.dirtyFrom)+1;\n    $('#ds').textContent=`erro ao aplicar a regra na etapa ${at}: ${e.message} — etapa ${at} em diante ficou desatualizada (⟳)`;\n    $('#ds').classList.add('err');\n  }finally{ loader(false); renderAll(); }\n}\n\nconst SHARED_DS='timeline-shared-sessionsDataSet';\nconst AUTH_REF='timelineSimAuthFinal';   // single source of truth for the auth strategy reference\nlet SHARE={busy:false,url:null,last:null};\n// Serialise a PRESENTATION model, not the raw session, so the reader stays purely presentational\n// and never re-derives spans/desloc/orphans — no second copy of this engine to keep in sync.\n// NOTE: METRICS_DEF[2] is the money marker; read it as !!md[2] (a literal dollar sign in this\n// position trips the upsert's parse check).\nfunction buildShareStages(){\n  return SESS.timeline.map((mv,i)=>{\n    const c=computeDerived(mv);\n    const incBy={};\n    mv.dest.forEach(s=>{ incBy[s]=Object.fromEntries(METRICS_DEF.map(md=>[md[0],0])); });\n    Object.entries(mv.munis).forEach(([m,o])=>{\n      if(m==='__OUTROS__') return;\n      const s=mv.assign[m]; if(!s||!incBy[s]) return;\n      METRICS_DEF.forEach(md=>{ incBy[s][md[0]]+=o[md[0]]||0; });\n    });\n    const saiTot={};\n    METRICS_DEF.forEach(md=>{\n      const k=md[0];\n      saiTot[k]=Object.entries(mv.munis).filter(([m])=>m!=='__OUTROS__').reduce((a,p)=>a+((p[1][k])||0),0);\n    });\n    // orphans follow their leader's home: they enter that sector AND leave the closing one\n    c.leaders.forEach(L=>{\n      const om=mv.orphanMetricsByGroup&&mv.orphanMetricsByGroup[L.grupo];\n      if(!om||!L.home) return;\n      METRICS_DEF.forEach(md=>{ const k=md[0];\n        if(incBy[L.home]) incBy[L.home][k]+=om[k]||0;\n        saiTot[k]+=om[k]||0; });\n    });\n    const ms=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__').sort((a,b)=>mv.munis[b].cbs-mv.munis[a].cbs);\n    const sv=mv.dest.map(s=>c.span[s]);\n    const baseOf=(s,k)=>{ const b=mv.baseMetrics[s]||{}; return +(b[k]||0); };\n    return {\n      i:i, sector:mv.sector, policy:mv.policy, domUF:mv.domUF,\n      optTier:(mv.optTier==null?0:mv.optTier),\n      destRuleFallback:!!mv.destRuleFallback,\n      dest:mv.dest.slice(), color:Object.assign({},mv.color), assign:Object.assign({},mv.assign),\n      kpis:{ cbsRealocadas:closingCbsOf(mv), desloc:c.desloc,\n             spread:(sv.length?Math.max.apply(null,sv)-Math.min.apply(null,sv):0),\n             municipios:ms.length, lideres:mv.leaders.length },\n      destinos:mv.dest.map(s=>({ s:s, base:baseOf(s,'cbs'), inc:c.inc[s]||0, orph:c.orph[s]||0, span:c.span[s]||0, gained:c.gained[s]||0 })),\n      municipios:ms.map(m=>({ nome:mName(m), uf:mUf(m), cbs:mv.munis[m].cbs, destino:mv.assign[m]||null })),\n      excluidos:(mv.excludedMunis||[]).map(x=>({ muni:x.muni, cbs:x.cbs })),\n      orphanTotal:c.orphanTotal||0, orphanStranded:c.orphanStranded||0, noShapeCbs:mv.noShapeCbs||0,\n      lideres:c.leaders.map(L=>({ lider:(L.lider||'').split(' ').slice(0,2).join(' '), grupo:L.grupo,\n        total:L.total, home:L.home, desloc:L.desloc, orphan:L.orphan||0 })),\n      metricas:METRICS_DEF.map(md=>{ const k=md[0];\n        return { key:k, label:md[1], money:!!md[2],\n          rows:mv.dest.map(s=>({ s:s, antes:baseOf(s,k), depois:baseOf(s,k)+((incBy[s]&&incBy[s][k])||0) })),\n          sai:saiTot[k]||0 }; }),\n      geoFeat:mv.geoFeat, nbrFeat:mv.nbrFeat, excludedFeat:[]\n    };\n  });\n}\nfunction buildShareSummary(stages){\n  const world=foldWorldState(SESS.timeline,SESS.timeline.length);\n  const receivers=[];\n  SESS.timeline.forEach((mv,i)=>{\n    const own=mv.pureOwnMetrics||{};\n    receivers.push({ s:mv.sector, situacao:'fechado (etapa '+(i+1)+')', antes:+(own.cbs||0), depois:0 });\n  });\n  const seen={};\n  Object.values(world.muniOverride).forEach(s=>{\n    if(seen[s]) return; seen[s]=1;\n    const base=SESS.sectorBaseCache[s]||{}, infl=world.sectorInflow[s]||{};\n    receivers.push({ s:s, situacao:'recebeu território', antes:+(base.cbs||0), depois:(+(base.cbs||0))+(infl.cbs||0) });\n  });\n  return { stages:stages.length, sectors:SESS.timeline.map(mv=>mv.sector),\n    totalCbs:stages.reduce((a,s)=>a+(s.kpis.cbsRealocadas||0),0),\n    totalDesloc:stages.reduce((a,s)=>a+(s.kpis.desloc||0),0), receivers:receivers };\n}\nfunction renderShareBody(){\n  const el=$('#shareBody'); if(!el) return;\n  const go=$('#shareGo'), cp=$('#shareCopy'), op=$('#shareOpen'), cc=$('#shareCancel');\n  if(SHARE.url){\n    el.innerHTML=`<div class=\"opt-note\" style=\"margin-top:0\"><b style=\"color:var(--ink)\">Sessão compartilhada ✓</b><br>\n      Link de leitura desta simulação congelada. Quem abrir precisa ter login no simulador.\n      <div class=\"shareurl\">${esc(SHARE.url)}</div></div>`;\n    if(go) go.classList.add('hidden');\n    if(cp) cp.classList.remove('hidden');\n    if(op) op.classList.remove('hidden');\n    if(cc) cc.textContent='Fechar';\n    return;\n  }\n  if(go) go.classList.remove('hidden');\n  if(cp) cp.classList.add('hidden');\n  if(op) op.classList.add('hidden');\n  if(cc) cc.textContent='Cancelar';\n  const st={...DEFAULT_SETTINGS,...(SESS.settings||{})};\n  const desloc=SESS.timeline.reduce((a,mv)=>a+(mv.munis?computeDerived(mv).desloc:0),0);\n  const destTxt=st.destRule==='dominant'?('dominantes ≥'+fmt(st.destMinCbs)+' CBs'):'qualquer município';\n  el.innerHTML=`<div class=\"opt-lbl\">Confirmar compartilhamento</div>\n    <div class=\"opt-sub\">Publica uma <b>cópia congelada</b> desta sessão, exatamente no estado atual.</div>\n    <div class=\"opt-note\" style=\"margin-top:0\">\n      · <b>${fmt(SESS.timeline.length)}</b> etapa(s) — ${esc(SESS.timeline.map(mv=>mv.sector).join(' → '))}<br>\n      · snapshot atualizado em <b>${esc(fmtSyncedAt(SESS.snapshotSyncedAt))}</b><br>\n      · base: <b>municípios dominantes (CSV)</b> · destino: <b>${esc(destTxt)}</b> · span: <b>${esc(spanShort(st))}</b><br>\n      · <b>${fmt(desloc)}</b> CBs deslocadas somando a cadeia\n    </div>\n    <div class=\"opt-note\">A cópia <b>não</b> acompanha edições posteriores desta sessão — pra atualizar, compartilhe de novo e use o link novo. O link exige login no simulador; não é público.</div>\n    ${SHARE.last?`<div class=\"opt-note\"><b style=\"color:var(--ink)\">Último link gerado nesta sessão</b> — aponta pro estado de <b>antes</b> das edições feitas depois dele.<div class=\"shareurl\">${esc(SHARE.last)}</div></div>`:''}`;\n}\nasync function openShare(){\n  if(!SESS.timeline.length){ $('#ds').textContent='nada pra compartilhar — feche pelo menos um setor primeiro.'; $('#ds').classList.add('err'); return; }\n  await flushDirty();\n  SHARE.url=null;\n  const s=$('#shareStatus'); if(s){ s.textContent=''; s.classList.remove('err'); }\n  renderShareBody();\n  $('#shareBg').classList.remove('hidden');\n  const b=$('#shareCancel'); if(b) b.focus();\n}\nfunction closeShare(){ const b=$('#shareBg'); if(b) b.classList.add('hidden'); }\nasync function doShare(){\n  if(SHARE.busy) return;\n  const go=$('#shareGo'), stx=$('#shareStatus');\n  SHARE.busy=true;\n  if(go){ go.disabled=true; go.textContent='Compartilhando…'; }\n  if(stx){ stx.textContent=''; stx.classList.remove('err'); }\n  try{\n    // Resolved as a GLOBAL PROCESS, not a declared param — which only works because the block\n    // instance on the `main` artboard binds `sharedDataset: @timeline-shared-sessionsDataSet`.\n    // That binding is load-bearing: a Process is only define()d once something on the rendering\n    // tree references it, so without it this lookup returns null and sharing dies on the guard\n    // below. Do NOT remove the instance param because this file never reads d2.params.sharedDataset.\n    const ds=d2.data(SHARED_DS);\n    if(!ds) throw new Error('dataset de sessões compartilhadas indisponível');\n    await flushDirty();\n    const stages=buildShareStages();\n    const summary=buildShareSummary(stages);\n    let who='';\n    try{ const a=d2.auth(AUTH_REF); who=(a&&a.user&&(a.user.email||a.user.nome))||''; }catch(e){}\n    const created=await ds.create({\n      label:SESS.sessionLabel||('Sessão '+new Date().toLocaleString('pt-BR')),\n      snapshotRaw:SESS.snapshotRaw, snapshotSyncedAt:SESS.snapshotSyncedAt,\n      settings:{...DEFAULT_SETTINGS,...(SESS.settings||{})},\n      stages:stages, summary:summary, sharedBy:who, sharedAt:new Date().toISOString()\n    });\n    const id=(created&&created._id)||(created&&created.data&&created.data._id)||(ds.selected&&ds.selected()&&ds.selected()._id)||null;\n    if(!id) throw new Error('registro gravado, mas sem _id na resposta — não foi possível montar o link');\n    SHARE.url=window.location.origin+'/sessions/'+id;\n    SHARE.last=SHARE.url;\n    renderShareBody();\n  }catch(e){\n    if(stx){ stx.textContent='erro ao compartilhar: '+e.message; stx.classList.add('err'); }\n  }finally{\n    SHARE.busy=false;\n    if(go){ go.disabled=false; go.textContent='Compartilhar'; }\n  }\n}\n\n// ---------- rendering ----------\nfunction renderTimeline(){\n  const el=$('#movementChips'); if(!el) return;\n  if(!SESS.timeline.length){ el.innerHTML='<span class=\"empty\">Nenhuma etapa ainda — use \"Fechar setor ▶\" à direita.</span>'; return; }\n  el.innerHTML=SESS.timeline.map((mv,i)=>{\n    const ready=mv.dest!==undefined;\n    const c=ready?computeDerived(mv):null;\n    const stale=SESS.dirtyFrom!=null && i>=SESS.dirtyFrom;\n    return `<div class=\"tchip ${i===SESS.selected?'on':''} ${stale?'stale':''}\" data-i=\"${i}\">\n      <span class=\"tnum\">${i+1}</span><span class=\"tsec\">Setor ${mv.sector}</span>\n      <span class=\"tstat\">${ready?fmt(c.desloc)+' desloc.':'…'}</span>\n      ${stale?'<span class=\"tstale\" title=\"recalcula ao selecionar outra etapa\">⟳</span>':''}\n      <span class=\"trm\" data-rm=\"${i}\" title=\"remover esta etapa e as seguintes\">✕</span>\n    </div>`;\n  }).join('');\n  el.querySelectorAll('.tchip').forEach(ch=>{\n    ch.addEventListener('click',async (e)=>{\n      if(e.target.dataset.rm!=null && e.target.dataset.rm!==''){ removeFrom(+e.target.dataset.rm); return; }\n      const i=+ch.dataset.i;\n      if(i!==SESS.selected) await flushDirty();\n      SESS.selected=i; renderAll();\n    });\n  });\n}\nfunction renderRuleNote(){\n  const el=$('#ruleNote'); if(!el) return;\n  const st={...DEFAULT_SETTINGS,...(SESS.settings||{})};\n  const mv=SESS.timeline[SESS.selected];\n  let h='';\n  h+=`<b style=\"color:var(--ink)\">Base de municípios dominantes:</b> só os municípios que a base (CSV) atribui ao setor entram no mapa e na alocação`;\n  if(mv&&mv.domCsvMunis) h+=` · <b>${fmt(mv.domCsvMunis)}</b> na base do setor ${mv.sector}`;\n  if(mv&&mv.excludedCbs) h+=` · <b style=\"color:var(--closing)\">${fmt(mv.excludedMunis.length)} município(s) / ${fmt(mv.excludedCbs)} CBs</b> fora da base nesta etapa — não aparecem no mapa e as CBs seguem suas líderes (quebra de vínculo)`;\n  if(DOM.error) h+=` · <b style=\"color:var(--closing)\">⚠ base indisponível: ${esc(DOM.error)}</b>`;\n  h+=`<br>`;\n  h+=`<b style=\"color:var(--ink)\">Regra de destino:</b> `;\n  h+= st.destRule==='dominant'\n    ? `só municípios com <b>≥${fmt(st.destMinCbs)} CBs</b> trazem setor pra lista de destinos`\n    : `qualquer município do setor fechado vale como ponte <span style=\"opacity:.7\">(padrão)</span>`;\n  if(mv&&mv.munis&&st.destRule==='dominant'){\n    const ig=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__'&&mv.munis[m].cbs<st.destMinCbs);\n    if(ig.length) h+=` · <b style=\"color:var(--closing)\">${fmt(ig.length)}</b> ignorado(s) como ponte (ainda redistribuído(s)): ${ig.slice(0,5).join(', ')}${ig.length>5?' +'+(ig.length-5):''}`;\n    if(mv.destRuleFallback) h+=`<br><b style=\"color:var(--closing)\">⚠ nenhum município dominante nesta etapa — regra relaxada pra \"qualquer município\".</b>`;\n  }\n  el.innerHTML=h;\n}\nfunction renderSpanRule(){\n  const el=$('#spanRule'); if(!el) return;\n  const mv=SESS.timeline[SESS.selected], lim=spanLimits();\n  if(!mv||!mv.munis||mv.view==='asis'||!spanLimitsOn(lim)){ el.innerHTML=''; return; }\n  const sp=spanMapFor(mv,mv.assign||{}), v=spanViolationsOf(sp,lim);\n  const bits=[];\n  if(lim.target) bits.push(`alvo <b>${fmt(lim.target)}</b>`);\n  if(lim.max) bits.push(`máx <b>${fmt(lim.max)}</b>`);\n  if(lim.min) bits.push(`mín <b>${fmt(lim.min)}</b>`);\n  let h=`Pré-requisito de span: ${bits.join(' · ')} CBs — `;\n  if(v.over.length||v.under.length){\n    h+=`<b style=\"color:var(--closing)\">⚠ `;\n    if(v.over.length) h+=`acima do máximo: ${v.over.map(s=>s+' ('+fmt(sp[s])+')').join(', ')}`;\n    if(v.over.length&&v.under.length) h+=' · ';\n    if(v.under.length) h+=`abaixo do mínimo: ${v.under.map(s=>s+' ('+fmt(sp[s])+')').join(', ')}`;\n    h+=`</b>`;\n    if(mv.optTier===1) h+=`<br><span style=\"opacity:.85\">Nenhuma alocação contígua respeita o span mínimo nesta etapa — o modelo relaxou essa exigência.</span>`;\n    else if(mv.optTier===2) h+=`<br><span style=\"opacity:.85\">Nenhuma alocação contígua respeita os limites nesta etapa — o modelo relaxou essa exigência.</span>`;\n    else if(mv.optTier===-1) h+=`<br><span style=\"opacity:.85\">Etapa resolvida por heurística — os limites não são garantidos.</span>`;\n  } else h+=`<b style=\"color:var(--ok)\">✓ todos os setores receptores dentro dos limites</b>`;\n  el.innerHTML=`<div class=\"note\" style=\"margin:-2px 0 6px\">${h}</div>`;\n}\nfunction renderContig(){const mv=SESS.timeline[SESS.selected];const el=$('#contig');if(!el||!mv)return;\n  if(mv.view==='asis'){el.innerHTML='';return;}\n  const bad=contigBadFor(mv,mv.assign);\n  el.innerHTML=bad.length\n    ?`<div class=\"note\" style=\"color:var(--closing);font-weight:600;margin:-2px 0 6px\">⚠ Contiguidade quebrada em ${bad.join(', ')} — município(s) desconectado(s) do território do setor. Use ★ ÓTIMO ou reassocie no mapa.</div>`\n    :`<div class=\"note\" style=\"color:var(--ok);margin:-2px 0 6px\">✓ Contíguo — cada setor forma uma região conectada.</div>`;\n}\nfunction closingCbsOf(mv){ return Object.entries(mv.munis).filter(([m])=>m!=='__OUTROS__').reduce((a,[,o])=>a+o.cbs,0); }\nfunction sectorTotalCbs(mv){ return Object.values(mv.munis).reduce((a,o)=>a+o.cbs,0); }\nfunction renderKpis(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const c=computeDerived(mv);\n  if(mv.view==='asis'){const mc=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__').length;\n    $('#kpis').innerHTML=[\n      {n:fmt(sectorTotalCbs(mv)),l:`CBs no setor ${mv.sector} (antes desta etapa)`,t:'Total de CBs no setor hoje — já considerando o que etapas anteriores da timeline mandaram pra cá.'},\n      {n:mv.csvMunisTotal?`${fmt(mc)}/${fmt(mv.csvMunisTotal)}`:fmt(mc),l:'Municípios do setor',t:`Municípios desenhados nesta etapa${mv.csvMunisTotal?` de ${fmt(mv.csvMunisTotal)} que a base de dominantes atribui ao setor`:''}.${(mv.missingMunis||[]).length?' Fora do mapa: '+mv.missingMunis.map(x=>x.muni+' ('+x.reason+')').join(' · '):''}${Object.keys(mv.ufGuessed||{}).length?' UF inferida da UF dominante do setor (nome repetido em outra UF carregada): '+Object.entries(mv.ufGuessed).map(([nm,u])=>nm+'→'+u).join(', '):''}`},\n      {n:fmt(mv.leaders.length),l:'Líderes (grupos)',t:'Líderes presentes no setor nesta etapa.'},\n      {n:fmt(mv.dest.length),l:'Setores adjacentes',t:`Setores vizinhos (ainda abertos) da MESMA gerência de vendas (CD_GV ${mv.gv||'?'}) que poderiam receber os municípios.${(mv.gvRejected||[]).length?' Fora do mapa, por serem de outra gerência: '+mv.gvRejected.join(', ')+'.':''}`},\n    ].map(k=>`<div class=\"kpi\" title=\"${k.t}\"><div class=\"n\">${k.n}</div><div class=\"l\">${k.l}</div></div>`).join('');\n    return;}\n  const sv=mv.dest.map(s=>c.span[s]);const spread=sv.length?Math.max(...sv)-Math.min(...sv):0;\n  const zero=mv.dest.filter(s=>c.gained[s]===0);const totCbs=closingCbsOf(mv);\n  $('#kpis').innerHTML=[\n    {n:fmt(c.desloc),l:mv.policy==='fora'?'CBs fora do setor':'CBs c/ quebra de relação',cls:'warn',t:'CBs cuja líder acabou noutro setor nesta etapa.'},\n    {n:fmt(spread),l:'Desequilíbrio (máx−mín CBs)',cls:spread>800?'warn':'ok',t:'Diferença de tamanho entre o maior e o menor setor depois desta etapa.'},\n    {n:fmt(totCbs),l:'CBs realocadas',cls:'',t:`Total de CBs do setor ${mv.sector} sendo redistribuídas nesta etapa.`},\n    {n:zero.length?zero.join(', '):'nenhum',l:'Setor sem líder herdada',cls:zero.length?'warn':'ok',t:'Setor que recebe município(s) mas nenhuma líder nesta etapa.'},\n  ].concat(mv.excludedCbs?[{n:fmt(mv.excludedCbs),l:`CBs ignoradas · ${fmt(mv.excludedMunis.length)} município(s) fora da base`,cls:'warn',t:'CBs em municípios que a base de dominantes não atribui a este setor: ficam fora do mapa e da alocação geográfica e seguem a líder do seu grupo.'}]:[])\n   .concat((mv.missingMunis||[]).length?[{n:fmt(mv.missingMunis.length),l:`Município(s) da base fora do mapa · ${fmt(mv.csvMunisTotal)} na base`,cls:'warn',t:`A base de dominantes atribui ${fmt(mv.csvMunisTotal)} município(s) ao setor ${mv.sector} e ${fmt(mv.csvMunisTotal-mv.missingMunis.length)} chegaram ao mapa. Fora: ${mv.missingMunis.map(x=>x.muni+' — '+x.reason+(x.cbs?' ('+fmt(x.cbs)+' CBs)':'')).join(' · ')}`}]:[])\n   .map(k=>`<div class=\"kpi ${k.cls}\" title=\"${k.t}\"><div class=\"n\">${k.n}</div><div class=\"l\">${k.l}</div></div>`).join('');\n}\nfunction renderSpans(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const c=computeDerived(mv);\n  if(mv.view==='asis'){const items=[{s:mv.sector,val:sectorTotalCbs(mv),color:CLOSE_COLOR}].concat(mv.dest.map(s=>({s,val:+(mv.baseMetrics[s]?.cbs||0),color:mv.color[s]})));\n    const max=Math.max(...items.map(x=>x.val),1);\n    $('#spans').innerHTML=items.map(x=>`<div class=\"bar-row\"><div class=\"tag\" style=\"color:${x.color}\">${x.s}</div><div class=\"bar-track\">\n      <div class=\"bar-inc\" style=\"width:${x.val/max*100}%;background:${x.color}\"></div></div>\n      <div class=\"bar-val\">${fmt(x.val)}</div></div>`).join('')\n      +`<div class=\"note\">Estrutura antes desta etapa — o setor <b>${mv.sector}</b> ainda existe. Alterne pra <b>TOBE</b> pra ver a redistribuição.</div>`;\n    return;}\n  const lim=spanLimits(),on=spanLimitsOn(lim);\n  const rawMax=Math.max(...mv.dest.map(s=>c.span[s]),lim.target||0,lim.max||0,1);\n  const max=on?rawMax*1.04:rawMax;   // headroom so a marker sitting at the scale top stays visible\n  const mk=(v,color,label)=>v?`<div class=\"bar-mark\" style=\"left:${Math.min(99.6,v/max*100).toFixed(1)}%;background:${color}\" title=\"${label}\"></div>`:'';\n  const marks=mk(lim.min,'#ff9500','span mínimo '+fmt(lim.min))+mk(lim.target,'#007aff','span alvo '+fmt(lim.target))+mk(lim.max,'#ff3b30','span máximo '+fmt(lim.max));\n  $('#spans').innerHTML=mv.dest.map(s=>{const base=+(mv.baseMetrics[s]?.cbs||0),i=c.inc[s];\n    const over=lim.max&&c.span[s]>lim.max,under=lim.min&&c.span[s]<lim.min;\n    return `<div class=\"bar-row\"><div class=\"tag\" style=\"color:${mv.color[s]}\">${s}</div><div class=\"bar-track\">\n      <div class=\"bar-base\" style=\"width:${base/max*100}%;background:${mv.color[s]}\"></div>\n      <div class=\"bar-inc\" style=\"width:${i/max*100}%;background:${mv.color[s]}\"></div>${marks}</div>\n      <div class=\"bar-val\" style=\"${over?'color:var(--closing);font-weight:700':(under?'color:#ff9500;font-weight:700':'')}\">${fmt(c.span[s])} <span style=\"opacity:.6\">(+${fmt(i)})</span>${over?' ▲':''}${under?' ▼':''}</div></div>`;}).join('')\n    +`<div class=\"note\">Claro = base (já incluindo etapas anteriores) · cheio = CBs entrantes do ${mv.sector} nesta etapa.${c.orphanTotal?` Inclui <b>${fmt(c.orphanTotal-c.orphanStranded)}</b> CB(s) de municípios fora da base de dominantes que seguiram suas líderes.`:''}${on?' Marcas: <b style=\"color:#007aff\">│</b> alvo · <b style=\"color:#ff3b30\">│</b> máx · <b style=\"color:#ff9500\">│</b> mín.':''}</div>`;\n}\n// Two very different reasons land rows in the __OUTROS__ bucket — no IBGE shape, or outside the\n// sector's dominance base. Same bucket computationally, but they must not read as the same thing.\nfunction outsideNote(mv){\n  const bits=[];\n  if(mv.noShapeCbs) bits.push(`<b>${fmt(mv.noShapeCbs)}</b> CBs em ${fmt(mv.noShapeMunis.length)} município(s) sem shape na UF`);\n  if(mv.excludedCbs) bits.push(`<b>${fmt(mv.excludedCbs)}</b> CBs em ${fmt(mv.excludedMunis.length)} município(s) <b>fora da base de dominantes</b> deste setor — <b style=\"color:var(--closing)\">quebra de vínculo</b>`);\n  if(!bits.length) return '';\n  let h=`<div class=\"note\">Fora do mapa e da alocação geográfica: ${bits.join(' · ')}.`;\n  if(mv.excludedCbs){\n    const c=computeDerived(mv);\n    h+=` As <b>${fmt(mv.excludedCbs)}</b> CBs em quebra de vínculo <b>seguem a líder do seu grupo</b>`;\n    const byS=mv.dest.filter(s=>c.orph[s]).map(s=>`<b style=\"color:${mv.color[s]}\">${s}</b> (${fmt(c.orph[s])})`);\n    h+=byS.length?`: ${byS.join(' · ')}.`:'.';\n    if(c.orphanStranded) h+=` <b style=\"color:var(--closing)\">${fmt(c.orphanStranded)} CB(s) sem destino</b> — a líder não ficou com nenhum município realocado, então não há setor pra seguir.`;\n  }\n  if(mv.noShapeCbs) h+=` As CBs sem shape na UF continuam fora de qualquer setor destino.`;\n  if(mv.excludedMunis&&mv.excludedMunis.length) h+=`<br><span style=\"opacity:.85\">${mv.excludedMunis.slice(0,8).map(x=>x.muni+' ('+fmt(x.cbs)+')').join(', ')}${mv.excludedMunis.length>8?' +'+(mv.excludedMunis.length-8):''}</span>`;\n  return h+`</div>`;\n}\nfunction renderMuni(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const ms=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__').sort((a,b)=>mv.munis[b].cbs-mv.munis[a].cbs);\n  if(mv.view==='asis'){$('#muniList').innerHTML=ms.map(m=>`<div class=\"muni-item\"><div class=\"nm\">${m}</div><div class=\"ct\">${fmt(mv.munis[m].cbs)} CBs</div><span class=\"badge\" style=\"background:${CLOSE_COLOR};color:#fff;border-color:${CLOSE_COLOR}\">setor ${mv.sector}</span></div>`).join('')\n      +`<div class=\"note\">Hoje todos pertencem ao setor <b>${mv.sector}</b>. No <b>TOBE</b> cada um vira botões de destino.</div>`+outsideNote(mv);return;}\n  $('#muniList').innerHTML=ms.map(m=>`<div class=\"muni-item\"><div class=\"nm\">${m}</div><div class=\"ct\">${fmt(mv.munis[m].cbs)} CBs</div>\n    <div class=\"seg\" data-m=\"${m}\">${mv.dest.map(s=>`<button data-s=\"${s}\" class=\"${mv.assign[m]===s?'on':''}\" style=\"${mv.assign[m]===s?'background:'+mv.color[s]:''}\">${s}</button>`).join('')}</div></div>`).join('')\n    +outsideNote(mv);\n  $('#muniList').querySelectorAll('.seg button').forEach(b=>b.onclick=()=>{const m=b.parentElement.dataset.m,s=b.dataset.s;editSelected(m2=>{m2.assign[m]=s;});});\n}\nfunction renderLeaders(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const c=computeDerived(mv);\n  if(mv.view==='asis'){$('#leaders').innerHTML=`<thead><tr><th>Líder</th><th>Grupo</th><th>CBs</th><th>Setor</th></tr></thead><tbody>`\n    +mv.leaders.map(L=>`<tr><td>${(L.lider||'').split(' ').slice(0,2).join(' ')}</td><td>${L.grupo}</td><td>${fmt(L.total)}</td><td><span class=\"home\" style=\"background:${CLOSE_COLOR}\"></span>${mv.sector}</td></tr>`).join('')\n    +`<tr style=\"font-weight:700\"><td>TOTAL</td><td></td><td>${fmt(mv.leaders.reduce((a,L)=>a+L.total,0))}</td><td></td></tr></tbody>`;return;}\n  const showOrph=c.orphanTotal>0;\n  $('#leaders').innerHTML=`<thead><tr><th>Líder</th><th>CBs</th><th>Home</th>${mv.dest.map(s=>`<th>${s}</th>`).join('')}${showOrph?'<th title=\"CBs em municípios fora da base de dominantes que seguiram esta líder\">Órfãs</th>':''}<th>Desloc.</th></tr></thead><tbody>`\n   +c.leaders.map(L=>`<tr><td>${(L.lider||'').split(' ').slice(0,2).join(' ')}</td><td>${fmt(L.total)}</td>\n     <td>${L.home?`<span class=\"home\" style=\"background:${mv.color[L.home]}\"></span>${L.home}`:'–'}</td>\n     ${mv.dest.map(s=>`<td class=\"cell\" style=\"${s===L.home?'color:'+mv.color[s]+';font-weight:700':''}\">${L.byS[s]||'·'}</td>`).join('')}\n     ${showOrph?`<td class=\"cell\" style=\"${L.orphan&&!L.orphanHome?'color:var(--closing);font-weight:700':''}\" title=\"${L.orphan?(L.orphanHome?'seguem a líder para o setor '+L.orphanHome:'sem home — CBs sem setor pra seguir'):''}\">${L.orphan?fmt(L.orphan)+(L.orphanHome?'':' ⚠'):'·'}</td>`:''}\n     <td style=\"color:${L.desloc?'var(--closing)':'var(--mut)'};font-weight:${L.desloc?700:400}\">${L.desloc||'0'}</td></tr>`).join('')\n   +`<tr style=\"font-weight:700\"><td>TOTAL</td><td>${fmt(c.leaders.reduce((a,L)=>a+L.total,0))}</td><td></td>${mv.dest.map(s=>`<td>${fmt(c.leaders.reduce((a,L)=>a+L.byS[s],0))}</td>`).join('')}${showOrph?`<td>${fmt(c.orphanTotal)}</td>`:''}<td style=\"color:var(--closing)\">${fmt(c.desloc)}</td></tr></tbody>`;\n}\nfunction renderMatrix(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const ms=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__').sort((a,b)=>mv.munis[b].cbs-mv.munis[a].cbs);\n  // `_out` is a flag stamped on the ROW, and rows are shared between etapas (absorbed + inherited\n  // orphans), so the last etapa to aggregate wins and reading it here can describe the wrong etapa.\n  // Derive the bucket from THIS mv instead. Summing rather than .find() because several out-municípios\n  // of the same group all collapse into __OUTROS__, and only the first was being counted.\n  const outOf=x=>!mv.geoFeat[mkey(x.municipio,x.uf)];\n  const cell=(m,g)=>mv.matrix.reduce((a,x)=>a+((((outOf(x)?'__OUTROS__':mkey(x.municipio,x.uf))===m)&&String(x.grupo)===g)?+x.cbs:0),0);\n  const mx=Math.max(...ms.flatMap(m=>mv.leaders.map(L=>cell(m,L.grupo))),1);\n  // No destination column here. This is the AS-IS matrix: every município in it still belongs to the\n  // closing sector, so showing where it is HEADED mixed the two states of the world in one table and\n  // made the ASIS view read like a plan. The destination lives on the map and in \"Municípios → setor\n  // destino\", which are about the to-be.\n  $('#matrix').innerHTML=`<thead><tr><th>Município</th>${mv.leaders.map(L=>`<th title=\"${L.lider}\">${L.grupo}</th>`).join('')}<th>Tot</th></tr></thead><tbody>`\n   +ms.map(m=>`<tr><td>${m}</td>`\n     +mv.leaders.map(L=>{const v=cell(m,L.grupo);return `<td class=\"cell\" style=\"${v?`background:rgba(229,181,63,${.08+v/mx*.5})`:''}\">${v||'·'}</td>`;}).join('')\n     +`<td style=\"font-weight:700\">${fmt(mv.munis[m].cbs)}</td></tr>`).join('')+`</tbody>`;\n}\n// TOBE counterpart of the AS-IS matrix: the same município × grupo grid plus the two columns the AS-IS\n// view deliberately refuses to carry — where the município ends up, and under which líder.\n// \"Líder resultante\" is the líder holding the most CBs in that município. A município is served by several\n// grupos at once and the data names no single owner, so the dominant one is the honest answer and its\n// share is printed beside it instead of being hidden behind a single name.\nfunction renderMatrixTobe(){const mv=SESS.timeline[SESS.selected]; const el=$('#matrixTobe'); const nt=$('#tobeNote');\n  if(!el) return;\n  if(!mv||!mv.munis){ el.innerHTML=''; if(nt) nt.innerHTML=''; return; }\n  const c=computeDerived(mv);\n  const homeOf={}; c.leaders.forEach(L=>{ homeOf[L.grupo]=L.home; });\n  const ms=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__').sort((a,b)=>mv.munis[b].cbs-mv.munis[a].cbs);\n  // One pass over the matrix instead of a scan per cell: the AS-IS table can afford the naive version\n  // on six municípios, but this one asks for the dominant líder too, which multiplies the lookups.\n  const outOf=x=>!mv.geoFeat[mkey(x.municipio,x.uf)];\n  const cellBy={}; mv.matrix.forEach(x=>{ const k=(outOf(x)?'__OUTROS__':mkey(x.municipio,x.uf))+'|'+String(x.grupo);\n    cellBy[k]=(cellBy[k]||0)+ +x.cbs; });\n  const cell=(m,g)=>cellBy[m+'|'+g]||0;\n  const mx=Math.max(...ms.flatMap(m=>mv.leaders.map(L=>cell(m,L.grupo))),1);\n  const domLeader=m=>{ let best=null,bc=0;\n    mv.leaders.forEach(L=>{ const v=cell(m,L.grupo); if(v>bc){ bc=v; best=L; } });\n    return best?{L:best,cbs:bc}:null; };\n  const short=L=>(L.lider||'').split(' ').slice(0,2).join(' ')||('grupo '+L.grupo);\n  // NOT named `rows` — that is the module-level Databricks response helper, and shadowing it inside a\n  // render function is a trap for whoever adds a query here later.\n  const recs=ms.map(m=>{ const d=mv.assign[m]||null, dl=domLeader(m);\n    const home=dl?(homeOf[dl.L.grupo]||null):null;\n    // The mismatch worth seeing: the territory goes to one setor while the líder serving it ends up in\n    // another. Under \"manter vínculo\" those CBs stay with her, which is exactly what \"CBs fora do setor\"\n    // counts — so the → Setor cell carries the warning now that líder is a group footer, not a column.\n    return {m:m,d:d,dl:dl,home:home,off:!!(dl&&home&&d&&home!==d)}; });\n  // Líder resultante is a fact about the GROUP — one líder dominates several municípios at once — not\n  // about any single row. Printing her name on every município she serves said the identical thing\n  // over and over; grouping the table by her and naming her ONCE, as a footer under her municípios,\n  // says it exactly as many times as it is true. Groups sort by the líder's total dominant CBs, with\n  // municípios that have no dominant líder pushed to a trailing group of their own.\n  const groupKey=r=>r.dl?String(r.dl.L.grupo):'__SEM_LIDER__';\n  const groupOrder=[]; const groups={};\n  recs.forEach(r=>{ const k=groupKey(r); if(!groups[k]){ groups[k]=[]; groupOrder.push(k); } groups[k].push(r); });\n  groupOrder.sort((ka,kb)=>{\n    if(ka==='__SEM_LIDER__') return 1; if(kb==='__SEM_LIDER__') return -1;\n    return groups[kb].reduce((a,r)=>a+r.dl.cbs,0)-groups[ka].reduce((a,r)=>a+r.dl.cbs,0);\n  });\n  const totalCols=2+mv.leaders.length+1;\n  el.innerHTML=`<thead><tr><th>Município</th><th>→ Setor</th>${mv.leaders.map(L=>`<th title=\"${esc(L.lider||'')}\">${L.grupo}</th>`).join('')}<th>Tot</th></tr></thead><tbody>`\n   +groupOrder.map(k=>{\n     const rs=groups[k];\n     const body=rs.map(r=>`<tr><td>${r.m}</td>`\n       +`<td${r.off?' style=\"color:var(--closing)\"':''} title=\"${r.off?'a líder desta linha termina noutro setor':''}\">${r.d?`<span class=\"home\" style=\"background:${mv.color[r.d]}\"></span>${r.d}`:'–'}${r.off?' ⚠':''}</td>`\n       +mv.leaders.map(L=>{const v=cell(r.m,L.grupo);return `<td class=\"cell\" style=\"${v?`background:rgba(229,181,63,${.08+v/mx*.5})`:''}\">${v||'·'}</td>`;}).join('')\n       +`<td style=\"font-weight:700\">${fmt(mv.munis[r.m].cbs)}</td></tr>`).join('');\n     const foot=(k==='__SEM_LIDER__')\n       ?`<tr class=\"lider-foot\"><td colspan=\"${totalCols}\" style=\"color:var(--mut);font-style:italic\">nenhuma CB de líder ${rs.length>1?'nestes municípios':'neste município'}</td></tr>`\n       :(()=>{ const L=rs[0].dl.L, home=rs[0].home, cbs=rs.reduce((a,r)=>a+r.dl.cbs,0), offN=rs.filter(r=>r.off).length;\n         return `<tr class=\"lider-foot\"><td colspan=\"${totalCols}\">Líder resultante: <b>${esc(short(L))}</b> <span class=\"badge\">${home||'sem setor'}</span>`\n           +` · grupo ${L.grupo} · ${fmt(cbs)} CBs (dominante em ${rs.length} município${rs.length>1?'s':''})`\n           +(offN?` · <span style=\"color:var(--closing)\">${fmt(offN)} ⚠ fora do setor da líder</span>`:'')+`</td></tr>`; })();\n     return body+foot;\n   }).join('')+`</tbody>`;\n  if(nt){\n    const offN=recs.filter(r=>r.off).length;\n    nt.innerHTML=(mv.policy!=='fora')\n      ? `Política <b>quebrar relação</b>: as CBs deixam a líder atual e passam à estrutura do setor destino — o rodapé de cada grupo mostra quem as atende <b>hoje</b>, não quem assume depois.`\n      : `<b>Líder resultante</b> = a líder com mais CBs no município, mostrada uma vez no rodapé do grupo dela; o chip é o setor onde ela termina. `\n        +(offN?`<span style=\"color:var(--closing)\">${fmt(offN)} município(s) ⚠</span> vão para um setor diferente do da sua líder — as CBs seguem a líder (é disso que o KPI “CBs fora do setor” é feito).`\n          :`Em todos os municípios a líder termina no mesmo setor que recebe o território.`);\n  }\n}\nfunction renderPolicy(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const c=computeDerived(mv);\n  $('#policyNote').innerHTML=mv.policy==='fora'\n    ?`<b style=\"color:var(--acc)\">Mantendo vínculo:</b> ${fmt(c.desloc)} CBs seguem com a líder mas ficam <b>fisicamente noutro setor</b>. Preserva relação; suja geografia.`\n    :`<b style=\"color:var(--acc)\">Quebrando vínculo:</b> ${fmt(c.desloc)} CBs <b>re-vinculam a uma líder do setor destino</b>. Geografia limpa; rompe relação.`;\n}\nfunction renderPlan(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const c=computeDerived(mv);const ms=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__').sort((a,b)=>a.localeCompare(b));\n  mv._plan=ms.map(m=>({municipio:mName(m),uf:mUf(m),cbs:mv.munis[m].cbs,destino:mv.assign[m]}));\n  $('#plan').innerHTML=`Etapa ${SESS.selected+1} · Setor <b>${mv.sector}</b> → ${ms.map(m=>`${m}→<b style=\"color:${mv.color[mv.assign[m]]}\">${mv.assign[m]||'–'}</b>`).join(' · ')}<br>\n   Política: <b>${mv.policy==='fora'?'manter vínculo (CBs fora do setor)':'quebrar relação'}</b> · ${fmt(c.desloc)} CBs impactadas nesta etapa.`\n   +(c.orphanTotal?`<br>Fora da base de dominantes: ${fmt(c.orphanTotal)} CB(s) seguem suas líderes — ${mv.dest.filter(s=>c.orph[s]).map(s=>`${s} (${fmt(c.orph[s])})`).join(' · ')||'–'}${c.orphanStranded?` · <b style=\"color:var(--closing)\">${fmt(c.orphanStranded)} sem líder com destino</b>`:''}. Não entram no CSV, que é por município.`:'');\n}\nfunction renderReport(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const c=computeDerived(mv);\n  mv.metric=mv.metric||'cbs';\n  const KEYS=METRICS_DEF.map(m=>m[0]);\n  const incBy={};mv.dest.forEach(s=>incBy[s]=Object.fromEntries(KEYS.map(k=>[k,0])));\n  Object.entries(mv.munis).forEach(([m,o])=>{if(m==='__OUTROS__')return;const s=mv.assign[m];if(!s||!incBy[s])return;KEYS.forEach(k=>incBy[s][k]+=o[k]||0);});\n  // orphan CBs land on their leader's home sector, not on a geographic destination\n  c.leaders.forEach(L=>{ const om=mv.orphanMetricsByGroup&&mv.orphanMetricsByGroup[L.grupo];\n    if(om&&L.home&&incBy[L.home]) KEYS.forEach(k=>incBy[L.home][k]+=om[k]||0); });\n  const closeTot={};KEYS.forEach(k=>closeTot[k]=Object.entries(mv.munis).filter(([m])=>m!=='__OUTROS__').reduce((a,[,o])=>a+(o[k]||0),0));\n  // they leave the closing sector too, so antes → depois still balances\n  c.leaders.forEach(L=>{ const om=mv.orphanMetricsByGroup&&mv.orphanMetricsByGroup[L.grupo];\n    if(om&&L.home) KEYS.forEach(k=>closeTot[k]+=om[k]||0); });\n  const trend=mv.trend.slice(-6);\n  const chartHTML=mk=>{\n    const isM=['receita','rec_nat','rec_avon'].includes(mk); const fN=isM?money:fmt;\n    const data=mv.dest.map(s=>({label:s,color:mv.color[s],antes:+(mv.baseMetrics[s]?.[mk]||0),depois:+(mv.baseMetrics[s]?.[mk]||0)+(incBy[s]?.[mk]||0)}));\n    data.push({label:mv.sector+'✕',color:'#ff3b30',antes:closeTot[mk]||0,depois:0});\n    const max=Math.max(...data.flatMap(d=>[d.antes,d.depois]),1);\n    const W=720,H=290,base=238,top=42,maxH=base-top,n=data.length,gw=(W-16)/n;\n    let g='';\n    data.forEach((d,i)=>{const cx=8+gw*i+gw/2,bw=Math.min(30,gw*0.30);\n      const ah=d.antes/max*maxH,dh=d.depois/max*maxH,ax=cx-bw-2,dx=cx+2;\n      g+=`<rect x=\"${ax.toFixed(1)}\" y=\"${(base-ah).toFixed(1)}\" width=\"${bw.toFixed(1)}\" height=\"${ah.toFixed(1)}\" rx=\"2.5\" fill=\"${d.color}\" opacity=\"0.35\"/>`;\n      g+=`<rect x=\"${dx.toFixed(1)}\" y=\"${(base-dh).toFixed(1)}\" width=\"${bw.toFixed(1)}\" height=\"${dh.toFixed(1)}\" rx=\"2.5\" fill=\"${d.color}\"/>`;\n      g+=`<text x=\"${(ax+bw/2).toFixed(1)}\" y=\"${(base-ah-4).toFixed(1)}\" text-anchor=\"middle\" font-size=\"9\" fill=\"#9a9aa8\">${fN(d.antes)}</text>`;\n      g+=`<text x=\"${(dx+bw/2).toFixed(1)}\" y=\"${(base-dh-4).toFixed(1)}\" text-anchor=\"middle\" font-size=\"9.5\" font-weight=\"700\" fill=\"${d.color}\">${fN(d.depois)}</text>`;\n      const dp=d.antes?((d.depois-d.antes)/d.antes*100):(d.depois?100:0);\n      g+=`<text x=\"${cx.toFixed(1)}\" y=\"16\" text-anchor=\"middle\" font-size=\"10.5\" font-weight=\"700\" fill=\"${dp>=0?'#34c759':'#ff3b30'}\">${dp>0?'+':''}${dp.toFixed(0)}%</text>`;\n      g+=`<text x=\"${cx.toFixed(1)}\" y=\"${base+16}\" text-anchor=\"middle\" font-size=\"10.5\" font-weight=\"700\" fill=\"#1c1c2b\">${d.label}</text>`;});\n    return `<svg viewBox=\"0 0 ${W} ${H}\" style=\"width:100%\"><line x1=\"8\" y1=\"${base}\" x2=\"${W-8}\" y2=\"${base}\" stroke=\"#e7e7ef\"/>${g}</svg>`;\n  };\n  let h=`<div style=\"display:flex;justify-content:space-between;align-items:center;gap:10px;flex-wrap:wrap\">\n      <h2 style=\"margin:0\">Impacto antes → depois desta etapa</h2>\n      <select id=\"metricSel\">${METRICS_DEF.map(m=>`<option value=\"${m[0]}\" ${m[0]===mv.metric?'selected':''}>${m[1]}</option>`).join('')}</select></div>\n    <div class=\"note\" style=\"margin:2px 0 4px\">Barra clara = <b>antes desta etapa</b> (já incluindo etapas anteriores) · barra cheia = <b>depois</b> · <b style=\"color:var(--acc)\">${mv.sector}✕</b> = setor fechado nesta etapa · % = variação</div>\n    ${chartHTML(mv.metric)}`;\n  h+=`<h2 style=\"margin-top:16px\">Antes → Depois por setor receptor (snapshot congelado)</h2>\n    <div class=\"scroll\"><table><thead><tr><th>Setor</th>${METRICS_DEF.map(m=>`<th>${m[1]}</th>`).join('')}</tr></thead><tbody>`;\n  mv.dest.forEach(s=>{const b=mv.baseMetrics[s]||{};const inc=incBy[s];\n    h+=`<tr><td><span class=\"home\" style=\"background:${mv.color[s]}\"></span>${s}</td>`+\n      METRICS_DEF.map(([k])=>{const bv=+b[k]||0,av=bv+(inc[k]||0);const d=bv?((av-bv)/bv*100):0;const f=METRICS_DEF.find(x=>x[0]===k)[2]==='$'?money:fmt;\n        return `<td>${f(av)}<div class=\"delta ${d>=0?'up':'dn'}\">${d>0?'+':''}${d.toFixed(0)}%</div></td>`;}).join('')+`</tr>`;});\n  h+=`<tr style=\"opacity:.8\"><td>${mv.sector} (sai)</td>`+METRICS_DEF.map(([k,,t])=>`<td>${(t==='$'?money:fmt)(closeTot[k]||0)}</td>`).join('')+`</tr>`;\n  h+=`</tbody></table></div>`;\n  const incLvl={};mv.dest.forEach(s=>incLvl[s]={});\n  Object.keys(mv.munis).forEach(m=>{if(m==='__OUTROS__')return;const s=mv.assign[m];if(!s||!incLvl[s])return;const lv=mv.levelByMuni[m]||{};for(const nv in lv)incLvl[s][nv]=(incLvl[s][nv]||0)+lv[nv];});\n  c.leaders.forEach(L=>{ const ol=mv.orphanLevelByGroup&&mv.orphanLevelByGroup[L.grupo];\n    if(ol&&L.home&&incLvl[L.home]) Object.entries(ol).forEach(([nv,n])=>incLvl[L.home][nv]=(incLvl[L.home][nv]||0)+n); });\n  h+=`<h2 style=\"margin-top:18px\">Consultoras por nível — antes → depois por setor receptor</h2>\n    <div class=\"scroll\"><table><thead><tr><th>Setor</th>${NIVEIS.map(n=>`<th>${n}</th>`).join('')}<th>Total</th></tr></thead><tbody>`;\n  mv.dest.forEach(s=>{const base=mv.baseLevel[s]||{},inc=incLvl[s]||{};let tb=0,ta=0;\n    h+=`<tr><td><span class=\"home\" style=\"background:${mv.color[s]}\"></span>${s}</td>`+\n      NIVEIS.map(nv=>{const b=base[nv]||0,i=inc[nv]||0,a=b+i;tb+=b;ta+=a;\n        return `<td>${a?fmt(a):'·'}${i?`<div class=\"delta up\">+${fmt(i)}</div>`:''}</td>`;}).join('')+\n      `<td style=\"font-weight:700\">${fmt(ta)}${ta-tb?`<div class=\"delta up\">+${fmt(ta-tb)}</div>`:''}</td></tr>`;});\n  h+=`</tbody></table></div><div class=\"note\">Número = CBs por nível <b>depois</b> desta etapa · <span style=\"color:var(--ok)\">+N</span> = entrantes do ${mv.sector}.</div>`;\n  const spk=(key)=>{const vals=trend.map(t=>+t[key]||0);const mx=Math.max(...vals,1);\n    return `<div class=\"spark\">${vals.map(v=>`<div class=\"b\" style=\"height:${(v/mx*100).toFixed(0)}%\" title=\"${fmt(v)}\"></div>`).join('')}</div>\n      <div class=\"note\">${trend.map(t=>String(t.ciclo).slice(-2)).join(' · ')}</div>`;};\n  h+=`<h2 style=\"margin-top:18px\">Setor ${mv.sector} — últimos ${trend.length} ciclos até o snapshot congelado</h2>\n    <div class=\"note\" style=\"margin:-4px 0 8px\">Tendência histórica <b>do próprio setor</b> — não ajustada pela absorção hipotética de etapas anteriores (limitação conhecida: tendência é por setor, não decomponível por município).</div>\n    <div style=\"display:grid;grid-template-columns:repeat(4,1fr);gap:10px\">\n    ${[['cbs','CBs'],['ativas','Ativas'],['receita','Receita'],['pontos','Pontos']].map(([k,l])=>`<div><div class=\"note\" style=\"margin:0 0 3px;font-weight:600;color:var(--ink)\">${l}</div>${spk(k)}</div>`).join('')}</div>`;\n  $('#tab-report').innerHTML=h;\n  const sel=$('#metricSel'); if(sel) sel.onchange=()=>{mv.metric=sel.value; renderReport();};\n}\nfunction renderCumulative(){\n  const el=$('#tab-cumulative'); if(!el) return;\n  if(!SESS.timeline.length){ el.innerHTML='<div class=\"note\">Nenhuma etapa na timeline ainda.</div>'; return; }\n  const ready=SESS.timeline.every(mv=>mv.munis);\n  if(!ready){ el.innerHTML='<div class=\"note\">Aguardando etapas terminarem de calcular…</div>'; return; }\n  const finalWorld=foldWorldState(SESS.timeline,SESS.timeline.length);\n  const openSectors=[...new Set(Object.values(finalWorld.muniOverride))];\n  let h=`<h2 style=\"margin:0 0 8px\">Linha do tempo — ${SESS.timeline.length} fechamento(s)</h2>\n    <div class=\"note\" style=\"margin:-2px 0 10px\">Setores fechados, em ordem: ${SESS.timeline.map(mv=>mv.sector).join(' → ')}. Cada linha abaixo soma o efeito de <b>toda a cadeia</b>, não apenas da última etapa.</div>`;\n  h+=`<div class=\"scroll\"><table><thead><tr><th>Setor</th><th>Situação</th>${METRICS_DEF.map(([,l])=>`<th>${l}</th>`).join('')}</tr></thead><tbody>`;\n  SESS.timeline.forEach((mv,i)=>{\n    h+=`<tr style=\"opacity:.75\"><td>${mv.sector}</td><td>fechado (etapa ${i+1})</td>`+METRICS_DEF.map(([k,,t])=>`<td>${(t==='$'?money:fmt)(mv.pureOwnMetrics?.[k]||0)}</td>`).join('')+`</tr>`;\n  });\n  openSectors.forEach(s=>{\n    const base=SESS.sectorBaseCache[s]||{};\n    const infl=finalWorld.sectorInflow[s]||{};\n    h+=`<tr><td>${s}</td><td>recebeu território</td>`+METRICS_DEF.map(([k,,t])=>{\n      const bv=+base[k]||0, av=bv+(infl[k]||0); const d=bv?((av-bv)/bv*100):0; const f=(t==='$'?money:fmt);\n      return `<td>${f(av)}<div class=\"delta ${d>=0?'up':'dn'}\">${d>0?'+':''}${d.toFixed(0)}%</div></td>`;\n    }).join('')+`</tr>`;\n  });\n  h+=`</tbody></table></div><div class=\"note\">\"Antes\" de um setor receptor é o snapshot congelado (sem nenhum fechamento aplicado); \"depois\" soma tudo que a cadeia inteira jogou pra ele.</div>`;\n  el.innerHTML=h;\n}\nfunction project(feats){let mnx=1/0,mny=1/0,mxx=-1/0,mxy=-1/0;\n  const each=cb=>feats.forEach(f=>{const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];ps.forEach(p=>p.forEach(r=>r.forEach(cb)));});\n  each(p=>{mnx=Math.min(mnx,p[0]);mxx=Math.max(mxx,p[0]);mny=Math.min(mny,p[1]);mxy=Math.max(mxy,p[1]);});\n  const mlat=(mny+mxy)/2,kx=Math.cos(mlat*Math.PI/180),W=700,H=500,pad=22;\n  const gw=(mxx-mnx)*kx,gh=(mxy-mny),sc=Math.min((W-2*pad)/gw,(H-2*pad)/gh);\n  const ox=(W-gw*sc)/2,oy=(H-gh*sc)/2;\n  return p=>[ox+(p[0]-mnx)*kx*sc, oy+(mxy-p[1])*sc];\n}\nfunction pathFor(f,pr){const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];\n  return ps.map(poly=>poly.map(r=>'M'+r.map(p=>{const q=pr(p);return q[0].toFixed(1)+','+q[1].toFixed(1);}).join('L')+'Z').join('')).join('');}\nfunction cxy(f,pr){let x=0,y=0,n=0;const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];ps.forEach(poly=>poly[0].forEach(p=>{const q=pr(p);x+=q[0];y+=q[1];n++;}));return[x/n,y/n];}\n// ---------- label placement ----------\n// Pole of inaccessibility: the interior point farthest from ANY boundary of the dissolved area. A\n// centroid is only a mean — on a concave sector, one split across a river, or a member whose vertex\n// average falls in a bay, it lands outside the very territory it is supposed to name, which is what\n// pushed the sector numbers off their own shapes. Even-odd across every ring of every member is a\n// correct union test here because municipalities tile rather than overlap.\n// The search box is clipped to the viewBox, so the result is inside the territory AND on screen.\n// Rings are decimated first — this is a label, not a measurement — which keeps a 20-município sector\n// to a few million ops, and the result is cached per stage: geometry never changes between renders,\n// only the fill does.\nfunction labelPointFor(fs,pr){\n  const rings=[];\n  (fs||[]).forEach(f=>{ if(!f||!f.geometry) return;\n    const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];\n    ps.forEach(poly=>poly.forEach(r=>{\n      if(!r||r.length<4) return;\n      const step=Math.max(1,Math.floor(r.length/120)),pts=[];\n      for(let i=0;i<r.length;i+=step) pts.push(pr(r[i]));\n      if(pts.length>3) rings.push(pts);\n    }));});\n  if(!rings.length) return null;\n  let mnx=1/0,mny=1/0,mxx=-1/0,mxy=-1/0;\n  rings.forEach(r=>r.forEach(p=>{ if(p[0]<mnx)mnx=p[0]; if(p[0]>mxx)mxx=p[0]; if(p[1]<mny)mny=p[1]; if(p[1]>mxy)mxy=p[1]; }));\n  mnx=Math.max(mnx,2); mny=Math.max(mny,2); mxx=Math.min(mxx,698); mxy=Math.min(mxy,498);\n  if(!(mxx>mnx&&mxy>mny)) return null;\n  const inside=(x,y)=>{ let c=false;\n    for(const r of rings) for(let i=0,j=r.length-1;i<r.length;j=i++){ const a=r[i],b=r[j];\n      if(((a[1]>y)!==(b[1]>y)) && (x<(b[0]-a[0])*(y-a[1])/(b[1]-a[1])+a[0])) c=!c; }\n    return c; };\n  const edgeDist=(x,y)=>{ let m=Infinity;\n    for(const r of rings) for(let i=0,j=r.length-1;i<r.length;j=i++){ const a=r[i],b=r[j];\n      const dx=b[0]-a[0],dy=b[1]-a[1],L=dx*dx+dy*dy;\n      let t=L?(((x-a[0])*dx+(y-a[1])*dy)/L):0; t=t<0?0:(t>1?1:t);\n      const ex=a[0]+t*dx-x,ey=a[1]+t*dy-y,d=ex*ex+ey*ey; if(d<m)m=d; }\n    return Math.sqrt(m); };\n  const W=mxx-mnx,H=mxy-mny,N=26;\n  let best=null,bd=-1;\n  for(let i=0;i<=N;i++) for(let j=0;j<=N;j++){\n    const x=mnx+W*i/N,y=mny+H*j/N;\n    if(!inside(x,y)) continue;\n    const d=edgeDist(x,y); if(d>bd){ bd=d; best=[x,y]; }\n  }\n  if(!best) return null;\n  // Hill-climb off the coarse grid: the grid only has to land somewhere in the right lobe, the\n  // refinement finds the deep point inside it — halving the step whenever no neighbour improves.\n  let step=Math.max(W,H)/N/2;\n  for(let k=0;k<7;k++){\n    let moved=false;\n    for(const o of [[1,0],[-1,0],[0,1],[0,-1],[1,1],[1,-1],[-1,1],[-1,-1]]){\n      const x=best[0]+o[0]*step,y=best[1]+o[1]*step;\n      if(x<mnx||x>mxx||y<mny||y>mxy||!inside(x,y)) continue;\n      const d=edgeDist(x,y); if(d>bd){ bd=d; best=[x,y]; moved=true; }\n    }\n    if(!moved) step/=2;\n  }\n  // The clearance travels with the point: it is the radius of the largest circle that fits inside the\n  // territory there, which is exactly the budget a caller needs to decide how much text will fit.\n  return {p:best,r:bd};\n}\nfunction labelPointOf(mv,key,fs,pr){\n  if(!mv._lbl) mv._lbl={};\n  if(!(key in mv._lbl)) mv._lbl[key]=labelPointFor(fs,pr);\n  return mv._lbl[key];\n}\nfunction drawMap(){\n  const mv=SESS.timeline[SESS.selected]; const svg=$('#map'); const ignNote=$('#mapIgnoredNote');\n  if(!mv){ svg.innerHTML=''; if(ignNote) ignNote.innerHTML=''; return; }\n  const c=computeDerived(mv);const NS='http://www.w3.org/2000/svg'; svg.innerHTML='';\n  const feats=[...mv.nbrFeat,...Object.values(mv.geoFeat)]; if(!feats.length) return;\n  const pr=project(feats);\n  const world=foldWorldState(SESS.timeline,SESS.selected);\n  // The context layer is ONE area per SECTOR, not one shape per município. The unit of this decision\n  // is the destination sector; a scatter of individually outlined municipalities carrying their own\n  // names invited exactly the wrong reading of the map. Members of a sector are filled AND stroked in\n  // the same colour, so the shared borders vanish and the group reads as a single dissolved\n  // territory — the IBGE shapes do not share vertices precisely enough to extract a clean union\n  // outline, and carrying a real polygon-clipping union for a context layer is not worth it.\n  // Labels are COLLECTED here and drawn last, after every path. Drawn inline they were buried by the\n  // next sector's fill, and placement cannot avoid a collision it has not seen yet.\n  const labels=[],placed=[];\n  const textW=(s,fs)=>String(s).length*fs*0.56;\n  // WCAG relative luminance of the fill a label sits on, so ink and halo can invert per label. \"Would\n  // white be better?\" has no single answer on this map: white reads on #5856d6 (L≈0.14) and disappears\n  // on #ff9500 and #34c759 (both L≈0.43, where black wins ~9:1 against white's ~2.2:1) and on every\n  // context fill, which is .32 opacity over white. Decided per label, never globally.\n  const lum=col=>{let h=String(col||'').replace('#','');\n    if(h.length===3) h=h[0]+h[0]+h[1]+h[1]+h[2]+h[2];\n    if(h.length!==6) return 1;\n    const c=[0,2,4].map(i=>parseInt(h.slice(i,i+2),16)/255)\n      .map(v=>v<=0.03928?v/12.92:Math.pow((v+0.055)/1.055,2.4));\n    return 0.2126*c[0]+0.7152*c[1]+0.0722*c[2];};\n  // Centred on (x,y) in BOTH axes. The old box hung off the first line's baseline, so every two-line\n  // label sat half its own height below the point it was supposed to mark.\n  const rectOf=(x,y,lines)=>{const w=Math.max.apply(null,lines.map(l=>textW(l.t,l.size)));\n    const h=lines.reduce((a,l)=>a+l.size*1.2,0);\n    return {x1:x-w/2-2.5,x2:x+w/2+2.5,y1:y-h/2-1.5,y2:y+h/2+1.5};};\n  const nbrBySec={};\n  mv.nbrFeat.forEach(f=>{\n    const nm=mkey(f.properties.name||f.properties.NOME||f.properties.nome||'',f.__uf);\n    const s=String((mv.nbrCurrentSector&&mv.nbrCurrentSector[nm])||'');\n    (nbrBySec[s]=nbrBySec[s]||[]).push(f);\n  });\n  Object.keys(nbrBySec).forEach(s=>{\n    const fs=nbrBySec[s];\n    const isDest=!!s&&mv.dest.includes(s);\n    const closedCtx=!!s&&world.closedSectors.has(s);\n    const col=isDest?(mv.color[s]||null):null;\n    fs.forEach(f=>{\n      const p=document.createElementNS(NS,'path');\n      p.setAttribute('d',pathFor(f,pr));\n      p.setAttribute('class','sect'+(isDest?'':(closedCtx?' closed-ctx':' plain')));\n      if(col){ p.setAttribute('fill',col); p.setAttribute('stroke',col); }\n      svg.appendChild(p);\n    });\n    if(!s) return;\n    // One number per sector, at the pole of inaccessibility of its DISSOLVED area — the whole group\n    // of members at once, not a representative member, so the number sits in the visual middle of the\n    // territory the operator actually sees.\n    const lp=labelPointOf(mv,'s:'+s,fs,pr);\n    // Context areas always read LIGHT — .sect paints dest colours at fill-opacity .32 over white, and\n    // plain/closed-ctx are near-white greys — so a sector number never wants white ink, whatever colour\n    // the sector itself was assigned.\n    if(lp&&lp.p) labels.push({anchor:lp.p,big:true,dark:false,lines:[{t:s,size:11.5,weight:700}]});\n  });\n  const asis=mv.view==='asis';\n  // The UF prefix is information only when the stage actually straddles a border. On a single-UF setor\n  // it is the same three characters repeated on every label — a large share of the clutter and none of\n  // the meaning. The hover tooltip carries the UF either way.\n  const showUf=new Set(Object.keys(mv.geoFeat).map(k=>mUf(k)).filter(Boolean)).size>1;\n  Object.entries(mv.geoFeat).forEach(([m,f])=>{const p=document.createElementNS(NS,'path');p.setAttribute('d',pathFor(f,pr));\n    const fillCol=asis?CLOSE_COLOR:(mv.color[mv.assign[m]]||'#444');\n    p.setAttribute('class','muni');p.setAttribute('fill',fillCol);\n    if(!asis) p.onclick=()=>{editSelected(m2=>{const i=m2.dest.indexOf(m2.assign[m]);if(m2.dest.length)m2.assign[m]=m2.dest[(i+1)%m2.dest.length];m2.selMuni=m;});};\n    p.style.cursor=asis?'default':'pointer';\n    p.onmousemove=e=>{const t=$('#tip');t.style.opacity=1;t.style.left=(e.clientX+12)+'px';t.style.top=(e.clientY+12)+'px';\n      t.innerHTML=asis?`<b>${mDisp(m)}</b><br>${fmt(mv.munis[m]?.cbs||0)} CBs · setor ${mv.sector}`:`<b>${mDisp(m)}</b><br>${fmt(mv.munis[m]?.cbs||0)} CBs → ${mv.assign[m]||'–'}<br><span style=\"color:var(--mut)\">clique p/ trocar</span>`;};\n    p.onmouseleave=()=>$('#tip').style.opacity=0;svg.appendChild(p);\n    // The name is never cut and never dropped. The pole of inaccessibility is still where the label\n    // WANTS to sit — the visual middle of the territory rather than a centroid that can fall outside a\n    // concave shape — but its clearance no longer gates anything: cutting BA-SAO SEBASTIAO DO PASSE\n    // down to BA-SAO SEBAST saved space by destroying the one thing the label existed to convey, and\n    // measuring the name against the inscribed circle rejected the centre for nearly every município.\n    const lp=labelPointOf(mv,'m:'+m,[f],pr);\n    const at=(lp&&lp.p)||cxy(f,pr);\n    const nmFull=(showUf&&mUf(m)?mUf(m)+'-':'')+mName(m);\n    const num=fmt(mv.munis[m]?.cbs||0)+(asis?'':'·'+(mv.assign[m]||'–'));\n    labels.push({anchor:at,cbs:+(mv.munis[m]?.cbs||0),dark:lum(fillCol)<0.18,\n      lines:[{t:nmFull,size:8.2,weight:700},{t:num,size:7,weight:500,mut:true}]});\n  });\n  // Placement, not de-cluttering. Every label IS drawn: it starts at its anchor and, if the text does\n  // not fit the territory or the slot is already taken, walks outward ring by ring until it finds\n  // clear canvas, trailing a hairline leader back to the shape it names. The previous pass dropped the\n  // loser of every collision outright, which is why municípios silently had no name at all.\n  // Order still matters — sector numbers first, then municípios by CB weight — because the earlier a\n  // label is placed the closer to home it lands.\n  const CW=700,CH=500,CPAD=2;\n  const inBounds=r=>r.x1>=CPAD&&r.x2<=CW-CPAD&&r.y1>=CPAD&&r.y2<=CH-CPAD;\n  const hits=r=>placed.reduce((a,q)=>a+((r.x2<q.x1||r.x1>q.x2||r.y2<q.y1||r.y1>q.y2)?0:1),0);\n  // Ring 0 is the anchor itself. Rings step 9u out over 16 directions, stretched horizontally because\n  // a label is wider than it is tall and sideways room is the room it actually needs.\n  const CAND=[[0,0]];\n  for(let ring=1;ring<=7;ring++){ const d=ring*9;\n    for(let a=0;a<16;a++){ const th=a*Math.PI/8; CAND.push([Math.cos(th)*d*1.35,Math.sin(th)*d]); } }\n  labels.sort((a,b)=>(b.big?1:0)-(a.big?1:0)||((b.cbs||0)-(a.cbs||0)));\n  labels.forEach(L=>{\n    let chosen=null,best=null,bestN=Infinity;\n    // Centred on the anchor is ALWAYS the first choice. An earlier cut here refused the anchor whenever\n    // the text was wider than the município's inscribed circle — true of almost every real name at this\n    // scale (BA-SAO SEBASTIAO DO PASSE is ~140u against ~80u of clearance), so every single label got\n    // nudged outside and nothing ended up centred on anything. Spilling past a border is normal on a\n    // choropleth and the halo keeps it readable; only a genuine COLLISION earns a move.\n    for(const off of CAND){\n      const x=L.anchor[0]+off[0], y=L.anchor[1]+off[1];\n      const r=rectOf(x,y,L.lines);\n      if(!inBounds(r)) continue;\n      const n=hits(r);\n      if(!n){ chosen={x,y,r,off}; break; }\n      // No clear slot yet — remember the LEAST crowded one. Falling back to the first in-bounds\n      // candidate meant falling back to the anchor every time, so a crowded map piled every loser onto\n      // the same point. CAND is ordered nearest-first and the compare is strict, so ties keep the\n      // closest slot.\n      if(n<bestN){ bestN=n; best={x,y,r,off}; }\n    }\n    // Canvas genuinely full: take the nearest in-bounds slot and accept the overlap. A label sitting\n    // on top of another is recoverable by eye; a name that was never drawn is not.\n    if(!chosen) chosen=best||{x:L.anchor[0],y:L.anchor[1],r:rectOf(L.anchor[0],L.anchor[1],L.lines),off:[0,0]};\n    placed.push(chosen.r);\n    const g=document.createElementNS(NS,'g'); g.setAttribute('class','lbl'+(L.big?' big':''));\n    if(Math.abs(chosen.off[0])>0.5||Math.abs(chosen.off[1])>0.5){\n      // The leader stops at the label's edge rather than its centre, so it never runs under the glyphs.\n      const cx=(chosen.r.x1+chosen.r.x2)/2, cy=(chosen.r.y1+chosen.r.y2)/2;\n      const hw=(chosen.r.x2-chosen.r.x1)/2, hh=(chosen.r.y2-chosen.r.y1)/2;\n      const dx=L.anchor[0]-cx, dy=L.anchor[1]-cy;\n      const tt=Math.min(dx?hw/Math.abs(dx):Infinity, dy?hh/Math.abs(dy):Infinity);\n      const ln=document.createElementNS(NS,'line'); ln.setAttribute('class','lead');\n      ln.style.stroke=L.dark?'#fff':'#1c1c1e';\n      ln.setAttribute('x1',L.anchor[0].toFixed(1)); ln.setAttribute('y1',L.anchor[1].toFixed(1));\n      ln.setAttribute('x2',(cx+dx*tt).toFixed(1)); ln.setAttribute('y2',(cy+dy*tt).toFixed(1));\n      g.appendChild(ln);\n    }\n    const hTot=L.lines.reduce((a,l)=>a+l.size*1.2,0);\n    let ty=chosen.y-hTot/2+L.lines[0].size*0.86;\n    // Inline style rather than a class: a stylesheet rule would outrank a presentation attribute and\n    // undo the per-label contrast decision made above.\n    const ink=L.dark?'#fff':'#1c1c1e', inkMut=L.dark?'rgba(255,255,255,.85)':'#48484d';\n    const halo=L.dark?'rgba(0,0,0,.6)':'#fff';\n    L.lines.forEach(l=>{ const t=document.createElementNS(NS,'text');\n      t.setAttribute('x',chosen.x.toFixed(1)); t.setAttribute('y',ty.toFixed(1));\n      t.setAttribute('font-size',l.size); t.setAttribute('font-weight',l.weight||600);\n      t.style.fill=l.mut?inkMut:ink; t.style.stroke=halo;\n      t.textContent=l.t; g.appendChild(t); ty+=l.size*1.2; });\n    svg.appendChild(g);\n  });\n  $('#legend').innerHTML=asis\n    ?`<span><b style=\"background:${CLOSE_COLOR}\"></b>Setor ${mv.sector} (estrutura antes desta etapa — ${Object.keys(mv.geoFeat).length} municípios)</span>`\n    // No \"vizinhos (contexto)\" or \"setor já fechado antes\" entry any more: every feature still drawn\n    // belongs to a destination sector, so .sect.plain and .sect.closed-ctx can no longer be produced\n    // and a legend key for them would point at nothing on the map.\n    :mv.dest.map(s=>`<span><b style=\"background:${mv.color[s]}\"></b>Setor ${s} — ${c.gained[s]} líder(es)</span>`).join('');\n  // Municipalities outside the dominance base are deliberately NOT drawn — no shape, no hover, no\n  // legend entry. They are reported in the panel instead, so the map only ever shows territory that\n  // is actually being reallocated.\n  if(ignNote) ignNote.innerHTML=(mv.excludedMunis&&mv.excludedMunis.length)\n    ? `<b style=\"color:var(--closing)\">${fmt(mv.excludedMunis.length)} município(s) / ${fmt(mv.excludedCbs||0)} CBs</b> fora da base de dominantes deste setor não são desenhados no mapa — as CBs seguem a líder do seu grupo (detalhe em “Municípios → setor destino”).`\n    : '';\n}\nasync function runSql(){const sql=$('#sqlIn').value.trim();$('#sqlStatus').textContent='rodando…';$('#sqlStatus').classList.remove('err');\n  try{ await ensurePinned(); const resp=await q(sql);const rs=rows(resp);const cols=(resp.manifest?.schema?.columns||[]).map(c=>c.name);\n    $('#sqlOut').innerHTML=`<thead><tr>${cols.map(c=>`<th>${c}</th>`).join('')}</tr></thead><tbody>`+rs.slice(0,200).map(r=>`<tr>${cols.map(c=>`<td>${r[c]??'·'}</td>`).join('')}</tr>`).join('')+`</tbody>`;\n    $('#sqlStatus').textContent=rs.length+' linha(s)';}\n  catch(e){$('#sqlStatus').textContent='bloqueado/erro: '+e.message;$('#sqlStatus').classList.add('err');}\n}\nfunction renderAll(){\n  renderStage();\n  renderTimeline(); renderSectorPicker();\n  const shb=$('#openShare'); if(shb) shb.disabled=!SESS.timeline.length;\n  const dpb=$('#dupSession'); if(dpb) dpb.disabled=!SESS.timeline.length;\n  const mv=SESS.timeline[SESS.selected];\n  // resolveSnapshotPin falls back to a live sub-select when it cannot pin a literal; saying\n  // \"congelado\" in that case would be a lie, so the pill reports what is actually in the SQL.\n  const pinned=SESS.snapLiteral && !/^\\(SELECT/i.test(SESS.snapLiteral);\n  $('#liveState').textContent = SESS.snapshotRaw\n    ? (pinned?'● snapshot congelado · ':'◍ snapshot ao vivo (não fixado) · ')+'atualizado em '+fmtSyncedAt(SESS.snapshotSyncedAt)+' · ↻'\n    : '● iniciando';\n  const mp=$('#basePill');\n  if(mp){\n    const warn=[];\n    if(DOM.bySetor&&!DOM.hasUf) warn.push('⚠ sem coluna UF');\n    if(DOM.badUf) warn.push('⚠ '+fmt(DOM.badUf)+' UF não reconhecida(s)');\n    if(DOM.clashes) warn.push('⚠ '+fmt(DOM.clashes)+' homônimo(s) no mesmo setor');\n    mp.textContent=DOM.bySetor?('◇ base dominantes: '+fmt(DOM.setores)+' setores · '+fmt(DOM.rows)+' municípios'+(warn.length?' · '+warn.join(' · '):'')):(DOM.error?'◇ base dominantes: indisponível':'◇ base dominantes: carregando…');\n    mp.title=DOM.error||(DOM.bySetor?((DOM.hasUf\n        ?('Coluna de UF usada: \"'+DOM.ufCol+'\".')\n        :('SEM coluna de UF. Colunas lidas: '+((DOM.headers||[]).join(' | ')||'?')+'. A UF de cada município vem desta base — sem ela, homônimos voltam a ser casados só pelo nome.'))\n      +(DOM.badUf?('\\n'+DOM.badUf+' linha(s) com UF irreconhecível — tratadas como desconhecida.'):'')\n      +(DOM.clashes?('\\n'+DOM.clashes+' município(s) aparecem no mesmo setor com UFs diferentes. O SQL agrupa só por DS_MUNICIPIO, então esses chegam somados numa linha única e não há como separá-los.'):'')\n      ):'')||DOM.url||''; }\n  const rp=$('#rulePill'); if(rp) rp.textContent='◈ destino: '+ruleShort(SESS.settings);\n  const sp=$('#spanPill'); if(sp) sp.textContent='◎ span: '+spanShort(SESS.settings);\n  renderRuleNote(); renderSpanRule();\n  if(!mv){ ['#map','#matrix','#matrixTobe','#tobeNote','#leaders'].forEach(s=>{const el=$(s);if(el)el.innerHTML='';}); $('#kpis').innerHTML=''; $('#spans').innerHTML=''; $('#muniList').innerHTML=''; $('#plan').innerHTML=''; return; }\n  $('#mapTitle').textContent=`Etapa ${SESS.selected+1}/${SESS.timeline.length} — fechando setor ${mv.sector}`;\n  $('#viewToggle').querySelectorAll('button').forEach(b=>b.classList.toggle('on',b.dataset.v===mv.view));\n  $('#policy').querySelectorAll('button').forEach(b=>b.classList.toggle('on',b.dataset.p===mv.policy));\n  $('#optBadge').textContent=mv.optBadge||'';\n  drawMap(); renderContig(); renderSpanRule(); renderKpis(); renderSpans(); renderMuni(); renderLeaders(); renderMatrix(); renderMatrixTobe(); renderPolicy(); renderPlan(); renderReport(); renderCumulative();\n}\n\n// ---------- event wiring ----------\n$('#go').onclick=()=>addMovement($('#sectorPick').value);\n$('#confirmSnap').onclick=()=>{ SESS.stage='main'; renderAll(); };\n$('#rand').onclick=()=>{\n  const closed=new Set(SESS.timeline.map(mv=>mv.sector));\n  const pool=SESS.sectorsList.filter(s=>!closed.has(s.setor));\n  const cand=pool.filter(s=>s.munis>=3&&s.munis<=10&&s.cbs>300);\n  const list=cand.length?cand:pool; if(!list.length) return;\n  const pick=list[Math.floor(Math.random()*list.length)];\n  $('#sectorPick').value=pick.setor;\n  addMovement(pick.setor);\n};\n$('#sectorPick').addEventListener('keydown',e=>{ if(e.key==='Enter') addMovement($('#sectorPick').value); });\n$('#confirmSessionPick').onchange=()=>loadSession($('#confirmSessionPick').value);\n$('#optim').onclick=()=>editSelected(mv=>{ mv.assign=optimizeFor(mv); });\n$('#autoTobe').onclick=()=>editSelected(mv=>{ mv.assign=autoAssignFor(mv); mv.optBadge='TOBE por adjacência'; });\n$('#viewToggle').querySelectorAll('button').forEach(b=>b.onclick=()=>{const mv=SESS.timeline[SESS.selected];if(!mv)return;mv.view=b.dataset.v;renderAll();});\n$('#policy').querySelectorAll('button').forEach(b=>b.onclick=()=>{const mv=SESS.timeline[SESS.selected];if(!mv)return;mv.policy=b.dataset.p;renderKpis();renderPolicy();renderPlan();});\nroot.querySelectorAll('.tabs button').forEach(b=>b.onclick=()=>{root.querySelectorAll('.tabs button').forEach(x=>x.classList.toggle('on',x===b));\n  ['matrix','tobe','report','cumulative','sql'].forEach(t=>$('#tab-'+t).classList.toggle('hidden',t!==b.dataset.tab));});\n$('#runSql').onclick=runSql;\n$('#copyPlan').onclick=()=>{const mv=SESS.timeline[SESS.selected];if(!mv)return;navigator.clipboard.writeText(JSON.stringify({setor:mv.sector,politica:mv.policy,plano:mv._plan},null,2));$('#copyPlan').textContent='copiado ✓';setTimeout(()=>$('#copyPlan').textContent='Copiar',1500);};\n$('#csvPlan').onclick=()=>{const mv=SESS.timeline[SESS.selected];if(!mv)return;const csv='municipio,uf,cbs,setor_destino\\n'+mv._plan.map(p=>`${p.municipio},${p.uf||''},${p.cbs},${p.destino}`).join('\\n');\n  const a=document.createElement('a');a.href=URL.createObjectURL(new Blob([csv],{type:'text/csv'}));a.download=`plano_migracao_setor_${mv.sector}.csv`;a.click();};\n$('#saveSession').onclick=saveSession;\n$('#dupSession').onclick=duplicateSession;\n$('#sessionPick').onchange=()=>loadSession($('#sessionPick').value);\n$('#liveState').onclick=refreshSnapshot;\n$('#liveState').addEventListener('keydown',e=>{ if(e.key==='Enter'||e.key===' '){ e.preventDefault(); refreshSnapshot(); } });\n$('#openOptions').onclick=openOptions;\n$('#optClose').onclick=closeOptions;\n$('#optCancel').onclick=closeOptions;\n$('#optApply').onclick=applyOptions;\n$('#optMinCbs').addEventListener('input',renderOptPreview);\n['#optTargetSpan','#optMaxSpan','#optMinSpan'].forEach(id=>$(id).addEventListener('input',renderOptPreview));\nroot.querySelectorAll('input[name=\"destRule\"]').forEach(r=>r.addEventListener('change',renderOptPreview));\n$('#optionsBg').addEventListener('click',e=>{ if(e.target.id==='optionsBg') closeOptions(); });\nroot.addEventListener('keydown',e=>{ if(e.key==='Escape'){ closeOptions(); closeShare(); } });\n\n$('#openShare').onclick=openShare;\n$('#shareX').onclick=closeShare;\n$('#shareCancel').onclick=closeShare;\n$('#shareGo').onclick=doShare;\n$('#shareCopy').onclick=()=>{ if(!SHARE.url) return; navigator.clipboard.writeText(SHARE.url);\n  const b=$('#shareCopy'); if(b){ b.textContent='copiado ✓'; setTimeout(()=>{ const x=$('#shareCopy'); if(x) x.textContent='Copiar link'; },1500); } };\n$('#shareOpen').onclick=()=>{ if(SHARE.url) window.open(SHARE.url,'_blank'); };\n$('#shareBg').addEventListener('click',e=>{ if(e.target.id==='shareBg') closeShare(); });\n\n// ---------- init ----------\n(async()=>{\n  loader(true,'congelando snapshot da sessão…');\n  try{\n    await Promise.all([ensurePinned(), loadSectors(), refreshSessionPicker()]);\n    SESS.stage='confirm';\n  }catch(e){ setError('erro init: '+e.message); }\n  finally{ loader(false); renderAll(); const rd=$('#ready'); if(rd) rd.setAttribute('data-loaded','1'); }\n})();\n\n  }\n}\n","at":"2026-08-12T17:30:10.427Z"},"extends":"data2-core-primitives@Block"},"updatedAt":"2026-08-12T17:30:10.565Z","createdAt":"2026-08-12T16:44:39.589Z"},{"_id":"6a7d08050c6a9916bf509fb5","component":"data2-core-types@Component","system":"6a57cfe9673eb7e3c5e57784","params":{"component":"xoLKR_Mb_n2vkwfmdExLH","package":"natura-geomarketing","title":"Timeline de fechamentos v3","extends":"data2-core-primitives@Block","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"sessionsDataset":{"component":"data2-core-types@InteractiveModuleReference"},"dominantesCsvUrl":{"component":"data2-core-types@FileComponentUrlReference"}}}},"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"const T='product.perfil_cb.crm_perfil_cb_diaria_historico';\nconst ELO='product.elo_modelo_combinado.commercial_consultant_index';\nconst PALETTE=['#5856d6','#ff9500','#34c759','#af52de','#ff2d55','#a2845e'];\nconst CLOSE_COLOR='#8e8e93';\nconst UF_CODE={RO:'11',AC:'12',AM:'13',RR:'14',PA:'15',AP:'16',TO:'17',MA:'21',PI:'22',CE:'23',RN:'24',PB:'25',PE:'26',AL:'27',SE:'28',BA:'29',MG:'31',ES:'32',RJ:'33',SP:'35',PR:'41',SC:'42',RS:'43',MS:'50',MT:'51',GO:'52',DF:'53'};\nconst UF_BORDERS={AC:['AM','RO'],AL:['BA','PE','SE'],AM:['AC','RO','RR','PA','MT'],AP:['PA'],\n BA:['AL','SE','PE','PI','TO','GO','MG','ES'],CE:['PI','PB','PE','RN'],DF:['GO','MG'],\n ES:['BA','MG','RJ'],GO:['DF','MT','MS','MG','BA','TO'],MA:['PA','TO','PI'],\n MG:['BA','GO','DF','MS','SP','RJ','ES'],MS:['MT','GO','MG','SP','PR'],MT:['RO','AM','PA','TO','GO','MS'],\n PA:['AP','AM','MT','TO','MA','RR'],PB:['RN','CE','PE'],PE:['PB','CE','PI','BA','AL'],\n PI:['MA','TO','BA','PE','CE'],PR:['SP','MS','SC'],RJ:['ES','MG','SP'],RN:['CE','PB'],\n RO:['AC','AM','MT'],RR:['AM','PA'],RS:['SC'],SC:['PR','RS'],SE:['BA','AL'],\n SP:['MG','RJ','PR','MS'],TO:['PA','MA','PI','BA','GO','MT']};\nconst NIVEIS=['Bronze','Cristal','Prata','Ouro','Diamante','Diamante+'];\nconst METRICS_DEF=[['cbs','CBs'],['ativas','Ativas'],['pedidos','Pedidos'],['pontos','Pontos'],['receita','Receita','$'],['rec_nat','Rec. Natura','$'],['rec_avon','Rec. Avon','$']];\nconst OPT_K=1.5;\nconst SESSIONS_DS='timeline-shared-sessionsDataSet';   // same table as SHARED_DS — see notes at listSessions()\n// Span defaults are the real operating band for a setor receptor, not placeholders: 2200 ≤ span ≤ 3500\n// with 2700 as the target. null meant \"sem limite\", so every new session started with the optimiser\n// balancing against nothing. Existing sessions are NOT touched — their persisted settings carry explicit\n// values that spread OVER these in openOptions/applyOptions, which is deliberate: their etapas were\n// computed under the old band and changing it silently would leave the stored result and the rule that\n// produced it out of sync.\nconst DEFAULT_SETTINGS={destRule:'any',destMinCbs:9,targetSpan:2700,maxSpan:3500,minSpan:2200};\nconst DOM_MEDIA_BASE='https://natura-geomarketing.data2.media/file/';\nconst DOM_CSV_FALLBACK=DOM_MEDIA_BASE+'yw_TQdp0QXEk6JsrliAqP'; \nconst numOrNull=v=>{const n=Math.round(+v);return (isFinite(n)&&n>0)?n:null;};\nconst spanShort=st=>{const p=[];if(st&&st.targetSpan)p.push('alvo '+st.targetSpan);if(st&&st.maxSpan)p.push('máx '+st.maxSpan);if(st&&st.minSpan)p.push('mín '+st.minSpan);return p.length?p.join(' · '):'livre';};\nconst ruleShort=st=>((st&&st.destRule)==='dominant')?('dominantes ≥'+((st&&st.destMinCbs)||DEFAULT_SETTINGS.destMinCbs)+' CBs'):'qualquer municipio';\n\nexport default {\n  css: `\n  :host{display:block;height:100%;--bg:#f5f5f7;--panel:#ffffff;--panel2:#f2f2f7;--line:#e5e5ea;--ink:#1c1c1e;--mut:#6e6e73;--acc:#007aff;--acc2:#0060df;--closing:#ff3b30;--ok:#34c759}\n  *{box-sizing:border-box}\n  .simroot{position:relative;height:100%;overflow:auto;font:13px/1.45 -apple-system,BlinkMacSystemFont,\"SF Pro Text\",\"Segoe UI\",Roboto,sans-serif;background:var(--bg);color:var(--ink);-webkit-font-smoothing:antialiased}\n  header{padding:10px 16px;background:rgba(246,246,248,.85);backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);border-bottom:1px solid var(--line);display:flex;align-items:center;gap:10px;flex-wrap:wrap}\n  header h1{font-size:14.5px;margin:0;font-weight:600;letter-spacing:-.1px;color:var(--ink)}\n  .mac-spacer{flex:1}\n  .howto{padding:8px 16px;background:var(--panel);border-bottom:1px solid var(--line);display:flex;gap:16px;flex-wrap:wrap;font-size:11.5px;color:var(--mut);align-items:center}\n  .howto b{color:var(--ink)} .howto span{max-width:340px}\n  .pill{font-size:10.5px;padding:2.5px 9px;border-radius:99px;border:1px solid var(--line);color:var(--mut);background:var(--panel2)}\n  .pill.live{color:var(--ink);cursor:pointer;user-select:none;transition:border-color .1s,color .1s,background .1s}\n  .pill.live:hover{border-color:var(--acc);color:var(--acc);background:#eaf3ff}\n  .pill.live:focus-visible{outline:2px solid rgba(0,122,255,.35);outline-offset:1px}\n  .pill.live.busy{border-color:var(--acc);color:var(--acc);cursor:progress}\n  .status{font-size:11px;color:var(--mut)}.status.err{color:var(--closing)}\n  select,input,textarea,button{font:inherit}\n  select,input{background:var(--panel);border:1px solid var(--line);color:var(--ink);border-radius:7px;padding:5.5px 9px}\n  select:focus,input:focus{outline:2px solid rgba(0,122,255,.35);outline-offset:0;border-color:var(--acc)}\n  button.act{background:var(--acc);color:#fff;border:1px solid transparent;border-radius:7px;padding:6px 13px;font-weight:600;cursor:pointer;box-shadow:0 1px 1px rgba(0,0,0,.08)}\n  button.act:hover{background:var(--acc2)}\n  button.ghost{background:var(--panel);color:var(--ink);border:1px solid var(--line);border-radius:7px;padding:5.5px 12px;cursor:pointer}\n  button.ghost:hover{background:var(--panel2)}\n  button.ghost.on{border-color:var(--acc);color:var(--acc);background:#eaf3ff}\n  button.ghost:disabled,button.act:disabled{opacity:.4;cursor:not-allowed}\n  .sessbar{padding:9px 20px;background:var(--panel2);border-bottom:1px solid var(--line);display:flex;gap:8px;flex-wrap:wrap;align-items:center}\n  .rail{padding:9px 16px;background:var(--panel);border-bottom:1px solid var(--line);display:flex;gap:8px;align-items:center;overflow-x:auto}\n  #movementChips{display:flex;gap:8px;flex:0 0 auto}\n  #addMovementGroup{display:flex;gap:8px;align-items:center;flex:0 0 auto;margin-left:auto;padding-left:12px;border-left:1px solid var(--line)}\n  #addMovementGroup input{min-width:150px}\n  .tchip{display:flex;align-items:center;gap:7px;background:var(--panel2);border:1px solid var(--line);border-radius:8px;padding:6px 10px;cursor:pointer;font-size:12px;flex:0 0 auto}\n  .tchip.on{border-color:var(--acc);background:#eaf3ff}\n  .tchip.stale{border-style:dashed;opacity:.85}\n  .tchip .tstale{color:#ff9500;font-weight:700}\n  .tchip .tnum{background:var(--ink);color:#fff;border-radius:99px;width:16px;height:16px;font-size:9.5px;display:flex;align-items:center;justify-content:center;font-weight:700}\n  .tchip .tsec{font-weight:600}\n  .tchip .tstat{color:var(--mut)}\n  .tchip .trm{color:var(--mut);font-weight:700;padding:0 3px}\n  .tchip .trm:hover{color:var(--closing)}\n  .rail .empty{color:var(--mut);font-size:12px}\n  .wrap{display:grid;grid-template-columns:minmax(360px,1fr) 430px;gap:14px;padding:14px 16px;align-items:start}\n  @media(max-width:1150px){.wrap{grid-template-columns:1fr}}\n  .card{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:14px 16px;margin-bottom:14px;box-shadow:0 1px 2px rgba(0,0,0,.04)}\n  .card h2{font-size:11px;text-transform:uppercase;letter-spacing:.4px;color:var(--mut);margin:0 0 9px;font-weight:600}\n  /* user-select, not pointer-events. .lbl already sets pointer-events:none, which stops the text from\n     RECEIVING clicks but does not exclude it from the browser's selection range — so cycling a\n     município's destination with repeated clicks kept dragging a double-click selection across the\n     labels. Nothing drawn in an svg here is text anyone needs to copy. */\n  svg{width:100%;height:auto;display:block;user-select:none;-webkit-user-select:none}\n  .map-wrap{position:relative}\n  #map{cursor:grab;touch-action:none}\n  #map.dragging{cursor:grabbing}\n  .zoom-pill{position:absolute;left:10px;bottom:10px;display:flex;align-items:stretch;background:var(--panel);border:1px solid var(--line);border-radius:99px;box-shadow:0 2px 8px rgba(0,0,0,.14);overflow:hidden;z-index:3}\n  .zoom-pill button{width:30px;height:30px;border:0;background:transparent;color:var(--ink);font:16px/1 -apple-system,BlinkMacSystemFont,sans-serif;font-weight:600;cursor:pointer;display:flex;align-items:center;justify-content:center}\n  .zoom-pill button:hover{background:var(--panel2)}\n  .zoom-pill button:active{background:#e5e5ea}\n  .zoom-pill .zoom-div{width:1px;background:var(--line)}\n  /* White hairlines inside the closing sector: the municipios read as one territory cut into parts\n     rather than as separate outlined units, and the saturated fills carry the grouping instead of the\n     ink. Neighbour sectors keep their own coloured strokes (.sect) — that contrast is what separates\n     what is being reallocated from what is only context. Selection no longer draws an outline; the\n     white border was the click affordance AND the default is now white, so it had nothing left to say. */\n  .muni{stroke:#fff;stroke-width:1.1;cursor:pointer;transition:filter .1s}.muni:hover{filter:brightness(1.15)}.muni.munihl{filter:brightness(1.15)}\n  .sect{stroke-width:1;fill-opacity:.32;stroke-opacity:.6}\n  .sect.plain{fill:#e8e8ec;stroke:#d4d4d9;fill-opacity:1;stroke-opacity:1}\n  .sect.closed-ctx{fill:#e2e2e7;stroke:#aeaeb2;stroke-dasharray:3 2;fill-opacity:1;stroke-opacity:1}\n  .lbl{pointer-events:none}\n  /* No plate behind the text: a halo painted UNDER the glyphs (paint-order) keeps a name legible on any\n     fill without stamping an opaque box over the territory it names. Ink and halo are chosen per label\n     from the luminance of the fill underneath, so they are deliberately NOT declared here — a\n     stylesheet rule outranks a presentation attribute and would silently override that choice. */\n  .lbl text{text-anchor:middle;paint-order:stroke fill;stroke-width:2.2px;stroke-linejoin:round;stroke-linecap:round}\n  .lbl.big text{stroke-width:2.9px}\n  .lbl line.lead{stroke-opacity:.5;stroke-width:.8}\n  .legend{display:flex;gap:12px;flex-wrap:wrap;margin-top:8px;font-size:12px}\n  .legend b{display:inline-block;width:11px;height:11px;border-radius:3px;margin-right:5px;vertical-align:-1px}\n  .kpis{display:grid;grid-template-columns:1fr 1fr;gap:9px;margin-bottom:12px}\n  .kpi{background:var(--panel2);border:1px solid var(--line);border-radius:10px;padding:9px 11px}\n  .kpi .n{font-size:19px;font-weight:700}.kpi .l{font-size:10.5px;color:var(--mut);margin-top:2px}\n  .kpi.warn{border-color:#ffd1cc}.kpi.warn .n{color:var(--closing)}.kpi.ok{border-color:#bdeecb}.kpi.ok .n{color:var(--ok)}\n  .bar-row{display:flex;align-items:center;gap:8px;margin:6px 0}\n  .bar-row .tag{width:42px;font-weight:600;font-size:12px}\n  .bar-track{flex:1;height:18px;background:var(--panel2);border-radius:5px;overflow:hidden;display:flex;position:relative}\n  .bar-mark{position:absolute;top:0;bottom:0;width:2px;opacity:.9;z-index:2}\n  .bar-base{height:100%;opacity:.4}.bar-inc{height:100%}\n  .bar-val{width:132px;text-align:right;font-size:11px;color:var(--mut);font-variant-numeric:tabular-nums}\n  table{border-collapse:collapse;width:100%;font-size:11.5px}\n  th,td{padding:5px 6px;text-align:right;border-bottom:1px solid var(--line);font-variant-numeric:tabular-nums}\n  th:first-child,td:first-child{text-align:left}\n  thead th{color:var(--mut);font-weight:600;font-size:10.5px;position:sticky;top:0;background:var(--panel)}\n  .home{display:inline-block;width:9px;height:9px;border-radius:2px;margin-right:4px}\n  .muni-item{display:flex;align-items:center;gap:8px;background:var(--panel2);border:1px solid var(--line);border-radius:8px;padding:5px 8px;margin-bottom:6px}\n  .muni-item .nm{flex:1;font-weight:600;font-size:12px}.muni-item .ct{color:var(--mut);font-size:11px}\n  .seg{display:flex;border:1px solid var(--line);border-radius:7px;overflow:hidden}\n  .seg button{border:0;background:transparent;color:var(--mut);padding:4px 8px;font-size:11px;font-weight:600;cursor:pointer}\n  .seg button.on{color:#fff}\n  .toolbar{display:flex;gap:8px;align-items:center;flex-wrap:wrap}\n  .toggle{display:flex;border:1px solid var(--line);border-radius:8px;overflow:hidden;font-size:12px}\n  .toggle button{background:transparent;border:0;color:var(--mut);padding:6px 10px;cursor:pointer;font-weight:600}\n  .toggle button.on{background:var(--panel2);color:var(--ink)}\n  .note{color:var(--mut);font-size:10.5px;margin-top:7px;line-height:1.5}\n  .cell{font-variant-numeric:tabular-nums}\n  .lider-foot td{background:var(--panel2);font-weight:600;font-size:11px;color:var(--ink);border-bottom:2px solid var(--line);padding:5px 6px;text-align:left}\n  .scroll{max-height:240px;overflow:auto}\n  /* Tables meant to be READ in full rather than sampled. Only the vertical cap is dropped — overflow\n     stays auto so the wide grupo grid can still scroll sideways inside its card, which is the one axis\n     that genuinely cannot fit. */\n  .scroll.grow{max-height:none}\n  .tip{position:fixed;pointer-events:none;background:#1c1c1e;color:#fff;border-radius:8px;padding:7px 9px;font-size:11px;opacity:0;transition:opacity .1s;z-index:9;max-width:230px}\n  .spark{display:flex;align-items:flex-end;gap:3px;height:44px}\n  .spark .b{flex:1;background:var(--acc);border-radius:2px 2px 0 0;min-height:2px;opacity:.85}\n  .delta{font-size:10px}.delta.up{color:var(--ok)}.delta.dn{color:var(--closing)}\n  .tabs{display:flex;gap:6px;margin-bottom:10px;flex-wrap:wrap}\n  .tabs button{background:transparent;border:1px solid var(--line);border-radius:8px;color:var(--mut);padding:6px 12px;cursor:pointer;font-weight:600}\n  .tabs button.on{background:var(--panel2);color:var(--ink);border-color:var(--acc)}\n  .hidden{display:none}\n  .sqlbox{width:100%;height:60px;font-family:ui-monospace,Menlo,monospace;font-size:11px;resize:vertical}\n  .load{position:absolute;inset:0;background:rgba(245,245,247,.85);backdrop-filter:blur(4px);display:flex;align-items:center;justify-content:center;z-index:20;font-size:13px;color:var(--acc);font-weight:600;text-align:center;padding:20px}\n  .load.hidden{display:none}\n  .badge{font-size:10px;padding:1px 6px;border-radius:5px;background:var(--panel2);border:1px solid var(--line);color:var(--mut)}\n  .sheet-bg{position:fixed;inset:0;background:rgba(28,28,30,.34);backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);display:flex;align-items:center;justify-content:center;z-index:40;padding:24px}\n  .sheet-bg.hidden{display:none}\n  .sheet{background:var(--panel);border:1px solid var(--line);border-radius:14px;box-shadow:0 24px 60px rgba(0,0,0,.22);width:min(580px,100%);max-height:100%;display:flex;flex-direction:column;overflow:hidden}\n  .sheet-hd{display:flex;align-items:center;gap:9px;padding:12px 16px;border-bottom:1px solid var(--line)}\n  .sheet-hd h3{margin:0;font-size:14px;font-weight:600;letter-spacing:-.1px}\n  .sheet-x{background:transparent;border:0;color:var(--mut);font-size:13px;cursor:pointer;padding:3px 7px;border-radius:6px}\n  .sheet-x:hover{background:var(--panel2);color:var(--ink)}\n  .sheet-bd{padding:14px 16px;overflow:auto}\n  .sheet-ft{display:flex;align-items:center;gap:8px;padding:11px 16px;border-top:1px solid var(--line);background:var(--panel2)}\n  .opt-lbl{font-size:11px;text-transform:uppercase;letter-spacing:.4px;color:var(--mut);font-weight:600}\n  .opt-sub{font-size:11.5px;color:var(--mut);margin:4px 0 10px;line-height:1.5}\n  .opt-row{display:flex;gap:10px;align-items:flex-start;border:1px solid var(--line);border-radius:10px;padding:10px 12px;margin-bottom:8px;cursor:pointer;background:var(--panel)}\n  .opt-row:hover{background:var(--panel2)}\n  .opt-row.on{border-color:var(--acc);background:#eaf3ff}\n  .opt-row:has(input:disabled){opacity:.5;cursor:not-allowed}\n  .opt-row input[type=radio]{margin:2px 0 0;accent-color:var(--acc);flex:0 0 auto}\n  .opt-t{font-size:12.5px;font-weight:600;display:flex;align-items:center;gap:6px;flex-wrap:wrap}\n  .opt-d{font-size:11.5px;color:var(--mut);margin-top:3px;line-height:1.55}\n  .opt-inline{font-size:11.5px;color:var(--mut);margin-top:9px;display:flex;align-items:center;gap:7px;flex-wrap:wrap}\n  .opt-inline.off{opacity:.4;pointer-events:none}\n  .opt-note{border:1px solid var(--line);background:var(--panel2);border-radius:10px;padding:9px 11px;font-size:11.5px;color:var(--mut);line-height:1.6;margin-top:12px}\n  .opt-grid{display:grid;grid-template-columns:1fr 1fr 1fr;gap:8px;margin-top:2px}\n  .opt-fld{display:flex;flex-direction:column;gap:5px;border:1px solid var(--line);border-radius:9px;padding:8px 10px;background:var(--panel2)}\n  .opt-fld span{font-size:11px;color:var(--mut);font-weight:600;line-height:1.35}\n  .opt-fld i{font-style:normal;font-weight:400;opacity:.72}\n  .opt-fld input{width:100%;background:var(--panel)}\n  .opt-err{margin-top:9px;font-size:11.5px;color:var(--closing);font-weight:600}\n  .opt-hr{height:1px;background:var(--line);margin:17px 0 0}\n  .shareurl{margin-top:9px;padding:9px 10px;border-radius:8px;background:var(--panel);border:1px solid var(--acc);\n    font-family:ui-monospace,Menlo,monospace;font-size:11px;color:var(--ink);word-break:break-all;user-select:all}\n`,\n  render(d2){\n    return `<div class=\"simroot\"><header id=\"topHeader\" class=\"hidden\">\n  <h1>Simulador de Timeline de Fechamentos</h1>\n  <span class=\"pill live\" id=\"liveState\" role=\"button\" tabindex=\"0\" title=\"Clique pra buscar o snapshot mais recente e recalcular a timeline inteira\">● iniciando</span>\n  <span class=\"pill ro\">read-only · nunca escreve</span>\n  <span class=\"pill\" id=\"basePill\"></span>\n  <span class=\"pill\" id=\"rulePill\"></span>\n  <span class=\"pill\" id=\"spanPill\"></span>\n  <span class=\"status\" id=\"ds\"></span>\n  <div class=\"mac-spacer\"></div>\n  <select id=\"sessionPick\" style=\"min-width:200px\"></select>\n  <button class=\"ghost\" id=\"openOptions\" title=\"Configurações desta sessão\">⚙ Opções</button>\n  <button class=\"act\" id=\"saveSession\">Salvar sessão</button>\n  <button class=\"ghost\" id=\"dupSession\" title=\"Cria uma cópia independente desta sessão — a original fica intacta e a cópia passa a ser a sessão ativa\">⧉ Duplicar</button>\n  <button class=\"ghost\" id=\"openShare\" title=\"Publicar uma cópia congelada desta sessão em modo leitura\">⇪ Compartilhar</button>\n  <span class=\"status\" id=\"sessStatus\"></span>\n</header>\n\n<div class=\"rail hidden\" id=\"timelineRail\">\n  <div id=\"movementChips\"></div>\n  <div id=\"addMovementGroup\">\n    <button class=\"act\" id=\"openMove\">Adicionar movimentação</button>\n  </div>\n</div>\n\n<div class=\"card\" id=\"confirmCard\" style=\"margin:14px 20px\">\n  <h2 style=\"margin:0 0 9px\">Confirmar snapshot antes de simular</h2>\n  <div class=\"note\" id=\"confirmBody\">congelando snapshot…</div>\n  <button class=\"act\" id=\"confirmSnap\" style=\"margin-top:12px\">Confirmar snapshot ▶ ir pra simulação</button>\n  <div class=\"note\" style=\"margin-top:16px\">ou continue uma sessão salva:</div>\n  <select id=\"confirmSessionPick\" style=\"min-width:260px;margin-top:4px\"></select>\n  <div class=\"status\" id=\"confirmStatus\" style=\"margin-top:8px\"></div>\n</div>\n\n<div class=\"wrap hidden\" id=\"mainWrap\">\n  <div>\n    <div class=\"card\">\n      <div style=\"display:flex;justify-content:space-between;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:9px\">\n        <h2 id=\"mapTitle\" style=\"margin:0\">Mapa — clique num município p/ trocar o setor destino</h2>\n        <div class=\"toggle\" id=\"viewToggle\" title=\"ASIS = estrutura do setor antes desta etapa (já considerando etapas anteriores) · TOBE = após a redistribuição desta etapa\">\n          <button data-v=\"asis\">◧ ASIS (antes desta etapa)</button>\n          <button data-v=\"tobe\" class=\"on\">◨ TOBE (simulação)</button>\n        </div>\n      </div>\n      <div class=\"map-wrap\">\n        <svg id=\"map\" viewBox=\"0 0 700 500\" preserveAspectRatio=\"xMidYMid meet\"></svg>\n        <div class=\"zoom-pill\" id=\"mapZoom\">\n          <button type=\"button\" id=\"mapZoomOut\" title=\"Diminuir zoom\">−</button>\n          <span class=\"zoom-div\"></span>\n          <button type=\"button\" id=\"mapZoomIn\" title=\"Aumentar zoom\">+</button>\n        </div>\n      </div>\n      <div class=\"legend\" id=\"legend\"></div>\n      <div class=\"note\">Coloridos = municípios do setor fechado nesta etapa (cor = destino). Ao redor, cada área é um <b>setor vizinho inteiro</b> com o código no meio — não municípios soltos: cor = setor destino, cinza = contexto, cinza tracejado = setor já fechado numa etapa anterior. Shapes reais IBGE/tbrugz.</div>\n      <div class=\"note\" id=\"mapIgnoredNote\"></div>\n    </div>\n\n    <div class=\"card\">\n      <h2>Líderes — destino e CBs deslocadas (nesta etapa)</h2>\n      <div class=\"note\" style=\"margin:-4px 0 9px\"><b>Home</b> = setor que ficou com a maioria das CBs da líder. <b style=\"color:var(--closing)\">Deslocadas</b> = CBs dela que caíram noutro setor.</div>\n      <div class=\"scroll grow\"><table id=\"leaders\"></table></div>\n    </div>\n\n    <div class=\"card\">\n      <div class=\"tabs\">\n        <button data-tab=\"matrix\" class=\"on\">Matriz ASIS</button>\n        <button data-tab=\"tobe\">Matriz TOBE</button>\n        <button data-tab=\"report\">Relatório de impacto (etapa)</button>\n        <button data-tab=\"cumulative\">Impacto acumulado (timeline)</button>\n        <button data-tab=\"sql\">Console SQL</button>\n      </div>\n      <div id=\"tab-matrix\"><div class=\"scroll grow\"><table id=\"matrix\"></table></div></div>\n      <div id=\"tab-tobe\" class=\"hidden\"><div class=\"scroll grow\"><table id=\"matrixTobe\"></table></div>\n        <div class=\"note\" id=\"tobeNote\"></div></div>\n      <div id=\"tab-report\" class=\"hidden\"></div>\n      <div id=\"tab-cumulative\" class=\"hidden\"></div>\n      <div id=\"tab-sql\" class=\"hidden\">\n        <textarea class=\"sqlbox\" id=\"sqlIn\">SELECT DS_MUNICIPIO, COUNT(DISTINCT CD_CONSULTORA) qtd FROM product.perfil_cb.crm_perfil_cb_diaria_historico WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR=3504 GROUP BY DS_MUNICIPIO ORDER BY qtd DESC</textarea>\n        <div class=\"toolbar\" style=\"margin:8px 0\"><button class=\"act\" id=\"runSql\">▶ Rodar</button><span class=\"status\" id=\"sqlStatus\"></span></div>\n        <div class=\"note\" style=\"margin:-4px 0 8px\">Roda contra o snapshot congelado desta sessão (não \"ao vivo\") — mesma coerência da timeline.</div>\n        <div class=\"scroll\"><table id=\"sqlOut\"></table></div>\n      </div>\n    </div>\n  </div>\n\n  <div>\n    <div class=\"card\">\n      <div class=\"toolbar\" style=\"margin-bottom:11px\">\n        <button class=\"ghost\" id=\"optim\" title=\"testa alocações que mantêm cada setor conectado e escolhe a que equilibra a carga entre setores + minimiza a quebra (evita empilhar tudo num setor)\">★ Modelo ÓTIMO (equilíbrio + quebra)</button>\n        <button class=\"ghost\" id=\"autoTobe\" title=\"preenche cada município pelo setor vizinho mais próximo (geografia)\">TOBE por adjacência</button>\n        <span class=\"badge\" id=\"optBadge\"></span>\n      </div>\n      <div class=\"note\" style=\"margin:-4px 0 10px\"><b style=\"color:var(--ink)\">★ ÓTIMO</b> = equilibra a carga entre os setores <b>e</b> minimiza a quebra (mantém o território conectado; não empilha tudo num setor). <b style=\"color:var(--ink)\">TOBE</b> = sugestão por vizinhança. Editar esta etapa recalcula automaticamente as etapas seguintes da timeline.</div>\n      <div class=\"note\" id=\"ruleNote\" style=\"margin:-6px 0 11px;padding:7px 9px;background:var(--panel2);border:1px solid var(--line);border-radius:8px\"></div>\n      <div class=\"kpis\" id=\"kpis\"></div>\n      <div id=\"contig\"></div>\n      <div id=\"spanRule\"></div>\n      <h2>Span por setor (CBs) — base + entrantes</h2>\n      <div id=\"spans\"></div>\n      <div id=\"policySection\">\n      <div style=\"display:flex;justify-content:space-between;align-items:center;margin:14px 0 7px\">\n        <h2 style=\"margin:0\">CBs deslocadas</h2>\n        <div class=\"toggle\" id=\"policy\">\n          <button data-p=\"fora\" class=\"on\">= fora do setor</button>\n          <button data-p=\"quebra\">= quebra de relação</button>\n        </div>\n      </div>\n      <div class=\"note\" id=\"policyNote\"></div>\n      </div>\n    </div>\n\n    <div class=\"card\">\n      <h2 id=\"muniListTitle\">Municípios → setor destino</h2>\n      <div class=\"note\" id=\"muniListNote\" style=\"margin:-4px 0 9px\">Clique no <b>código do setor</b> pra mandar o município <b>inteiro</b> pra lá (regra de negócio). A cor acompanha o mapa.</div>\n      <div id=\"muniList\"></div>\n    </div>\n\n    <div class=\"card\">\n      <div class=\"toolbar\" style=\"justify-content:space-between\">\n        <h2 style=\"margin:0\">Plano de migração (etapa selecionada)</h2>\n        <div><button class=\"ghost\" id=\"copyPlan\">Copiar</button> <button class=\"ghost\" id=\"csvPlan\">CSV</button></div>\n      </div>\n      <div id=\"plan\" class=\"note\"></div>\n    </div>\n  </div>\n</div>\n\n<div class=\"sheet-bg hidden\" id=\"shareBg\">\n  <div class=\"sheet\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"shareTitle\">\n    <div class=\"sheet-hd\"><h3 id=\"shareTitle\">Compartilhar sessão</h3><div class=\"mac-spacer\"></div><button class=\"sheet-x\" id=\"shareX\" title=\"Fechar\">✕</button></div>\n    <div class=\"sheet-bd\" id=\"shareBody\"></div>\n    <div class=\"sheet-ft\">\n      <span class=\"status\" id=\"shareStatus\"></span>\n      <div class=\"mac-spacer\"></div>\n      <button class=\"ghost hidden\" id=\"shareCopy\">Copiar link</button>\n      <button class=\"ghost hidden\" id=\"shareOpen\">Abrir</button>\n      <button class=\"ghost\" id=\"shareCancel\">Cancelar</button>\n      <button class=\"act\" id=\"shareGo\">Compartilhar</button>\n    </div>\n  </div>\n</div>\n\n<div class=\"sheet-bg hidden\" id=\"optionsBg\">\n  <div class=\"sheet\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"optTitle\">\n    <div class=\"sheet-hd\"><h3 id=\"optTitle\">Opções da sessão</h3><span class=\"badge\" id=\"optSessName\"></span><div class=\"mac-spacer\"></div><button class=\"sheet-x\" id=\"optClose\" title=\"Fechar\">✕</button></div>\n    <div class=\"sheet-bd\">\n      <div class=\"opt-lbl\">Regra rígida — seleção dos setores destino</div>\n      <div class=\"opt-sub\">Define quais setores vizinhos podem entrar na lista de destinos de cada etapa. Vale pra toda a timeline desta sessão.</div>\n      <label class=\"opt-row\" data-r=\"any\">\n        <input type=\"radio\" name=\"destRule\" value=\"any\">\n        <div>\n          <div class=\"opt-t\">Adjacente a qualquer município <span class=\"badge\">padrão</span></div>\n          <div class=\"opt-d\">Um setor entra na lista de destinos se tiver município vizinho a <b>qualquer</b> município do setor fechado — inclusive os menores. É o comportamento de hoje.</div>\n        </div>\n      </label>\n      <label class=\"opt-row\" data-r=\"dominant\">\n        <input type=\"radio\" name=\"destRule\" value=\"dominant\">\n        <div>\n          <div class=\"opt-t\">Adjacente a municípios dominantes</div>\n          <div class=\"opt-d\">Só os municípios do setor fechado com <b>CBs suficientes</b> valem como ponte. Os pequenos continuam sendo redistribuídos normalmente — só não trazem setor novo pra lista de destinos.</div>\n          <div class=\"opt-inline\" id=\"optMinCbsWrap\">Ignorar municípios com menos de <input type=\"number\" id=\"optMinCbs\" min=\"1\" max=\"9999\" step=\"1\" style=\"width:74px\"> CBs</div>\n        </div>\n      </label>\n      <div class=\"opt-hr\"></div>\n      <div class=\"opt-lbl\" style=\"margin-top:15px\">Pré-requisitos do setor destino — tamanho em CBs</div>\n      <div class=\"opt-sub\">Vale pro tamanho de cada setor receptor <b>depois</b> da redistribuição (base + entrantes). Em branco = desligado.</div>\n      <div class=\"opt-grid\">\n        <label class=\"opt-fld\"><span>Span alvo <i>(tamanho ideal)</i></span><input type=\"number\" id=\"optTargetSpan\" min=\"1\" max=\"99999\" step=\"1\" placeholder=\"livre\"></label>\n        <label class=\"opt-fld\"><span>Span máximo <i>(nenhum setor acima)</i></span><input type=\"number\" id=\"optMaxSpan\" min=\"1\" max=\"99999\" step=\"1\" placeholder=\"sem limite\"></label>\n        <label class=\"opt-fld\"><span>Span mínimo <i>(nenhum setor abaixo)</i></span><input type=\"number\" id=\"optMinSpan\" min=\"1\" max=\"99999\" step=\"1\" placeholder=\"sem limite\"></label>\n      </div>\n      <div class=\"opt-err hidden\" id=\"optSpanErr\"></div>\n      <div class=\"opt-note\" id=\"optPreview\"></div>\n    </div>\n    <div class=\"sheet-ft\"><span class=\"status\" id=\"optStatus\"></span><div class=\"mac-spacer\"></div><button class=\"ghost\" id=\"optCancel\">Cancelar</button><button class=\"act\" id=\"optApply\">Aplicar</button></div>\n  </div>\n</div>\n\n<div class=\"sheet-bg hidden\" id=\"moveBg\">\n  <div class=\"sheet\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"moveTitle\">\n    <div class=\"sheet-hd\"><h3 id=\"moveTitle\">Adicionar movimentação</h3><div class=\"mac-spacer\"></div><button class=\"sheet-x\" id=\"moveClose\" title=\"Fechar\">✕</button></div>\n    <div class=\"sheet-bd\">\n      <div class=\"opt-lbl\">Tipo de movimentação</div>\n      <div class=\"opt-sub\" id=\"moveLockNote\">Escolha o nível a fechar. Você pode fechar setores à vontade até fechar uma GV; aí só GV (ou mercado) daqui pra frente. Fechar um mercado trava a sessão em mercado.</div>\n      <label class=\"opt-row\" data-lvl=\"setor\"><input type=\"radio\" name=\"moveLevel\" value=\"setor\"><div><div class=\"opt-t\">Fechar Setor</div><div class=\"opt-d\">Redistribui os municípios do setor entre setores vizinhos da mesma GV.</div></div></label>\n      <label class=\"opt-row\" data-lvl=\"gv\"><input type=\"radio\" name=\"moveLevel\" value=\"gv\"><div><div class=\"opt-t\">Fechar GV</div><div class=\"opt-d\">Redistribui os setores (com municípios e CBs) da GV entre GVs vizinhas do mesmo mercado.</div></div></label>\n      <label class=\"opt-row\" data-lvl=\"mercado\"><input type=\"radio\" name=\"moveLevel\" value=\"mercado\"><div><div class=\"opt-t\">Fechar Mercado</div><div class=\"opt-d\">Redistribui as GVs (com setores, municípios e CBs) do mercado entre mercados vizinhos.</div></div></label>\n      <div class=\"opt-hr\"></div>\n      <div class=\"opt-lbl\" style=\"margin-top:15px\" id=\"moveCodeLbl\">Setor a fechar</div>\n      <div class=\"opt-inline\" id=\"moveCodeRow\">\n        <input id=\"moveCode\" list=\"moveCodeList\" placeholder=\"código\" style=\"min-width:150px\">\n        <datalist id=\"moveCodeList\"></datalist>\n        <button class=\"ghost\" id=\"moveRand\" title=\"Aleatório\">🎲</button>\n      </div>\n      <div class=\"opt-err hidden\" id=\"moveErr\"></div>\n    </div>\n    <div class=\"sheet-ft\"><span class=\"status\" id=\"moveStatus\"></span><div class=\"mac-spacer\"></div><button class=\"ghost\" id=\"moveCancel\">Cancelar</button><button class=\"act\" id=\"moveGo\">Fechar ▶ (nova etapa)</button></div>\n  </div>\n</div>\n\n<div class=\"tip\" id=\"tip\"></div>\n<div class=\"load hidden\" id=\"loader\">carregando…</div>\n<span id=\"ready\" style=\"display:none\"></span></div>`;\n  },\n  mounted(d2, root){\n\nconst $=s=>root.querySelector(s);\nconst fmt=n=>n==null?'–':Math.round(+n).toLocaleString('pt-BR');\nconst money=n=>{n=+n||0;return n>=1e6?'R$'+(n/1e6).toFixed(1)+'M':n>=1e3?'R$'+(n/1e3).toFixed(0)+'k':'R$'+Math.round(n)};\nconst norm=s=>(s||'').normalize('NFKD').replace(/[̀-ͯ]/g,'').toUpperCase().replace(/[^A-Z0-9]+/g,' ').trim();\nconst esc=s=>(s==null?'':String(s)).replace(/[&<>]/g,c=>({'&':'&amp;','<':'&lt;','>':'&gt;'}[c]));\nconst blankM=()=>({cbs:0,receita:0,rec_nat:0,rec_avon:0,pontos:0,pedidos:0,ativas:0});\n// ---------- município identity ----------\n// Brazil has many municipalities sharing a name (Bom Jesus alone exists in PI, RN, RS, SC, PB, GO).\n// A stage loads the dominant UF PLUS every bordering UF, so those collisions land in the SAME\n// feature set routinely: keyed by name alone the last shape loaded won, the map could draw a\n// município from the wrong state, buildAdj merged two unrelated municipalities into one node, and\n// GROUP BY DS_MUNICIPIO summed two real municipalities into one row. The key is NAME/UF everywhere\n// — SQL rows, GeoJSON features, the dominantes base, assignments, persisted sessions. norm() maps\n// every non-alphanumeric to a space, so '/' can never occur inside a name and the split is exact.\n// A missing UF degrades to a bare NAME key rather than inventing one.\nconst mkey=(name,uf)=>{const n=norm(name),u=String(uf==null?'':uf).trim().toUpperCase();return u?n+'/'+u:n;};\nconst mName=k=>{const s=String(k==null?'':k),i=s.lastIndexOf('/');return i<0?s:s.slice(0,i);};\nconst mUf=k=>{const s=String(k==null?'':k),i=s.lastIndexOf('/');return i<0?'':s.slice(i+1);};\nconst mDisp=k=>{const u=mUf(k);return u?mName(k)+' ('+u+')':mName(k);};\n// The base CSV is the ONLY source of a município's UF now, so its column is accepted in whatever\n// shape the base is maintained in: sigla, IBGE numeric code, or full state name. Anything that does\n// not resolve to a real sigla is treated as UNKNOWN rather than passed through — a bogus UF would key\n// a município to a shape that does not exist and drop it off the map without a word.\nconst UF_OF_CODE={}; Object.keys(UF_CODE).forEach(k=>{ UF_OF_CODE[UF_CODE[k]]=k; });\nconst UF_OF_NAME={ACRE:'AC',ALAGOAS:'AL',AMAPA:'AP',AMAZONAS:'AM',BAHIA:'BA',CEARA:'CE','DISTRITO FEDERAL':'DF','ESPIRITO SANTO':'ES',GOIAS:'GO',MARANHAO:'MA','MATO GROSSO':'MT','MATO GROSSO DO SUL':'MS','MINAS GERAIS':'MG',PARA:'PA',PARAIBA:'PB',PARANA:'PR',PERNAMBUCO:'PE',PIAUI:'PI','RIO DE JANEIRO':'RJ','RIO GRANDE DO NORTE':'RN','RIO GRANDE DO SUL':'RS',RONDONIA:'RO',RORAIMA:'RR','SANTA CATARINA':'SC','SAO PAULO':'SP',SERGIPE:'SE',TOCANTINS:'TO'};\nconst ufNorm=v=>{const s=norm(v); if(!s) return '';\n  if(UF_CODE[s]) return s;\n  if(UF_OF_CODE[s]) return UF_OF_CODE[s];\n  return UF_OF_NAME[s]||'';};\nconst loader=(on,t)=>{const l=$('#loader');l.classList.toggle('hidden',!on);if(t)l.textContent=t;};\nconst setError=(msg)=>{ const t=$('#ds'); if(t){t.textContent=msg;t.classList.add('err');} const c=$('#confirmStatus'); if(c){c.textContent=msg;c.classList.add('err');} };\n\n// ---------- base de municípios dominantes (CSV) ----------\n// WHICH municipalities belong to a sector is a business fact, not something to infer from CB volume:\n// it comes from a maintained CSV (one row per setor x município) linked through the `dominantesCsvUrl`\n// param. Anything the closing sector has CBs in but that the base does NOT assign to it is spillover:\n// not realocated, not drawn on the map, and its CBs follow their leader. Loaded once per URL and\n// cached for the whole session; a failure is thrown, never swallowed — a silent fallback here would\n// quietly change every number on the screen.\nconst DOM={url:null,promise:null,bySetor:null,ufBySetorMuni:null,rows:0,setores:0,hasUf:false,ufCol:null,badUf:0,clashes:0,headers:null,error:null};\nfunction parseCsv(text){\n  const out=[]; let row=[],cur='',q=false;\n  const push=()=>{ row.push(cur); cur=''; };\n  const endRow=()=>{ push(); if(row.length>1||row[0]!=='') out.push(row); row=[]; };\n  for(let i=0;i<text.length;i++){ const ch=text[i];\n    if(q){ if(ch==='\"'){ if(text[i+1]==='\"'){ cur+='\"'; i++; } else q=false; } else cur+=ch; }\n    else if(ch==='\"') q=true;\n    else if(ch===',') push();\n    else if(ch==='\\n') endRow();\n    else if(ch!=='\\r') cur+=ch;\n  }\n  if(cur!==''||row.length) endRow();\n  return out;\n}\n// `dominantesCsvUrl` is declared as a FileComponentUrlReference, so the instance points at the Drive\n// FILE, not at a URL literal — the Drive is policy-gated behind the app's auth strategy and a baked\n// string would be both stale and unauthorised. What the resolver hands back varies by where it is\n// resolved (URL string / file record / bare reference), so accept every shape instead of silently\n// reading undefined and falling through to the fallback.\n// The Drive is gated by the app's AuthenticationStrategy, so this read has to travel as the LOGGED-IN\n// USER — an anonymous CDN GET is exactly what the policy is there to refuse. `<system>.data2.media` is\n// only a cache in front of the SSP: on a cache miss it 302s to `<system>.data2apis.com`, which is where\n// the policy is actually evaluated.\n// COOKIES CANNOT CARRY THAT SESSION, which is why the previous `credentials:'include'` attempt could\n// never have worked: the app runs on <app>.<system>.data2.app and the SSP on <system>.data2apis.com —\n// cross-site — and the SSP answers `Access-Control-Allow-Origin: *` with no `Allow-Credentials`, so the\n// browser rejects a credentialed CORS read before it ever leaves the page. What the SSP actually reads\n// is `Authorization: Bearer <token>`: the runtime keeps that token in localStorage under\n// `__data2-session-<systemDomain>` (`__data2-session-data2` inside the builder preview) and replays it\n// on every dataset and rush call — same token, same header, same session, so the Drive policy sees the\n// logged-in user. Preflight passes because the SSP echoes whatever header the request asks for.\nfunction d2SessionToken(sysDomain){\n  const read=k=>{ try{ return (k&&window.localStorage.getItem(k))||''; }catch(e){ return ''; } };\n  return read(sysDomain?('__data2-session-'+sysDomain):'')||read('__data2-session-data2')||'';\n}\nfunction domCsvSystemDomain(url){\n  const m=/^https?:\\/\\/([^.\\/]+)\\.data2\\.(?:media|app)\\//i.exec(url)||/^https?:\\/\\/([^.\\/]+)\\.data2apis\\.com\\//i.exec(url);\n  return m?m[1]:'';\n}\nfunction domCsvCandidates(url){\n  const out=[];\n  const isMedia=/^https?:\\/\\/[^.\\/]+\\.data2\\.media\\//i.test(url);\n  const api=isMedia?url.replace(/^(https?:\\/\\/[^.\\/]+)\\.data2\\.media\\//i,'$1.data2apis.com/'):null;\n  const tok=d2SessionToken(domCsvSystemDomain(url));\n  const auth=tok?{authorization:'Bearer '+tok}:null;\n  // Authenticated origin read first — the only candidate a GATED Drive can actually answer.\n  if(api&&auth) out.push({url:api,headers:auth,label:'api+sessão'});\n  if(!api&&auth) out.push({url:url,headers:auth,label:'origem+sessão'});\n  // Anonymous last: only ever succeeds on an UNGATED Drive — or on a stale CDN cache hit, which is NOT\n  // proof the file is public (the origin keeps answering 401 once the edge entry expires).\n  if(api) out.push({url:api,headers:null,label:'api anônimo'});\n  out.push({url:url,headers:null,label:'origem anônima'});\n  return out;\n}\nfunction domCsvUrl(){\n  const pick=v=>{\n    if(!v) return '';\n    if(typeof v==='string') return v;\n    const q=v.params||{};\n    const ref=q.reference||v.reference;\n    return q.fileUrl||q.url||v.fileUrl||v.url||(ref?DOM_MEDIA_BASE+ref:'');\n  };\n  return String(pick(d2.param('dominantesCsvUrl'))||DOM_CSV_FALLBACK||'').trim();\n}\nasync function ensureDominantes(){\n  const url=domCsvUrl();\n  if(!url) throw new Error('base de municípios dominantes não configurada — ligue o arquivo CSV no parâmetro dominantesCsvUrl da instância do componente');\n  if(DOM.url===url && DOM.bySetor) return DOM.bySetor;\n  if(DOM.url===url && DOM.promise) return DOM.promise;\n  DOM.url=url; DOM.error=null;\n  DOM.promise=(async()=>{\n    // Self-diagnosing on purpose: every candidate reports its own outcome and the message names the\n    // session it was carrying. \"Unauthorized\" alone cannot distinguish \"not logged into THIS strategy\"\n    // from \"cookie not sent cross-site\" from \"param never bound, so it tried the fallback URL\" — and\n    // guessing between those from the outside costs a round trip each time.\n    let r=null; const tried=[];\n    for(const c of domCsvCandidates(url)){\n      let res=null;\n      try{ res=await fetch(c.url,{cache:'no-store',credentials:'omit',headers:c.headers||undefined}); }\n      catch(e){ tried.push(c.label+' → rede/CORS'); continue; }\n      if(res.ok){ r=res; break; }\n      tried.push(c.label+' → '+res.status);\n    }\n    if(!r){\n      let sess='sessão desconhecida';\n      try{\n        const a=d2.auth(AUTH_REF);\n        sess=(a&&a.isAuthed)?('logado como '+((a.user&&(a.user.email||a.user.nome))||'?')):('NÃO logado na estratégia '+AUTH_REF);\n      }catch(e){ sess='estratégia '+AUTH_REF+' não resolvida'; }\n      const tk=d2SessionToken(domCsvSystemDomain(url));\n      throw new Error('base de municípios dominantes: não foi possível ler o arquivo — '+sess+' · token de sessão '+(tk?'presente':'AUSENTE no localStorage')+'. Tentativas: '+tried.join(' · '));\n    }\n    const table=parseCsv(await r.text());\n    if(table.length<2) throw new Error('base de municípios dominantes vazia');\n    const head=table[0].map(h=>norm(h));\n    const iS=head.indexOf('CD SETOR'), iM=head.indexOf('MUNICIPIO');\n    if(iS<0||iM<0) throw new Error('base de municípios dominantes sem as colunas CD_SETOR / MUNICIPIO');\n    // CD_GV is the gerência de vendas the setor answers to, and it is the authority for the hard rule\n    // that a closing sector only ever hands territory to sectors of its OWN gerência. Its absence is\n    // fatal rather than a warning: with no GV there is no way to PROVE two sectors share one, and\n    // falling through unchecked is exactly the leak this column exists to close.\n    const iG=['CD GV','CDGV','GV','CD GERENCIA','CD GERENCIA VENDAS','CD GERENCIA DE VENDAS','GERENCIA DE VENDAS','GERENCIA'].map(h=>head.indexOf(h)).find(i=>i>=0);\n    if(iG==null) throw new Error('base de municípios dominantes sem a coluna CD_GV — a regra de gerência de vendas não pode ser aplicada. Colunas lidas: '+head.slice(0,40).join(', '));\n    // MERCADO fica ACIMA de GV na hierarquia (mercado > GV > setor) — fechamento de Mercado e a regra\n    // \"GV só fecha pra GV do mesmo mercado\" dependem dela do mesmo jeito que a regra de GV depende\n    // de CD_GV, então a ausência é fatal pelo mesmo motivo.\n    const iK=['MERCADO','MERCADO REGIONAL','MKT','MARKET'].map(h=>head.indexOf(h)).find(i=>i>=0);\n    if(iK==null) throw new Error('base de municípios dominantes sem a coluna MERCADO — fechamento de GV/Mercado precisa dela. Colunas lidas: '+head.slice(0,40).join(', '));\n    // Nomes de exibição — opcionais: a hierarquia funciona só com os códigos, mas o código sozinho\n    // não diz nada pro operador escolhendo o que fechar.\n    const iDS=['DC SETOR','NOME SETOR','DESCRICAO SETOR','NM SETOR'].map(h=>head.indexOf(h)).find(i=>i>=0);\n    const iDG=['DC GV','NOME GV','DESCRICAO GV','NM GV','GV NOME'].map(h=>head.indexOf(h)).find(i=>i>=0);\n    // The UF column is what the whole keying now rests on — SQL no longer carries DS_ESTADO — so its\n    // absence is a first-class finding, not a footnote. The header actually matched is reported on the\n    // base pill, and when nothing matches the pill lists every column read, because guessing a header\n    // name from the outside costs a round trip each time.\n    const iU=['UF','SIGLA UF','SG UF','CD UF','ESTADO','DS ESTADO','SIGLA','ESTADO SIGLA','UF MUNICIPIO'].map(h=>head.indexOf(h)).find(i=>i>=0);\n    const by={},ufBy={},gvBy={},mkBySetor={},setorLabel={},gvLabel={}; let n=0,bad=0; const clash={},gvClash={},mkClash={};\n    for(let i=1;i<table.length;i++){\n      const line=table[i]; if(!line) continue;\n      const s=String(line[iS]==null?'':line[iS]).trim(), m=norm(line[iM]);\n      if(!s||!m) continue;\n      // One setor spans many rows (one per município) and every one of them repeats its CD_GV. Two\n      // DIFFERENT values for the same setor means the base itself disagrees about which gerência owns\n      // it — counted and reported, never keyed to whichever row happened to be read last.\n      const gvv=String(line[iG]==null?'':line[iG]).trim();\n      if(gvv){ if(gvBy[s]!==undefined && gvBy[s]!==gvv) gvClash[s]=true; else gvBy[s]=gvv; }\n      const mkv=String(line[iK]==null?'':line[iK]).trim();\n      if(mkv){ if(mkBySetor[s]!==undefined && mkBySetor[s]!==mkv) mkClash[s]=true; else mkBySetor[s]=mkv; }\n      if(iDS!=null){ const lbl=String(line[iDS]==null?'':line[iDS]).trim(); if(lbl && !setorLabel[s]) setorLabel[s]=lbl; }\n      if(iDG!=null && gvv){ const lbl=String(line[iDG]==null?'':line[iDG]).trim(); if(lbl && !gvLabel[gvv]) gvLabel[gvv]=lbl; }\n      const raw=(iU==null)?'':line[iU];\n      const u=(iU==null)?'':ufNorm(raw);\n      if(iU!=null && String(raw==null?'':raw).trim() && !u) bad++;\n      // The same name twice in ONE setor under two UFs is the single case the reverted SQL cannot\n      // survive: mSQL groups by DS_MUNICIPIO alone, so both municipalities arrive summed into one row\n      // and no lookup can split them again. Counted and reported — never quietly keyed to whichever\n      // UF happened to be read last.\n      const kk=s+'|'+m;\n      // An UNRESOLVED uf must never outrank a resolved one. Reading a blank/bogus UF row first wrote ''\n      // here, and the next row carrying the real sigla was then rejected as a clash — so the key stayed\n      // falsy for good, ufFor() fell through, and the município degraded to a bare NAME key that matches\n      // no shape and no dominance entry. With DISTRITO/ZONA in the base a município spans several rows,\n      // so which row lands first is pure luck. A clash is only two RESOLVED siglas that disagree.\n      if(!u){ if(ufBy[kk]===undefined) ufBy[kk]=''; }\n      else if(!ufBy[kk]) ufBy[kk]=u;\n      else if(ufBy[kk]!==u) clash[kk]=true;\n      (by[s]=by[s]||new Set()).add(u?m+'/'+u:m); n++;\n    }\n    if(!n) throw new Error('base de municípios dominantes sem linhas válidas');\n    DOM.bySetor=by; DOM.ufBySetorMuni=ufBy; DOM.rows=n; DOM.setores=Object.keys(by).length;\n    DOM.gvBySetor=gvBy; DOM.gvClashes=Object.keys(gvClash).length; DOM.gvCol=String(table[0][iG]||'').trim();\n    DOM.gvSetores=Object.keys(gvBy).length;\n    DOM.hasUf=(iU!=null); DOM.ufCol=(iU==null?null:String(table[0][iU]||'').trim());\n    DOM.badUf=bad; DOM.clashes=Object.keys(clash).length; DOM.headers=head.slice(0,40); DOM.error=null;\n    // ---- hierarquia: setor ⊂ GV ⊂ mercado, tudo derivado do MESMO csv que a regra de setor já\n    // confia — fechamento de GV/Mercado lê a mesma fonte, nunca uma segunda base paralela.\n    DOM.mercadoBySetor=mkBySetor; DOM.mercadoClashes=Object.keys(mkClash).length; DOM.mercadoCol=String(table[0][iK]||'').trim();\n    DOM.setorLabel=setorLabel; DOM.gvLabel=gvLabel;\n    const sectorsByGv={},sectorsByMercado={},gvsByMercado={},mercadoByGv={},gvMercClash={};\n    Object.keys(by).forEach(s=>{\n      const gv=gvBy[s], mk=mkBySetor[s];\n      if(gv) (sectorsByGv[gv]=sectorsByGv[gv]||new Set()).add(s);\n      if(mk) (sectorsByMercado[mk]=sectorsByMercado[mk]||new Set()).add(s);\n      if(gv&&mk){ if(mercadoByGv[gv]!==undefined && mercadoByGv[gv]!==mk) gvMercClash[gv]=true; else mercadoByGv[gv]=mk; }\n    });\n    Object.entries(mercadoByGv).forEach(([gv,mk])=>(gvsByMercado[mk]=gvsByMercado[mk]||new Set()).add(gv));\n    DOM.sectorsByGv=sectorsByGv; DOM.sectorsByMercado=sectorsByMercado; DOM.gvsByMercado=gvsByMercado;\n    DOM.mercadoByGv=mercadoByGv; DOM.gvMercadoClashes=Object.keys(gvMercClash).length;\n    return by;\n  })();\n  DOM.promise.catch(e=>{ DOM.promise=null; DOM.bySetor=null; DOM.error=e.message; renderAll(); });\n  return DOM.promise;\n}\n\nlet SESS={ snapshotRaw:null, snapshotSyncedAt:null, snapLiteral:null, eloMaxCycle:null, timeline:[], selected:0,\n           sessionId:null, sessionLabel:null, sessionsList:[], sectorsList:[], sectorBaseCache:{}, stage:'loading', dirtyFrom:null,\n           snapBusy:false, settings:{...DEFAULT_SETTINGS} };\n\nasync function q(sql){\n  let dbx,res;\n  try{\n    res=await d2.rush('AwW_11Nkg-dKksP7ic8V8').invoke({sql});\n  }catch(e){\n    throw new Error('Databricks indisponível (rush AwW_11Nkg-dKksP7ic8V8): '+e.message);\n  }\n  // The listener answers 200 with {sql} and NO `result` when its upstream probe times out: the\n  // handler builds `result: $result.data`, so an empty upstream simply drops the key rather than\n  // failing. Reading straight through to res.data.result.data reported \"Cannot read properties of\n  // undefined (reading 'data')\" — which reads like a bug in THIS component and sent a debugging\n  // session after the wrong thing. Name the layer that actually failed instead.\n  const payload=res&&res.data;\n  if(!payload) throw new Error('rush AwW_11Nkg-dKksP7ic8V8 não devolveu corpo — listener fora do ar?');\n  if(!payload.result) throw new Error('a sonda Databricks não respondeu: o listener AwW_11Nkg-dKksP7ic8V8 devolveu 200 sem `result`, o que normalmente é timeout do upstream (natura-x-app). O SQL não chegou a rodar.');\n  dbx=payload.result.data;\n  if(!dbx) throw new Error('sonda Databricks respondeu sem dados (result.data vazio).');\n  if(dbx.state && dbx.state!=='SUCCEEDED') throw new Error('Databricks '+dbx.state+': '+(dbx.error?.message||JSON.stringify(dbx.error)||'erro desconhecido'));\n  return dbx;\n}\nfunction rows(resp){const c=(resp.columns||[]).map(x=>x.name);\n  return (resp.rows||[]).map(a=>Object.fromEntries(c.map((k,i)=>[k,a[i]])));}\n// Stamps the UF onto every feature at load: the fetch is per-UF, so this is the ONLY point where a\n// shape's state is known for certain. Downstream the features are flattened into one array and the\n// origin would be unrecoverable. Persisted with the feature in saved sessions.\nasync function geoUF(uf){const code=UF_CODE[uf]||uf;const r=await fetch('https://raw.githubusercontent.com/tbrugz/geodata-br/master/geojson/geojs-'+code+'-mun.json');if(!r.ok)throw new Error('geo '+uf);\n  const g=await r.json(); const U=String(uf).toUpperCase();\n  (g.features||[]).forEach(f=>{ f.__uf=U; });\n  return g;}\n\nfunction buildAdj(features){\n  const pts=f=>{const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates],s=new Set();\n    ps.forEach(poly=>poly.forEach(ring=>ring.forEach(p=>s.add(Math.round(p[0]*1000)/1000+','+Math.round(p[1]*1000)/1000))));return s;};\n  const feat={},idx={};\n  features.forEach(f=>{const nm=mkey(f.properties.name||f.properties.NOME||f.properties.nome,f.__uf);feat[nm]={f,pts:pts(f)};});\n  for(const nm in feat) feat[nm].pts.forEach(p=>(idx[p]=idx[p]||[]).push(nm));\n  const nbrs=nm=>{const c={};feat[nm].pts.forEach(p=>idx[p].forEach(o=>{if(o!==nm)c[o]=(c[o]||0)+1;}));\n    return Object.entries(c).filter(([,n])=>n>=2).map(([o,n])=>({o,w:n}));};\n  return {feat,nbrs};\n}\nfunction centroidLL(f){let x=0,y=0,n=0;const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];\n  ps.forEach(poly=>poly[0].forEach(p=>{x+=p[0];y+=p[1];n++;}));return[x/n,y/n];}\n\n// ---------- snapshot pinning ----------\nasync function resolveSnapshotPin(){\n  const [rawR,liveCountR,eloR]=await Promise.all([\n    q(`SELECT MAX(DT_HISTORICO) snap FROM ${T} WHERE CD_PAIS=1`).then(rows),\n    q(`SELECT COUNT(*) n FROM ${T} WHERE CD_PAIS=1 AND DT_HISTORICO=(SELECT MAX(DT_HISTORICO) FROM ${T} WHERE CD_PAIS=1)`).then(rows),\n    q(`SELECT MAX(operational_cycle) mx FROM ${ELO} WHERE country_code=1`).then(rows).catch(()=>[]),\n  ]);\n  const raw=rawR[0]&&rawR[0].snap;\n  const liveCount=+((liveCountR[0]||{}).n||0);\n  const eloMax=+((eloR[0]||{}).mx||0);\n  const LIVE_SUBQ=`(SELECT MAX(DT_HISTORICO) FROM ${T} WHERE CD_PAIS=1)`;\n  const dbTs=(raw||'').replace('T',' ').replace(/Z$/,'');\n  const candidates=[`TIMESTAMP'${dbTs}'`,`'${dbTs}'`,`DATE'${dbTs}'`];\n  const tests=await Promise.all(candidates.map(c=>\n    q(`SELECT COUNT(*) n FROM ${T} WHERE CD_PAIS=1 AND DT_HISTORICO=${c}`).then(rows).then(r=>+((r[0]||{}).n||0)).catch(()=>-1)\n  ));\n  let chosen=LIVE_SUBQ;\n  for(let i=0;i<candidates.length;i++){ if(liveCount>0 && tests[i]===liveCount){ chosen=candidates[i]; break; } }\n  return {snapshotRaw:raw, snapLiteral:chosen, eloMaxCycle:eloMax, syncedAt:new Date().toISOString()};\n}\n// DISPLAY CONTRACT: the UI never prints the snapshot's own DT_HISTORICO (snapshotRaw). What the user\n// sees is `snapshotSyncedAt` — the date AND hour at which THIS instance last pulled/pinned the\n// snapshot it is querying. snapshotRaw is still resolved, still drives every SQL literal, and is\n// still persisted by saveSession/doShare; it is only kept off the screen.\nfunction fmtSyncedAt(iso){\n  if(!iso) return '—';\n  const d=new Date(iso);\n  if(isNaN(d.getTime())) return String(iso);\n  return d.toLocaleString('pt-BR',{day:'2-digit',month:'2-digit',year:'numeric',hour:'2-digit',minute:'2-digit'});\n}\nasync function ensurePinned(){\n  if(SESS.snapLiteral) return;\n  const p=await resolveSnapshotPin();\n  SESS.snapshotRaw=p.snapshotRaw; SESS.snapLiteral=p.snapLiteral; SESS.eloMaxCycle=p.eloMaxCycle;\n  SESS.snapshotSyncedAt=p.syncedAt;\n}\n\n// ---------- world-state fold ----------\nfunction accMetrics(base,add){\n  const out=base?{...base}:blankM();\n  Object.keys(blankM()).forEach(k=>{ out[k]=(out[k]||0)+((add&&add[k])||0); });\n  return out;\n}\nfunction foldWorldState(timeline,uptoIdx){\n  const closedSectors=new Set(),muniOverride={},muniGeo={},muniRow={},muniLevel={},sectorInflow={},sectorInflowLevel={},sectorOrphanRows={};\n  // GV/mercado: setores e GVs não se dissolvem quando o dono deles fecha — eles só passam a\n  // responder a um destino novo. Por isso o rastro do cascade mora numa camada PRÓPRIA\n  // (secOverride/gvOverride), separada da camada de município do fechamento de setor — a\n  // hierarquia trava a sessão num nível só, então nunca as duas camadas têm conteúdo ao mesmo tempo.\n  const closedGvs=new Set(),secOverride={},gvInflow={};\n  const closedMercados=new Set(),gvOverride={},mercadoInflow={};\n  for(let k=0;k<uptoIdx;k++){\n    const mv=timeline[k]; if(!mv||!mv.sector||!mv.munis) continue;\n    const level=mv.level||'setor';\n    if(level==='gv'){\n      closedGvs.add(String(mv.sector));\n      Object.keys(mv.munis).forEach(u=>{\n        if(u==='__OUTROS__') return;\n        const dest=mv.assign[u]; if(!dest) return;\n        secOverride[u]=String(dest);\n        gvInflow[dest]=accMetrics(gvInflow[dest],mv.munis[u]);\n      });\n      continue;\n    }\n    if(level==='mercado'){\n      closedMercados.add(String(mv.sector));\n      Object.keys(mv.munis).forEach(u=>{\n        if(u==='__OUTROS__') return;\n        const dest=mv.assign[u]; if(!dest) return;\n        gvOverride[u]=String(dest);\n        mercadoInflow[dest]=accMetrics(mercadoInflow[dest],mv.munis[u]);\n      });\n      continue;\n    }\n    closedSectors.add(String(mv.sector));\n    Object.keys(mv.munis).forEach(m=>{\n      if(m==='__OUTROS__') return;\n      const dest=mv.assign[m]; if(!dest) return;\n      muniOverride[m]=String(dest);\n      if(mv.geoFeat&&mv.geoFeat[m]) muniGeo[m]=mv.geoFeat[m];\n      const rws=(mv.matrix||[]).filter(r=>mkey(r.municipio,r.uf)===m);\n      muniRow[m]=(muniRow[m]||[]).concat(rws);\n      if(mv.levelByMuni&&mv.levelByMuni[m]) muniLevel[m]={...(muniLevel[m]||{}),...mv.levelByMuni[m]};\n      sectorInflow[dest]=accMetrics(sectorInflow[dest],mv.munis[m]);\n      const lv=(mv.levelByMuni&&mv.levelByMuni[m])||{};\n      sectorInflowLevel[dest]=sectorInflowLevel[dest]||{};\n      Object.entries(lv).forEach(([nv,c])=>{ sectorInflowLevel[dest][nv]=(sectorInflowLevel[dest][nv]||0)+c; });\n    });\n    // Orphan CBs follow their leader's home sector, so later etapas must inherit them the same way\n    // the allocated municipalities are inherited — otherwise a stage's span would not match the\n    // base carried into the next one.\n    if(mv.orphanMetricsByGroup && Object.keys(mv.orphanMetricsByGroup).length){\n      const d=computeDerived(mv);\n      d.leaders.forEach(L=>{\n        if(!L.home) return;\n        const om=mv.orphanMetricsByGroup[L.grupo];\n        if(om) sectorInflow[L.home]=accMetrics(sectorInflow[L.home],om);\n        // sectorInflow only reaches a sector while it is a DESTINATION (it lands in baseMetrics).\n        // Keep the rows as well, so the sector still carries these CBs on the day it is the one\n        // being closed — that read goes through mv.matrix, which baseMetrics never touches.\n        const orws=mv.orphanRowsByGroup&&mv.orphanRowsByGroup[L.grupo];\n        if(orws&&orws.length) sectorOrphanRows[L.home]=(sectorOrphanRows[L.home]||[]).concat(orws);\n        const ol=mv.orphanLevelByGroup&&mv.orphanLevelByGroup[L.grupo];\n        if(ol){ sectorInflowLevel[L.home]=sectorInflowLevel[L.home]||{};\n          Object.entries(ol).forEach(([nv,c])=>{ sectorInflowLevel[L.home][nv]=(sectorInflowLevel[L.home][nv]||0)+c; }); }\n      });\n    }\n  }\n  return {closedSectors,muniOverride,muniGeo,muniRow,muniLevel,sectorInflow,sectorInflowLevel,sectorOrphanRows,\n          closedGvs,secOverride,gvInflow,closedMercados,gvOverride,mercadoInflow};\n}\n\n// ---------- per-movement compute ----------\nfunction aggregateMovement(mv){\n  const level=mv.level||'setor';\n  const munis={},leaders={};\n  const exSet=new Set((mv.excludedMunis||[]).map(x=>x.muni));\n  const acc=(o,r)=>{o.cbs+=+r.cbs;o.receita+=+r.receita||0;o.rec_nat+=+r.rec_nat||0;o.rec_avon+=+r.rec_avon||0;o.pontos+=+r.pontos||0;o.pedidos+=+r.pedidos||0;o.ativas+=+r.ativas||0;};\n  // Orphans = CBs in municipalities outside the sector's dominance base. They are NOT allocated\n  // geographically; they follow their own leader's home sector. Kept per leader group so every\n  // consumer (span, cascade, impact report) can route them the same way. Só existe no nível setor —\n  // GV/mercado não têm spillover (todo setor pertence a exatamente uma GV/mercado na base).\n  mv.orphanByGroup={}; mv.orphanMetricsByGroup={}; mv.orphanRowsByGroup={};\n  // unidade que este nível redistribui: a própria município (setor fecha), o setor da linha (GV\n  // fecha), a GV do setor da linha (mercado fecha).\n  const unitOf=r=>level==='setor'?null:(level==='gv'?String(r.setor):(DOM.gvBySetor[String(r.setor)]||''));\n  mv.matrix.forEach(r=>{\n    const m=mkey(r.municipio,r.uf);\n    r._out=!mv.geoFeat[m];   // assign, never just set: absorbed rows are reused across etapas\n    const mm=level==='setor'?(r._out?'__OUTROS__':m):(unitOf(r)||'__OUTROS__');\n    munis[mm]=munis[mm]||{...blankM(),name:mm}; acc(munis[mm],r);\n    const g=String(r.grupo); leaders[g]=leaders[g]||{grupo:g,lider:r.lider,total:0,byMuni:{}};\n    leaders[g].total+=+r.cbs; leaders[g].byMuni[mm]=(leaders[g].byMuni[mm]||0)+ +r.cbs;\n    if(level==='setor' && r._out && exSet.has(m)){\n      mv.orphanByGroup[g]=(mv.orphanByGroup[g]||0)+ +r.cbs;\n      // The ROW too, not just the totals: when the leader's home sector is itself closed in a later\n      // etapa, that etapa rebuilds its matrix from SQL + absorbed municípios, and these CBs are in\n      // neither (their município never moved). Without the row they silently vanish from the sector\n      // they were just credited to — see sectorOrphanRows in foldWorldState.\n      (mv.orphanRowsByGroup[g]=mv.orphanRowsByGroup[g]||[]).push(r);\n      mv.orphanMetricsByGroup[g]=accMetrics(mv.orphanMetricsByGroup[g],\n        {cbs:+r.cbs,receita:+r.receita||0,rec_nat:+r.rec_nat||0,rec_avon:+r.rec_avon||0,pontos:+r.pontos||0,pedidos:+r.pedidos||0,ativas:+r.ativas||0});\n    }\n  });\n  // Level counts only exist per municipality, never per leader, so an excluded municipality's level\n  // mix is credited to the group holding most of its CBs (sub-threshold by definition, so usually one).\n  mv.orphanLevelByGroup={};\n  (mv.excludedMunis||[]).forEach(({muni})=>{\n    const lv=(mv.levelByMuni&&mv.levelByMuni[muni])||{}; if(!Object.keys(lv).length) return;\n    let bg=null,bc=-1;\n    mv.matrix.forEach(r=>{ if(mkey(r.municipio,r.uf)!==muni) return; const cc=+r.cbs; if(cc>bc){bc=cc;bg=String(r.grupo);} });\n    if(!bg) return;\n    mv.orphanLevelByGroup[bg]=mv.orphanLevelByGroup[bg]||{};\n    Object.entries(lv).forEach(([nv,cc])=>{ mv.orphanLevelByGroup[bg][nv]=(mv.orphanLevelByGroup[bg][nv]||0)+cc; });\n  });\n  mv.munis=munis; mv.leaders=Object.values(leaders).sort((a,b)=>b.total-a.total);\n}\nfunction autoAssignFor(mv){\n  const a={};\n  Object.keys(mv.munis).forEach(m=>{ if(m==='__OUTROS__')return;\n    const v=mv.allowed[m]||{}; const votes=Object.keys(v);\n    if(votes.length){ let best=votes[0],bw=-1; for(const s of votes) if(v[s]>bw){bw=v[s];best=s;} a[m]=best; }\n    else if(mv.dest.length){ const c=mv.muniCentroid[m]; let best=mv.dest[0],bd=Infinity;\n      for(const s of mv.dest){ const sc=mv.secCentroid[s]; if(!sc||!c)continue; const d=(c[0]-sc[0])**2+(c[1]-sc[1])**2; if(d<bd){bd=d;best=s;} }\n      a[m]=best; }\n  });\n  return a;\n}\nfunction deslocFor(mv,assign){\n  let d=0;\n  mv.leaders.forEach(L=>{const byS={};let tot=0;\n    for(const [m,c] of Object.entries(L.byMuni)){if(m==='__OUTROS__')continue;const s=assign[m];if(s){byS[s]=(byS[s]||0)+c;tot+=c;}}\n    const home=mv.dest.reduce((a,s)=>(byS[s]||0)>(byS[a]||0)?s:a,mv.dest[0]);\n    d+=tot-(byS[home]||0);});\n  return d;\n}\nfunction spanMapFor(mv,a){const inc={};mv.dest.forEach(s=>inc[s]=0);\n  Object.entries(mv.munis).forEach(([m,o])=>{if(m==='__OUTROS__')return;const s=a[m];if(s&&inc[s]!=null)inc[s]+=o.cbs;});\n  // Orphan CBs follow their leader's home sector, and that home depends on THIS candidate\n  // assignment — so they have to be counted here, or the optimizer would score and constrain a\n  // span that differs from the one the UI shows. Skipped entirely when there are no orphans.\n  if(mv.orphanByGroup&&Object.keys(mv.orphanByGroup).length){\n    mv.leaders.forEach(L=>{\n      const orphan=mv.orphanByGroup[L.grupo]||0; if(!orphan) return;\n      const byS={}; let tot=0;\n      for(const [m,c] of Object.entries(L.byMuni)){ if(m==='__OUTROS__') continue; const s=a[m]; if(s&&inc[s]!=null){ byS[s]=(byS[s]||0)+c; tot+=c; } }\n      if(!tot) return;   // no home to follow -> stranded, counted nowhere\n      const home=mv.dest.reduce((x,s)=>(byS[s]||0)>(byS[x]||0)?s:x,mv.dest[0]);\n      if(inc[home]!=null) inc[home]+=orphan;\n    });\n  }\n  const sp={};mv.dest.forEach(s=>sp[s]=(+(mv.baseMetrics[s]?.cbs||0))+inc[s]);return sp;}\nfunction maxSpanOfFor(mv,a){return Math.max(...Object.values(spanMapFor(mv,a)),0);}\nfunction spanLimits(mv){\n  // Span alvo/máximo/mínimo é uma regra de fechamento de SETOR (tamanho ideal de território) —\n  // GV/mercado não têm essa noção e ignoram qualquer valor configurado nas opções da sessão.\n  if(mv && (mv.level||'setor')!=='setor') return {target:null,max:null,min:null};\n  const st={...DEFAULT_SETTINGS,...(SESS.settings||{})};\n  return {target:numOrNull(st.targetSpan),max:numOrNull(st.maxSpan),min:numOrNull(st.minSpan)};}\nfunction spanLimitsOn(lim){return !!(lim.target||lim.max||lim.min);}\nfunction spanViolationsOf(sp,lim){const over=[],under=[];\n  Object.entries(sp).forEach(([s,v])=>{ if(lim.max&&v>lim.max)over.push(s); if(lim.min&&v<lim.min)under.push(s); });\n  return {over,under};}\nfunction spanViolationsFor(mv,a){return spanViolationsOf(spanMapFor(mv,a),spanLimits(mv));}\n// With a target span the objective becomes RMS distance from the ideal size (punishes too big AND\n// too small). With no target we keep the legacy objective: shave the biggest sector.\nfunction spanCostFor(mv,a){const lim=spanLimits(mv),vals=Object.values(spanMapFor(mv,a));\n  if(!vals.length) return 0;\n  if(lim.target) return Math.sqrt(vals.reduce((s,v)=>s+(v-lim.target)**2,0)/vals.length);\n  return Math.max(...vals);}\n// ---------- ÓTIMO: objetivo multi-critério ----------\n// Three normalised objectives, each 0..1, so the weights below are directly comparable. The old\n// score added a span cost measured in CBs to a desloc measured in CBs, so on a large sector the\n// balance term was numerically ~100x the desloc term and silently decided everything on its own.\n//   balance — RMS spread of the resulting spans (against the target span when one is set,\n//             otherwise against their own mean), over that reference. 0 = every destination\n//             sector ends up the same size.\n//   dist    — how far each município travels, CB-weighted: half from the share of its outer\n//             border that faces the sector it was given to, half from centroid distance. 0 =\n//             every município went to a sector it physically touches. Adjacency used to be a\n//             pure yes/no constraint (contiguity); this is what makes it a preference too.\n//   orphan  — stranded orphan CBs (leader left without a home sector, so they land nowhere at\n//             all) plus CBs split away from their leader's home, over the CBs at stake.\n//             Stranded ones count OPT_STRAND_K times: a stranded CB leaves the model entirely,\n//             a deslocated one merely changes hands.\nconst OPT_W={balance:1, dist:0.85, orphan:1};\nconst OPT_STRAND_K=3;\nconst OPT_SIMS=24;             // simultaneous simulations per run, scaled down on big stages\nconst OPT_PASSES=14;           // local-search sweeps inside one simulation\nconst OPT_EVAL_BUDGET=120000;  // total candidate evaluations across the whole portfolio\nconst OPT_EXHAUSTIVE_MAX=60000;\nfunction optDistPrep(mv){\n  let mx=0;\n  Object.keys(mv.munis).forEach(m=>{ if(m==='__OUTROS__') return; const c=mv.muniCentroid[m]; if(!c) return;\n    mv.dest.forEach(s=>{ const sc=mv.secCentroid[s]; if(!sc) return;\n      const d=Math.hypot(c[0]-sc[0],c[1]-sc[1]); if(d>mx) mx=d; }); });\n  return mx||1;\n}\nfunction optDistCost(mv,m,s,dmax){\n  const v=mv.allowed[m]||{}; let tot=0; for(const k in v) tot+=v[k];\n  const share=tot?((v[s]||0)/tot):0;\n  const c=mv.muniCentroid[m], sc=mv.secCentroid[s];\n  // Missing centroid on either side is neutral (0.5), never 0 — an unmeasurable move must not\n  // score as the cheapest one on the board.\n  const geo=(c&&sc)?Math.min(1,Math.hypot(c[0]-sc[0],c[1]-sc[1])/dmax):0.5;\n  return 0.5*(1-share)+0.5*geo;\n}\nfunction optEval(mv,a,dmax){\n  const lim=spanLimits(mv);\n  const sp=spanMapFor(mv,a), vals=Object.values(sp);\n  let balance=0;\n  if(vals.length){\n    const ref=lim.target||(vals.reduce((x,y)=>x+y,0)/vals.length);\n    if(ref) balance=Math.min(1,Math.sqrt(vals.reduce((s,v)=>s+(v-ref)**2,0)/vals.length)/ref);\n  }\n  let cbs=0,dist=0;\n  for(const m in a){ const o=mv.munis[m]; if(!o) continue; const w=+o.cbs||0; cbs+=w; dist+=w*optDistCost(mv,m,a[m],dmax); }\n  dist=cbs?(dist/cbs):0;\n  let stranded=0,desloc=0,tot=0;\n  mv.leaders.forEach(L=>{\n    const byS={}; let t=0;\n    for(const [m,c] of Object.entries(L.byMuni)){ if(m==='__OUTROS__') continue; const s=a[m]; if(s){ byS[s]=(byS[s]||0)+c; t+=c; } }\n    const orphan=(mv.orphanByGroup&&mv.orphanByGroup[L.grupo])||0;\n    tot+=t+orphan;\n    if(!t){ stranded+=orphan; return; }   // no allocated CBs -> no home -> these orphans land nowhere\n    const home=mv.dest.reduce((x,s)=>(byS[s]||0)>(byS[x]||0)?s:x,mv.dest[0]);\n    desloc+=t-(byS[home]||0);\n  });\n  const orphanTerm=tot?Math.min(1,(desloc+OPT_STRAND_K*stranded)/tot):0;\n  return { cost:OPT_W.balance*balance+OPT_W.dist*dist+OPT_W.orphan*orphanTerm,\n           balance, dist, desloc, stranded, sp, viol:spanViolationsOf(sp,lim) };\n}\nfunction optScoreFor(mv,a){ return optEval(mv,a,mv.__optDmax||optDistPrep(mv)).cost; }\n// Seeded PRNG on purpose. computeMovement runs the optimizer for EVERY stage and recomputeFrom\n// re-runs every stage downstream of an edit, so a Math.random() portfolio would hand back a\n// different allocation on each pass and a saved timeline would never reproduce.\nfunction optRng(seed){ let a=seed>>>0;\n  return ()=>{ a=(a+0x6D2B79F5)>>>0; let t=Math.imul(a^(a>>>15),1|a);\n    t=(t+Math.imul(t^(t>>>7),61|t))^t; return ((t^(t>>>14))>>>0)/4294967296; }; }\nfunction optSeed(mv,ms){ let h=2166136261>>>0;\n  const s=String(mv.sector)+'|'+ms.join(',')+'|'+mv.dest.join(',');\n  for(let i=0;i<s.length;i++) h=Math.imul(h^s.charCodeAt(i),16777619);\n  return h>>>0; }\nfunction contigBadFor(mv,assign){\n  // Contiguidade geográfica só faz sentido no grão de município (setor fechando): setores e GVs\n  // não precisam formar uma mancha contínua quando GV/mercado fecha — cada setor/GV vai pro destino\n  // que faz sentido pra ele, sem exigir que o conjunto redistribuído continue \"grudado\".\n  if((mv.level||'setor')!=='setor') return [];\n  const bySec={}; for(const m in assign){(bySec[assign[m]]=bySec[assign[m]]||[]).push(m);}\n  const bad=[];\n  for(const s in bySec){const grp=bySec[s],inGrp=new Set(grp);\n    const seeds=grp.filter(m=>(mv.allowed[m]||{})[s]);\n    if(!seeds.length){bad.push(s);continue;}\n    const seen=new Set(seeds),st=[...seeds];\n    while(st.length){const m=st.pop();(mv.closeAdj[m]||[]).forEach(o=>{if(inGrp.has(o)&&!seen.has(o)){seen.add(o);st.push(o);}});}\n    if(seen.size!==grp.length)bad.push(s);}\n  return bad;\n}\nfunction greedyFor(mv,ms,opts){const lim=spanLimits(mv);const a={};\n  ms.forEach((m,i)=>{let best=opts[i][0],bd=Infinity;\n    for(const s of opts[i]){a[m]=s;\n      // over-max only grows as we keep assigning, so it is safe to penalise mid-build;\n      // under-min shrinks, so penalising it here would just chase noise.\n      const over=lim.max?spanViolationsOf(spanMapFor(mv,a),{max:lim.max,min:null}).over.length:0;\n      const d=optScoreFor(mv,a)+(contigBadFor(mv,a).length?1e9:0)+over*1e6;\n      if(d<bd){bd=d;best=s;}}\n    a[m]=best;});\n  return a;}\nfunction optimizeFor(mv){\n  const ms=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__');\n  if(!ms.length||!mv.dest.length){ mv.optBadge=mv.dest.length?'':'sem setor destino identificado'; return {}; }\n  const opts=ms.map(m=>{const al=(mv.reachable[m]&&mv.reachable[m].length)?mv.reachable[m]:mv.dest.slice();return al.length?al:mv.dest.slice();});\n  const combos=opts.reduce((a,o)=>a*o.length,1);\n  const lim=spanLimits(mv);\n  const dmax=optDistPrep(mv); mv.__optDmax=dmax;\n\n  // Feasibility ladder — same meaning as before, because renderSpanRule and the saved sessions\n  // both read mv.optTier: 0 = contíguo + max + min span, 1 = contíguo + max span, 2 = contíguo\n  // only. Every candidate any simulation produces is offered to all three tiers; we ship the\n  // strictest tier that got a solution, so an unreachable min/max relaxes loudly instead of\n  // stranding the stage with nothing.\n  const tier=[null,null,null],tSc=[Infinity,Infinity,Infinity],tEv=[null,null,null];\n  let feasible=0,evals=0;\n  const offer=(a,ev)=>{\n    if(contigBadFor(mv,a).length) return false;\n    feasible++;\n    const put=t=>{ if(ev.cost<tSc[t]){ tSc[t]=ev.cost; tier[t]={...a}; tEv[t]=ev; } };\n    put(2);\n    if(!ev.viol.over.length){ put(1); if(!ev.viol.under.length) put(0); }\n    return true;\n  };\n  const evalOf=a=>{ evals++; return optEval(mv,a,dmax); };\n\n  // Small enough to settle the question outright: enumerate every contiguous allocation and the\n  // winner is provably the best one under this objective. No search needed, so none is run.\n  const exhaustive=combos<=OPT_EXHAUSTIVE_MAX;\n  let sims=0;\n  if(exhaustive){\n    const cur={};\n    const rec=i=>{ if(i===ms.length){ offer(cur,evalOf(cur)); return; }\n      for(const s of opts[i]){ cur[ms[i]]=s; rec(i+1); } };\n    rec(0);\n  } else {\n    // Too big to enumerate, so run a portfolio of independent simulations instead. Each one is a\n    // seed assignment, then hill-climbing on single-município reassignments, then one perturbation\n    // and another climb to escape whatever local optimum it settled into. Different seeds land in\n    // different basins; the ladder above keeps the best across all of them.\n    const improve=a=>{\n      let ev=evalOf(a); offer(a,ev);\n      for(let pass=0;pass<OPT_PASSES;pass++){\n        let moved=false;\n        for(let i=0;i<ms.length;i++){\n          const m=ms[i],cur=a[m]; let best=cur,bev=ev;\n          for(const s of opts[i]){\n            if(s===cur) continue;\n            a[m]=s;\n            const e=evalOf(a);\n            // contiguity is a hard constraint, and the cheaper test runs first on purpose\n            if(e.cost<bev.cost-1e-12 && !contigBadFor(mv,a).length){ best=s; bev=e; }\n          }\n          a[m]=best;\n          if(best!==cur){ ev=bev; moved=true; offer(a,ev); }\n        }\n        if(!moved) break;\n      }\n    };\n    const rng=optRng(optSeed(mv,ms));\n    const perSim=Math.max(1,ms.length*Math.max(1,mv.dest.length)*OPT_PASSES);\n    const budget=Math.max(4,Math.min(OPT_SIMS,Math.floor(OPT_EVAL_BUDGET/perSim)||4));\n    const seeds=[];\n    if(mv.assign&&ms.every(m=>mv.assign[m])) seeds.push({...mv.assign});   // never regress on what is already on screen\n    seeds.push(autoAssignFor(mv));                                        // adjacency-first seed\n    seeds.push(greedyFor(mv,ms,opts));                                    // balance-first seed\n    while(seeds.length<budget){\n      // randomised construction biased toward nearby sectors — the bias keeps each seed sane, the\n      // randomness is what sends the runs into different basins\n      const a={};\n      ms.forEach((m,i)=>{ let bs=opts[i][0],bw=-Infinity;\n        for(const s of opts[i]){ const w=(1-optDistCost(mv,m,s,dmax))+rng()*0.9; if(w>bw){bw=w;bs=s;} }\n        a[m]=bs; });\n      seeds.push(a);\n    }\n    seeds.forEach(seed=>{\n      const a={...seed};\n      // a restored or legacy assign can still name a sector this stage no longer offers\n      ms.forEach((m,i)=>{ if(!opts[i].includes(a[m])) a[m]=opts[i][0]; });\n      improve(a);\n      const kick=Math.max(1,Math.round(ms.length*0.25));\n      for(let k=0;k<kick;k++){ const i=Math.floor(rng()*ms.length); a[ms[i]]=opts[i][Math.floor(rng()*opts[i].length)]; }\n      improve(a);\n    });\n    sims=seeds.length;\n  }\n\n  const t=tier.findIndex(x=>x);\n  if(t<0){ mv.optTier=-1; mv.optBadge='sem solução conectada — heurística'; return greedyFor(mv,ms,opts); }\n  const best=tier[t], ev=tEv[t]; mv.optTier=t;\n  const relax=[];\n  if(t>0 && lim.min) relax.push('span mínimo '+fmt(lim.min));\n  if(t>1 && lim.max) relax.push('span máximo '+fmt(lim.max));\n  mv.optStats={balance:ev.balance,dist:ev.dist,desloc:ev.desloc,stranded:ev.stranded,sims,evals,feasible,combos,exhaustive};\n  mv.optBadge=`ótimo · ${exhaustive?`espaço completo (${fmt(combos)})`:`${fmt(sims)} simulações`}`\n    +` · equilíbrio ±${Math.round(ev.balance*100)}% · adjacência ${Math.round((1-ev.dist)*100)}%`\n    +` · quebra ${fmt(ev.desloc)} CBs · ${fmt(ev.stranded)} fora do setor sem destino`\n    +` · pico ${fmt(maxSpanOfFor(mv,best))} CBs`\n    +(lim.target?` · alvo ${fmt(lim.target)}`:'')\n    +(relax.length?` · ⚠ inatingível: ${relax.join(' + ')}`:(spanLimitsOn(lim)?' · limites ok':''));\n  return best;\n}\nfunction computeDerived(mv){\n  const inc={},gained={},orph={};mv.dest.forEach(s=>{inc[s]=0;gained[s]=0;orph[s]=0;});\n  Object.entries(mv.munis).forEach(([m,o])=>{if(m==='__OUTROS__')return;const s=mv.assign[m];if(s&&inc[s]!=null)inc[s]+=o.cbs;});\n  let desloc=0,orphanTotal=0,orphanStranded=0;\n  const L2=mv.leaders.map(L=>{const byS={};mv.dest.forEach(s=>byS[s]=0);let tot=0;\n    for(const [m,c] of Object.entries(L.byMuni)){if(m==='__OUTROS__')continue;const s=mv.assign[m];if(s&&byS[s]!=null){byS[s]+=c;tot+=c;}}\n    // no allocated CBs => no home. Picking dest[0] by default would silently dump this leader's\n    // orphan CBs into an arbitrary sector, so we leave it null and report them as stranded.\n    const home=(tot>0&&mv.dest.length)?mv.dest.reduce((a,s)=>byS[s]>byS[a]?s:a,mv.dest[0]):null;\n    const dl=tot-(home?byS[home]:0);desloc+=dl;if(home)gained[home]++;\n    const orphan=(mv.orphanByGroup&&mv.orphanByGroup[L.grupo])||0;\n    orphanTotal+=orphan;\n    if(orphan){ if(home&&orph[home]!=null) orph[home]+=orphan; else orphanStranded+=orphan; }\n    return {...L,byS,home,desloc:dl,assignedTotal:tot,orphan,orphanHome:(orphan&&home)?home:null};});\n  const span={};mv.dest.forEach(s=>span[s]=(+(mv.baseMetrics[s]?.cbs||0))+inc[s]+orph[s]);\n  return {inc,gained,desloc,leaders:L2,span,orph,orphanTotal,orphanStranded};\n}\n\nasync function computeMovement(code,level,world){\n  level=level||'setor';\n  code=String(code);\n  const mv={sector:code,level,policy:'fora',view:'tobe',selMuni:null,optBadge:''};\n  const SNAP=SESS.snapLiteral;\n  // GV/mercado precisam da base ANTES de montar a query (pra saber quais CD_SETOR entram no IN);\n  // setor não precisa — mantém o timing original (a query dispara sem esperar o CSV).\n  let domBase=level==='setor'?null:await ensureDominantes();\n  const memberSectors=level==='setor'?[code]:memberSectorsOf(level,code,world);\n  if(!memberSectors.length) throw new Error(`${LEVELS[level].label} ${code} não existe na base de municípios dominantes (CSV) — atualize a base antes de fechar`);\n  const secList=memberSectors.join(',');\n\n  const mSQL=`SELECT DS_MUNICIPIO municipio, CD_SETOR setor, CD_GRUPO grupo, MAX(DS_LEADER_NAME) lider,\n     COUNT(DISTINCT CD_CONSULTORA) cbs, ROUND(SUM(VL_PEDIDOS_CICLO),0) receita,\n     ROUND(SUM(VL_PEDIDOS_NATURA_CICLO),0) rec_nat, ROUND(SUM(VL_PEDIDOS_AVON_CICLO),0) rec_avon,\n     ROUND(SUM(QT_PONTOS_CICLO),0) pontos, ROUND(SUM(QT_PEDIDOS_CICLO),0) pedidos,\n     SUM(CASE WHEN ST_FEZ_PED_CICLO_ATUAL THEN 1 ELSE 0 END) ativas\n    FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR IN (${secList}) AND DT_HISTORICO=${SNAP}\n    GROUP BY DS_MUNICIPIO, CD_SETOR, CD_GRUPO`;\n  const ufSQL=`SELECT DS_ESTADO uf, COUNT(*) n FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR IN (${secList}) AND DT_HISTORICO=${SNAP} GROUP BY DS_ESTADO ORDER BY n DESC`;\n  const trendSQL=`SELECT operational_cycle ciclo, COUNT(DISTINCT person_code) cbs,\n     COUNT(DISTINCT CASE WHEN registered_bc_ind=1 THEN person_code END) ativas,\n     ROUND(SUM(revenue_nat_ss_amt),0) receita, ROUND(SUM(points_nat_ss_amt),0) pontos\n    FROM ${ELO} WHERE country_code=1 AND sector_code IN (${secList}) AND operational_cycle<=${SESS.eloMaxCycle||999999} GROUP BY operational_cycle ORDER BY operational_cycle DESC LIMIT 8`;\n  const lvlSQL=`SELECT DS_NVL_PLAN_CRESC nivel, COUNT(DISTINCT CD_CONSULTORA) cbs,\n     ROUND(SUM(VL_PEDIDOS_NATURA_CICLO),0) rec_nat, ROUND(SUM(VL_PEDIDOS_AVON_CICLO),0) rec_avon\n    FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR IN (${secList}) AND DS_NVL_PLAN_CRESC IS NOT NULL AND DT_HISTORICO=${SNAP} GROUP BY DS_NVL_PLAN_CRESC ORDER BY cbs DESC`;\n  const lvlMuniSQL=`SELECT DS_MUNICIPIO municipio, CD_SETOR setor, DS_NVL_PLAN_CRESC nivel, COUNT(DISTINCT CD_CONSULTORA) cbs\n    FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR IN (${secList}) AND DS_NVL_PLAN_CRESC IS NOT NULL AND DT_HISTORICO=${SNAP} GROUP BY DS_MUNICIPIO, CD_SETOR, DS_NVL_PLAN_CRESC`;\n  const [mR,ufR,tR,lR,lmR]=await Promise.all([q(mSQL),q(ufSQL),q(trendSQL),q(lvlSQL),q(lvlMuniSQL)]);\n\n  const ownMatrix=rows(mR).filter(r=>+r.cbs>0);\n  mv.pureOwnMetrics=blankM();\n  ownMatrix.forEach(r=>{ mv.pureOwnMetrics.cbs+=+r.cbs; mv.pureOwnMetrics.receita+=+r.receita||0; mv.pureOwnMetrics.rec_nat+=+r.rec_nat||0; mv.pureOwnMetrics.rec_avon+=+r.rec_avon||0; mv.pureOwnMetrics.pontos+=+r.pontos||0; mv.pureOwnMetrics.pedidos+=+r.pedidos||0; mv.pureOwnMetrics.ativas+=+r.ativas||0; });\n\n  mv.levelByMuni={};\n  if(level==='setor') Object.entries(world.muniLevel||{}).forEach(([m,lv])=>{ if(world.muniOverride[m]===code) mv.levelByMuni[m]={...lv}; });\n\n  mv.trend=rows(tR).map(r=>({...r,cbs:+r.cbs,ativas:+r.ativas,receita:+r.receita,pontos:+r.pontos})).filter(r=>r.cbs>10).reverse();\n  mv.levels=rows(lR);\n\n  let absorbedRows=[],inheritedOrphanRows=[];\n  if(level==='setor'){\n    Object.entries(world.muniOverride).forEach(([m,destSec])=>{ if(destSec===code && world.muniRow[m]) absorbedRows.push(...world.muniRow[m]); });\n    inheritedOrphanRows=(world.sectorOrphanRows&&world.sectorOrphanRows[code])||[];\n  }\n  mv.matrix=ownMatrix.concat(absorbedRows,inheritedOrphanRows);\n\n  const ufList=rows(ufR).map(r=>r.uf).filter(Boolean);\n  const domUF=ufList[0]||'PR';\n  mv.domUF=domUF;\n  domBase=domBase||await ensureDominantes();\n  // Uma GV ou mercado pode espalhar por mais UFs do que \"a UF dominante + suas vizinhas\" cobre —\n  // toda UF que aparece na base de dominantes de QUALQUER setor-membro entra na janela de shapes.\n  const memberUFs=new Set([domUF]);\n  memberSectors.forEach(s=>{ (domBase[String(s)]||new Set()).forEach(entry=>{ const u=mUf(entry); if(u) memberUFs.add(u); }); });\n  const ufSet=new Set(memberUFs);\n  memberUFs.forEach(u=>(UF_BORDERS[u]||[]).forEach(b=>ufSet.add(b)));\n  const geos=await Promise.all([...ufSet].map(u=>geoUF(u).catch(()=>null)));\n  const allFeat=geos.filter(Boolean).flatMap(g=>g.features);\n  const adj=buildAdj(allFeat);\n\n  // A UF só vem da base de dominantes (setor real da linha × município), nunca de \"esse nome só\n  // apareceu numa UF carregada\" ou de um chute pra UF dominante do fechamento inteiro. Os dois\n  // eram seguros quando só 1-3 UFs entravam na janela (fechamento de setor); GV e principalmente\n  // mercado carregam dezenas de UFs de uma vez, então \"único entre as UFs carregadas\" deixa de\n  // significar \"único no Brasil\" — era exatamente esse chute que colocava um homônimo de outra UF\n  // espalhado longe do resto do mapa. Sem entrada na base, o município fica sem UF (mesmo\n  // tratamento de \"sem shape\" que já existe) em vez de arriscar aparecer no lugar errado.\n  const ufGuessed={};\n  const ufFor=(setorOf,muni)=>{const nm=norm(muni);\n    return (DOM.ufBySetorMuni&&DOM.ufBySetorMuni[String(setorOf)+'|'+nm])||'';};\n  mv.matrix.forEach(r=>{ if(!r.uf) r.uf=ufFor(r.setor,r.municipio); });\n  rows(lmR).forEach(r=>{ const k=mkey(r.municipio,ufFor(r.setor,r.municipio)); (mv.levelByMuni[k]=mv.levelByMuni[k]||{})[r.nivel]=+r.cbs; });\n\n  const totBy={}; mv.matrix.forEach(r=>{const n=mkey(r.municipio,r.uf); totBy[n]=(totBy[n]||0)+ +r.cbs;});\n  const footprint=new Set(Object.entries(totBy).filter(([,c])=>c>0).map(([m])=>m));\n  const withShape=[...footprint].filter(n=>adj.feat[n]||world.muniGeo[n]);\n  mv.cbsByMuni={...totBy}; mv.shapeMunis=withShape.slice();\n  mv.noShapeMunis=[...footprint].filter(n=>!(adj.feat[n]||world.muniGeo[n])).map(n=>({muni:n,cbs:totBy[n]||0})).sort((a,b)=>b.cbs-a.cbs);\n  mv.noShapeCbs=mv.noShapeMunis.reduce((a,x)=>a+x.cbs,0);\n\n  // ---- RULE: quais municípios pertencem a este fechamento ----\n  // setor: exatamente a regra de hoje. GV/mercado: união da base de TODOS os setores-membro — a\n  // base já garante que um setor pertence a uma única GV/mercado, então não existe aqui o spillover\n  // fuzzy que município tem contra setor (por isso o orphan-handling abaixo é pulado nesses níveis).\n  let domOwn;\n  if(level==='setor'){\n    domOwn=domBase[code]||new Set();\n  } else {\n    domOwn=new Set();\n    memberSectors.forEach(s=>(domBase[String(s)]||new Set()).forEach(n=>domOwn.add(n)));\n  }\n  const inherited=level==='setor'?new Set(Object.keys(world.muniOverride||{}).filter(m=>world.muniOverride[m]===code)):new Set();\n  if(!domOwn.size && !inherited.size) throw new Error(`${LEVELS[level].label} ${code} não existe na base de municípios dominantes (CSV) — atualize a base antes de fechar`);\n  const belongs=n=>domOwn.has(n)||(!DOM.hasUf&&domOwn.has(mName(n)))||inherited.has(n);\n  mv.domCsvMunis=domOwn.size;\n  const dropped=level==='setor'?withShape.filter(n=>!belongs(n)):[];\n  if(withShape.length && dropped.length===withShape.length) throw new Error(`${LEVELS[level].label} ${code}: nenhum dos municípios com CBs está na base de dominantes — nada pra realocar`);\n  const droppedSet=new Set(dropped);\n  mv.excludedMunis=dropped.map(n=>({muni:n,cbs:totBy[n]||0})).sort((a,b)=>b.cbs-a.cbs);\n  mv.excludedCbs=dropped.reduce((a,n)=>a+(totBy[n]||0),0);\n\n  const closingNames=withShape.filter(n=>!droppedSet.has(n));\n  const closingSet=new Set(closingNames);\n  mv.geoFeat={}; closingNames.forEach(n=>{ mv.geoFeat[n]=(adj.feat[n]&&adj.feat[n].f)||world.muniGeo[n]; });\n\n  // ---- unidade de realocação: a geometria é sempre município; a UNIDADE que troca de dono é o\n  // próprio município (setor fecha), o setor inteiro (GV fecha) ou a GV inteira (mercado fecha).\n  const municipioSetor={}; mv.matrix.forEach(r=>{ const n=mkey(r.municipio,r.uf); if(!municipioSetor[n]) municipioSetor[n]=String(r.setor); });\n  const resolveUnit=n=>{\n    if(level==='setor') return n;\n    const sOf=municipioSetor[n]; if(!sOf) return '';\n    return level==='gv'?sOf:(DOM.gvBySetor[sOf]||'');\n  };\n  mv.unitOfMuni={}; closingNames.forEach(n=>{ mv.unitOfMuni[n]=resolveUnit(n); });\n  mv.unitMunis={}; closingNames.forEach(n=>{ const u=mv.unitOfMuni[n]; if(!u) return; (mv.unitMunis[u]=mv.unitMunis[u]||[]).push(n); });\n  const units=level==='setor'?closingNames:Object.keys(mv.unitMunis);\n\n  const drawnCsv=new Set(closingNames.map(n=>DOM.hasUf?n:mName(n)));\n  const footKeyOf=k=>DOM.hasUf?(footprint.has(k)?k:null):([...footprint].find(x=>mName(x)===k)||null);\n  mv.csvMunisTotal=domOwn.size;\n  mv.ufGuessed={...ufGuessed};\n  if(level==='setor'){\n    mv.missingMunis=[...domOwn].filter(k=>!drawnCsv.has(k)).map(k=>{\n      const fk=footKeyOf(k);\n      const hasShape=!!(adj.feat[fk||k]||world.muniGeo[fk||k]);\n      const alias=[...footprint].filter(x=>x!==k&&mName(x)===mName(k));\n      let reason;\n      if(!fk&&alias.length) reason=`UF divergente — as CBs entraram na chave ${alias.join(' / ')} e a base diz ${k}`;\n      else if(!fk) reason=hasShape?'sem CBs neste setor no snapshot — desenhado como vizinho':'sem CBs neste setor no snapshot';\n      else if(!hasShape) reason='sem shape nas UFs carregadas';\n      else reason='chave não casou com a base de dominantes';\n      return {muni:k,cbs:(fk?totBy[fk]:alias.reduce((a,x)=>a+(totBy[x]||0),0))||0,reason:reason};\n    });\n  } else {\n    mv.missingMunis=[];\n  }\n\n  // ---- HARD RULE: destino tem de compartilhar a fronteira certa acima do que está fechando ----\n  // setor → mesma GV; GV → mesmo mercado; mercado → nada acima, qualquer vizinho vale.\n  const ownParent=parentOf(level,code);\n  if(level!=='mercado' && !ownParent) throw new Error(`${LEVELS[level].label} ${code} não tem ${level==='setor'?'CD_GV':'MERCADO'} na base de municípios dominantes — sem essa fronteira não há como garantir que os destinos ficam do lado certo da hierarquia`);\n  const sameParent=destCode=>!ownParent||parentOf(level,destCode)===ownParent;\n  mv.gv=ownParent;\n  const alreadyClosed=destCode=>level==='setor'?world.closedSectors.has(destCode):(level==='gv'?(world.closedGvs||new Set()).has(destCode):(world.closedMercados||new Set()).has(destCode));\n\n  const destRule=(SESS.settings&&SESS.settings.destRule)||DEFAULT_SETTINGS.destRule;\n  const destMinCbs=Math.max(1,Math.round(+((SESS.settings||{}).destMinCbs)||DEFAULT_SETTINGS.destMinCbs));\n  mv.destRule=destRule; mv.destMinCbs=destMinCbs; mv.destRuleFallback=false;\n  mv.allowed={}; mv.allowedRaw={};\n  units.forEach(u=>{ mv.allowed[u]={}; mv.allowedRaw[u]={}; });\n\n  const extVotes={}; const nbrNames=new Set(); let domSecOf={};\n  if(level==='setor'){\n    // setor: destino descoberto por ADJACÊNCIA GEOGRÁFICA de município — uma query ao vivo por\n    // vizinho, mas o perímetro de UM setor é pequeno o bastante pra valer a pena.\n    closingNames.forEach(n=>{\n      if(!adj.feat[n]) return;\n      adj.nbrs(n).forEach(({o,w})=>{ if(!closingSet.has(o) && !droppedSet.has(o)){ nbrNames.add(o); (extVotes[n]=extVotes[n]||[]).push({o,w}); } });\n    });\n    let neigh=[];\n    if(nbrNames.size){\n      const inList=[...new Set([...nbrNames].map(n=>mName(n)))].map(n=>`'${n.replace(/'/g,\"''\")}'`).join(',');\n      const nSQL=`SELECT DS_MUNICIPIO municipio, CD_SETOR setor, COUNT(DISTINCT CD_CONSULTORA) cbs\n        FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR NOT IN (${secList}) AND CD_SETOR>0 AND DT_HISTORICO=${SNAP} AND DS_MUNICIPIO IN (${inList}) GROUP BY DS_MUNICIPIO, CD_SETOR`;\n      neigh=rows(await q(nSQL));\n    }\n    neigh.forEach(r=>{ if(!r.uf) r.uf=ufFor(r.setor,r.municipio); });\n    const byM={}; neigh.forEach(r=>{const m=mkey(r.municipio,r.uf); if(!nbrNames.has(m)) return; (byM[m]=byM[m]||[]).push(r);});\n    Object.entries(byM).forEach(([m,rs])=>{ rs.sort((a,b)=>+b.cbs-+a.cbs); domSecOf[m]=String(rs[0].setor); });\n    nbrNames.forEach(n=>{ if(world.muniOverride && world.muniOverride[n]) domSecOf[n]=world.muniOverride[n]; });\n\n    mv.nbrCurrentSector={};\n    mv.gvRejected=[];\n    const gvHidden=new Set();\n    nbrNames.forEach(n=>{\n      const destCode=destUnitOfSector(level,domSecOf[n],world);\n      if(destCode && !sameParent(destCode)){ gvHidden.add(n); if(mv.gvRejected.indexOf(destCode)<0) mv.gvRejected.push(destCode); return; }\n      if(domSecOf[n]) mv.nbrCurrentSector[n]=destCode;\n    });\n    gvHidden.forEach(n=>{ nbrNames.delete(n); delete domSecOf[n]; delete mv.nbrCurrentSector[n]; });\n    Object.keys(extVotes).forEach(n=>{ extVotes[n]=extVotes[n].filter(v=>!gvHidden.has(v.o)); });\n\n    const isBridge=n=>destRule!=='dominant'||(totBy[n]||0)>=destMinCbs;\n    mv.bridgeMunis=closingNames.filter(isBridge);\n    mv.ignoredBridges=closingNames.filter(n=>!isBridge(n));\n\n    const wAny={}, wDom={};\n    closingNames.forEach(n=>{\n      const u=n;\n      if(!mv.allowed[u]) return;\n      const bridge=isBridge(n);\n      (extVotes[n]||[]).forEach(({o,w})=>{\n        const destCode=mv.nbrCurrentSector[o];\n        if(!destCode || destCode===code || alreadyClosed(destCode)) return;\n        mv.allowed[u][destCode]=(mv.allowed[u][destCode]||0)+w;\n        mv.allowedRaw[u][destCode]=(mv.allowedRaw[u][destCode]||0)+w;\n        wAny[destCode]=(wAny[destCode]||0)+w;\n        if(bridge) wDom[destCode]=(wDom[destCode]||0)+w;\n      });\n    });\n    let secWeight=wAny;\n    if(destRule==='dominant'){\n      if(Object.keys(wDom).length) secWeight=wDom;\n      else { secWeight=wAny; mv.destRuleFallback=true; }\n    }\n    mv.dest=Object.keys(secWeight).sort((a,b)=>secWeight[b]-secWeight[a]).slice(0,6);\n    if(!mv.dest.length){\n      mv.dest=[...new Set(Object.values(mv.nbrCurrentSector))].filter(destCode=>destCode&&destCode!==code&&!alreadyClosed(destCode)&&sameParent(destCode)).slice(0,6);\n      units.forEach(u=>{ if(mv.allowed[u]&&!Object.keys(mv.allowed[u]).length){ mv.dest.forEach(destCode=>mv.allowed[u][destCode]=1); } });\n    }\n  } else {\n    // GV/mercado: destino é SEMPRE todo irmão válido na hierarquia — NUNCA descoberto por\n    // adjacência geográfica de município. Uma GV/mercado pode ter território espalhado por\n    // dezenas de UFs sem qualquer conexão física entre as partes (a hierarquia aqui é\n    // organizacional, não geográfica) — \"vizinho por fronteira de município\" não é só caro (a\n    // query ao vivo vira um IN-list de centenas de municípios e estoura timeout: foi exatamente\n    // isso que quebrou o fechamento de um mercado espalhado) — é a pergunta errada. A fronteira que\n    // já importa (mesma GV / mesmo mercado) é imposta pela regra de parentesco logo acima; dentro\n    // dela QUALQUER irmão é candidato, e o otimizador decide pelo equilíbrio de span e continuidade\n    // de líder, nunca por proximidade física — geografia não pesa aqui.\n    mv.nbrCurrentSector={};\n    mv.gvRejected=[];\n    mv.bridgeMunis=closingNames.slice();\n    mv.ignoredBridges=[];\n    const siblings=level==='gv'\n      ? [...(DOM.gvsByMercado[ownParent]||[])]\n      : Object.keys(DOM.sectorsByMercado||{});\n    mv.dest=siblings.filter(destCode=>destCode!==code && !alreadyClosed(destCode) && sameParent(destCode));\n    units.forEach(u=>{ mv.dest.forEach(destCode=>{ mv.allowed[u][destCode]=1; mv.allowedRaw[u][destCode]=1; }); });\n  }\n  mv.dest=mv.dest.filter(sameParent);\n\n  // ---- O QUE É DESENHADO: território COMPLETO de cada destino (não só a borda), sempre lido da\n  // mesma base de dominantes já usada pro lado que fecha.\n  const territoryOf=destCode=>{\n    const secs=memberSectorsOf(level,destCode,world);\n    const out=new Set();\n    secs.forEach(s=>(domBase[String(s)]||new Set()).forEach(n=>out.add(n)));\n    return out;\n  };\n  const drawSet=new Set(mv.dest);\n  mv.dest.forEach(destCode=>{\n    territoryOf(destCode).forEach(n=>{\n      if(nbrNames.has(n)) return;\n      nbrNames.add(n);\n      mv.nbrCurrentSector[n]=(level==='setor'&&world.muniOverride&&world.muniOverride[n])?world.muniOverride[n]:destCode;\n    });\n  });\n  mv.nbrFeat=[...nbrNames].filter(n=>drawSet.has(mv.nbrCurrentSector[n])).map(n=>adj.feat[n]&&adj.feat[n].f).filter(Boolean);\n  units.forEach(u=>{ Object.keys(mv.allowed[u]||{}).forEach(destCode=>{ if(!mv.dest.includes(destCode)) delete mv.allowed[u][destCode]; }); });\n  mv.color={}; mv.dest.forEach((destCode,i)=>mv.color[destCode]=PALETTE[i%PALETTE.length]);\n\n  const accC={}; Object.entries(mv.nbrCurrentSector).forEach(([nb,destCode])=>{ if(!mv.dest.includes(destCode))return; const f=(adj.feat[nb]&&adj.feat[nb].f)||world.muniGeo[nb]; if(!f)return; const c=centroidLL(f); accC[destCode]=accC[destCode]||[0,0,0]; accC[destCode][0]+=c[0]; accC[destCode][1]+=c[1]; accC[destCode][2]++; });\n  mv.secCentroid={}; mv.dest.forEach(destCode=>{ if(accC[destCode]) mv.secCentroid[destCode]=[accC[destCode][0]/accC[destCode][2],accC[destCode][1]/accC[destCode][2]]; });\n\n  if(level==='setor'){\n    mv.muniCentroid={}; closingNames.forEach(n=>{ if(mv.geoFeat[n]) mv.muniCentroid[n]=centroidLL(mv.geoFeat[n]); });\n    mv.closeAdj={}; closingNames.forEach(n=>{ mv.closeAdj[n]=adj.feat[n]?adj.nbrs(n).filter(({o})=>closingSet.has(o)).map(({o})=>o):[]; });\n  } else {\n    mv.muniCentroid={};\n    Object.entries(mv.unitMunis).forEach(([u,ms])=>{\n      const cs=ms.map(n=>mv.geoFeat[n]&&centroidLL(mv.geoFeat[n])).filter(Boolean);\n      if(cs.length) mv.muniCentroid[u]=[cs.reduce((a,c)=>a+c[0],0)/cs.length,cs.reduce((a,c)=>a+c[1],0)/cs.length];\n    });\n    mv.closeAdj={};\n    const unitSet=new Set(units);\n    Object.entries(mv.unitMunis).forEach(([u,ms])=>{\n      const touch=new Set();\n      ms.forEach(n=>{ if(!adj.feat[n]) return; adj.nbrs(n).forEach(({o})=>{ const ou=mv.unitOfMuni[o]; if(ou&&ou!==u&&unitSet.has(ou)) touch.add(ou); }); });\n      mv.closeAdj[u]=[...touch];\n    });\n  }\n  const comp={}; let ci=0; units.forEach(n=>{ if(comp[n]!=null)return; const st=[n]; comp[n]=ci; while(st.length){ const x=st.pop(); (mv.closeAdj[x]||[]).forEach(o=>{ if(comp[o]==null){ comp[o]=ci; st.push(o); } }); } ci++; });\n  const compAllowed={}; units.forEach(n=>{ const cid=comp[n]; (compAllowed[cid]=compAllowed[cid]||new Set()); Object.keys(mv.allowed[n]||{}).forEach(s=>compAllowed[cid].add(s)); });\n  mv.reachable={}; units.forEach(n=>{ mv.reachable[n]=[...(compAllowed[comp[n]]||[])].filter(s=>mv.dest.includes(s)); });\n\n  if(mv.dest.length){\n    const destSectorMap={}; mv.dest.forEach(destCode=>{ destSectorMap[destCode]=memberSectorsOf(level,destCode,world); });\n    const allDestSecs=[...new Set(Object.values(destSectorMap).flat())];\n    const rList=allDestSecs.join(',');\n    const bSQL=`SELECT CD_SETOR setor, COUNT(DISTINCT CD_CONSULTORA) cbs,\n       SUM(CASE WHEN ST_FEZ_PED_CICLO_ATUAL THEN 1 ELSE 0 END) ativas,\n       ROUND(SUM(VL_PEDIDOS_CICLO),0) receita, ROUND(SUM(VL_PEDIDOS_NATURA_CICLO),0) rec_nat,\n       ROUND(SUM(VL_PEDIDOS_AVON_CICLO),0) rec_avon, ROUND(SUM(QT_PONTOS_CICLO),0) pontos, ROUND(SUM(QT_PEDIDOS_CICLO),0) pedidos\n      FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR IN (${rList}) AND DT_HISTORICO=${SNAP} GROUP BY CD_SETOR`;\n    const blSQL=`SELECT CD_SETOR setor, DS_NVL_PLAN_CRESC nivel, COUNT(DISTINCT CD_CONSULTORA) cbs\n      FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR IN (${rList}) AND DS_NVL_PLAN_CRESC IS NOT NULL AND DT_HISTORICO=${SNAP} GROUP BY CD_SETOR, DS_NVL_PLAN_CRESC`;\n    const [bR,blR]=await Promise.all([q(bSQL),q(blSQL)]);\n    const secMetrics={}; rows(bR).forEach(r=>{ secMetrics[String(r.setor)]=r; if(!SESS.sectorBaseCache[String(r.setor)]) SESS.sectorBaseCache[String(r.setor)]=r; });\n    const secLevel={}; rows(blR).forEach(r=>{ const s=String(r.setor); (secLevel[s]=secLevel[s]||{})[r.nivel]=+r.cbs; });\n    mv.baseMetrics={}; mv.baseLevel={};\n    mv.dest.forEach(destCode=>{\n      const secs=destSectorMap[destCode];\n      const acc=blankM(); acc.setor=destCode;\n      secs.forEach(s=>{ const r=secMetrics[String(s)]; if(!r) return; Object.keys(blankM()).forEach(k=>{ acc[k]=(+acc[k]||0)+(+r[k]||0); }); });\n      mv.baseMetrics[destCode]=acc;\n      const lv={}; secs.forEach(s=>{ const l=secLevel[String(s)]; if(!l) return; Object.entries(l).forEach(([nv,c])=>{ lv[nv]=(lv[nv]||0)+c; }); });\n      mv.baseLevel[destCode]=lv;\n    });\n  } else { mv.baseMetrics={}; mv.baseLevel={}; }\n\n  mv.dest.forEach(destCode=>{\n    if(!mv.baseMetrics[destCode]) mv.baseMetrics[destCode]={setor:destCode,cbs:0,ativas:0,receita:0,rec_nat:0,rec_avon:0,pontos:0,pedidos:0};\n    const inflowSrc=level==='setor'?world.sectorInflow:(level==='gv'?world.gvInflow:world.mercadoInflow);\n    const infl=inflowSrc&&inflowSrc[destCode];\n    if(infl) Object.keys(blankM()).forEach(k=>{ mv.baseMetrics[destCode][k]=(+mv.baseMetrics[destCode][k]||0)+(infl[k]||0); });\n    if(level==='setor'){\n      const inflLv=world.sectorInflowLevel&&world.sectorInflowLevel[destCode];\n      if(inflLv){ mv.baseLevel[destCode]=mv.baseLevel[destCode]||{}; Object.entries(inflLv).forEach(([nv,c])=>{ mv.baseLevel[destCode][nv]=(mv.baseLevel[destCode][nv]||0)+c; }); }\n    }\n  });\n\n  aggregateMovement(mv);\n  mv.assign=optimizeFor(mv);\n  return mv;\n}\n\n// ---------- cascade engine ----------\nasync function computeAt(i){\n  await ensurePinned();\n  const world=foldWorldState(SESS.timeline,i);\n  const sec=SESS.timeline[i].sector;\n  const level=SESS.timeline[i].level||'setor';\n  const mv=await computeMovement(sec,level,world);\n  SESS.timeline[i]=mv;\n}\nasync function recomputeFrom(i){\n  for(let k=i;k<SESS.timeline.length;k++){\n    loader(true,`recalculando etapa ${k+1} de ${SESS.timeline.length}…`);\n    try{ await computeAt(k); }\n    catch(e){\n      // A stage that failed to recompute still holds its PREVIOUS result, so the timeline would\n      // silently mix pre- and post-change etapas. Flag this stage and everything after it as stale\n      // (dashed chip + ⟳) so the state is visible and flushDirty retries from here.\n      SESS.dirtyFrom = SESS.dirtyFrom==null ? k : Math.min(SESS.dirtyFrom,k);\n      throw e;\n    }\n  }\n}\nasync function flushDirty(){\n  if(SESS.dirtyFrom==null) return;\n  const from=SESS.dirtyFrom; SESS.dirtyFrom=null;\n  loader(true,'recalculando etapas seguintes…');\n  try{ await recomputeFrom(from); }\n  catch(e){ $('#ds').textContent='erro ao recalcular cadeia: '+e.message; $('#ds').classList.add('err'); }\n  finally{ loader(false); }\n}\nasync function addMovement(level,sec){\n  level=level||'setor';\n  sec=(sec==null?'':String(sec)).trim();\n  if(!sec) return;\n  if(!movementAvailable(level)){ $('#ds').textContent=`Fechar ${LEVELS[level].label} ainda não está disponível.`; $('#ds').classList.add('err'); return; }\n  if(!hierarchyAllows(level)){ const minLabel=LEVELS[Object.keys(LEVEL_RANK).find(k=>LEVEL_RANK[k]===sessionMinRank())].label; $('#ds').textContent=`esta sessão já fechou um nível mais alto — só \"${minLabel}\" (ou acima) fica disponível.`; $('#ds').classList.add('err'); return; }\n  const closedNow=new Set(SESS.timeline.filter(mv=>(mv.level||'setor')===level).map(mv=>mv.sector));\n  if(closedNow.has(sec)){ $('#ds').textContent=LEVELS[level].label+' '+sec+' já fechado(a) nesta timeline.'; $('#ds').classList.add('err'); return; }\n  if(level==='setor' && !SESS.sectorsList.some(s=>s.setor===sec)){ $('#ds').textContent='setor \"'+sec+'\" não existe no snapshot congelado.'; $('#ds').classList.add('err'); return; }\n  await flushDirty();\n  loader(true,`fechando ${lc(LEVELS[level].label)} `+sec+' — puxando dado do snapshot congelado…');\n  $('#liveState').classList.remove('err');\n  try{\n    SESS.timeline.push({sector:String(sec),level:level});\n    await computeAt(SESS.timeline.length-1);\n    SESS.selected=SESS.timeline.length-1;\n    $('#ds').classList.remove('err'); $('#ds').textContent='';\n  }catch(e){\n    SESS.timeline.pop();\n    $('#ds').textContent=`erro ao fechar ${lc(LEVELS[level].label)} `+sec+': '+e.message; $('#ds').classList.add('err');\n  } finally { loader(false); renderAll(); }\n}\nfunction removeFrom(i){\n  SESS.timeline.length=i;\n  SESS.selected=Math.min(SESS.selected,Math.max(0,SESS.timeline.length-1));\n  if(SESS.dirtyFrom!=null && SESS.dirtyFrom>=SESS.timeline.length) SESS.dirtyFrom=null;\n  renderAll();\n}\nasync function editSelected(mutator){\n  const mv=SESS.timeline[SESS.selected]; if(!mv) return;\n  mutator(mv);\n  if(SESS.selected<SESS.timeline.length-1){\n    SESS.dirtyFrom = SESS.dirtyFrom==null ? SESS.selected+1 : Math.min(SESS.dirtyFrom, SESS.selected+1);\n  }\n  renderAll();\n}\n\n// ---------- sectors list / picker ----------\nasync function loadSectors(){\n  const sql=`SELECT CD_SETOR setor, MAX(DS_ESTADO) uf, COUNT(DISTINCT CD_CONSULTORA) cbs, COUNT(DISTINCT DS_MUNICIPIO) munis\n    FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR>0 AND DT_HISTORICO=(SELECT MAX(DT_HISTORICO) FROM ${T} WHERE CD_PAIS=1) GROUP BY CD_SETOR ORDER BY CD_SETOR`;\n  SESS.sectorsList=rows(await q(sql)).map(r=>({setor:String(r.setor),uf:r.uf,cbs:+r.cbs,munis:+r.munis}));\n}\nfunction renderSectorPicker(){\n  const ready=SESS.stage==='main';\n  const ob=$('#openMove'); if(ob) ob.disabled=!ready;\n}\n\n// ---------- movement modal (setor / GV / mercado) ----------\n// Hierarquia mercado > GV > setor: a sessão trava no nível da primeira movimentação. Misturar\n// níveis quebraria a leitura de \"antes/depois\" da cadeia — fechar uma GV já redistribui setores\n// inteiros pra outras GVs; fechar um setor isolado depois não bate mais com o mundo que sobrou.\n// de/a/no: contrações de \"de\"/\"a\"/\"em\" com o artigo de cada nível — GV é feminina (a Gerência de\n// Vendas), setor e mercado são masculinos. Errar o gênero aqui é o tipo de coisa que grita \"isto foi\n// feito pra setor e só remendado pros outros níveis\", exatamente o que este objeto existe pra evitar.\nconst LEVELS={\n  setor:{label:'Setor',codeLbl:'Setor a fechar',placeholder:'código do setor',childLabel:'Município',destLabel:'Setor',de:'do',a:'ao',no:'no',parentLabel:'GV',parentPhrase:'da mesma GV',parentWord:'gerência'},\n  gv:{label:'GV',codeLbl:'GV a fechar',placeholder:'código da GV',childLabel:'Setor',destLabel:'GV',de:'da',a:'à',no:'na',parentLabel:'Mercado',parentPhrase:'do mesmo mercado',parentWord:'mercado'},\n  mercado:{label:'Mercado',codeLbl:'Mercado a fechar',placeholder:'nome do mercado',childLabel:'GV',destLabel:'Mercado',de:'do',a:'ao',no:'no',parentLabel:null,parentPhrase:null,parentWord:null},\n};\n// GV é sigla — .toLowerCase() a transformaria em \"gv\", errado em qualquer posição da frase. Palavras\n// normais (Setor/Mercado/Município) minúsculam à vontade no meio de uma frase; GV nunca.\nconst LOWER={Setor:'setor',Mercado:'mercado',Município:'município',GV:'GV'};\nconst lc=w=>LOWER[w]||w.toLowerCase();\n// Hierarquia é uma catraca, não um cadeado: mercado(0) > GV(1) > setor(2). Fechar um nível mais\n// alto (número menor) trava PRA SEMPRE nesta sessão qualquer nível mais baixo (número maior) —\n// mas o próprio nível, ou um ainda mais alto, continua liberado. É assim que \"posso fechar setores\n// até fechar uma GV; posso fechar GVs até fechar um mercado\" funciona: nunca destrava de volta.\nconst LEVEL_RANK={mercado:0,gv:1,setor:2};\nfunction sessionMinRank(){\n  let r=LEVEL_RANK.setor;\n  SESS.timeline.forEach(mv=>{ const rk=LEVEL_RANK[mv.level||'setor']; if(rk<r) r=rk; });\n  return r;\n}\nfunction hierarchyAllows(lvl){ return LEVEL_RANK[lvl]<=sessionMinRank(); }\nfunction movementAvailable(lvl){ return lvl==='setor'||lvl==='gv'||lvl==='mercado'; }\n// ---------- hierarquia: setor ⊂ GV ⊂ mercado — tudo derivado da base de dominantes (DOM) ----------\n// memberSectors: o escopo de CD_SETOR que a query no CRM precisa cobrir pra fechar este código, em\n// qualquer nível — um setor é ele mesmo; uma GV é todo setor que a base lhe atribui; um mercado é\n// todo setor de toda GV que a base atribui a ele.\n// membros ATUAIS de um GV/mercado, um nível abaixo (setores de uma GV; GVs de um mercado) — nunca\n// só a foto estática do CSV: uma etapa anterior NESTA MESMA sessão pode já ter movido um filho pra\n// dentro ou pra fora deste código, e um fechamento seguinte tem de enxergar o mundo como ele está\n// agora, não como o CSV descreveu antes de qualquer movimentação.\nfunction currentMembersOf(level,code,world){\n  code=String(code);\n  // \"gv\": setores da GV (DOM.sectorsByGv). \"mercado\": GVs do mercado (DOM.gvsByMercado) — NUNCA\n  // sectorsByMercado, que pula a camada de GV inteira e faz memberSectorsOf tratar códigos de\n  // setor como se fossem códigos de GV (não batem em DOM.sectorsByGv, e o fechamento morre com\n  // \"não existe na base\" mesmo quando o mercado está lá).\n  const staticMembers=level==='gv'?(DOM.sectorsByGv[code]||new Set()):(DOM.gvsByMercado[code]||new Set());\n  const overrideMap=level==='gv'?(world&&world.secOverride):(world&&world.gvOverride);\n  const out=new Set(staticMembers);\n  if(overrideMap){\n    Object.entries(overrideMap).forEach(([child,dest])=>{\n      if(dest===code) out.add(child);\n      else if(staticMembers.has(child)) out.delete(child);\n    });\n  }\n  return [...out];\n}\n// setores que a query no CRM precisa cobrir pra fechar este código, em qualquer nível — setor é\n// ele mesmo; GV é seus setores ATUAIS; mercado é todo setor de toda GV ATUALMENTE sua (setor não\n// troca de GV sozinho numa sessão de mercado — só GV inteira troca de mercado).\nfunction memberSectorsOf(level,code,world){\n  code=String(code);\n  if(level==='setor') return [code];\n  if(level==='gv') return currentMembersOf('gv',code,world);\n  const gvs=currentMembersOf('mercado',code,world);\n  const out=new Set();\n  gvs.forEach(gv=>(DOM.sectorsByGv[gv]||new Set()).forEach(s=>out.add(s)));\n  return [...out];\n}\n// fronteira que um destino tem de respeitar: GV do setor que fecha, mercado da GV que fecha —\n// mercado não tem nada acima, então não existe regra pra ele. Estática de propósito: um setor não\n// troca de GV nem uma GV troca de mercado só por existirem etapas anteriores nesta sessão — quem\n// muda de dono é o NÍVEL ABAIXO do que está fechando, nunca o próprio código sendo avaliado aqui.\nfunction parentOf(level,code){\n  code=String(code);\n  if(level==='setor') return DOM.gvBySetor[code]||'';\n  if(level==='gv') return DOM.mercadoByGv[code]||'';\n  return '';\n}\n// dado o setor que uma município vizinha atualmente pertence (fato ao vivo do CRM, nunca muda de\n// verdade), a que CANDIDATO A DESTINO isso corresponde neste nível — considerando que uma etapa\n// anterior desta sessão pode já ter movido esse setor (GV fechando) ou essa GV (mercado fechando)\n// pra outro dono, o que a foto estática do CSV sozinha não enxergaria.\nfunction destUnitOfSector(level,setorCode,world){\n  setorCode=String(setorCode);\n  if(level==='setor') return setorCode;\n  if(level==='gv'){ const ov=world&&world.secOverride&&world.secOverride[setorCode]; return ov||DOM.gvBySetor[setorCode]||''; }\n  const gv=DOM.gvBySetor[setorCode]||'';\n  const ov=world&&world.gvOverride&&world.gvOverride[gv];\n  return ov||DOM.mercadoBySetor[setorCode]||'';\n}\nfunction currentMoveLevel(){ const r=root.querySelector('input[name=\"moveLevel\"]:checked'); return (r&&r.value)||'setor'; }\nfunction openMove(){\n  const minRank=sessionMinRank();\n  const lastLevel=SESS.timeline.length?(SESS.timeline[SESS.timeline.length-1].level||'setor'):'setor';\n  root.querySelectorAll('input[name=\"moveLevel\"]').forEach(r=>{\n    const lvl=r.value;\n    r.disabled=!movementAvailable(lvl)||!hierarchyAllows(lvl);\n    r.checked=hierarchyAllows(lastLevel)?lvl===lastLevel:lvl===Object.keys(LEVEL_RANK).find(k=>LEVEL_RANK[k]===minRank);\n  });\n  const note=$('#moveLockNote');\n  const minLabel=LEVELS[Object.keys(LEVEL_RANK).find(k=>LEVEL_RANK[k]===minRank)].label;\n  if(note) note.textContent=minRank<LEVEL_RANK.setor\n    ? `Esta sessão já fechou um nível mais alto na hierarquia — só \"${minLabel}\" (ou acima) continua disponível daqui pra frente.`\n    : 'Escolha o nível a fechar. Você pode fechar setores à vontade até fechar uma GV; aí só GV (ou mercado) daqui pra frente. Fechar um mercado trava a sessão em mercado.';\n  $('#moveCode').value='';\n  const err=$('#moveErr'); if(err){ err.textContent=''; err.classList.add('hidden'); }\n  const st=$('#moveStatus'); if(st) st.textContent='';\n  $('#moveBg').classList.remove('hidden');\n  renderMoveForm();\n  const c=$('#moveCancel'); if(c) c.focus();\n}\nfunction closeMove(){ const b=$('#moveBg'); if(b) b.classList.add('hidden'); }\nfunction renderMoveForm(){\n  root.querySelectorAll('#moveBg .opt-row').forEach(r=>r.classList.toggle('on',r.dataset.lvl===currentMoveLevel()));\n  const lvl=LEVELS[currentMoveLevel()];\n  $('#moveCodeLbl').textContent=lvl.codeLbl;\n  $('#moveCode').placeholder=lvl.placeholder;\n  loadMoveOptions();\n}\nasync function loadMoveOptions(){\n  const lvl=currentMoveLevel();\n  const dl=$('#moveCodeList'); if(!dl) return;\n  const closedSet=new Set(SESS.timeline.filter(mv=>(mv.level||'setor')===lvl).map(mv=>mv.sector));\n  if(lvl==='setor'){\n    dl.innerHTML=SESS.sectorsList.filter(s=>!closedSet.has(s.setor))\n      .map(s=>`<option value=\"${s.setor}\">${s.setor} · ${s.uf||'?'} · ${fmt(s.cbs)} CBs · ${s.munis} munic.</option>`).join('');\n    return;\n  }\n  dl.innerHTML='';\n  try{ await ensureDominantes(); }catch(e){ return; }\n  if(lvl==='gv'){\n    const gvs=Object.keys(DOM.sectorsByGv||{}).filter(g=>!closedSet.has(g)).sort();\n    dl.innerHTML=gvs.map(g=>`<option value=\"${g}\">${g}${DOM.gvLabel[g]?' · '+esc(DOM.gvLabel[g]):''} · ${DOM.sectorsByGv[g].size} setor(es)</option>`).join('');\n  } else if(lvl==='mercado'){\n    const mks=Object.keys(DOM.sectorsByMercado||{}).filter(m=>!closedSet.has(m)).sort();\n    dl.innerHTML=mks.map(m=>`<option value=\"${m}\">${m} · ${(DOM.gvsByMercado[m]||new Set()).size} GV(s) · ${DOM.sectorsByMercado[m].size} setor(es)</option>`).join('');\n  }\n}\nfunction moveRandPick(){\n  const opts=[...($('#moveCodeList').options||[])].map(o=>o.value);\n  if(!opts.length) return;\n  $('#moveCode').value=opts[Math.floor(Math.random()*opts.length)];\n}\nasync function submitMove(){\n  const lvl=currentMoveLevel();\n  const code=($('#moveCode').value||'').trim();\n  const err=$('#moveErr');\n  const fail=msg=>{ if(err){ err.textContent=msg; err.classList.remove('hidden'); } };\n  if(err){ err.textContent=''; err.classList.add('hidden'); }\n  if(!movementAvailable(lvl)) return fail(`Fechar ${LEVELS[lvl].label} ainda não está disponível.`);\n  if(!hierarchyAllows(lvl)){ const minLabel=LEVELS[Object.keys(LEVEL_RANK).find(k=>LEVEL_RANK[k]===sessionMinRank())].label; return fail(`Esta sessão já fechou um nível mais alto — só \"${minLabel}\" (ou acima) fica disponível.`); }\n  if(!code) return fail('Informe um código.');\n  closeMove();\n  await addMovement(lvl,code);\n}\nfunction renderStage(){\n  const isMain=SESS.stage==='main';\n  const cc=$('#confirmCard'), mw=$('#mainWrap');\n  const hdr=$('#topHeader'), rl=$('#timelineRail');\n  if(hdr) hdr.classList.toggle('hidden', !isMain);\n  if(rl) rl.classList.toggle('hidden', !isMain);\n  if(cc) cc.classList.toggle('hidden', isMain);\n  if(mw) mw.classList.toggle('hidden', !isMain);\n  const cb=$('#confirmBody');\n  if(cb && !isMain) cb.innerHTML = SESS.snapshotRaw\n    ? `Snapshot congelado · atualizado em <b>${fmtSyncedAt(SESS.snapshotSyncedAt)}</b> · <b>${SESS.sectorsList.length}</b> setor(es) disponível(eis) pra fechar. Nenhuma consulta de detalhe roda até você confirmar e escolher o primeiro setor.`\n    : 'congelando snapshot…';\n}\n\n// ---------- session persistence ----------\n// ONE table (`timeline-shared-sessions`) holds BOTH kinds of row, so SESSIONS_DS and SHARED_DS\n// deliberately resolve to the SAME DataSet — the two names mark intent, not two stores:\n//   · working session  — carries `movements`; saveSession updates it in place\n//   · shared snapshot  — carries `sharedAt` + `stages`; doShare CREATES it and nothing updates it\n// listSessions MUST exclude the shared rows. They are write-once by contract, and if one showed\n// up in the picker, loading it and pressing Salvar would fire ds.update() straight at a frozen\n// snapshot. Filtering here is what keeps that unreachable — it is the guard, not a cosmetic.\n// Both lookups stay because a policy-gated DataSet's Process resolves late; same race the reader\n// component polls for. SESSIONS_DS lives at module scope so no call site can hit it in the TDZ.\nasync function listSessions(){\n  const ds=(d2.data('sessionsDataset')||d2.data(SESSIONS_DS)); if(!ds) return [];\n  await ds.refresh();\n  const recs=ds.records()||[];\n  return [...recs].filter(r=>!r.sharedAt).sort((a,b)=>new Date(b.updatedAt||0)-new Date(a.updatedAt||0));\n}\nasync function refreshSessionPicker(){\n  const list=await listSessions().catch(()=>[]);\n  SESS.sessionsList=list;\n  const opts=list.map(s=>`<option value=\"${s._id}\">${esc(s.label||'sem nome')} · ${fmt((s.movements||[]).length)} etapa(s)</option>`).join('')+`<option value=\"\">+ Nova sessão</option>`;\n  const sel=$('#sessionPick'); if(sel){ sel.innerHTML=opts; sel.value=SESS.sessionId||''; }\n  const csel=$('#confirmSessionPick'); if(csel){ csel.innerHTML=opts; csel.value=SESS.sessionId||''; }\n}\nasync function saveSession(){\n  const ds=(d2.data('sessionsDataset')||d2.data(SESSIONS_DS));\n  if(!ds){ $('#sessStatus').textContent='dataset de sessões indisponível'; return; }\n  if(!SESS.timeline.length){ $('#sessStatus').textContent='nada pra salvar ainda'; return; }\n  await flushDirty();\n  const label=SESS.sessionLabel||('Sessão '+new Date().toLocaleString('pt-BR'));\n  const nowIso=new Date().toISOString();\n  const payload={\n    label,\n    settings:{...DEFAULT_SETTINGS,...(SESS.settings||{})},\n    snapshotRaw:SESS.snapshotRaw, snapshotSyncedAt:SESS.snapshotSyncedAt, snapLiteral:SESS.snapLiteral, eloMaxCycle:SESS.eloMaxCycle,\n    movements:SESS.timeline.map(mv=>({\n      sector:mv.sector, level:mv.level||'setor', assign:mv.assign, policy:mv.policy,\n      matrix:mv.matrix, trend:mv.trend, levels:mv.levels, levelByMuni:mv.levelByMuni,\n      pureOwnMetrics:mv.pureOwnMetrics, domUF:mv.domUF, dest:mv.dest, color:mv.color,\n      gv:mv.gv, gvRejected:mv.gvRejected,\n      missingMunis:mv.missingMunis, csvMunisTotal:mv.csvMunisTotal, ufGuessed:mv.ufGuessed,\n      baseMetrics:mv.baseMetrics, baseLevel:mv.baseLevel, geoFeat:mv.geoFeat, nbrFeat:mv.nbrFeat,\n      nbrCurrentSector:mv.nbrCurrentSector, allowed:mv.allowed, allowedRaw:mv.allowedRaw, reachable:mv.reachable,\n      destRule:mv.destRule, destMinCbs:mv.destMinCbs, destRuleFallback:mv.destRuleFallback, optTier:mv.optTier,\n      cbsByMuni:mv.cbsByMuni, shapeMunis:mv.shapeMunis, excludedMunis:mv.excludedMunis, domCsvMunis:mv.domCsvMunis,\n      excludedCbs:mv.excludedCbs, noShapeMunis:mv.noShapeMunis, noShapeCbs:mv.noShapeCbs,\n      secCentroid:mv.secCentroid, muniCentroid:mv.muniCentroid, closeAdj:mv.closeAdj, optBadge:mv.optBadge,\n    })),\n    updatedAt:nowIso,\n  };\n  $('#sessStatus').textContent='salvando…';\n  try{\n    if(SESS.sessionId){\n      await ds.update({_id:SESS.sessionId,...payload});\n    } else {\n      payload.createdAt=nowIso;\n      const created=await ds.create(payload);\n      SESS.sessionId=(created&&created._id)||(created&&created.data&&created.data._id)||(ds.selected&&ds.selected()&&ds.selected()._id)||null;\n    }\n    SESS.sessionLabel=label;\n    await refreshSessionPicker();\n    $('#sessStatus').textContent='salvo ✓';\n  }catch(e){ $('#sessStatus').textContent='erro ao salvar: '+e.message; }\n  setTimeout(()=>{ if($('#sessStatus')) $('#sessStatus').textContent=''; },2200);\n}\n// Duplicate = drop sessionId so saveSession takes its CREATE branch instead of its update branch.\n// The source record is never written to, the copy gets a fresh _id and its own createdAt, and the\n// copy becomes the active session (so the next Salvar edits the copy, not the original).\nasync function duplicateSession(){\n  if(!SESS.timeline.length){ $('#sessStatus').textContent='nada pra duplicar ainda'; return; }\n  const prevId=SESS.sessionId, prevLabel=SESS.sessionLabel;\n  SESS.sessionId=null;\n  SESS.sessionLabel=(SESS.sessionLabel||'Sessão')+' (cópia)';\n  await saveSession();\n  if(!SESS.sessionId){\n    // saveSession swallows its own errors into #sessStatus, so a still-null id after the await is\n    // the only failure signal we get. Put the original identity back — otherwise a failed copy\n    // silently leaves the session detached, and the next Salvar would fork a new record instead\n    // of updating the one the user thought they were editing.\n    SESS.sessionId=prevId; SESS.sessionLabel=prevLabel;\n    await refreshSessionPicker().catch(()=>{});\n    return;\n  }\n  if($('#sessStatus')) $('#sessStatus').textContent='duplicado ✓';\n}\nasync function loadSession(id){\n  if(!id) return newSession();\n  const list=(SESS.sessionsList&&SESS.sessionsList.length)?SESS.sessionsList:await listSessions().catch(()=>[]);\n  const rec=list.find(s=>String(s._id)===String(id));\n  if(!rec) return newSession();\n  loader(true,'carregando sessão…');\n  SESS.sessionId=rec._id; SESS.sessionLabel=rec.label;\n  SESS.snapshotRaw=rec.snapshotRaw; SESS.snapshotSyncedAt=rec.snapshotSyncedAt||null; SESS.snapLiteral=rec.snapLiteral; SESS.eloMaxCycle=rec.eloMaxCycle;\n  SESS.settings={...DEFAULT_SETTINGS,...(rec.settings||{})};\n  SESS.timeline=(rec.movements||[]).map(m=>({sector:String(m.sector),level:m.level||'setor'}));\n  SESS.selected=0; SESS.sectorBaseCache={}; SESS.stage='main'; SESS.dirtyFrom=null;\n  try{\n    for(let i=0;i<SESS.timeline.length;i++){\n      const saved=(rec.movements||[])[i]||{};\n      // Sessions saved before the UF became part of the key hold bare-name keys in matrix rows,\n      // assign, geoFeat and closeAdj alike. Restoring that cache would mix key shapes the moment the\n      // stage is recomputed — and it would preserve the very collision this fixes — so those stages\n      // are replayed against the pinned snapshot and the manual assignment is remapped by name.\n      const legacyKeys=!!(saved.matrix&&saved.matrix.length&&saved.matrix.every(r=>r&&r.uf==null));\n      // Sessões salvas antes da regra de gerência podem carregar um destino de outra GV no cache.\n      // Restaurar esse cache manteria o setor proibido na tela para sempre, então essas etapas são\n      // reprocessadas contra o snapshot fixado — igual ao tratamento das chaves legadas.\n      const crossGv=await savedCrossesGv(saved);\n      if(saved.matrix&&!legacyKeys&&!crossGv){\n        loader(true,`restaurando etapa ${i+1}/${SESS.timeline.length} — setor ${SESS.timeline[i].sector} (cache, sem consulta)…`);\n        const mv={sector:String(saved.sector), level:saved.level||'setor', policy:saved.policy||'fora', view:'tobe', selMuni:null, optBadge:saved.optBadge||''};\n        mv.matrix=saved.matrix; mv.trend=saved.trend||[]; mv.levels=saved.levels||[]; mv.levelByMuni=saved.levelByMuni||{};\n        mv.pureOwnMetrics=saved.pureOwnMetrics||blankM(); mv.domUF=saved.domUF; mv.dest=saved.dest||[]; mv.color=saved.color||{};\n        mv.baseMetrics=saved.baseMetrics||{}; mv.baseLevel=saved.baseLevel||{}; mv.geoFeat=saved.geoFeat||{}; mv.nbrFeat=saved.nbrFeat||[];\n        mv.nbrCurrentSector=saved.nbrCurrentSector||{}; mv.allowed=saved.allowed||{}; mv.reachable=saved.reachable||{};\n        mv.allowedRaw=saved.allowedRaw||saved.allowed||{};\n        mv.destRule=saved.destRule||SESS.settings.destRule; mv.destMinCbs=saved.destMinCbs||SESS.settings.destMinCbs; mv.destRuleFallback=!!saved.destRuleFallback;\n        mv.optTier=(saved.optTier==null?0:saved.optTier);\n        mv.gv=saved.gv||''; mv.gvRejected=saved.gvRejected||[];\n        mv.missingMunis=saved.missingMunis||[]; mv.csvMunisTotal=saved.csvMunisTotal||0;\n        mv.ufGuessed=saved.ufGuessed||{};\n        mv.cbsByMuni=saved.cbsByMuni||{}; mv.shapeMunis=saved.shapeMunis||[];\n        mv.excludedMunis=saved.excludedMunis||[]; mv.excludedCbs=saved.excludedCbs||0; mv.domCsvMunis=saved.domCsvMunis||0;\n        mv.noShapeMunis=saved.noShapeMunis||[]; mv.noShapeCbs=saved.noShapeCbs||0;\n        mv.secCentroid=saved.secCentroid||{}; mv.muniCentroid=saved.muniCentroid||{}; mv.closeAdj=saved.closeAdj||{};\n        aggregateMovement(mv);\n        mv.assign=saved.assign||{};\n        if((mv.level||'setor')==='setor') mv.dest.forEach(s=>{ if(!SESS.sectorBaseCache[s]) SESS.sectorBaseCache[s]=mv.baseMetrics[s]; });\n        SESS.timeline[i]=mv;\n      } else {\n        loader(true,`replay ${i+1}/${SESS.timeline.length} — setor ${SESS.timeline[i].sector}…`);\n        await computeAt(i);\n        if(saved.assign) SESS.timeline[i].assign=legacyKeys?remapAssign(SESS.timeline[i],saved.assign):saved.assign;\n        if(saved.policy) SESS.timeline[i].policy=saved.policy;\n      }\n    }\n    await loadSectors();\n  }catch(e){ $('#ds').textContent='erro ao carregar sessão: '+e.message; $('#ds').classList.add('err'); }\n  finally{ loader(false); }\n  renderAll();\n}\n// Re-points a legacy bare-name assignment at the NAME/UF key it can only mean. When a name resolves\n// to more than one município in the recomputed stage the manual choice is genuinely ambiguous —\n// dropping it lets the optimizer allocate instead of guessing on the operator's behalf.\n// True when a cached stage names a destination outside the closing sector's gerência de vendas.\n// Judges the cache by TODAY's rule, reading the (memoised) dominantes base rather than trusting what\n// the session was saved with. Unknown GV on the closing sector answers false: the stage then loads\n// from cache instead of being replayed into the hard throw in computeMovement, which would leave the\n// operator staring at a broken session with no way back.\nasync function savedCrossesGv(saved){\n  if(!saved||!saved.sector||!(saved.dest||[]).length) return false;\n  let gvBy={};\n  try{ await ensureDominantes(); gvBy=DOM.gvBySetor||{}; }catch(e){ return false; }\n  const own=gvBy[String(saved.sector)]||'';\n  if(!own) return false;\n  if(saved.dest.some(s=>(gvBy[String(s)]||'')!==own)) return true;\n  // A stage saved before foreign-GV neighbours stopped being drawn can hold a perfectly clean dest and\n  // STILL carry their shapes in nbrFeat/nbrCurrentSector — it would repaint the old map straight from\n  // cache. An unknown gerência is not evidence of a foreign one, so only a known, differing GV replays.\n  return Object.values(saved.nbrCurrentSector||{}).some(s=>{ const g=gvBy[String(s)]||''; return g&&g!==own; });\n}\nfunction remapAssign(mv,savedAssign){\n  const keys=Object.keys(mv.munis||{}).filter(k=>k!=='__OUTROS__');\n  const out={};\n  Object.entries(savedAssign||{}).forEach(([k,v])=>{\n    if(keys.indexOf(k)>=0){ out[k]=v; return; }\n    const cand=keys.filter(x=>mName(x)===mName(k));\n    if(cand.length===1) out[cand[0]]=v;\n  });\n  return out;\n}\nfunction newSession(){\n  SESS.sessionId=null; SESS.sessionLabel=null; SESS.timeline=[]; SESS.selected=0; SESS.sectorBaseCache={};\n  SESS.settings={...DEFAULT_SETTINGS};\n  SESS.snapshotRaw=null; SESS.snapshotSyncedAt=null; SESS.snapLiteral=null; SESS.eloMaxCycle=null; SESS.stage='loading'; SESS.dirtyFrom=null;\n  (async()=>{\n    loader(true,'iniciando nova sessão…');\n    try{ await Promise.all([ensurePinned(), loadSectors()]); SESS.stage='confirm'; }\n    catch(e){ setError('erro init: '+e.message); }\n    finally{ loader(false); renderAll(); }\n  })();\n}\n\n// ---------- snapshot refresh ----------\n// Deliberately breaks the frozen-snapshot guarantee, on demand: re-resolves DT_HISTORICO and\n// replays the whole timeline against the new one. Skips the replay when the snapshot has not\n// actually moved, so a stray click on a long timeline costs one cheap probe instead of ~8 queries\n// per etapa.\nasync function refreshSnapshot(){\n  if(SESS.stage!=='main' || SESS.snapBusy) return;\n  SESS.snapBusy=true;\n  const prevRaw=SESS.snapshotRaw;\n  const pill=$('#liveState'); if(pill){ pill.classList.add('busy'); pill.textContent='◌ atualizando snapshot…'; }\n  loader(true,'buscando o snapshot mais recente…');\n  let ok=false;\n  try{\n    const p=await resolveSnapshotPin();\n    if(!p.snapshotRaw) throw new Error('não foi possível resolver DT_HISTORICO');\n    const same=String(p.snapshotRaw)===String(prevRaw);\n    SESS.snapshotRaw=p.snapshotRaw; SESS.snapshotSyncedAt=p.syncedAt; SESS.snapLiteral=p.snapLiteral; SESS.eloMaxCycle=p.eloMaxCycle;\n    await loadSectors();   // the sector list follows the live max, so it can have moved too\n    if(same){\n      $('#ds').textContent=`snapshot já era o mais recente · atualizado em ${fmtSyncedAt(p.syncedAt)} — nada recalculado`;\n    } else if(SESS.timeline.length){\n      SESS.dirtyFrom=null;\n      SESS.sectorBaseCache={};   // baselines come from the snapshot, so every one of them changed\n      loader(true,'snapshot novo — recalculando a timeline…');\n      await recomputeFrom(0);\n      $('#ds').textContent=`snapshot atualizado em ${fmtSyncedAt(p.syncedAt)} · ${fmt(SESS.timeline.length)} etapa(s) recalculada(s)`;\n    } else {\n      $('#ds').textContent=`snapshot atualizado em ${fmtSyncedAt(p.syncedAt)}`;\n    }\n    $('#ds').classList.remove('err');\n    ok=true;\n  }catch(e){\n    const at=(SESS.dirtyFrom==null?null:SESS.dirtyFrom+1);\n    $('#ds').textContent='erro ao atualizar o snapshot'+(at?` na etapa ${at} — etapa ${at} em diante ficou desatualizada (⟳)`:'')+': '+e.message;\n    $('#ds').classList.add('err');\n  }finally{\n    SESS.snapBusy=false;\n    if(pill) pill.classList.remove('busy');\n    loader(false); renderAll();\n    if(ok) setTimeout(()=>{ const d=$('#ds'); if(d&&!d.classList.contains('err')) d.textContent=''; },7000);\n  }\n}\n\n// ---------- session options ----------\nfunction previewDest(mv,rule,minCbs){\n  if(!mv||!mv.allowedRaw||!mv.munis) return null;\n  const w={}; let relaxed=false;\n  const cbsOf=m=>(mv.cbsByMuni&&mv.cbsByMuni[m]!=null)?mv.cbsByMuni[m]:((mv.munis[m]&&mv.munis[m].cbs)||0);\n  const add=m=>Object.entries(mv.allowedRaw[m]||{}).forEach(([s,v])=>{ w[s]=(w[s]||0)+v; });\n  // allowedRaw only carries municipalities already inside the sector's dominance base, so there is\n  // nothing left to filter out here beyond the destination rule itself.\n  Object.keys(mv.allowedRaw).forEach(m=>{ const cbs=cbsOf(m);\n    if(rule==='dominant'&&cbs<minCbs) return; add(m); });\n  if(rule==='dominant'&&!Object.keys(w).length){ Object.keys(mv.allowedRaw).forEach(add); relaxed=true; }\n  return {dest:Object.keys(w).sort((a,b)=>w[b]-w[a]).slice(0,6),relaxed};\n}\nfunction readOptForm(){\n  const r=root.querySelector('input[name=\"destRule\"]:checked');\n  let n=Math.round(+$('#optMinCbs').value);\n  if(!(n>0)) n=DEFAULT_SETTINGS.destMinCbs;\n  return {destRule:(r&&r.value)||DEFAULT_SETTINGS.destRule, destMinCbs:n,\n          targetSpan:numOrNull($('#optTargetSpan').value),\n          maxSpan:numOrNull($('#optMaxSpan').value),\n          minSpan:numOrNull($('#optMinSpan').value)};\n}\nfunction spanFormError(f){\n  if(f.minSpan&&f.maxSpan&&f.minSpan>f.maxSpan) return `Span mínimo (${fmt(f.minSpan)}) não pode ser maior que o máximo (${fmt(f.maxSpan)}).`;\n  if(f.targetSpan&&f.maxSpan&&f.targetSpan>f.maxSpan) return `Span alvo (${fmt(f.targetSpan)}) não pode passar do máximo (${fmt(f.maxSpan)}).`;\n  if(f.targetSpan&&f.minSpan&&f.targetSpan<f.minSpan) return `Span alvo (${fmt(f.targetSpan)}) não pode ficar abaixo do mínimo (${fmt(f.minSpan)}).`;\n  return '';\n}\nfunction renderOptPreview(){\n  const el=$('#optPreview'); if(!el) return;\n  const f=readOptForm();\n  root.querySelectorAll('.opt-row').forEach(r=>{\n    if(r.dataset.r!=null) r.classList.toggle('on',r.dataset.r===f.destRule);\n  });\n  const wrap=$('#optMinCbsWrap'); if(wrap) wrap.classList.toggle('off',f.destRule!=='dominant');\n  const err=spanFormError(f), ee=$('#optSpanErr');\n  if(ee){ ee.textContent=err; ee.classList.toggle('hidden',!err); }\n  const ap=$('#optApply'); if(ap) ap.disabled=!!err;\n  const mv=SESS.timeline[SESS.selected];\n  // Prévia inteira é sobre conceitos de setor (ponte por município, span alvo/máx/mín) que não\n  // existem em GV/mercado — mostrar aqui só confundiria com números que não valem nada.\n  if(mv && (mv.level||'setor')!=='setor'){ el.innerHTML=''; return; }\n  if(!mv||!mv.munis){ el.innerHTML='Nenhuma etapa calculada ainda — as regras passam a valer no próximo fechamento.'; return; }\n  const cbsOf=m=>(mv.cbsByMuni&&mv.cbsByMuni[m]!=null)?mv.cbsByMuni[m]:((mv.munis[m]&&mv.munis[m].cbs)||0);\n  const ms=Object.keys(mv.geoFeat||{});\n  const ig=f.destRule==='dominant'?ms.filter(m=>cbsOf(m)<f.destMinCbs):[];\n  const pv=previewDest(mv,f.destRule,f.destMinCbs);\n  let h=`<b style=\"color:var(--ink)\">Prévia — etapa ${SESS.selected+1}, setor ${mv.sector}</b><br>`;\n  const exN=(mv.excludedMunis||[]).length;\n  if(exN) h+=`Base de dominantes: <b>${fmt(ms.length)}</b> município(s) no mapa · <span style=\"color:var(--closing)\">${fmt(exN)} fora da base — ${fmt(mv.excludedCbs||0)} CBs seguem suas líderes</span><br>`;\n  h+=`${fmt(ms.length-ig.length)} de ${fmt(ms.length)} município(s) valem como ponte`;\n  if(ig.length) h+=` · <span style=\"color:var(--closing)\">ignorados:</span> ${ig.slice(0,8).join(', ')}${ig.length>8?' +'+(ig.length-8):''}`;\n  if(pv){\n    h+=`<br>Setores destino com esta regra: <b style=\"color:var(--ink)\">${pv.dest.join(', ')||'–'}</b>`;\n    const cur=(mv.dest||[]).join(', ');\n    if(pv.dest.join(',')!==(mv.dest||[]).join(',')) h+=` <span style=\"color:var(--closing)\">(hoje: ${cur||'–'})</span>`;\n    if(pv.relaxed) h+=`<br><b style=\"color:var(--closing)\">⚠ nenhum município dominante nesta etapa — a regra relaxa pra \"qualquer município\" pra não deixar a etapa sem destino.</b>`;\n  }\n  if(f.targetSpan||f.maxSpan||f.minSpan){\n    const sp=spanMapFor(mv,mv.assign||{}), v=spanViolationsOf(sp,{target:f.targetSpan,max:f.maxSpan,min:f.minSpan});\n    h+=`<br><br>Span dos destinos como está hoje: ${mv.dest.map(s=>s+' <b>'+fmt(sp[s])+'</b>').join(' · ')||'–'}`;\n    if(v.over.length||v.under.length) h+=`<br><span style=\"color:var(--closing)\">Fora dos limites: ${[...v.over.map(s=>s+' ▲ acima do máx'),...v.under.map(s=>s+' ▼ abaixo do mín')].join(', ')}</span> — o modelo ÓTIMO tenta corrigir no recálculo.`;\n    else h+=` <span style=\"color:var(--ok)\">— já dentro dos limites</span>`;\n  }\n  if(SESS.timeline.length) h+=`<br><span style=\"margin-top:4px;display:inline-block\">Aplicar <b>recalcula as ${fmt(SESS.timeline.length)} etapa(s)</b> contra o snapshot congelado — os destinos ajustados à mão serão refeitos pelo modelo ÓTIMO.</span>`;\n  el.innerHTML=h;\n}\nfunction openOptions(){\n  const st={...DEFAULT_SETTINGS,...(SESS.settings||{})};\n  root.querySelectorAll('input[name=\"destRule\"]').forEach(r=>{ r.checked=(r.value===st.destRule); });\n  $('#optMinCbs').value=st.destMinCbs;\n  $('#optTargetSpan').value=st.targetSpan||'';\n  $('#optMaxSpan').value=st.maxSpan||'';\n  $('#optMinSpan').value=st.minSpan||'';\n  $('#optApply').disabled=false;\n  $('#optSessName').textContent=SESS.sessionLabel||'sessão não salva';\n  $('#optStatus').textContent='';\n  $('#optionsBg').classList.remove('hidden');\n  renderOptPreview();\n  const c=$('#optCancel'); if(c) c.focus();\n}\nfunction closeOptions(){ const b=$('#optionsBg'); if(b) b.classList.add('hidden'); }\nasync function applyOptions(){\n  const f=readOptForm();\n  if(spanFormError(f)) return;\n  const prev={...DEFAULT_SETTINGS,...(SESS.settings||{})};\n  const changed = prev.destRule!==f.destRule\n    || (f.destRule==='dominant' && prev.destMinCbs!==f.destMinCbs)\n    || numOrNull(prev.targetSpan)!==f.targetSpan\n    || numOrNull(prev.maxSpan)!==f.maxSpan\n    || numOrNull(prev.minSpan)!==f.minSpan;\n  SESS.settings={...prev,...f};\n  closeOptions();\n  if(!changed || !SESS.timeline.length){ renderAll(); return; }\n  SESS.dirtyFrom=null;\n  SESS.sectorBaseCache={};   // the recompute re-derives every baseline; keeping the old ones would\n                             // leave \"Impacto acumulado\" comparing against pre-change numbers\n  loader(true,'aplicando nova regra de destino — recalculando timeline…');\n  try{\n    await recomputeFrom(0);\n    $('#ds').textContent=''; $('#ds').classList.remove('err');\n  }catch(e){\n    const at=(SESS.dirtyFrom==null?0:SESS.dirtyFrom)+1;\n    $('#ds').textContent=`erro ao aplicar a regra na etapa ${at}: ${e.message} — etapa ${at} em diante ficou desatualizada (⟳)`;\n    $('#ds').classList.add('err');\n  }finally{ loader(false); renderAll(); }\n}\n\nconst SHARED_DS='timeline-shared-sessionsDataSet';\nconst AUTH_REF='timelineSimAuthFinal';   // single source of truth for the auth strategy reference\nlet SHARE={busy:false,url:null,last:null};\n// Serialise a PRESENTATION model, not the raw session, so the reader stays purely presentational\n// and never re-derives spans/desloc/orphans — no second copy of this engine to keep in sync.\n// NOTE: METRICS_DEF[2] is the money marker; read it as !!md[2] (a literal dollar sign in this\n// position trips the upsert's parse check).\nfunction buildShareStages(){\n  return SESS.timeline.map((mv,i)=>{\n    const c=computeDerived(mv);\n    const incBy={};\n    mv.dest.forEach(s=>{ incBy[s]=Object.fromEntries(METRICS_DEF.map(md=>[md[0],0])); });\n    Object.entries(mv.munis).forEach(([m,o])=>{\n      if(m==='__OUTROS__') return;\n      const s=mv.assign[m]; if(!s||!incBy[s]) return;\n      METRICS_DEF.forEach(md=>{ incBy[s][md[0]]+=o[md[0]]||0; });\n    });\n    const saiTot={};\n    METRICS_DEF.forEach(md=>{\n      const k=md[0];\n      saiTot[k]=Object.entries(mv.munis).filter(([m])=>m!=='__OUTROS__').reduce((a,p)=>a+((p[1][k])||0),0);\n    });\n    // orphans follow their leader's home: they enter that sector AND leave the closing one\n    c.leaders.forEach(L=>{\n      const om=mv.orphanMetricsByGroup&&mv.orphanMetricsByGroup[L.grupo];\n      if(!om||!L.home) return;\n      METRICS_DEF.forEach(md=>{ const k=md[0];\n        if(incBy[L.home]) incBy[L.home][k]+=om[k]||0;\n        saiTot[k]+=om[k]||0; });\n    });\n    const ms=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__').sort((a,b)=>mv.munis[b].cbs-mv.munis[a].cbs);\n    const sv=mv.dest.map(s=>c.span[s]);\n    const baseOf=(s,k)=>{ const b=mv.baseMetrics[s]||{}; return +(b[k]||0); };\n    return {\n      i:i, sector:mv.sector, level:mv.level||'setor', unitOfMuni:mv.unitOfMuni||{}, policy:mv.policy, domUF:mv.domUF,\n      optTier:(mv.optTier==null?0:mv.optTier),\n      destRuleFallback:!!mv.destRuleFallback,\n      dest:mv.dest.slice(), color:Object.assign({},mv.color), assign:Object.assign({},mv.assign),\n      kpis:{ cbsRealocadas:closingCbsOf(mv), desloc:c.desloc,\n             spread:(sv.length?Math.max.apply(null,sv)-Math.min.apply(null,sv):0),\n             municipios:ms.length, lideres:mv.leaders.length },\n      destinos:mv.dest.map(s=>({ s:s, base:baseOf(s,'cbs'), inc:c.inc[s]||0, orph:c.orph[s]||0, span:c.span[s]||0, gained:c.gained[s]||0 })),\n      municipios:ms.map(m=>(mv.level&&mv.level!=='setor')?{ nome:m, uf:'', cbs:mv.munis[m].cbs, destino:mv.assign[m]||null }:{ nome:mName(m), uf:mUf(m), cbs:mv.munis[m].cbs, destino:mv.assign[m]||null }),\n      excluidos:(mv.excludedMunis||[]).map(x=>({ muni:x.muni, cbs:x.cbs })),\n      orphanTotal:c.orphanTotal||0, orphanStranded:c.orphanStranded||0, noShapeCbs:mv.noShapeCbs||0,\n      lideres:c.leaders.map(L=>({ lider:(L.lider||'').split(' ').slice(0,2).join(' '), grupo:L.grupo,\n        total:L.total, home:L.home, desloc:L.desloc, orphan:L.orphan||0 })),\n      metricas:METRICS_DEF.map(md=>{ const k=md[0];\n        return { key:k, label:md[1], money:!!md[2],\n          rows:mv.dest.map(s=>({ s:s, antes:baseOf(s,k), depois:baseOf(s,k)+((incBy[s]&&incBy[s][k])||0) })),\n          sai:saiTot[k]||0 }; }),\n      geoFeat:mv.geoFeat, nbrFeat:mv.nbrFeat, excludedFeat:[]\n    };\n  });\n}\nfunction buildShareSummary(stages){\n  const world=foldWorldState(SESS.timeline,SESS.timeline.length);\n  const receivers=[];\n  SESS.timeline.forEach((mv,i)=>{\n    const own=mv.pureOwnMetrics||{};\n    receivers.push({ s:mv.sector, situacao:'fechado (etapa '+(i+1)+')', antes:+(own.cbs||0), depois:0 });\n  });\n  const seen={};\n  Object.values(world.muniOverride).forEach(s=>{\n    if(seen[s]) return; seen[s]=1;\n    const base=SESS.sectorBaseCache[s]||{}, infl=world.sectorInflow[s]||{};\n    receivers.push({ s:s, situacao:'recebeu território', antes:+(base.cbs||0), depois:(+(base.cbs||0))+(infl.cbs||0) });\n  });\n  return { stages:stages.length, sectors:SESS.timeline.map(mv=>mv.sector),\n    totalCbs:stages.reduce((a,s)=>a+(s.kpis.cbsRealocadas||0),0),\n    totalDesloc:stages.reduce((a,s)=>a+(s.kpis.desloc||0),0), receivers:receivers };\n}\nfunction renderShareBody(){\n  const el=$('#shareBody'); if(!el) return;\n  const go=$('#shareGo'), cp=$('#shareCopy'), op=$('#shareOpen'), cc=$('#shareCancel');\n  if(SHARE.url){\n    el.innerHTML=`<div class=\"opt-note\" style=\"margin-top:0\"><b style=\"color:var(--ink)\">Sessão compartilhada ✓</b><br>\n      Link de leitura desta simulação congelada. Quem abrir precisa ter login no simulador.\n      <div class=\"shareurl\">${esc(SHARE.url)}</div></div>`;\n    if(go) go.classList.add('hidden');\n    if(cp) cp.classList.remove('hidden');\n    if(op) op.classList.remove('hidden');\n    if(cc) cc.textContent='Fechar';\n    return;\n  }\n  if(go) go.classList.remove('hidden');\n  if(cp) cp.classList.add('hidden');\n  if(op) op.classList.add('hidden');\n  if(cc) cc.textContent='Cancelar';\n  const st={...DEFAULT_SETTINGS,...(SESS.settings||{})};\n  const desloc=SESS.timeline.reduce((a,mv)=>a+(mv.munis?computeDerived(mv).desloc:0),0);\n  const destTxt=st.destRule==='dominant'?('dominantes ≥'+fmt(st.destMinCbs)+' CBs'):'qualquer município';\n  el.innerHTML=`<div class=\"opt-lbl\">Confirmar compartilhamento</div>\n    <div class=\"opt-sub\">Publica uma <b>cópia congelada</b> desta sessão, exatamente no estado atual.</div>\n    <div class=\"opt-note\" style=\"margin-top:0\">\n      · <b>${fmt(SESS.timeline.length)}</b> etapa(s) — ${esc(SESS.timeline.map(mv=>mv.sector).join(' → '))}<br>\n      · snapshot atualizado em <b>${esc(fmtSyncedAt(SESS.snapshotSyncedAt))}</b><br>\n      · base: <b>municípios dominantes (CSV)</b> · destino: <b>${esc(destTxt)}</b> · span: <b>${esc(spanShort(st))}</b><br>\n      · <b>${fmt(desloc)}</b> CBs deslocadas somando a cadeia\n    </div>\n    <div class=\"opt-note\">A cópia <b>não</b> acompanha edições posteriores desta sessão — pra atualizar, compartilhe de novo e use o link novo. O link exige login no simulador; não é público.</div>\n    ${SHARE.last?`<div class=\"opt-note\"><b style=\"color:var(--ink)\">Último link gerado nesta sessão</b> — aponta pro estado de <b>antes</b> das edições feitas depois dele.<div class=\"shareurl\">${esc(SHARE.last)}</div></div>`:''}`;\n}\nasync function openShare(){\n  if(!SESS.timeline.length){ $('#ds').textContent='nada pra compartilhar — feche pelo menos um setor primeiro.'; $('#ds').classList.add('err'); return; }\n  await flushDirty();\n  SHARE.url=null;\n  const s=$('#shareStatus'); if(s){ s.textContent=''; s.classList.remove('err'); }\n  renderShareBody();\n  $('#shareBg').classList.remove('hidden');\n  const b=$('#shareCancel'); if(b) b.focus();\n}\nfunction closeShare(){ const b=$('#shareBg'); if(b) b.classList.add('hidden'); }\nasync function doShare(){\n  if(SHARE.busy) return;\n  const go=$('#shareGo'), stx=$('#shareStatus');\n  SHARE.busy=true;\n  if(go){ go.disabled=true; go.textContent='Compartilhando…'; }\n  if(stx){ stx.textContent=''; stx.classList.remove('err'); }\n  try{\n    // Resolved as a GLOBAL PROCESS, not a declared param — which only works because the block\n    // instance on the `main` artboard binds `sharedDataset: @timeline-shared-sessionsDataSet`.\n    // That binding is load-bearing: a Process is only define()d once something on the rendering\n    // tree references it, so without it this lookup returns null and sharing dies on the guard\n    // below. Do NOT remove the instance param because this file never reads d2.params.sharedDataset.\n    const ds=d2.data(SHARED_DS);\n    if(!ds) throw new Error('dataset de sessões compartilhadas indisponível');\n    await flushDirty();\n    const stages=buildShareStages();\n    const summary=buildShareSummary(stages);\n    let who='';\n    try{ const a=d2.auth(AUTH_REF); who=(a&&a.user&&(a.user.email||a.user.nome))||''; }catch(e){}\n    const created=await ds.create({\n      label:SESS.sessionLabel||('Sessão '+new Date().toLocaleString('pt-BR')),\n      snapshotRaw:SESS.snapshotRaw, snapshotSyncedAt:SESS.snapshotSyncedAt,\n      settings:{...DEFAULT_SETTINGS,...(SESS.settings||{})},\n      stages:stages, summary:summary, sharedBy:who, sharedAt:new Date().toISOString()\n    });\n    const id=(created&&created._id)||(created&&created.data&&created.data._id)||(ds.selected&&ds.selected()&&ds.selected()._id)||null;\n    if(!id) throw new Error('registro gravado, mas sem _id na resposta — não foi possível montar o link');\n    SHARE.url=window.location.origin+'/sessions/'+id;\n    SHARE.last=SHARE.url;\n    renderShareBody();\n  }catch(e){\n    if(stx){ stx.textContent='erro ao compartilhar: '+e.message; stx.classList.add('err'); }\n  }finally{\n    SHARE.busy=false;\n    if(go){ go.disabled=false; go.textContent='Compartilhar'; }\n  }\n}\n\n// ---------- rendering ----------\nfunction renderTimeline(){\n  const el=$('#movementChips'); if(!el) return;\n  if(!SESS.timeline.length){ el.innerHTML='<span class=\"empty\">Nenhuma etapa ainda — use \"Adicionar movimentação\" à direita.</span>'; return; }\n  el.innerHTML=SESS.timeline.map((mv,i)=>{\n    const ready=mv.dest!==undefined;\n    const c=ready?computeDerived(mv):null;\n    const stale=SESS.dirtyFrom!=null && i>=SESS.dirtyFrom;\n    return `<div class=\"tchip ${i===SESS.selected?'on':''} ${stale?'stale':''}\" data-i=\"${i}\">\n      <span class=\"tnum\">${i+1}</span><span class=\"tsec\">${LEVELS[mv.level||'setor'].label} ${mv.sector}</span>\n      <span class=\"tstat\">${ready?((mv.level||'setor')==='setor'?fmt(c.desloc)+' desloc.':fmt(closingCbsOf(mv))+' CBs'):'…'}</span>\n      ${stale?'<span class=\"tstale\" title=\"recalcula ao selecionar outra etapa\">⟳</span>':''}\n      <span class=\"trm\" data-rm=\"${i}\" title=\"remover esta etapa e as seguintes\">✕</span>\n    </div>`;\n  }).join('');\n  el.querySelectorAll('.tchip').forEach(ch=>{\n    ch.addEventListener('click',async (e)=>{\n      if(e.target.dataset.rm!=null && e.target.dataset.rm!==''){ removeFrom(+e.target.dataset.rm); return; }\n      const i=+ch.dataset.i;\n      if(i!==SESS.selected) await flushDirty();\n      SESS.selected=i; renderAll();\n    });\n  });\n}\nfunction renderRuleNote(){\n  const el=$('#ruleNote'); if(!el) return;\n  const st={...DEFAULT_SETTINGS,...(SESS.settings||{})};\n  const mv=SESS.timeline[SESS.selected];\n  const lvl=LEVELS[(mv&&mv.level)||'setor'];\n  let h='';\n  if(!mv || (mv.level||'setor')==='setor'){\n    h+=`<b style=\"color:var(--ink)\">Base de municípios dominantes:</b> só os municípios que a base (CSV) atribui ao setor entram no mapa e na alocação`;\n    if(mv&&mv.domCsvMunis) h+=` · <b>${fmt(mv.domCsvMunis)}</b> na base do setor ${mv.sector}`;\n    if(mv&&mv.excludedCbs) h+=` · <b style=\"color:var(--closing)\">${fmt(mv.excludedMunis.length)} município(s) / ${fmt(mv.excludedCbs)} CBs</b> fora da base nesta etapa — não aparecem no mapa e as CBs seguem suas líderes (quebra de vínculo)`;\n  } else {\n    // GV/mercado não têm spillover (todo setor pertence a exatamente uma GV/mercado na base), então\n    // não existe \"excluído\" pra reportar aqui — só o tamanho da base e em quantas unidades ela se agrupa.\n    h+=`<b style=\"color:var(--ink)\">Base de ${lc(lvl.childLabel)}s dominantes:</b> ${mv.domCsvMunis!=null?`<b>${fmt(mv.domCsvMunis)}</b> município(s) `:''}na base ${lvl.de} ${lc(lvl.label)} ${mv.sector}, agrupados em <b>${fmt(Object.keys(mv.unitMunis||{}).length)}</b> ${lc(lvl.childLabel)}(s)`;\n  }\n  if(DOM.error) h+=` · <b style=\"color:var(--closing)\">⚠ base indisponível: ${esc(DOM.error)}</b>`;\n  h+=`<br>`;\n  h+=`<b style=\"color:var(--ink)\">Regra de destino:</b> `;\n  h+= st.destRule==='dominant'\n    ? `só municípios com <b>≥${fmt(st.destMinCbs)} CBs</b> trazem ${lc(lvl.destLabel)} pra lista de destinos`\n    : `qualquer município ${lvl.de} ${lc(lvl.label)} fechad${lvl.a==='à'?'a':'o'} vale como ponte <span style=\"opacity:.7\">(padrão)</span>`;\n  if(mv&&st.destRule==='dominant'){\n    // A ponte é sempre por MUNICÍPIO, em qualquer nível — mv.ignoredBridges já é a lista definitiva\n    // que computeMovement calculou, então lê-la aqui em vez de recalcular contra mv.munis, que em\n    // GV/mercado está no grão de setor/GV e daria o número errado.\n    const ig=mv.ignoredBridges||[];\n    if(ig.length) h+=` · <b style=\"color:var(--closing)\">${fmt(ig.length)}</b> ignorado(s) como ponte (ainda redistribuído(s)): ${ig.slice(0,5).join(', ')}${ig.length>5?' +'+(ig.length-5):''}`;\n    if(mv.destRuleFallback) h+=`<br><b style=\"color:var(--closing)\">⚠ nenhum município dominante nesta etapa — regra relaxada pra \"qualquer município\".</b>`;\n  }\n  el.innerHTML=h;\n}\nfunction renderSpanRule(){\n  const el=$('#spanRule'); if(!el) return;\n  const mv=SESS.timeline[SESS.selected], lim=spanLimits(mv);\n  if(!mv||!mv.munis||mv.view==='asis'||!spanLimitsOn(lim)){ el.innerHTML=''; return; }\n  const sp=spanMapFor(mv,mv.assign||{}), v=spanViolationsOf(sp,lim);\n  const bits=[];\n  if(lim.target) bits.push(`alvo <b>${fmt(lim.target)}</b>`);\n  if(lim.max) bits.push(`máx <b>${fmt(lim.max)}</b>`);\n  if(lim.min) bits.push(`mín <b>${fmt(lim.min)}</b>`);\n  let h=`Pré-requisito de span: ${bits.join(' · ')} CBs — `;\n  if(v.over.length||v.under.length){\n    h+=`<b style=\"color:var(--closing)\">⚠ `;\n    if(v.over.length) h+=`acima do máximo: ${v.over.map(s=>s+' ('+fmt(sp[s])+')').join(', ')}`;\n    if(v.over.length&&v.under.length) h+=' · ';\n    if(v.under.length) h+=`abaixo do mínimo: ${v.under.map(s=>s+' ('+fmt(sp[s])+')').join(', ')}`;\n    h+=`</b>`;\n    if(mv.optTier===1) h+=`<br><span style=\"opacity:.85\">Nenhuma alocação conectada respeita o span mínimo nesta etapa — o modelo relaxou essa exigência.</span>`;\n    else if(mv.optTier===2) h+=`<br><span style=\"opacity:.85\">Nenhuma alocação conectada respeita os limites nesta etapa — o modelo relaxou essa exigência.</span>`;\n    else if(mv.optTier===-1) h+=`<br><span style=\"opacity:.85\">Etapa resolvida por heurística — os limites não são garantidos.</span>`;\n  } else h+=`<b style=\"color:var(--ok)\">✓ todos os setores receptores dentro dos limites</b>`;\n  el.innerHTML=`<div class=\"note\" style=\"margin:-2px 0 6px\">${h}</div>`;\n}\nfunction renderContig(){const mv=SESS.timeline[SESS.selected];const el=$('#contig');if(!el||!mv)return;\n  if(mv.view==='asis'){el.innerHTML='';return;}\n  const lvl=LEVELS[mv.level||'setor'];\n  // Indicador de conectividade geográfica só se aplica a fechamento de setor — ver contigBadFor.\n  if((mv.level||'setor')!=='setor'){ el.innerHTML=''; return; }\n  const bad=contigBadFor(mv,mv.assign);\n  el.innerHTML=bad.length\n    ?`<div class=\"note\" style=\"color:var(--closing);font-weight:600;margin:-2px 0 6px\">⚠ Território desconectado em ${bad.join(', ')} — ${lc(lvl.childLabel)}(s) desconectado(s) do território ${lvl.de} ${lc(lvl.label)}. Use ★ ÓTIMO ou reassocie no mapa.</div>`\n    :`<div class=\"note\" style=\"color:var(--ok);margin:-2px 0 6px\">✓ Sem quebras — cada ${lc(lvl.label)} forma uma região conectada.</div>`;\n}\nfunction closingCbsOf(mv){ return Object.entries(mv.munis).filter(([m])=>m!=='__OUTROS__').reduce((a,[,o])=>a+o.cbs,0); }\nfunction sectorTotalCbs(mv){ return Object.values(mv.munis).reduce((a,o)=>a+o.cbs,0); }\nfunction renderKpis(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const c=computeDerived(mv); const lvl=LEVELS[mv.level||'setor'];\n  const childPlural=lvl.childLabel==='Setor'?'Setores':(lvl.childLabel==='GV'?'GVs':'Municípios');\n  if(mv.view==='asis'){const mc=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__').length;\n    $('#kpis').innerHTML=[\n      {n:fmt(sectorTotalCbs(mv)),l:`CBs ${lvl.no} ${lc(lvl.label)} ${mv.sector} (antes desta etapa)`,t:`Total de CBs ${lvl.no} ${lc(lvl.label)} hoje — já considerando o que etapas anteriores da timeline mandaram pra cá.`},\n      {n:mv.csvMunisTotal?`${fmt(mc)}/${fmt(mv.csvMunisTotal)}`:fmt(mc),l:`${childPlural} ${lvl.de} ${lc(lvl.label)}`,t:`${lvl.childLabel}(s) desenhados nesta etapa${mv.csvMunisTotal?` de ${fmt(mv.csvMunisTotal)} que a base de dominantes atribui ${lvl.a} ${lc(lvl.label)}`:''}.${(mv.missingMunis||[]).length?' Fora do mapa: '+mv.missingMunis.map(x=>x.muni+' ('+x.reason+')').join(' · '):''}${Object.keys(mv.ufGuessed||{}).length?' UF inferida da UF dominante do setor (nome repetido em outra UF carregada): '+Object.entries(mv.ufGuessed).map(([nm,u])=>nm+'→'+u).join(', '):''}`},\n      {n:fmt(mv.leaders.length),l:'Líderes (grupos)',t:`Líderes presentes ${lvl.no} ${lc(lvl.label)} nesta etapa.`},\n      {n:fmt(mv.dest.length),l:`${lvl.destLabel}s adjacentes`,t:`${lvl.destLabel}s vizinh${lvl.destLabel==='GV'?'as':'os'} (ainda abertas)${lvl.parentPhrase?` ${lvl.parentPhrase}`:''}${mv.gv?` (${mv.gv})`:''} que poderiam receber os ${lc(lvl.childLabel)}s.${(mv.gvRejected||[]).length&&lvl.parentWord?' Fora do mapa, por serem de outr'+(lvl.parentWord==='gerência'?'a':'o')+' '+lvl.parentWord+': '+mv.gvRejected.join(', ')+'.':''}`},\n    ].map(k=>`<div class=\"kpi\" title=\"${k.t}\"><div class=\"n\">${k.n}</div><div class=\"l\">${k.l}</div></div>`).join('');\n    return;}\n  const sv=mv.dest.map(s=>c.span[s]);const spread=sv.length?Math.max(...sv)-Math.min(...sv):0;\n  const zero=mv.dest.filter(s=>c.gained[s]===0);const totCbs=closingCbsOf(mv);\n  $('#kpis').innerHTML=[\n    // \"CBs fora do X\" só faz sentido pra fechamento de setor — a mecânica de vínculo (CBs que\n    // seguem a líder pra fora do território) é uma coisa de setor/orphan, não de GV/mercado.\n    (mv.level||'setor')==='setor'?{n:fmt(c.desloc),l:mv.policy==='fora'?`CBs fora ${lvl.de} ${lc(lvl.destLabel)}`:'CBs c/ quebra de relação',cls:'warn',t:`CBs cuja líder acabou noutr${lvl.a==='à'?'a':'o'} ${lc(lvl.destLabel)} nesta etapa.`}:null,\n    {n:fmt(spread),l:'Desequilíbrio (máx−mín CBs)',cls:spread>800?'warn':'ok',t:`Diferença de tamanho entre ${lvl.destLabel==='GV'?'a maior e a menor':'o maior e o menor'} ${lc(lvl.destLabel)} depois desta etapa.`},\n    {n:fmt(totCbs),l:'CBs realocadas',cls:'',t:`Total de CBs ${lvl.de} ${lc(lvl.label)} ${mv.sector} sendo redistribuídas nesta etapa.`},\n    (mv.level||'setor')==='setor'?{n:zero.length?zero.join(', '):'nenhum',l:`${lvl.destLabel} sem líder herdada`,cls:zero.length?'warn':'ok',t:`${lvl.destLabel} que recebe ${lc(lvl.childLabel)}(s) mas nenhuma líder nesta etapa.`}:null,\n  ].filter(Boolean).concat(mv.excludedCbs?[{n:fmt(mv.excludedCbs),l:`CBs fora do setor · ${fmt(mv.excludedMunis.length)} município(s) fora da base`,cls:'warn',t:'CBs em municípios que a base de dominantes não atribui a este setor: ficam fora do mapa e da alocação geográfica e seguem a líder do seu grupo.'}]:[])\n   .concat((mv.missingMunis||[]).length?[{n:fmt(mv.missingMunis.length),l:`Município(s) da base fora do mapa · ${fmt(mv.csvMunisTotal)} na base`,cls:'warn',t:`A base de dominantes atribui ${fmt(mv.csvMunisTotal)} município(s) ao setor ${mv.sector} e ${fmt(mv.csvMunisTotal-mv.missingMunis.length)} chegaram ao mapa. Fora: ${mv.missingMunis.map(x=>x.muni+' — '+x.reason+(x.cbs?' ('+fmt(x.cbs)+' CBs)':'')).join(' · ')}`}]:[])\n   .map(k=>`<div class=\"kpi ${k.cls}\" title=\"${k.t}\"><div class=\"n\">${k.n}</div><div class=\"l\">${k.l}</div></div>`).join('');\n}\nfunction renderSpans(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const c=computeDerived(mv); const lvl=LEVELS[mv.level||'setor'];\n  if(mv.view==='asis'){const items=[{s:mv.sector,val:sectorTotalCbs(mv),color:CLOSE_COLOR}].concat(mv.dest.map(s=>({s,val:+(mv.baseMetrics[s]?.cbs||0),color:mv.color[s]})));\n    const max=Math.max(...items.map(x=>x.val),1);\n    $('#spans').innerHTML=items.map(x=>`<div class=\"bar-row\"><div class=\"tag\" style=\"color:${x.color}\">${x.s}</div><div class=\"bar-track\">\n      <div class=\"bar-inc\" style=\"width:${x.val/max*100}%;background:${x.color}\"></div></div>\n      <div class=\"bar-val\">${fmt(x.val)}</div></div>`).join('')\n      +`<div class=\"note\">Estrutura antes desta etapa — ${lvl.a} ${lc(lvl.label)} <b>${mv.sector}</b> ainda existe. Alterne pra <b>TOBE</b> pra ver a redistribuição.</div>`;\n    return;}\n  const lim=spanLimits(mv),on=spanLimitsOn(lim);\n  const rawMax=Math.max(...mv.dest.map(s=>c.span[s]),lim.target||0,lim.max||0,1);\n  const max=on?rawMax*1.04:rawMax;   // headroom so a marker sitting at the scale top stays visible\n  const marks='';\n  $('#spans').innerHTML=mv.dest.map(s=>{const base=+(mv.baseMetrics[s]?.cbs||0),i=c.inc[s];\n    const over=lim.max&&c.span[s]>lim.max,under=lim.min&&c.span[s]<lim.min;\n    return `<div class=\"bar-row\"><div class=\"tag\" style=\"color:${mv.color[s]}\">${s}</div><div class=\"bar-track\">\n      <div class=\"bar-base\" style=\"width:${base/max*100}%;background:${mv.color[s]}\"></div>\n      <div class=\"bar-inc\" style=\"width:${i/max*100}%;background:${mv.color[s]}\"></div>${marks}</div>\n      <div class=\"bar-val\" style=\"${over?'color:var(--closing);font-weight:700':(under?'color:#ff9500;font-weight:700':'')}\">${fmt(c.span[s])} <span style=\"opacity:.6\">(+${fmt(i)})</span>${over?' ▲':''}${under?' ▼':''}</div></div>`;}).join('')\n    +`<div class=\"note\">Claro = base (já incluindo etapas anteriores) · cheio = CBs entrantes ${lvl.de} ${mv.sector} nesta etapa.${c.orphanTotal?` Inclui <b>${fmt(c.orphanTotal-c.orphanStranded)}</b> CB(s) de municípios fora da base de dominantes que seguiram suas líderes.`:''}</div>`;\n}\n// Two very different reasons land rows in the __OUTROS__ bucket — no IBGE shape, or outside the\n// sector's dominance base. Same bucket computationally, but they must not read as the same thing.\nfunction outsideNote(mv){\n  const bits=[];\n  if(mv.noShapeCbs) bits.push(`<b>${fmt(mv.noShapeCbs)}</b> CBs em ${fmt(mv.noShapeMunis.length)} município(s) sem shape na UF`);\n  if(mv.excludedCbs) bits.push(`<b>${fmt(mv.excludedCbs)}</b> CBs em ${fmt(mv.excludedMunis.length)} município(s) <b>fora da base de dominantes</b> deste setor — <b style=\"color:var(--closing)\">quebra de vínculo</b>`);\n  if(!bits.length) return '';\n  let h=`<div class=\"note\">Fora do mapa e da alocação geográfica: ${bits.join(' · ')}.`;\n  if(mv.excludedCbs){\n    const c=computeDerived(mv);\n    h+=` As <b>${fmt(mv.excludedCbs)}</b> CBs em quebra de vínculo <b>seguem a líder do seu grupo</b>`;\n    const byS=mv.dest.filter(s=>c.orph[s]).map(s=>`<b style=\"color:${mv.color[s]}\">${s}</b> (${fmt(c.orph[s])})`);\n    h+=byS.length?`: ${byS.join(' · ')}.`:'.';\n    if(c.orphanStranded) h+=` <b style=\"color:var(--closing)\">${fmt(c.orphanStranded)} CB(s) sem destino</b> — a líder não ficou com nenhum município realocado, então não há setor pra seguir.`;\n  }\n  if(mv.noShapeCbs) h+=` As CBs sem shape na UF continuam fora de qualquer setor destino.`;\n  if(mv.excludedMunis&&mv.excludedMunis.length) h+=`<br><span style=\"opacity:.85\">${mv.excludedMunis.slice(0,8).map(x=>x.muni+' ('+fmt(x.cbs)+')').join(', ')}${mv.excludedMunis.length>8?' +'+(mv.excludedMunis.length-8):''}</span>`;\n  return h+`</div>`;\n}\nfunction renderMuni(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const lvl=LEVELS[mv.level||'setor'];\n  const plural=lvl.childLabel==='Setor'?'Setores':(lvl.childLabel==='GV'?'GVs':'Municípios');\n  const fem=lvl.childLabel==='GV';\n  const t=$('#muniListTitle'); if(t) t.textContent=`${plural} → ${lc(lvl.destLabel)} destino`;\n  const nt=$('#muniListNote'); if(nt) nt.innerHTML=`Clique no <b>código ${lvl.a} ${lc(lvl.destLabel)}</b> pra mandar ${lvl.a} ${lc(lvl.childLabel)} <b>inteir${fem?'a':'o'}</b> pra lá (regra de negócio). A cor acompanha o mapa.`;\n  const ms=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__').sort((a,b)=>mv.munis[b].cbs-mv.munis[a].cbs);\n  if(mv.view==='asis'){$('#muniList').innerHTML=ms.map(m=>`<div class=\"muni-item\"><div class=\"nm\">${m}</div><div class=\"ct\">${fmt(mv.munis[m].cbs)} CBs</div><span class=\"badge\" style=\"background:${CLOSE_COLOR};color:#fff;border-color:${CLOSE_COLOR}\">${lc(lvl.label)} ${mv.sector}</span></div>`).join('')\n      +`<div class=\"note\">Hoje tod${fem?'as':'os'} pertencem ${lvl.a} ${lc(lvl.label)} <b>${mv.sector}</b>. No <b>TOBE</b> cada um vira botões de destino.</div>`+outsideNote(mv);return;}\n  $('#muniList').innerHTML=ms.map(m=>`<div class=\"muni-item\"><div class=\"nm\">${m}</div><div class=\"ct\">${fmt(mv.munis[m].cbs)} CBs</div>\n    <div class=\"seg\" data-m=\"${m}\">${mv.dest.map(s=>`<button data-s=\"${s}\" class=\"${mv.assign[m]===s?'on':''}\" style=\"${mv.assign[m]===s?'background:'+mv.color[s]:''}\">${s}</button>`).join('')}</div></div>`).join('')\n    +outsideNote(mv);\n  $('#muniList').querySelectorAll('.seg button').forEach(b=>b.onclick=()=>{const m=b.parentElement.dataset.m,s=b.dataset.s;editSelected(m2=>{m2.assign[m]=s;});});\n}\nfunction renderLeaders(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const c=computeDerived(mv);\n  if(mv.view==='asis'){$('#leaders').innerHTML=`<thead><tr><th>Líder</th><th>Grupo</th><th>CBs</th><th>${LEVELS[mv.level||'setor'].label}</th></tr></thead><tbody>`\n    +mv.leaders.map(L=>`<tr><td>${(L.lider||'').split(' ').slice(0,2).join(' ')}</td><td>${L.grupo}</td><td>${fmt(L.total)}</td><td><span class=\"home\" style=\"background:${CLOSE_COLOR}\"></span>${mv.sector}</td></tr>`).join('')\n    +`<tr style=\"font-weight:700\"><td>TOTAL</td><td></td><td>${fmt(mv.leaders.reduce((a,L)=>a+L.total,0))}</td><td></td></tr></tbody>`;return;}\n  const showOrph=c.orphanTotal>0;\n  $('#leaders').innerHTML=`<thead><tr><th>Líder</th><th>CBs</th><th>Home</th>${mv.dest.map(s=>`<th>${s}</th>`).join('')}${showOrph?'<th title=\"CBs em municípios fora da base de dominantes que seguiram esta líder\">Fora do setor</th>':''}<th>Desloc.</th></tr></thead><tbody>`\n   +c.leaders.map(L=>`<tr><td>${(L.lider||'').split(' ').slice(0,2).join(' ')}</td><td>${fmt(L.total)}</td>\n     <td>${L.home?`<span class=\"home\" style=\"background:${mv.color[L.home]}\"></span>${L.home}`:'–'}</td>\n     ${mv.dest.map(s=>`<td class=\"cell\" style=\"${s===L.home?'color:'+mv.color[s]+';font-weight:700':''}\">${L.byS[s]||'·'}</td>`).join('')}\n     ${showOrph?`<td class=\"cell\" style=\"${L.orphan&&!L.orphanHome?'color:var(--closing);font-weight:700':''}\" title=\"${L.orphan?(L.orphanHome?'seguem a líder para o setor '+L.orphanHome:'sem home — CBs sem setor pra seguir'):''}\">${L.orphan?fmt(L.orphan)+(L.orphanHome?'':' ⚠'):'·'}</td>`:''}\n     <td style=\"color:${L.desloc?'var(--closing)':'var(--mut)'};font-weight:${L.desloc?700:400}\">${L.desloc||'0'}</td></tr>`).join('')\n   +`<tr style=\"font-weight:700\"><td>TOTAL</td><td>${fmt(c.leaders.reduce((a,L)=>a+L.total,0))}</td><td></td>${mv.dest.map(s=>`<td>${fmt(c.leaders.reduce((a,L)=>a+L.byS[s],0))}</td>`).join('')}${showOrph?`<td>${fmt(c.orphanTotal)}</td>`:''}<td style=\"color:var(--closing)\">${fmt(c.desloc)}</td></tr></tbody>`;\n}\nfunction renderMatrix(){const mv=SESS.timeline[SESS.selected]; if(!mv) return;\n  // Esta matriz cruza LINHAS DO CRM (município x grupo) — no fechamento de GV/mercado a unidade\n  // que troca de dono é setor/GV, não município, e reconstruir a matriz nesse grão é trabalho ainda\n  // não feito; mostrar a tabela como se fosse por município aqui daria linhas vazias sem avisar.\n  if((mv.level||'setor')!=='setor'){ $('#matrix').innerHTML=`<tr><td class=\"note\" style=\"padding:10px\">Matriz por município × grupo ainda não disponível pra fechamento de ${LEVELS[mv.level].label} — use os KPIs, líderes e plano de migração acima.</td></tr>`; return; }\n  const ms=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__').sort((a,b)=>mv.munis[b].cbs-mv.munis[a].cbs);\n  // `_out` is a flag stamped on the ROW, and rows are shared between etapas (absorbed + inherited\n  // orphans), so the last etapa to aggregate wins and reading it here can describe the wrong etapa.\n  // Derive the bucket from THIS mv instead. Summing rather than .find() because several out-municípios\n  // of the same group all collapse into __OUTROS__, and only the first was being counted.\n  const outOf=x=>!mv.geoFeat[mkey(x.municipio,x.uf)];\n  const cell=(m,g)=>mv.matrix.reduce((a,x)=>a+((((outOf(x)?'__OUTROS__':mkey(x.municipio,x.uf))===m)&&String(x.grupo)===g)?+x.cbs:0),0);\n  const mx=Math.max(...ms.flatMap(m=>mv.leaders.map(L=>cell(m,L.grupo))),1);\n  // No destination column here. This is the AS-IS matrix: every município in it still belongs to the\n  // closing sector, so showing where it is HEADED mixed the two states of the world in one table and\n  // made the ASIS view read like a plan. The destination lives on the map and in \"Municípios → setor\n  // destino\", which are about the to-be.\n  $('#matrix').innerHTML=`<thead><tr><th>Município</th>${mv.leaders.map(L=>`<th title=\"${L.lider}\">${L.grupo}</th>`).join('')}<th>Tot</th></tr></thead><tbody>`\n   +ms.map(m=>`<tr><td>${m}</td>`\n     +mv.leaders.map(L=>{const v=cell(m,L.grupo);return `<td class=\"cell\" style=\"${v?`background:rgba(229,181,63,${.08+v/mx*.5})`:''}\">${v||'·'}</td>`;}).join('')\n     +`<td style=\"font-weight:700\">${fmt(mv.munis[m].cbs)}</td></tr>`).join('')+`</tbody>`;\n}\n// TOBE counterpart of the AS-IS matrix: the same município × grupo grid plus the two columns the AS-IS\n// view deliberately refuses to carry — where the município ends up, and under which líder.\n// \"Líder resultante\" is the líder holding the most CBs in that município. A município is served by several\n// grupos at once and the data names no single owner, so the dominant one is the honest answer and its\n// share is printed beside it instead of being hidden behind a single name.\nfunction renderMatrixTobe(){const mv=SESS.timeline[SESS.selected]; const el=$('#matrixTobe'); const nt=$('#tobeNote');\n  if(!el) return;\n  if(!mv||!mv.munis){ el.innerHTML=''; if(nt) nt.innerHTML=''; return; }\n  if((mv.level||'setor')!=='setor'){ el.innerHTML=`<tr><td class=\"note\" style=\"padding:10px\">Matriz por município × grupo ainda não disponível pra fechamento de ${LEVELS[mv.level].label} — use os KPIs, líderes e plano de migração acima.</td></tr>`; if(nt) nt.innerHTML=''; return; }\n  const c=computeDerived(mv);\n  const homeOf={}; c.leaders.forEach(L=>{ homeOf[L.grupo]=L.home; });\n  const ms=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__').sort((a,b)=>mv.munis[b].cbs-mv.munis[a].cbs);\n  // One pass over the matrix instead of a scan per cell: the AS-IS table can afford the naive version\n  // on six municípios, but this one asks for the dominant líder too, which multiplies the lookups.\n  const outOf=x=>!mv.geoFeat[mkey(x.municipio,x.uf)];\n  const cellBy={}; mv.matrix.forEach(x=>{ const k=(outOf(x)?'__OUTROS__':mkey(x.municipio,x.uf))+'|'+String(x.grupo);\n    cellBy[k]=(cellBy[k]||0)+ +x.cbs; });\n  const cell=(m,g)=>cellBy[m+'|'+g]||0;\n  const mx=Math.max(...ms.flatMap(m=>mv.leaders.map(L=>cell(m,L.grupo))),1);\n  const domLeader=m=>{ let best=null,bc=0;\n    mv.leaders.forEach(L=>{ const v=cell(m,L.grupo); if(v>bc){ bc=v; best=L; } });\n    return best?{L:best,cbs:bc}:null; };\n  const short=L=>(L.lider||'').split(' ').slice(0,2).join(' ')||('grupo '+L.grupo);\n  // NOT named `rows` — that is the module-level Databricks response helper, and shadowing it inside a\n  // render function is a trap for whoever adds a query here later.\n  // Off-mismatch ainda calculado pra alimentar a nota abaixo da tabela — só não vira mais coluna: o\n  // destino agora é \"Setor destino\" por GRUPO no rodapé, não mais por município na grade.\n  const recs=ms.map(m=>{ const d=mv.assign[m]||null, dl=domLeader(m);\n    const home=dl?(homeOf[dl.L.grupo]||null):null;\n    return {m:m,off:!!(dl&&home&&d&&home!==d)}; });\n  el.innerHTML=`<thead><tr><th>Município</th>${mv.leaders.map(L=>`<th title=\"${esc(L.lider||'')}\">${L.grupo}<br><span style=\"font-weight:400;font-size:10px;color:var(--mut)\">${esc(short(L))}</span></th>`).join('')}<th>Tot</th></tr></thead><tbody>`\n   +ms.map(m=>`<tr><td>${m}</td>`\n     +mv.leaders.map(L=>{const v=cell(m,L.grupo);return `<td class=\"cell\" style=\"${v?`background:rgba(229,181,63,${.08+v/mx*.5})`:''}\">${v||'·'}</td>`;}).join('')\n     +`<td style=\"font-weight:700\">${fmt(mv.munis[m].cbs)}</td></tr>`).join('')\n   // Um rótulo de destino por GRUPO (coluna), não por município (linha) — cada grupo tem UM home\n   // fixo (computeDerived já calculou), então ele mora uma vez no rodapé, igual o nome já morava.\n   +`<tr class=\"lider-foot\"><td>Setor destino</td>`\n     +mv.leaders.map(L=>{const h=homeOf[L.grupo]; return `<td>${h?`<span class=\"home\" style=\"background:${mv.color[h]}\"></span>${h}`:'–'}</td>`;}).join('')\n     +`<td></td></tr>`\n   +`</tbody>`;\n  if(nt){\n    const offN=recs.filter(r=>r.off).length;\n    nt.innerHTML=(mv.policy!=='fora')\n      ? `Política <b>quebrar relação</b>: as CBs deixam a líder atual e passam à estrutura do setor destino — o rodapé mostra pra onde cada grupo vai.`\n      : `<b>Setor destino</b> = o setor que recebe a maior parte das CBs de cada líder (rodapé, uma vez por grupo). `\n        +(offN?`<span style=\"color:var(--closing)\">${fmt(offN)} município(s) ⚠</span> têm a líder dominante indo para um setor diferente do dela — as CBs seguem a líder (é disso que o KPI “CBs fora do setor” é feito).`\n          :`Em todos os municípios a líder dominante termina no mesmo setor que recebe o território.`);\n  }\n}\nfunction renderPolicy(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const c=computeDerived(mv); const lvl=LEVELS[mv.level||'setor'];\n  // O toggle fora-do-setor/quebra-de-relação é uma decisão de setor fechando — em GV/mercado a\n  // seção some inteira em vez de mostrar um controle que não corresponde a nada calculado.\n  const sec=$('#policySection'); if(sec) sec.classList.toggle('hidden',(mv.level||'setor')!=='setor');\n  if((mv.level||'setor')!=='setor') return;\n  $('#policyNote').innerHTML=mv.policy==='fora'\n    ?`<b style=\"color:var(--acc)\">Mantendo vínculo:</b> ${fmt(c.desloc)} CBs seguem com a líder mas ficam <b>fisicamente noutr${lvl.a==='à'?'a':'o'} ${lc(lvl.destLabel)}</b>. Preserva relação; suja geografia.`\n    :`<b style=\"color:var(--acc)\">Quebrando vínculo:</b> ${fmt(c.desloc)} CBs <b>re-vinculam a uma líder d${lvl.a==='à'?'a':'o'} ${lc(lvl.destLabel)} destino</b>. Geografia limpa; rompe relação.`;\n}\nfunction renderPlan(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const c=computeDerived(mv); const lvl=LEVELS[mv.level||'setor']; const ms=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__').sort((a,b)=>a.localeCompare(b));\n  // GV/mercado: a chave \"m\" aqui é um código de setor/GV, não uma chave município/UF — mName/mUf\n  // parseariam lixo, então o CSV de plano exporta o código cru nesses níveis.\n  mv._plan=ms.map(m=>(mv.level&&mv.level!=='setor')?{municipio:m,uf:'',cbs:mv.munis[m].cbs,destino:mv.assign[m]}:{municipio:mName(m),uf:mUf(m),cbs:mv.munis[m].cbs,destino:mv.assign[m]});\n  $('#plan').innerHTML=`Etapa ${SESS.selected+1} · ${lvl.label} <b>${mv.sector}</b> → ${ms.map(m=>`${m}→<b style=\"color:${mv.color[mv.assign[m]]}\">${mv.assign[m]||'–'}</b>`).join(' · ')}<br>\n   Política: <b>${mv.policy==='fora'?`manter vínculo (CBs fora ${lvl.de} ${lc(lvl.destLabel)})`:'quebrar relação'}</b> · ${fmt(c.desloc)} CBs impactadas nesta etapa.`\n   +(c.orphanTotal?`<br>Fora da base de dominantes: ${fmt(c.orphanTotal)} CB(s) seguem suas líderes — ${mv.dest.filter(s=>c.orph[s]).map(s=>`${s} (${fmt(c.orph[s])})`).join(' · ')||'–'}${c.orphanStranded?` · <b style=\"color:var(--closing)\">${fmt(c.orphanStranded)} sem líder com destino</b>`:''}. Não entram no CSV, que é por município.`:'');\n}\nfunction renderReport(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const c=computeDerived(mv);\n  mv.metric=mv.metric||'cbs';\n  const KEYS=METRICS_DEF.map(m=>m[0]);\n  const incBy={};mv.dest.forEach(s=>incBy[s]=Object.fromEntries(KEYS.map(k=>[k,0])));\n  Object.entries(mv.munis).forEach(([m,o])=>{if(m==='__OUTROS__')return;const s=mv.assign[m];if(!s||!incBy[s])return;KEYS.forEach(k=>incBy[s][k]+=o[k]||0);});\n  // orphan CBs land on their leader's home sector, not on a geographic destination\n  c.leaders.forEach(L=>{ const om=mv.orphanMetricsByGroup&&mv.orphanMetricsByGroup[L.grupo];\n    if(om&&L.home&&incBy[L.home]) KEYS.forEach(k=>incBy[L.home][k]+=om[k]||0); });\n  const closeTot={};KEYS.forEach(k=>closeTot[k]=Object.entries(mv.munis).filter(([m])=>m!=='__OUTROS__').reduce((a,[,o])=>a+(o[k]||0),0));\n  // they leave the closing sector too, so antes → depois still balances\n  c.leaders.forEach(L=>{ const om=mv.orphanMetricsByGroup&&mv.orphanMetricsByGroup[L.grupo];\n    if(om&&L.home) KEYS.forEach(k=>closeTot[k]+=om[k]||0); });\n  const trend=mv.trend.slice(-6);\n  const chartHTML=mk=>{\n    const isM=['receita','rec_nat','rec_avon'].includes(mk); const fN=isM?money:fmt;\n    const data=mv.dest.map(s=>({label:s,color:mv.color[s],antes:+(mv.baseMetrics[s]?.[mk]||0),depois:+(mv.baseMetrics[s]?.[mk]||0)+(incBy[s]?.[mk]||0)}));\n    data.push({label:mv.sector+'✕',color:'#ff3b30',antes:closeTot[mk]||0,depois:0});\n    const max=Math.max(...data.flatMap(d=>[d.antes,d.depois]),1);\n    const W=720,H=290,base=238,top=42,maxH=base-top,n=data.length,gw=(W-16)/n;\n    let g='';\n    data.forEach((d,i)=>{const cx=8+gw*i+gw/2,bw=Math.min(30,gw*0.30);\n      const ah=d.antes/max*maxH,dh=d.depois/max*maxH,ax=cx-bw-2,dx=cx+2;\n      g+=`<rect x=\"${ax.toFixed(1)}\" y=\"${(base-ah).toFixed(1)}\" width=\"${bw.toFixed(1)}\" height=\"${ah.toFixed(1)}\" rx=\"2.5\" fill=\"${d.color}\" opacity=\"0.35\"/>`;\n      g+=`<rect x=\"${dx.toFixed(1)}\" y=\"${(base-dh).toFixed(1)}\" width=\"${bw.toFixed(1)}\" height=\"${dh.toFixed(1)}\" rx=\"2.5\" fill=\"${d.color}\"/>`;\n      g+=`<text x=\"${(ax+bw/2).toFixed(1)}\" y=\"${(base-ah-4).toFixed(1)}\" text-anchor=\"middle\" font-size=\"9\" fill=\"#9a9aa8\">${fN(d.antes)}</text>`;\n      g+=`<text x=\"${(dx+bw/2).toFixed(1)}\" y=\"${(base-dh-4).toFixed(1)}\" text-anchor=\"middle\" font-size=\"9.5\" font-weight=\"700\" fill=\"${d.color}\">${fN(d.depois)}</text>`;\n      const dp=d.antes?((d.depois-d.antes)/d.antes*100):(d.depois?100:0);\n      g+=`<text x=\"${cx.toFixed(1)}\" y=\"16\" text-anchor=\"middle\" font-size=\"10.5\" font-weight=\"700\" fill=\"${dp>=0?'#34c759':'#ff3b30'}\">${dp>0?'+':''}${dp.toFixed(0)}%</text>`;\n      g+=`<text x=\"${cx.toFixed(1)}\" y=\"${base+16}\" text-anchor=\"middle\" font-size=\"10.5\" font-weight=\"700\" fill=\"#1c1c2b\">${d.label}</text>`;});\n    return `<svg viewBox=\"0 0 ${W} ${H}\" style=\"width:100%\"><line x1=\"8\" y1=\"${base}\" x2=\"${W-8}\" y2=\"${base}\" stroke=\"#e7e7ef\"/>${g}</svg>`;\n  };\n  let h=`<div style=\"display:flex;justify-content:space-between;align-items:center;gap:10px;flex-wrap:wrap\">\n      <h2 style=\"margin:0\">Impacto antes → depois desta etapa</h2>\n      <select id=\"metricSel\">${METRICS_DEF.map(m=>`<option value=\"${m[0]}\" ${m[0]===mv.metric?'selected':''}>${m[1]}</option>`).join('')}</select></div>\n    <div class=\"note\" style=\"margin:2px 0 4px\">Barra clara = <b>antes desta etapa</b> (já incluindo etapas anteriores) · barra cheia = <b>depois</b> · <b style=\"color:var(--acc)\">${mv.sector}✕</b> = ${lc(lvl.label)} fechad${lvl.a==='à'?'a':'o'} nesta etapa · % = variação</div>\n    ${chartHTML(mv.metric)}`;\n  h+=`<h2 style=\"margin-top:16px\">Antes → Depois por ${lc(lvl.destLabel)} receptor (snapshot congelado)</h2>\n    <div class=\"scroll\"><table><thead><tr><th>${lvl.destLabel}</th>${METRICS_DEF.map(m=>`<th>${m[1]}</th>`).join('')}</tr></thead><tbody>`;\n  mv.dest.forEach(s=>{const b=mv.baseMetrics[s]||{};const inc=incBy[s];\n    h+=`<tr><td><span class=\"home\" style=\"background:${mv.color[s]}\"></span>${s}</td>`+\n      METRICS_DEF.map(([k])=>{const bv=+b[k]||0,av=bv+(inc[k]||0);const d=bv?((av-bv)/bv*100):0;const f=METRICS_DEF.find(x=>x[0]===k)[2]==='$'?money:fmt;\n        return `<td>${f(av)}<div class=\"delta ${d>=0?'up':'dn'}\">${d>0?'+':''}${d.toFixed(0)}%</div></td>`;}).join('')+`</tr>`;});\n  h+=`<tr style=\"opacity:.8\"><td>${mv.sector} (sai)</td>`+METRICS_DEF.map(([k,,t])=>`<td>${(t==='$'?money:fmt)(closeTot[k]||0)}</td>`).join('')+`</tr>`;\n  h+=`</tbody></table></div>`;\n  const incLvl={};mv.dest.forEach(s=>incLvl[s]={});\n  Object.keys(mv.munis).forEach(m=>{if(m==='__OUTROS__')return;const s=mv.assign[m];if(!s||!incLvl[s])return;const lv=mv.levelByMuni[m]||{};for(const nv in lv)incLvl[s][nv]=(incLvl[s][nv]||0)+lv[nv];});\n  c.leaders.forEach(L=>{ const ol=mv.orphanLevelByGroup&&mv.orphanLevelByGroup[L.grupo];\n    if(ol&&L.home&&incLvl[L.home]) Object.entries(ol).forEach(([nv,n])=>incLvl[L.home][nv]=(incLvl[L.home][nv]||0)+n); });\n  h+=`<h2 style=\"margin-top:18px\">Consultoras por nível — antes → depois por ${lc(lvl.destLabel)} receptor</h2>\n    <div class=\"scroll\"><table><thead><tr><th>${lvl.destLabel}</th>${NIVEIS.map(n=>`<th>${n}</th>`).join('')}<th>Total</th></tr></thead><tbody>`;\n  mv.dest.forEach(s=>{const base=mv.baseLevel[s]||{},inc=incLvl[s]||{};let tb=0,ta=0;\n    h+=`<tr><td><span class=\"home\" style=\"background:${mv.color[s]}\"></span>${s}</td>`+\n      NIVEIS.map(nv=>{const b=base[nv]||0,i=inc[nv]||0,a=b+i;tb+=b;ta+=a;\n        return `<td>${a?fmt(a):'·'}${i?`<div class=\"delta up\">+${fmt(i)}</div>`:''}</td>`;}).join('')+\n      `<td style=\"font-weight:700\">${fmt(ta)}${ta-tb?`<div class=\"delta up\">+${fmt(ta-tb)}</div>`:''}</td></tr>`;});\n  h+=`</tbody></table></div><div class=\"note\">Número = CBs por nível <b>depois</b> desta etapa · <span style=\"color:var(--ok)\">+N</span> = entrantes do ${mv.sector}.</div>`;\n  const spk=(key)=>{const vals=trend.map(t=>+t[key]||0);const mx=Math.max(...vals,1);\n    return `<div class=\"spark\">${vals.map(v=>`<div class=\"b\" style=\"height:${(v/mx*100).toFixed(0)}%\" title=\"${fmt(v)}\"></div>`).join('')}</div>\n      <div class=\"note\">${trend.map(t=>String(t.ciclo).slice(-2)).join(' · ')}</div>`;};\n  h+=`<h2 style=\"margin-top:18px\">Setor ${mv.sector} — últimos ${trend.length} ciclos até o snapshot congelado</h2>\n    <div class=\"note\" style=\"margin:-4px 0 8px\">Tendência histórica <b>do próprio setor</b> — não ajustada pela absorção hipotética de etapas anteriores (limitação conhecida: tendência é por setor, não decomponível por município).</div>\n    <div style=\"display:grid;grid-template-columns:repeat(4,1fr);gap:10px\">\n    ${[['cbs','CBs'],['ativas','Ativas'],['receita','Receita'],['pontos','Pontos']].map(([k,l])=>`<div><div class=\"note\" style=\"margin:0 0 3px;font-weight:600;color:var(--ink)\">${l}</div>${spk(k)}</div>`).join('')}</div>`;\n  $('#tab-report').innerHTML=h;\n  const sel=$('#metricSel'); if(sel) sel.onchange=()=>{mv.metric=sel.value; renderReport();};\n}\nfunction renderCumulative(){\n  const el=$('#tab-cumulative'); if(!el) return;\n  // Esta view soma a cadeia inteira via foldWorldState().muniOverride/sectorBaseCache — hoje só\n  // populados pelo fechamento de setor. GV/mercado têm o rastro equivalente (secOverride/gvOverride),\n  // mas essa agregação ainda não foi refeita nesse grão; melhor avisar do que mostrar tabela vazia.\n  const lockLvl=SESS.timeline.length?(SESS.timeline[0].level||'setor'):'setor';\n  if(lockLvl!=='setor'){ el.innerHTML=`<div class=\"note\">Impacto acumulado da cadeia ainda não disponível pra sessões de ${lc(LEVELS[lockLvl].label)} — use o relatório da etapa (aba anterior) etapa a etapa.</div>`; return; }\n  if(!SESS.timeline.length){ el.innerHTML='<div class=\"note\">Nenhuma etapa na timeline ainda.</div>'; return; }\n  const ready=SESS.timeline.every(mv=>mv.munis);\n  if(!ready){ el.innerHTML='<div class=\"note\">Aguardando etapas terminarem de calcular…</div>'; return; }\n  const finalWorld=foldWorldState(SESS.timeline,SESS.timeline.length);\n  const openSectors=[...new Set(Object.values(finalWorld.muniOverride))];\n  let h=`<h2 style=\"margin:0 0 8px\">Linha do tempo — ${SESS.timeline.length} fechamento(s)</h2>\n    <div class=\"note\" style=\"margin:-2px 0 10px\">Setores fechados, em ordem: ${SESS.timeline.map(mv=>mv.sector).join(' → ')}. Cada linha abaixo soma o efeito de <b>toda a cadeia</b>, não apenas da última etapa.</div>`;\n  h+=`<div class=\"scroll\"><table><thead><tr><th>Setor</th><th>Situação</th>${METRICS_DEF.map(([,l])=>`<th>${l}</th>`).join('')}</tr></thead><tbody>`;\n  SESS.timeline.forEach((mv,i)=>{\n    h+=`<tr style=\"opacity:.75\"><td>${mv.sector}</td><td>fechado (etapa ${i+1})</td>`+METRICS_DEF.map(([k,,t])=>`<td>${(t==='$'?money:fmt)(mv.pureOwnMetrics?.[k]||0)}</td>`).join('')+`</tr>`;\n  });\n  openSectors.forEach(s=>{\n    const base=SESS.sectorBaseCache[s]||{};\n    const infl=finalWorld.sectorInflow[s]||{};\n    h+=`<tr><td>${s}</td><td>recebeu território</td>`+METRICS_DEF.map(([k,,t])=>{\n      const bv=+base[k]||0, av=bv+(infl[k]||0); const d=bv?((av-bv)/bv*100):0; const f=(t==='$'?money:fmt);\n      return `<td>${f(av)}<div class=\"delta ${d>=0?'up':'dn'}\">${d>0?'+':''}${d.toFixed(0)}%</div></td>`;\n    }).join('')+`</tr>`;\n  });\n  h+=`</tbody></table></div><div class=\"note\">\"Antes\" de um setor receptor é o snapshot congelado (sem nenhum fechamento aplicado); \"depois\" soma tudo que a cadeia inteira jogou pra ele.</div>`;\n  el.innerHTML=h;\n}\nfunction project(feats){let mnx=1/0,mny=1/0,mxx=-1/0,mxy=-1/0;\n  const each=cb=>feats.forEach(f=>{const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];ps.forEach(p=>p.forEach(r=>r.forEach(cb)));});\n  each(p=>{mnx=Math.min(mnx,p[0]);mxx=Math.max(mxx,p[0]);mny=Math.min(mny,p[1]);mxy=Math.max(mxy,p[1]);});\n  const mlat=(mny+mxy)/2,kx=Math.cos(mlat*Math.PI/180),W=700,H=500,pad=22;\n  const gw=(mxx-mnx)*kx,gh=(mxy-mny),sc=Math.min((W-2*pad)/gw,(H-2*pad)/gh);\n  const ox=(W-gw*sc)/2,oy=(H-gh*sc)/2;\n  return p=>[ox+(p[0]-mnx)*kx*sc, oy+(mxy-p[1])*sc];\n}\nfunction pathFor(f,pr){const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];\n  return ps.map(poly=>poly.map(r=>'M'+r.map(p=>{const q=pr(p);return q[0].toFixed(1)+','+q[1].toFixed(1);}).join('L')+'Z').join('')).join('');}\nfunction cxy(f,pr){let x=0,y=0,n=0;const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];ps.forEach(poly=>poly[0].forEach(p=>{const q=pr(p);x+=q[0];y+=q[1];n++;}));return[x/n,y/n];}\n// ---------- label placement ----------\n// Pole of inaccessibility: the interior point farthest from ANY boundary of the dissolved area. A\n// centroid is only a mean — on a concave sector, one split across a river, or a member whose vertex\n// average falls in a bay, it lands outside the very territory it is supposed to name, which is what\n// pushed the sector numbers off their own shapes. Even-odd across every ring of every member is a\n// correct union test here because municipalities tile rather than overlap.\n// The search box is clipped to the viewBox, so the result is inside the territory AND on screen.\n// Rings are decimated first — this is a label, not a measurement — which keeps a 20-município sector\n// to a few million ops, and the result is cached per stage: geometry never changes between renders,\n// only the fill does.\nfunction labelPointFor(fs,pr){\n  const rings=[];\n  (fs||[]).forEach(f=>{ if(!f||!f.geometry) return;\n    const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];\n    ps.forEach(poly=>poly.forEach(r=>{\n      if(!r||r.length<4) return;\n      const step=Math.max(1,Math.floor(r.length/120)),pts=[];\n      for(let i=0;i<r.length;i+=step) pts.push(pr(r[i]));\n      if(pts.length>3) rings.push(pts);\n    }));});\n  if(!rings.length) return null;\n  let mnx=1/0,mny=1/0,mxx=-1/0,mxy=-1/0;\n  rings.forEach(r=>r.forEach(p=>{ if(p[0]<mnx)mnx=p[0]; if(p[0]>mxx)mxx=p[0]; if(p[1]<mny)mny=p[1]; if(p[1]>mxy)mxy=p[1]; }));\n  mnx=Math.max(mnx,2); mny=Math.max(mny,2); mxx=Math.min(mxx,698); mxy=Math.min(mxy,498);\n  if(!(mxx>mnx&&mxy>mny)) return null;\n  const inside=(x,y)=>{ let c=false;\n    for(const r of rings) for(let i=0,j=r.length-1;i<r.length;j=i++){ const a=r[i],b=r[j];\n      if(((a[1]>y)!==(b[1]>y)) && (x<(b[0]-a[0])*(y-a[1])/(b[1]-a[1])+a[0])) c=!c; }\n    return c; };\n  const edgeDist=(x,y)=>{ let m=Infinity;\n    for(const r of rings) for(let i=0,j=r.length-1;i<r.length;j=i++){ const a=r[i],b=r[j];\n      const dx=b[0]-a[0],dy=b[1]-a[1],L=dx*dx+dy*dy;\n      let t=L?(((x-a[0])*dx+(y-a[1])*dy)/L):0; t=t<0?0:(t>1?1:t);\n      const ex=a[0]+t*dx-x,ey=a[1]+t*dy-y,d=ex*ex+ey*ey; if(d<m)m=d; }\n    return Math.sqrt(m); };\n  const W=mxx-mnx,H=mxy-mny,N=26;\n  let best=null,bd=-1;\n  for(let i=0;i<=N;i++) for(let j=0;j<=N;j++){\n    const x=mnx+W*i/N,y=mny+H*j/N;\n    if(!inside(x,y)) continue;\n    const d=edgeDist(x,y); if(d>bd){ bd=d; best=[x,y]; }\n  }\n  if(!best) return null;\n  // Hill-climb off the coarse grid: the grid only has to land somewhere in the right lobe, the\n  // refinement finds the deep point inside it — halving the step whenever no neighbour improves.\n  let step=Math.max(W,H)/N/2;\n  for(let k=0;k<7;k++){\n    let moved=false;\n    for(const o of [[1,0],[-1,0],[0,1],[0,-1],[1,1],[1,-1],[-1,1],[-1,-1]]){\n      const x=best[0]+o[0]*step,y=best[1]+o[1]*step;\n      if(x<mnx||x>mxx||y<mny||y>mxy||!inside(x,y)) continue;\n      const d=edgeDist(x,y); if(d>bd){ bd=d; best=[x,y]; moved=true; }\n    }\n    if(!moved) step/=2;\n  }\n  // The clearance travels with the point: it is the radius of the largest circle that fits inside the\n  // territory there, which is exactly the budget a caller needs to decide how much text will fit.\n  return {p:best,r:bd};\n}\nfunction labelPointOf(mv,key,fs,pr){\n  if(!mv._lbl) mv._lbl={};\n  if(!(key in mv._lbl)) mv._lbl[key]=labelPointFor(fs,pr);\n  return mv._lbl[key];\n}\n// ---------- map zoom/pan ----------\n// Zoom é feito manipulando o viewBox, nunca um transform CSS — assim rótulos e polígonos vivem no\n// MESMO sistema de coordenadas e escalam juntos automaticamente (texto tem font-size em unidades do\n// viewBox, então encolher o viewBox amplia tudo por igual, sem lógica extra pro tamanho da fonte).\nconst MAP_W=700, MAP_H=500, MAP_ZOOM_MAX=8;\nlet mapView={x:0,y:0,w:MAP_W,h:MAP_H};\nfunction applyMapView(){\n  const svg=$('#map'); if(!svg) return;\n  svg.setAttribute('viewBox', mapView.x.toFixed(2)+' '+mapView.y.toFixed(2)+' '+mapView.w.toFixed(2)+' '+mapView.h.toFixed(2));\n  // Rótulo tem font-size em unidades do viewBox, então sem isso ele cresceria junto com o zoom até\n  // virar um borrão — encolhendo o font-size na mesma proporção que o viewBox encolhe cancela\n  // exatamente o zoom, e o texto fica do MESMO tamanho na tela em qualquer nível de zoom.\n  const fsScale=mapView.w/MAP_W;\n  svg.querySelectorAll('text[data-fs]').forEach(t=>{\n    const base=+t.getAttribute('data-fs')||8;\n    t.setAttribute('font-size',(base*fsScale).toFixed(2));\n  });\n  // Mesmo raciocínio pro halo do texto e pro fio que liga um rótulo deslocado ao seu município —\n  // os dois têm largura de traço fixa em unidades do viewBox, então sem reescalar iam virar uma\n  // mancha grossa (halo) ou uma barra (fio) no zoom alto em vez de ficarem do mesmo tamanho na tela.\n  svg.querySelectorAll('[data-sw]').forEach(el=>{\n    const base=+el.getAttribute('data-sw')||1;\n    el.style.strokeWidth=(base*fsScale).toFixed(3)+'px';\n  });\n}\nfunction zoomMapBy(factor){\n  const cx=mapView.x+mapView.w/2, cy=mapView.y+mapView.h/2;\n  let w=mapView.w/factor, h=mapView.h/factor;\n  w=Math.min(MAP_W, Math.max(MAP_W/MAP_ZOOM_MAX, w));\n  h=Math.min(MAP_H, Math.max(MAP_H/MAP_ZOOM_MAX, h));\n  let x=cx-w/2, y=cy-h/2;\n  x=Math.min(MAP_W-w, Math.max(0,x));\n  y=Math.min(MAP_H-h, Math.max(0,y));\n  mapView={x,y,w,h};\n  applyMapView();\n}\n// Arrastar sempre fica DENTRO do canvas de 700x500 (clamp em [0, MAP_W-w] / [0, MAP_H-h]) — nunca\n// existe um x/y que deixa o viewBox parcialmente fora da área com conteúdo, então o mapa nunca\n// \"some\" da tela, só pode chegar até a borda do que existe pra ver.\nlet mapDrag=null, mapDidDrag=false;\nfunction mapPointerDown(e){\n  const svg=$('#map'); if(!svg) return;\n  mapDrag={x0:e.clientX,y0:e.clientY,vx0:mapView.x,vy0:mapView.y,rect:svg.getBoundingClientRect()};\n  mapDidDrag=false;\n  svg.classList.add('dragging');\n  // NÃO setPointerCapture aqui: capturar o ponteiro no <svg> reencaminha o click resultante pro\n  // próprio <svg> em vez do <path> do município embaixo do cursor — todo clique parava de chegar\n  // no onclick de reatribuição, não só depois de um arrasto de verdade. move/up escutam em `root`\n  // (nunca substituído por renderAll) em vez de no <svg>, então o arrasto continua funcionando\n  // mesmo se o ponteiro sair da área do mapa no meio do gesto.\n}\nfunction mapPointerMove(e){\n  if(!mapDrag) return;\n  const dxPix=e.clientX-mapDrag.x0, dyPix=e.clientY-mapDrag.y0;\n  if(!mapDidDrag && Math.hypot(dxPix,dyPix)>4) mapDidDrag=true;\n  if(!mapDrag.rect.width||!mapDrag.rect.height) return;\n  const sx=mapView.w/mapDrag.rect.width, sy=mapView.h/mapDrag.rect.height;\n  let x=mapDrag.vx0-dxPix*sx, y=mapDrag.vy0-dyPix*sy;\n  x=Math.min(MAP_W-mapView.w, Math.max(0,x));\n  y=Math.min(MAP_H-mapView.h, Math.max(0,y));\n  mapView={...mapView,x,y};\n  applyMapView();\n}\nfunction mapPointerUp(){\n  if(!mapDrag) return;\n  mapDrag=null;\n  const svg=$('#map'); if(svg) svg.classList.remove('dragging');\n}\nfunction drawMap(){\n  const mv=SESS.timeline[SESS.selected]; const svg=$('#map'); const ignNote=$('#mapIgnoredNote');\n  if(!mv){ svg.innerHTML=''; if(ignNote) ignNote.innerHTML=''; return; }\n  const level=mv.level||'setor';\n  // setor fecha: a unidade É o município. GV/mercado fecham: cada município herda a atribuição do\n  // setor/GV a que pertence — municípios do mesmo setor sempre têm a MESMA cor e giram JUNTOS no\n  // clique, porque é o setor inteiro (não o município) que troca de dono nesses níveis.\n  const unitAssign=m=>level==='setor'?mv.assign[m]:mv.assign[(mv.unitOfMuni||{})[m]];\n  const c=computeDerived(mv);const NS='http://www.w3.org/2000/svg'; svg.innerHTML='';\n  const feats=[...mv.nbrFeat,...Object.values(mv.geoFeat)]; if(!feats.length) return;\n  const pr=project(feats);\n  const world=foldWorldState(SESS.timeline,SESS.selected);\n  // The context layer is ONE area per SECTOR, not one shape per município. The unit of this decision\n  // is the destination sector; a scatter of individually outlined municipalities carrying their own\n  // names invited exactly the wrong reading of the map. Members of a sector are filled AND stroked in\n  // the same colour, so the shared borders vanish and the group reads as a single dissolved\n  // territory — the IBGE shapes do not share vertices precisely enough to extract a clean union\n  // outline, and carrying a real polygon-clipping union for a context layer is not worth it.\n  // Labels are COLLECTED here and drawn last, after every path. Drawn inline they were buried by the\n  // next sector's fill, and placement cannot avoid a collision it has not seen yet.\n  const labels=[],placed=[];\n  const textW=(s,fs)=>String(s).length*fs*0.56;\n  // WCAG relative luminance of the fill a label sits on, so ink and halo can invert per label. \"Would\n  // white be better?\" has no single answer on this map: white reads on #5856d6 (L≈0.14) and disappears\n  // on #ff9500 and #34c759 (both L≈0.43, where black wins ~9:1 against white's ~2.2:1) and on every\n  // context fill, which is .32 opacity over white. Decided per label, never globally.\n  const lum=col=>{let h=String(col||'').replace('#','');\n    if(h.length===3) h=h[0]+h[0]+h[1]+h[1]+h[2]+h[2];\n    if(h.length!==6) return 1;\n    const c=[0,2,4].map(i=>parseInt(h.slice(i,i+2),16)/255)\n      .map(v=>v<=0.03928?v/12.92:Math.pow((v+0.055)/1.055,2.4));\n    return 0.2126*c[0]+0.7152*c[1]+0.0722*c[2];};\n  // Centred on (x,y) in BOTH axes. The old box hung off the first line's baseline, so every two-line\n  // label sat half its own height below the point it was supposed to mark.\n  const rectOf=(x,y,lines)=>{const w=Math.max.apply(null,lines.map(l=>textW(l.t,l.size)));\n    const h=lines.reduce((a,l)=>a+l.size*1.2,0);\n    return {x1:x-w/2-2.5,x2:x+w/2+2.5,y1:y-h/2-1.5,y2:y+h/2+1.5};};\n  const nbrBySec={};\n  mv.nbrFeat.forEach(f=>{\n    const nm=mkey(f.properties.name||f.properties.NOME||f.properties.nome||'',f.__uf);\n    const s=String((mv.nbrCurrentSector&&mv.nbrCurrentSector[nm])||'');\n    (nbrBySec[s]=nbrBySec[s]||[]).push(f);\n  });\n  Object.keys(nbrBySec).forEach(s=>{\n    const fs=nbrBySec[s];\n    const isDest=!!s&&mv.dest.includes(s);\n    const closedCtx=!!s&&world.closedSectors.has(s);\n    const col=isDest?(mv.color[s]||null):null;\n    fs.forEach(f=>{\n      const p=document.createElementNS(NS,'path');\n      p.setAttribute('d',pathFor(f,pr));\n      p.setAttribute('class','sect'+(isDest?'':(closedCtx?' closed-ctx':' plain')));\n      if(col){ p.setAttribute('fill',col); p.setAttribute('stroke',col); }\n      svg.appendChild(p);\n    });\n    if(!s) return;\n    // One number per sector, at the pole of inaccessibility of its DISSOLVED area — the whole group\n    // of members at once, not a representative member, so the number sits in the visual middle of the\n    // territory the operator actually sees.\n    const lp=labelPointOf(mv,'s:'+s,fs,pr);\n    // Context areas always read LIGHT — .sect paints dest colours at fill-opacity .32 over white, and\n    // plain/closed-ctx are near-white greys — so a sector number never wants white ink, whatever colour\n    // the sector itself was assigned.\n    if(lp&&lp.p) labels.push({anchor:lp.p,big:true,dark:false,lines:[{t:s,size:11.5,weight:700}]});\n  });\n  const asis=mv.view==='asis';\n  // The UF prefix is information only when the stage actually straddles a border. On a single-UF setor\n  // it is the same three characters repeated on every label — a large share of the clutter and none of\n  // the meaning. The hover tooltip carries the UF either way.\n  const showUf=new Set(Object.keys(mv.geoFeat).map(k=>mUf(k)).filter(Boolean)).size>1;\n  if(level==='setor'){\n    // Setor fechando: a UNIDADE é o próprio município — cada um se comporta, colore e rotula\n    // individualmente, exatamente como sempre foi.\n    Object.entries(mv.geoFeat).forEach(([m,f])=>{const p=document.createElementNS(NS,'path');p.setAttribute('d',pathFor(f,pr));\n      const fillCol=asis?CLOSE_COLOR:(mv.color[unitAssign(m)]||'#444');\n      p.setAttribute('class','muni');p.setAttribute('fill',fillCol);\n      if(!asis) p.onclick=()=>{editSelected(m2=>{const i=m2.dest.indexOf(m2.assign[m]);if(m2.dest.length)m2.assign[m]=m2.dest[(i+1)%m2.dest.length];m2.selMuni=m;});};\n      p.style.cursor=asis?'default':'pointer';\n      p.onmousemove=e=>{const t=$('#tip');t.style.opacity=1;t.style.left=(e.clientX+12)+'px';t.style.top=(e.clientY+12)+'px';\n        t.innerHTML=asis?`<b>${mDisp(m)}</b><br>${fmt(mv.cbsByMuni[m]||0)} CBs · setor ${mv.sector}`:`<b>${mDisp(m)}</b><br>${fmt(mv.cbsByMuni[m]||0)} CBs → ${unitAssign(m)||'–'}<br><span style=\"color:var(--mut)\">clique p/ trocar</span>`;};\n      p.onmouseleave=()=>$('#tip').style.opacity=0;svg.appendChild(p);\n      const lp=labelPointOf(mv,'m:'+m,[f],pr);\n      const at=(lp&&lp.p)||cxy(f,pr);\n      const nmFull=(showUf&&mUf(m)?mUf(m)+'-':'')+mName(m);\n      const num=fmt(mv.cbsByMuni[m]||0)+(asis?'':'·'+(unitAssign(m)||'–'));\n      labels.push({anchor:at,cbs:+(mv.cbsByMuni[m]||0),dark:lum(fillCol)<0.18,\n        lines:[{t:nmFull,size:8.2,weight:700},{t:num,size:7,weight:500,mut:true}]});\n    });\n  } else {\n    // GV/mercado fechando: a UNIDADE é o setor (ou a GV) inteiro, nunca o município isolado —\n    // vários municípios do mesmo setor têm de ler como UMA área só, nunca como municípios separados\n    // que por acaso têm a mesma cor. Mesmo truque do contexto vizinho logo acima: stroke = fill via\n    // estilo inline (uma regra de classe como .muni{stroke:#fff} outrank­aria um atributo stroke\n    // comum, então a costura entre membros só some setando o style direto) — e UM rótulo só por\n    // unidade, no ponto de inacessibilidade da área dissolvida, nunca um rótulo por município.\n    Object.entries(mv.unitMunis||{}).forEach(([u,ms])=>{\n      const fillCol=asis?CLOSE_COLOR:(mv.color[mv.assign[u]]||'#444');\n      const feats=ms.map(m=>mv.geoFeat[m]).filter(Boolean);\n      // Todo município deste u é UMA unidade só na tela — passar o mouse sobre qualquer pedaço tem\n      // que acender o grupo inteiro, não só o pedaço que o cursor está tocando. :hover no CSS só\n      // sabe acender o próprio <path>; o grupo inteiro precisa de JS guardando os irmãos.\n      const els=[];\n      ms.forEach(m=>{\n        const f=mv.geoFeat[m]; if(!f) return;\n        const p=document.createElementNS(NS,'path');p.setAttribute('d',pathFor(f,pr));\n        p.setAttribute('class','muni');p.setAttribute('fill',fillCol);p.style.stroke=fillCol;\n        els.push(p);\n        if(!asis) p.onclick=()=>{editSelected(m2=>{const i=m2.dest.indexOf(m2.assign[u]);if(m2.dest.length)m2.assign[u]=m2.dest[(i+1)%m2.dest.length];m2.selMuni=u;});};\n        p.style.cursor=asis?'default':'pointer';\n        p.onmouseenter=()=>{ els.forEach(e=>e.classList.add('munihl')); };\n        p.onmousemove=e=>{const t=$('#tip');t.style.opacity=1;t.style.left=(e.clientX+12)+'px';t.style.top=(e.clientY+12)+'px';\n          t.innerHTML=asis?`<b>${LEVELS[level].childLabel} ${u}</b><br>${fmt(mv.munis[u]?.cbs||0)} CBs · ${LEVELS[level].label} ${mv.sector}`:`<b>${LEVELS[level].childLabel} ${u}</b><br>${fmt(mv.munis[u]?.cbs||0)} CBs → ${mv.assign[u]||'–'}<br><span style=\"color:var(--mut)\">clique p/ trocar</span>`;};\n        p.onmouseleave=()=>{ els.forEach(e=>e.classList.remove('munihl')); $('#tip').style.opacity=0; };svg.appendChild(p);\n      });\n      const lp=labelPointOf(mv,'u:'+u,feats,pr);\n      const at=(lp&&lp.p)||(feats[0]&&cxy(feats[0],pr));\n      if(at){\n        const num=fmt(mv.munis[u]?.cbs||0)+(asis?'':'·'+(mv.assign[u]||'–'));\n        labels.push({anchor:at,big:true,cbs:+(mv.munis[u]?.cbs||0),dark:lum(fillCol)<0.18,\n          lines:[{t:`${LEVELS[level].childLabel} ${u}`,size:9,weight:700},{t:num,size:7.5,weight:500,mut:true}]});\n      }\n    });\n  }\n  // Placement, not de-cluttering. Every label IS drawn: it starts at its anchor and, if the text does\n  // not fit the territory or the slot is already taken, walks outward ring by ring until it finds\n  // clear canvas, trailing a hairline leader back to the shape it names. The previous pass dropped the\n  // loser of every collision outright, which is why municípios silently had no name at all.\n  // Order still matters — sector numbers first, then municípios by CB weight — because the earlier a\n  // label is placed the closer to home it lands.\n  const CW=700,CH=500,CPAD=2;\n  const inBounds=r=>r.x1>=CPAD&&r.x2<=CW-CPAD&&r.y1>=CPAD&&r.y2<=CH-CPAD;\n  const hits=r=>placed.reduce((a,q)=>a+((r.x2<q.x1||r.x1>q.x2||r.y2<q.y1||r.y1>q.y2)?0:1),0);\n  // Ring 0 is the anchor itself. Rings step 9u out over 16 directions, stretched horizontally because\n  // a label is wider than it is tall and sideways room is the room it actually needs.\n  const CAND=[[0,0]];\n  for(let ring=1;ring<=7;ring++){ const d=ring*9;\n    for(let a=0;a<16;a++){ const th=a*Math.PI/8; CAND.push([Math.cos(th)*d*1.35,Math.sin(th)*d]); } }\n  labels.sort((a,b)=>(b.big?1:0)-(a.big?1:0)||((b.cbs||0)-(a.cbs||0)));\n  labels.forEach(L=>{\n    let chosen=null,best=null,bestN=Infinity;\n    // Centred on the anchor is ALWAYS the first choice. An earlier cut here refused the anchor whenever\n    // the text was wider than the município's inscribed circle — true of almost every real name at this\n    // scale (BA-SAO SEBASTIAO DO PASSE is ~140u against ~80u of clearance), so every single label got\n    // nudged outside and nothing ended up centred on anything. Spilling past a border is normal on a\n    // choropleth and the halo keeps it readable; only a genuine COLLISION earns a move.\n    for(const off of CAND){\n      const x=L.anchor[0]+off[0], y=L.anchor[1]+off[1];\n      const r=rectOf(x,y,L.lines);\n      if(!inBounds(r)) continue;\n      const n=hits(r);\n      if(!n){ chosen={x,y,r,off}; break; }\n      // No clear slot yet — remember the LEAST crowded one. Falling back to the first in-bounds\n      // candidate meant falling back to the anchor every time, so a crowded map piled every loser onto\n      // the same point. CAND is ordered nearest-first and the compare is strict, so ties keep the\n      // closest slot.\n      if(n<bestN){ bestN=n; best={x,y,r,off}; }\n    }\n    // Canvas genuinely full: take the nearest in-bounds slot and accept the overlap. A label sitting\n    // on top of another is recoverable by eye; a name that was never drawn is not.\n    if(!chosen) chosen=best||{x:L.anchor[0],y:L.anchor[1],r:rectOf(L.anchor[0],L.anchor[1],L.lines),off:[0,0]};\n    placed.push(chosen.r);\n    const g=document.createElementNS(NS,'g'); g.setAttribute('class','lbl'+(L.big?' big':''));\n    if(Math.abs(chosen.off[0])>0.5||Math.abs(chosen.off[1])>0.5){\n      // The leader stops at the label's edge rather than its centre, so it never runs under the glyphs.\n      const cx=(chosen.r.x1+chosen.r.x2)/2, cy=(chosen.r.y1+chosen.r.y2)/2;\n      const hw=(chosen.r.x2-chosen.r.x1)/2, hh=(chosen.r.y2-chosen.r.y1)/2;\n      const dx=L.anchor[0]-cx, dy=L.anchor[1]-cy;\n      const tt=Math.min(dx?hw/Math.abs(dx):Infinity, dy?hh/Math.abs(dy):Infinity);\n      const ln=document.createElementNS(NS,'line'); ln.setAttribute('class','lead');\n      ln.style.stroke=L.dark?'#fff':'#1c1c1e';\n      // A largura do fio também é fixa em unidades do viewBox, igual o halo do texto — sem\n      // reescalar junto, no zoom alto ela vira uma barra grossa em vez de um fio fino.\n      ln.setAttribute('data-sw','0.8'); ln.style.strokeWidth='0.8px';\n      ln.setAttribute('x1',L.anchor[0].toFixed(1)); ln.setAttribute('y1',L.anchor[1].toFixed(1));\n      ln.setAttribute('x2',(cx+dx*tt).toFixed(1)); ln.setAttribute('y2',(cy+dy*tt).toFixed(1));\n      g.appendChild(ln);\n    }\n    const hTot=L.lines.reduce((a,l)=>a+l.size*1.2,0);\n    let ty=chosen.y-hTot/2+L.lines[0].size*0.86;\n    // Inline style rather than a class: a stylesheet rule would outrank a presentation attribute and\n    // undo the per-label contrast decision made above.\n    const ink=L.dark?'#fff':'#1c1c1e', inkMut=L.dark?'rgba(255,255,255,.85)':'#48484d';\n    const halo=L.dark?'rgba(0,0,0,.6)':'#fff';\n    // Halo do texto (o \"contorno\" que garante legibilidade sobre qualquer cor de fundo) também é\n    // fixo em unidades do viewBox via .lbl text{stroke-width}/.lbl.big text{stroke-width} — sem\n    // reescalar junto com o font-size, no zoom alto ele vira uma mancha escura cobrindo a letra\n    // inteira em vez de um contorno fino, exatamente o \"Setor 3570\" ilegível reportado.\n    const swBase=L.big?2.9:2.2;\n    L.lines.forEach(l=>{ const t=document.createElementNS(NS,'text');\n      t.setAttribute('x',chosen.x.toFixed(1)); t.setAttribute('y',ty.toFixed(1));\n      t.setAttribute('font-size',l.size); t.setAttribute('data-fs',l.size); t.setAttribute('font-weight',l.weight||600);\n      t.setAttribute('data-sw',swBase); t.style.strokeWidth=swBase+'px';\n      t.style.fill=l.mut?inkMut:ink; t.style.stroke=halo;\n      t.textContent=l.t; g.appendChild(t); ty+=l.size*1.2; });\n    svg.appendChild(g);\n  });\n  $('#legend').innerHTML=asis\n    ?`<span><b style=\"background:${CLOSE_COLOR}\"></b>${LEVELS[level].label} ${mv.sector} (estrutura antes desta etapa — ${level==='setor'?Object.keys(mv.geoFeat).length+' municípios':Object.keys(mv.unitMunis||{}).length+' '+LEVELS[level].childLabel.toLowerCase()+'(s)'})</span>`\n    // No \"vizinhos (contexto)\" or \"setor já fechado antes\" entry any more: every feature still drawn\n    // belongs to a destination sector, so .sect.plain and .sect.closed-ctx can no longer be produced\n    // and a legend key for them would point at nothing on the map.\n    :mv.dest.map(s=>`<span><b style=\"background:${mv.color[s]}\"></b>${LEVELS[level].destLabel} ${s} — ${c.gained[s]} líder(es)</span>`).join('');\n  // Municipalities outside the dominance base are deliberately NOT drawn — no shape, no hover, no\n  // legend entry. They are reported in the panel instead, so the map only ever shows territory that\n  // is actually being reallocated.\n  if(ignNote) ignNote.innerHTML=(mv.excludedMunis&&mv.excludedMunis.length)\n    ? `<b style=\"color:var(--closing)\">${fmt(mv.excludedMunis.length)} município(s) / ${fmt(mv.excludedCbs||0)} CBs</b> fora da base de dominantes deste setor não são desenhados no mapa — as CBs seguem a líder do seu grupo (detalhe em “Municípios → setor destino”).`\n    : '';\n  applyMapView();\n}\nasync function runSql(){const sql=$('#sqlIn').value.trim();$('#sqlStatus').textContent='rodando…';$('#sqlStatus').classList.remove('err');\n  try{ await ensurePinned(); const resp=await q(sql);const rs=rows(resp);const cols=(resp.manifest?.schema?.columns||[]).map(c=>c.name);\n    $('#sqlOut').innerHTML=`<thead><tr>${cols.map(c=>`<th>${c}</th>`).join('')}</tr></thead><tbody>`+rs.slice(0,200).map(r=>`<tr>${cols.map(c=>`<td>${r[c]??'·'}</td>`).join('')}</tr>`).join('')+`</tbody>`;\n    $('#sqlStatus').textContent=rs.length+' linha(s)';}\n  catch(e){$('#sqlStatus').textContent='bloqueado/erro: '+e.message;$('#sqlStatus').classList.add('err');}\n}\nfunction renderAll(){\n  renderStage();\n  renderTimeline(); renderSectorPicker();\n  const shb=$('#openShare'); if(shb) shb.disabled=!SESS.timeline.length;\n  const dpb=$('#dupSession'); if(dpb) dpb.disabled=!SESS.timeline.length;\n  const mv=SESS.timeline[SESS.selected];\n  // resolveSnapshotPin falls back to a live sub-select when it cannot pin a literal; saying\n  // \"congelado\" in that case would be a lie, so the pill reports what is actually in the SQL.\n  const pinned=SESS.snapLiteral && !/^\\(SELECT/i.test(SESS.snapLiteral);\n  $('#liveState').textContent = SESS.snapshotRaw\n    ? (pinned?'● snapshot congelado · ':'◍ snapshot ao vivo (não fixado) · ')+'atualizado em '+fmtSyncedAt(SESS.snapshotSyncedAt)+' · ↻'\n    : '● iniciando';\n  const mp=$('#basePill');\n  if(mp){\n    const warn=[];\n    if(DOM.bySetor&&!DOM.hasUf) warn.push('⚠ sem coluna UF');\n    if(DOM.badUf) warn.push('⚠ '+fmt(DOM.badUf)+' UF não reconhecida(s)');\n    if(DOM.clashes) warn.push('⚠ '+fmt(DOM.clashes)+' homônimo(s) no mesmo setor');\n    mp.textContent=DOM.bySetor?('◇ base dominantes: '+fmt(DOM.setores)+' setores · '+fmt(DOM.rows)+' municípios'+(warn.length?' · '+warn.join(' · '):'')):(DOM.error?'◇ base dominantes: indisponível':'◇ base dominantes: carregando…');\n    mp.title=DOM.error||(DOM.bySetor?((DOM.hasUf\n        ?('Coluna de UF usada: \"'+DOM.ufCol+'\".')\n        :('SEM coluna de UF. Colunas lidas: '+((DOM.headers||[]).join(' | ')||'?')+'. A UF de cada município vem desta base — sem ela, homônimos voltam a ser casados só pelo nome.'))\n      +(DOM.badUf?('\\n'+DOM.badUf+' linha(s) com UF irreconhecível — tratadas como desconhecida.'):'')\n      +(DOM.clashes?('\\n'+DOM.clashes+' município(s) aparecem no mesmo setor com UFs diferentes. O SQL agrupa só por DS_MUNICIPIO, então esses chegam somados numa linha única e não há como separá-los.'):'')\n      ):'')||DOM.url||''; }\n  const rp=$('#rulePill'); if(rp) rp.textContent='◈ destino: '+ruleShort(SESS.settings);\n  const sp=$('#spanPill'); if(sp) sp.textContent='◎ span: '+spanShort(SESS.settings);\n  renderRuleNote(); renderSpanRule();\n  if(!mv){ ['#map','#matrix','#matrixTobe','#tobeNote','#leaders'].forEach(s=>{const el=$(s);if(el)el.innerHTML='';}); $('#kpis').innerHTML=''; $('#spans').innerHTML=''; $('#muniList').innerHTML=''; $('#plan').innerHTML=''; return; }\n  $('#mapTitle').textContent=`Etapa ${SESS.selected+1}/${SESS.timeline.length} — fechando ${lc(LEVELS[mv.level||'setor'].label)} ${mv.sector}`;\n  $('#viewToggle').querySelectorAll('button').forEach(b=>b.classList.toggle('on',b.dataset.v===mv.view));\n  $('#policy').querySelectorAll('button').forEach(b=>b.classList.toggle('on',b.dataset.p===mv.policy));\n  $('#optBadge').textContent=mv.optBadge||'';\n  drawMap(); renderContig(); renderSpanRule(); renderKpis(); renderSpans(); renderMuni(); renderLeaders(); renderMatrix(); renderMatrixTobe(); renderPolicy(); renderPlan(); renderReport(); renderCumulative();\n}\n\n// ---------- event wiring ----------\n$('#confirmSnap').onclick=()=>{ SESS.stage='main'; renderAll(); };\n$('#openMove').onclick=openMove;\n$('#moveClose').onclick=closeMove;\n$('#moveCancel').onclick=closeMove;\n$('#moveBg').addEventListener('click',e=>{ if(e.target.id==='moveBg') closeMove(); });\nroot.querySelectorAll('input[name=\"moveLevel\"]').forEach(r=>r.addEventListener('change',renderMoveForm));\n$('#moveRand').onclick=moveRandPick;\n$('#moveGo').onclick=submitMove;\n$('#moveCode').addEventListener('keydown',e=>{ if(e.key==='Enter') submitMove(); });\n$('#confirmSessionPick').onchange=()=>loadSession($('#confirmSessionPick').value);\n$('#optim').onclick=()=>editSelected(mv=>{ mv.assign=optimizeFor(mv); });\n$('#autoTobe').onclick=()=>editSelected(mv=>{ mv.assign=autoAssignFor(mv); mv.optBadge='TOBE por adjacência'; });\n$('#viewToggle').querySelectorAll('button').forEach(b=>b.onclick=()=>{const mv=SESS.timeline[SESS.selected];if(!mv)return;mv.view=b.dataset.v;renderAll();});\n$('#mapZoomIn').onclick=()=>zoomMapBy(1.4);\n$('#mapZoomOut').onclick=()=>zoomMapBy(1/1.4);\n$('#map').addEventListener('pointerdown',mapPointerDown);\nroot.addEventListener('pointermove',mapPointerMove);\nroot.addEventListener('pointerup',mapPointerUp);\nroot.addEventListener('pointerleave',mapPointerUp);\n// Arrastar não pode virar \"cliquei num município e troquei o destino sem querer\": se o ponteiro se\n// moveu além do limiar de arrasto, este clique (capture, antes de chegar no <path>) é engolido.\n$('#map').addEventListener('click',e=>{ if(mapDidDrag){ e.stopPropagation(); e.preventDefault(); mapDidDrag=false; } },true);\n$('#policy').querySelectorAll('button').forEach(b=>b.onclick=()=>{const mv=SESS.timeline[SESS.selected];if(!mv)return;mv.policy=b.dataset.p;renderKpis();renderPolicy();renderPlan();});\nroot.querySelectorAll('.tabs button').forEach(b=>b.onclick=()=>{root.querySelectorAll('.tabs button').forEach(x=>x.classList.toggle('on',x===b));\n  ['matrix','tobe','report','cumulative','sql'].forEach(t=>$('#tab-'+t).classList.toggle('hidden',t!==b.dataset.tab));});\n$('#runSql').onclick=runSql;\n$('#copyPlan').onclick=()=>{const mv=SESS.timeline[SESS.selected];if(!mv)return;navigator.clipboard.writeText(JSON.stringify({setor:mv.sector,politica:mv.policy,plano:mv._plan},null,2));$('#copyPlan').textContent='copiado ✓';setTimeout(()=>$('#copyPlan').textContent='Copiar',1500);};\n$('#csvPlan').onclick=()=>{const mv=SESS.timeline[SESS.selected];if(!mv)return;const csv='municipio,uf,cbs,setor_destino\\n'+mv._plan.map(p=>`${p.municipio},${p.uf||''},${p.cbs},${p.destino}`).join('\\n');\n  const a=document.createElement('a');a.href=URL.createObjectURL(new Blob([csv],{type:'text/csv'}));a.download=`plano_migracao_setor_${mv.sector}.csv`;a.click();};\n$('#saveSession').onclick=saveSession;\n$('#dupSession').onclick=duplicateSession;\n$('#sessionPick').onchange=()=>loadSession($('#sessionPick').value);\n$('#liveState').onclick=refreshSnapshot;\n$('#liveState').addEventListener('keydown',e=>{ if(e.key==='Enter'||e.key===' '){ e.preventDefault(); refreshSnapshot(); } });\n$('#openOptions').onclick=openOptions;\n$('#optClose').onclick=closeOptions;\n$('#optCancel').onclick=closeOptions;\n$('#optApply').onclick=applyOptions;\n$('#optMinCbs').addEventListener('input',renderOptPreview);\n['#optTargetSpan','#optMaxSpan','#optMinSpan'].forEach(id=>$(id).addEventListener('input',renderOptPreview));\nroot.querySelectorAll('input[name=\"destRule\"]').forEach(r=>r.addEventListener('change',renderOptPreview));\n$('#optionsBg').addEventListener('click',e=>{ if(e.target.id==='optionsBg') closeOptions(); });\nroot.addEventListener('keydown',e=>{ if(e.key==='Escape'){ closeOptions(); closeShare(); closeMove(); } });\n\n$('#openShare').onclick=openShare;\n$('#shareX').onclick=closeShare;\n$('#shareCancel').onclick=closeShare;\n$('#shareGo').onclick=doShare;\n$('#shareCopy').onclick=()=>{ if(!SHARE.url) return; navigator.clipboard.writeText(SHARE.url);\n  const b=$('#shareCopy'); if(b){ b.textContent='copiado ✓'; setTimeout(()=>{ const x=$('#shareCopy'); if(x) x.textContent='Copiar link'; },1500); } };\n$('#shareOpen').onclick=()=>{ if(SHARE.url) window.open(SHARE.url,'_blank'); };\n$('#shareBg').addEventListener('click',e=>{ if(e.target.id==='shareBg') closeShare(); });\n\n// ---------- init ----------\n(async()=>{\n  loader(true,'congelando snapshot da sessão…');\n  try{\n    await Promise.all([ensurePinned(), loadSectors(), refreshSessionPicker()]);\n    SESS.stage='confirm';\n  }catch(e){ setError('erro init: '+e.message); }\n  finally{ loader(false); renderAll(); const rd=$('#ready'); if(rd) rd.setAttribute('data-loaded','1'); }\n})();\n\n  }\n}\n"}},"sessionsDataset":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"sessionsDataset"}}}},"dominantesCsvUrl":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"dominantesCsvUrl"}}}}}}}},"__d2PrevCode":{"code":"const T='product.perfil_cb.crm_perfil_cb_diaria_historico';\nconst ELO='product.elo_modelo_combinado.commercial_consultant_index';\nconst PALETTE=['#5856d6','#ff9500','#34c759','#af52de','#ff2d55','#a2845e'];\nconst CLOSE_COLOR='#8e8e93';\nconst UF_CODE={RO:'11',AC:'12',AM:'13',RR:'14',PA:'15',AP:'16',TO:'17',MA:'21',PI:'22',CE:'23',RN:'24',PB:'25',PE:'26',AL:'27',SE:'28',BA:'29',MG:'31',ES:'32',RJ:'33',SP:'35',PR:'41',SC:'42',RS:'43',MS:'50',MT:'51',GO:'52',DF:'53'};\nconst UF_BORDERS={AC:['AM','RO'],AL:['BA','PE','SE'],AM:['AC','RO','RR','PA','MT'],AP:['PA'],\n BA:['AL','SE','PE','PI','TO','GO','MG','ES'],CE:['PI','PB','PE','RN'],DF:['GO','MG'],\n ES:['BA','MG','RJ'],GO:['DF','MT','MS','MG','BA','TO'],MA:['PA','TO','PI'],\n MG:['BA','GO','DF','MS','SP','RJ','ES'],MS:['MT','GO','MG','SP','PR'],MT:['RO','AM','PA','TO','GO','MS'],\n PA:['AP','AM','MT','TO','MA','RR'],PB:['RN','CE','PE'],PE:['PB','CE','PI','BA','AL'],\n PI:['MA','TO','BA','PE','CE'],PR:['SP','MS','SC'],RJ:['ES','MG','SP'],RN:['CE','PB'],\n RO:['AC','AM','MT'],RR:['AM','PA'],RS:['SC'],SC:['PR','RS'],SE:['BA','AL'],\n SP:['MG','RJ','PR','MS'],TO:['PA','MA','PI','BA','GO','MT']};\nconst NIVEIS=['Bronze','Cristal','Prata','Ouro','Diamante','Diamante+'];\nconst METRICS_DEF=[['cbs','CBs'],['ativas','Ativas'],['pedidos','Pedidos'],['pontos','Pontos'],['receita','Receita','$'],['rec_nat','Rec. Natura','$'],['rec_avon','Rec. Avon','$']];\nconst OPT_K=1.5;\nconst SESSIONS_DS='timeline-shared-sessionsDataSet';   // same table as SHARED_DS — see notes at listSessions()\n// Span defaults are the real operating band for a setor receptor, not placeholders: 2200 ≤ span ≤ 3500\n// with 2700 as the target. null meant \"sem limite\", so every new session started with the optimiser\n// balancing against nothing. Existing sessions are NOT touched — their persisted settings carry explicit\n// values that spread OVER these in openOptions/applyOptions, which is deliberate: their etapas were\n// computed under the old band and changing it silently would leave the stored result and the rule that\n// produced it out of sync.\nconst DEFAULT_SETTINGS={destRule:'any',destMinCbs:9,targetSpan:2700,maxSpan:3500,minSpan:2200};\nconst DOM_MEDIA_BASE='https://natura-geomarketing.data2.media/file/';\nconst DOM_CSV_FALLBACK=DOM_MEDIA_BASE+'yw_TQdp0QXEk6JsrliAqP'; \nconst numOrNull=v=>{const n=Math.round(+v);return (isFinite(n)&&n>0)?n:null;};\nconst spanShort=st=>{const p=[];if(st&&st.targetSpan)p.push('alvo '+st.targetSpan);if(st&&st.maxSpan)p.push('máx '+st.maxSpan);if(st&&st.minSpan)p.push('mín '+st.minSpan);return p.length?p.join(' · '):'livre';};\nconst ruleShort=st=>((st&&st.destRule)==='dominant')?('dominantes ≥'+((st&&st.destMinCbs)||DEFAULT_SETTINGS.destMinCbs)+' CBs'):'qualquer municipio';\n\nexport default {\n  css: `\n  :host{display:block;height:100%;--bg:#f5f5f7;--panel:#ffffff;--panel2:#f2f2f7;--line:#e5e5ea;--ink:#1c1c1e;--mut:#6e6e73;--acc:#007aff;--acc2:#0060df;--closing:#ff3b30;--ok:#34c759}\n  *{box-sizing:border-box}\n  .simroot{position:relative;height:100%;overflow:auto;font:13px/1.45 -apple-system,BlinkMacSystemFont,\"SF Pro Text\",\"Segoe UI\",Roboto,sans-serif;background:var(--bg);color:var(--ink);-webkit-font-smoothing:antialiased}\n  header{padding:10px 16px;background:rgba(246,246,248,.85);backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);border-bottom:1px solid var(--line);display:flex;align-items:center;gap:10px;flex-wrap:wrap}\n  header h1{font-size:14.5px;margin:0;font-weight:600;letter-spacing:-.1px;color:var(--ink)}\n  .mac-spacer{flex:1}\n  .howto{padding:8px 16px;background:var(--panel);border-bottom:1px solid var(--line);display:flex;gap:16px;flex-wrap:wrap;font-size:11.5px;color:var(--mut);align-items:center}\n  .howto b{color:var(--ink)} .howto span{max-width:340px}\n  .pill{font-size:10.5px;padding:2.5px 9px;border-radius:99px;border:1px solid var(--line);color:var(--mut);background:var(--panel2)}\n  .pill.live{color:var(--ink);cursor:pointer;user-select:none;transition:border-color .1s,color .1s,background .1s}\n  .pill.live:hover{border-color:var(--acc);color:var(--acc);background:#eaf3ff}\n  .pill.live:focus-visible{outline:2px solid rgba(0,122,255,.35);outline-offset:1px}\n  .pill.live.busy{border-color:var(--acc);color:var(--acc);cursor:progress}\n  .status{font-size:11px;color:var(--mut)}.status.err{color:var(--closing)}\n  select,input,textarea,button{font:inherit}\n  select,input{background:var(--panel);border:1px solid var(--line);color:var(--ink);border-radius:7px;padding:5.5px 9px}\n  select:focus,input:focus{outline:2px solid rgba(0,122,255,.35);outline-offset:0;border-color:var(--acc)}\n  button.act{background:var(--acc);color:#fff;border:1px solid transparent;border-radius:7px;padding:6px 13px;font-weight:600;cursor:pointer;box-shadow:0 1px 1px rgba(0,0,0,.08)}\n  button.act:hover{background:var(--acc2)}\n  button.ghost{background:var(--panel);color:var(--ink);border:1px solid var(--line);border-radius:7px;padding:5.5px 12px;cursor:pointer}\n  button.ghost:hover{background:var(--panel2)}\n  button.ghost.on{border-color:var(--acc);color:var(--acc);background:#eaf3ff}\n  button.ghost:disabled,button.act:disabled{opacity:.4;cursor:not-allowed}\n  .sessbar{padding:9px 20px;background:var(--panel2);border-bottom:1px solid var(--line);display:flex;gap:8px;flex-wrap:wrap;align-items:center}\n  .rail{padding:9px 16px;background:var(--panel);border-bottom:1px solid var(--line);display:flex;gap:8px;align-items:center;overflow-x:auto}\n  #movementChips{display:flex;gap:8px;flex:0 0 auto}\n  #addMovementGroup{display:flex;gap:8px;align-items:center;flex:0 0 auto;margin-left:auto;padding-left:12px;border-left:1px solid var(--line)}\n  #addMovementGroup input{min-width:150px}\n  .tchip{display:flex;align-items:center;gap:7px;background:var(--panel2);border:1px solid var(--line);border-radius:8px;padding:6px 10px;cursor:pointer;font-size:12px;flex:0 0 auto}\n  .tchip.on{border-color:var(--acc);background:#eaf3ff}\n  .tchip.stale{border-style:dashed;opacity:.85}\n  .tchip .tstale{color:#ff9500;font-weight:700}\n  .tchip .tnum{background:var(--ink);color:#fff;border-radius:99px;width:16px;height:16px;font-size:9.5px;display:flex;align-items:center;justify-content:center;font-weight:700}\n  .tchip .tsec{font-weight:600}\n  .tchip .tstat{color:var(--mut)}\n  .tchip .trm{color:var(--mut);font-weight:700;padding:0 3px}\n  .tchip .trm:hover{color:var(--closing)}\n  .rail .empty{color:var(--mut);font-size:12px}\n  .wrap{display:grid;grid-template-columns:minmax(360px,1fr) 430px;gap:14px;padding:14px 16px;align-items:start}\n  @media(max-width:1150px){.wrap{grid-template-columns:1fr}}\n  .card{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:14px 16px;margin-bottom:14px;box-shadow:0 1px 2px rgba(0,0,0,.04)}\n  .card h2{font-size:11px;text-transform:uppercase;letter-spacing:.4px;color:var(--mut);margin:0 0 9px;font-weight:600}\n  /* user-select, not pointer-events. .lbl already sets pointer-events:none, which stops the text from\n     RECEIVING clicks but does not exclude it from the browser's selection range — so cycling a\n     município's destination with repeated clicks kept dragging a double-click selection across the\n     labels. Nothing drawn in an svg here is text anyone needs to copy. */\n  svg{width:100%;height:auto;display:block;user-select:none;-webkit-user-select:none}\n  .map-wrap{position:relative}\n  #map{cursor:grab;touch-action:none}\n  #map.dragging{cursor:grabbing}\n  .zoom-pill{position:absolute;left:10px;bottom:10px;display:flex;align-items:stretch;background:var(--panel);border:1px solid var(--line);border-radius:99px;box-shadow:0 2px 8px rgba(0,0,0,.14);overflow:hidden;z-index:3}\n  .zoom-pill button{width:30px;height:30px;border:0;background:transparent;color:var(--ink);font:16px/1 -apple-system,BlinkMacSystemFont,sans-serif;font-weight:600;cursor:pointer;display:flex;align-items:center;justify-content:center}\n  .zoom-pill button:hover{background:var(--panel2)}\n  .zoom-pill button:active{background:#e5e5ea}\n  .zoom-pill .zoom-div{width:1px;background:var(--line)}\n  /* White hairlines inside the closing sector: the municipios read as one territory cut into parts\n     rather than as separate outlined units, and the saturated fills carry the grouping instead of the\n     ink. Neighbour sectors keep their own coloured strokes (.sect) — that contrast is what separates\n     what is being reallocated from what is only context. Selection no longer draws an outline; the\n     white border was the click affordance AND the default is now white, so it had nothing left to say. */\n  .muni{stroke:#fff;stroke-width:1.1;cursor:pointer;transition:filter .1s}.muni:hover{filter:brightness(1.15)}.muni.munihl{filter:brightness(1.15)}\n  .sect{stroke-width:1;fill-opacity:.32;stroke-opacity:.6}\n  .sect.plain{fill:#e8e8ec;stroke:#d4d4d9;fill-opacity:1;stroke-opacity:1}\n  .sect.closed-ctx{fill:#e2e2e7;stroke:#aeaeb2;stroke-dasharray:3 2;fill-opacity:1;stroke-opacity:1}\n  .lbl{pointer-events:none}\n  /* No plate behind the text: a halo painted UNDER the glyphs (paint-order) keeps a name legible on any\n     fill without stamping an opaque box over the territory it names. Ink and halo are chosen per label\n     from the luminance of the fill underneath, so they are deliberately NOT declared here — a\n     stylesheet rule outranks a presentation attribute and would silently override that choice. */\n  .lbl text{text-anchor:middle;paint-order:stroke fill;stroke-width:2.2px;stroke-linejoin:round;stroke-linecap:round}\n  .lbl.big text{stroke-width:2.9px}\n  .lbl line.lead{stroke-opacity:.5;stroke-width:.8}\n  .legend{display:flex;gap:12px;flex-wrap:wrap;margin-top:8px;font-size:12px}\n  .legend b{display:inline-block;width:11px;height:11px;border-radius:3px;margin-right:5px;vertical-align:-1px}\n  .kpis{display:grid;grid-template-columns:1fr 1fr;gap:9px;margin-bottom:12px}\n  .kpi{background:var(--panel2);border:1px solid var(--line);border-radius:10px;padding:9px 11px}\n  .kpi .n{font-size:19px;font-weight:700}.kpi .l{font-size:10.5px;color:var(--mut);margin-top:2px}\n  .kpi.warn{border-color:#ffd1cc}.kpi.warn .n{color:var(--closing)}.kpi.ok{border-color:#bdeecb}.kpi.ok .n{color:var(--ok)}\n  .bar-row{display:flex;align-items:center;gap:8px;margin:6px 0}\n  .bar-row .tag{width:42px;font-weight:600;font-size:12px}\n  .bar-track{flex:1;height:18px;background:var(--panel2);border-radius:5px;overflow:hidden;display:flex;position:relative}\n  .bar-mark{position:absolute;top:0;bottom:0;width:2px;opacity:.9;z-index:2}\n  .bar-base{height:100%;opacity:.4}.bar-inc{height:100%}\n  .bar-val{width:132px;text-align:right;font-size:11px;color:var(--mut);font-variant-numeric:tabular-nums}\n  table{border-collapse:collapse;width:100%;font-size:11.5px}\n  th,td{padding:5px 6px;text-align:right;border-bottom:1px solid var(--line);font-variant-numeric:tabular-nums}\n  th:first-child,td:first-child{text-align:left}\n  thead th{color:var(--mut);font-weight:600;font-size:10.5px;position:sticky;top:0;background:var(--panel)}\n  .home{display:inline-block;width:9px;height:9px;border-radius:2px;margin-right:4px}\n  .muni-item{display:flex;align-items:center;gap:8px;background:var(--panel2);border:1px solid var(--line);border-radius:8px;padding:5px 8px;margin-bottom:6px}\n  .muni-item .nm{flex:1;font-weight:600;font-size:12px}.muni-item .ct{color:var(--mut);font-size:11px}\n  .seg{display:flex;border:1px solid var(--line);border-radius:7px;overflow:hidden}\n  .seg button{border:0;background:transparent;color:var(--mut);padding:4px 8px;font-size:11px;font-weight:600;cursor:pointer}\n  .seg button.on{color:#fff}\n  .toolbar{display:flex;gap:8px;align-items:center;flex-wrap:wrap}\n  .toggle{display:flex;border:1px solid var(--line);border-radius:8px;overflow:hidden;font-size:12px}\n  .toggle button{background:transparent;border:0;color:var(--mut);padding:6px 10px;cursor:pointer;font-weight:600}\n  .toggle button.on{background:var(--panel2);color:var(--ink)}\n  .note{color:var(--mut);font-size:10.5px;margin-top:7px;line-height:1.5}\n  .cell{font-variant-numeric:tabular-nums}\n  .lider-foot td{background:var(--panel2);font-weight:600;font-size:11px;color:var(--ink);border-bottom:2px solid var(--line);padding:5px 6px;text-align:left}\n  .scroll{max-height:240px;overflow:auto}\n  /* Tables meant to be READ in full rather than sampled. Only the vertical cap is dropped — overflow\n     stays auto so the wide grupo grid can still scroll sideways inside its card, which is the one axis\n     that genuinely cannot fit. */\n  .scroll.grow{max-height:none}\n  .tip{position:fixed;pointer-events:none;background:#1c1c1e;color:#fff;border-radius:8px;padding:7px 9px;font-size:11px;opacity:0;transition:opacity .1s;z-index:9;max-width:230px}\n  .spark{display:flex;align-items:flex-end;gap:3px;height:44px}\n  .spark .b{flex:1;background:var(--acc);border-radius:2px 2px 0 0;min-height:2px;opacity:.85}\n  .delta{font-size:10px}.delta.up{color:var(--ok)}.delta.dn{color:var(--closing)}\n  .tabs{display:flex;gap:6px;margin-bottom:10px;flex-wrap:wrap}\n  .tabs button{background:transparent;border:1px solid var(--line);border-radius:8px;color:var(--mut);padding:6px 12px;cursor:pointer;font-weight:600}\n  .tabs button.on{background:var(--panel2);color:var(--ink);border-color:var(--acc)}\n  .hidden{display:none}\n  .sqlbox{width:100%;height:60px;font-family:ui-monospace,Menlo,monospace;font-size:11px;resize:vertical}\n  .load{position:absolute;inset:0;background:rgba(245,245,247,.85);backdrop-filter:blur(4px);display:flex;align-items:center;justify-content:center;z-index:20;font-size:13px;color:var(--acc);font-weight:600;text-align:center;padding:20px}\n  .load.hidden{display:none}\n  .badge{font-size:10px;padding:1px 6px;border-radius:5px;background:var(--panel2);border:1px solid var(--line);color:var(--mut)}\n  .sheet-bg{position:fixed;inset:0;background:rgba(28,28,30,.34);backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);display:flex;align-items:center;justify-content:center;z-index:40;padding:24px}\n  .sheet-bg.hidden{display:none}\n  .sheet{background:var(--panel);border:1px solid var(--line);border-radius:14px;box-shadow:0 24px 60px rgba(0,0,0,.22);width:min(580px,100%);max-height:100%;display:flex;flex-direction:column;overflow:hidden}\n  .sheet-hd{display:flex;align-items:center;gap:9px;padding:12px 16px;border-bottom:1px solid var(--line)}\n  .sheet-hd h3{margin:0;font-size:14px;font-weight:600;letter-spacing:-.1px}\n  .sheet-x{background:transparent;border:0;color:var(--mut);font-size:13px;cursor:pointer;padding:3px 7px;border-radius:6px}\n  .sheet-x:hover{background:var(--panel2);color:var(--ink)}\n  .sheet-bd{padding:14px 16px;overflow:auto}\n  .sheet-ft{display:flex;align-items:center;gap:8px;padding:11px 16px;border-top:1px solid var(--line);background:var(--panel2)}\n  .opt-lbl{font-size:11px;text-transform:uppercase;letter-spacing:.4px;color:var(--mut);font-weight:600}\n  .opt-sub{font-size:11.5px;color:var(--mut);margin:4px 0 10px;line-height:1.5}\n  .opt-row{display:flex;gap:10px;align-items:flex-start;border:1px solid var(--line);border-radius:10px;padding:10px 12px;margin-bottom:8px;cursor:pointer;background:var(--panel)}\n  .opt-row:hover{background:var(--panel2)}\n  .opt-row.on{border-color:var(--acc);background:#eaf3ff}\n  .opt-row:has(input:disabled){opacity:.5;cursor:not-allowed}\n  .opt-row input[type=radio]{margin:2px 0 0;accent-color:var(--acc);flex:0 0 auto}\n  .opt-t{font-size:12.5px;font-weight:600;display:flex;align-items:center;gap:6px;flex-wrap:wrap}\n  .opt-d{font-size:11.5px;color:var(--mut);margin-top:3px;line-height:1.55}\n  .opt-inline{font-size:11.5px;color:var(--mut);margin-top:9px;display:flex;align-items:center;gap:7px;flex-wrap:wrap}\n  .opt-inline.off{opacity:.4;pointer-events:none}\n  .opt-note{border:1px solid var(--line);background:var(--panel2);border-radius:10px;padding:9px 11px;font-size:11.5px;color:var(--mut);line-height:1.6;margin-top:12px}\n  .opt-grid{display:grid;grid-template-columns:1fr 1fr 1fr;gap:8px;margin-top:2px}\n  .opt-fld{display:flex;flex-direction:column;gap:5px;border:1px solid var(--line);border-radius:9px;padding:8px 10px;background:var(--panel2)}\n  .opt-fld span{font-size:11px;color:var(--mut);font-weight:600;line-height:1.35}\n  .opt-fld i{font-style:normal;font-weight:400;opacity:.72}\n  .opt-fld input{width:100%;background:var(--panel)}\n  .opt-err{margin-top:9px;font-size:11.5px;color:var(--closing);font-weight:600}\n  .opt-hr{height:1px;background:var(--line);margin:17px 0 0}\n  .shareurl{margin-top:9px;padding:9px 10px;border-radius:8px;background:var(--panel);border:1px solid var(--acc);\n    font-family:ui-monospace,Menlo,monospace;font-size:11px;color:var(--ink);word-break:break-all;user-select:all}\n`,\n  render(d2){\n    return `<div class=\"simroot\"><header id=\"topHeader\" class=\"hidden\">\n  <h1>Simulador de Timeline de Fechamentos</h1>\n  <span class=\"pill live\" id=\"liveState\" role=\"button\" tabindex=\"0\" title=\"Clique pra buscar o snapshot mais recente e recalcular a timeline inteira\">● iniciando</span>\n  <span class=\"pill ro\">read-only · nunca escreve</span>\n  <span class=\"pill\" id=\"basePill\"></span>\n  <span class=\"pill\" id=\"rulePill\"></span>\n  <span class=\"pill\" id=\"spanPill\"></span>\n  <span class=\"status\" id=\"ds\"></span>\n  <div class=\"mac-spacer\"></div>\n  <select id=\"sessionPick\" style=\"min-width:200px\"></select>\n  <button class=\"ghost\" id=\"openOptions\" title=\"Configurações desta sessão\">⚙ Opções</button>\n  <button class=\"act\" id=\"saveSession\">Salvar sessão</button>\n  <button class=\"ghost\" id=\"dupSession\" title=\"Cria uma cópia independente desta sessão — a original fica intacta e a cópia passa a ser a sessão ativa\">⧉ Duplicar</button>\n  <button class=\"ghost\" id=\"openShare\" title=\"Publicar uma cópia congelada desta sessão em modo leitura\">⇪ Compartilhar</button>\n  <span class=\"status\" id=\"sessStatus\"></span>\n</header>\n\n<div class=\"rail hidden\" id=\"timelineRail\">\n  <div id=\"movementChips\"></div>\n  <div id=\"addMovementGroup\">\n    <button class=\"act\" id=\"openMove\">Adicionar movimentação</button>\n  </div>\n</div>\n\n<div class=\"card\" id=\"confirmCard\" style=\"margin:14px 20px\">\n  <h2 style=\"margin:0 0 9px\">Confirmar snapshot antes de simular</h2>\n  <div class=\"note\" id=\"confirmBody\">congelando snapshot…</div>\n  <button class=\"act\" id=\"confirmSnap\" style=\"margin-top:12px\">Confirmar snapshot ▶ ir pra simulação</button>\n  <div class=\"note\" style=\"margin-top:16px\">ou continue uma sessão salva:</div>\n  <select id=\"confirmSessionPick\" style=\"min-width:260px;margin-top:4px\"></select>\n  <div class=\"status\" id=\"confirmStatus\" style=\"margin-top:8px\"></div>\n</div>\n\n<div class=\"wrap hidden\" id=\"mainWrap\">\n  <div>\n    <div class=\"card\">\n      <div style=\"display:flex;justify-content:space-between;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:9px\">\n        <h2 id=\"mapTitle\" style=\"margin:0\">Mapa — clique num município p/ trocar o setor destino</h2>\n        <div class=\"toggle\" id=\"viewToggle\" title=\"ASIS = estrutura do setor antes desta etapa (já considerando etapas anteriores) · TOBE = após a redistribuição desta etapa\">\n          <button data-v=\"asis\">◧ ASIS (antes desta etapa)</button>\n          <button data-v=\"tobe\" class=\"on\">◨ TOBE (simulação)</button>\n        </div>\n      </div>\n      <div class=\"map-wrap\">\n        <svg id=\"map\" viewBox=\"0 0 700 500\" preserveAspectRatio=\"xMidYMid meet\"></svg>\n        <div class=\"zoom-pill\" id=\"mapZoom\">\n          <button type=\"button\" id=\"mapZoomOut\" title=\"Diminuir zoom\">−</button>\n          <span class=\"zoom-div\"></span>\n          <button type=\"button\" id=\"mapZoomIn\" title=\"Aumentar zoom\">+</button>\n        </div>\n      </div>\n      <div class=\"legend\" id=\"legend\"></div>\n      <div class=\"note\">Coloridos = municípios do setor fechado nesta etapa (cor = destino). Ao redor, cada área é um <b>setor vizinho inteiro</b> com o código no meio — não municípios soltos: cor = setor destino, cinza = contexto, cinza tracejado = setor já fechado numa etapa anterior. Shapes reais IBGE/tbrugz.</div>\n      <div class=\"note\" id=\"mapIgnoredNote\"></div>\n    </div>\n\n    <div class=\"card\">\n      <h2>Líderes — destino e CBs deslocadas (nesta etapa)</h2>\n      <div class=\"note\" style=\"margin:-4px 0 9px\"><b>Home</b> = setor que ficou com a maioria das CBs da líder. <b style=\"color:var(--closing)\">Deslocadas</b> = CBs dela que caíram noutro setor.</div>\n      <div class=\"scroll grow\"><table id=\"leaders\"></table></div>\n    </div>\n\n    <div class=\"card\">\n      <div class=\"tabs\">\n        <button data-tab=\"matrix\" class=\"on\">Matriz ASIS</button>\n        <button data-tab=\"tobe\">Matriz TOBE</button>\n        <button data-tab=\"report\">Relatório de impacto (etapa)</button>\n        <button data-tab=\"cumulative\">Impacto acumulado (timeline)</button>\n        <button data-tab=\"sql\">Console SQL</button>\n      </div>\n      <div id=\"tab-matrix\"><div class=\"scroll grow\"><table id=\"matrix\"></table></div></div>\n      <div id=\"tab-tobe\" class=\"hidden\"><div class=\"scroll grow\"><table id=\"matrixTobe\"></table></div>\n        <div class=\"note\" id=\"tobeNote\"></div></div>\n      <div id=\"tab-report\" class=\"hidden\"></div>\n      <div id=\"tab-cumulative\" class=\"hidden\"></div>\n      <div id=\"tab-sql\" class=\"hidden\">\n        <textarea class=\"sqlbox\" id=\"sqlIn\">SELECT DS_MUNICIPIO, COUNT(DISTINCT CD_CONSULTORA) qtd FROM product.perfil_cb.crm_perfil_cb_diaria_historico WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR=3504 GROUP BY DS_MUNICIPIO ORDER BY qtd DESC</textarea>\n        <div class=\"toolbar\" style=\"margin:8px 0\"><button class=\"act\" id=\"runSql\">▶ Rodar</button><span class=\"status\" id=\"sqlStatus\"></span></div>\n        <div class=\"note\" style=\"margin:-4px 0 8px\">Roda contra o snapshot congelado desta sessão (não \"ao vivo\") — mesma coerência da timeline.</div>\n        <div class=\"scroll\"><table id=\"sqlOut\"></table></div>\n      </div>\n    </div>\n  </div>\n\n  <div>\n    <div class=\"card\">\n      <div class=\"toolbar\" style=\"margin-bottom:11px\">\n        <button class=\"ghost\" id=\"optim\" title=\"testa alocações que mantêm cada setor conectado e escolhe a que equilibra a carga entre setores + minimiza a quebra (evita empilhar tudo num setor)\">★ Modelo ÓTIMO (equilíbrio + quebra)</button>\n        <button class=\"ghost\" id=\"autoTobe\" title=\"preenche cada município pelo setor vizinho mais próximo (geografia)\">TOBE por adjacência</button>\n        <span class=\"badge\" id=\"optBadge\"></span>\n      </div>\n      <div class=\"note\" style=\"margin:-4px 0 10px\"><b style=\"color:var(--ink)\">★ ÓTIMO</b> = equilibra a carga entre os setores <b>e</b> minimiza a quebra (mantém o território conectado; não empilha tudo num setor). <b style=\"color:var(--ink)\">TOBE</b> = sugestão por vizinhança. Editar esta etapa recalcula automaticamente as etapas seguintes da timeline.</div>\n      <div class=\"note\" id=\"ruleNote\" style=\"margin:-6px 0 11px;padding:7px 9px;background:var(--panel2);border:1px solid var(--line);border-radius:8px\"></div>\n      <div class=\"kpis\" id=\"kpis\"></div>\n      <div id=\"contig\"></div>\n      <div id=\"spanRule\"></div>\n      <h2>Span por setor (CBs) — base + entrantes</h2>\n      <div id=\"spans\"></div>\n      <div id=\"policySection\">\n      <div style=\"display:flex;justify-content:space-between;align-items:center;margin:14px 0 7px\">\n        <h2 style=\"margin:0\">CBs deslocadas</h2>\n        <div class=\"toggle\" id=\"policy\">\n          <button data-p=\"fora\" class=\"on\">= fora do setor</button>\n          <button data-p=\"quebra\">= quebra de relação</button>\n        </div>\n      </div>\n      <div class=\"note\" id=\"policyNote\"></div>\n      </div>\n    </div>\n\n    <div class=\"card\">\n      <h2 id=\"muniListTitle\">Municípios → setor destino</h2>\n      <div class=\"note\" id=\"muniListNote\" style=\"margin:-4px 0 9px\">Clique no <b>código do setor</b> pra mandar o município <b>inteiro</b> pra lá (regra de negócio). A cor acompanha o mapa.</div>\n      <div id=\"muniList\"></div>\n    </div>\n\n    <div class=\"card\">\n      <div class=\"toolbar\" style=\"justify-content:space-between\">\n        <h2 style=\"margin:0\">Plano de migração (etapa selecionada)</h2>\n        <div><button class=\"ghost\" id=\"copyPlan\">Copiar</button> <button class=\"ghost\" id=\"csvPlan\">CSV</button></div>\n      </div>\n      <div id=\"plan\" class=\"note\"></div>\n    </div>\n  </div>\n</div>\n\n<div class=\"sheet-bg hidden\" id=\"shareBg\">\n  <div class=\"sheet\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"shareTitle\">\n    <div class=\"sheet-hd\"><h3 id=\"shareTitle\">Compartilhar sessão</h3><div class=\"mac-spacer\"></div><button class=\"sheet-x\" id=\"shareX\" title=\"Fechar\">✕</button></div>\n    <div class=\"sheet-bd\" id=\"shareBody\"></div>\n    <div class=\"sheet-ft\">\n      <span class=\"status\" id=\"shareStatus\"></span>\n      <div class=\"mac-spacer\"></div>\n      <button class=\"ghost hidden\" id=\"shareCopy\">Copiar link</button>\n      <button class=\"ghost hidden\" id=\"shareOpen\">Abrir</button>\n      <button class=\"ghost\" id=\"shareCancel\">Cancelar</button>\n      <button class=\"act\" id=\"shareGo\">Compartilhar</button>\n    </div>\n  </div>\n</div>\n\n<div class=\"sheet-bg hidden\" id=\"optionsBg\">\n  <div class=\"sheet\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"optTitle\">\n    <div class=\"sheet-hd\"><h3 id=\"optTitle\">Opções da sessão</h3><span class=\"badge\" id=\"optSessName\"></span><div class=\"mac-spacer\"></div><button class=\"sheet-x\" id=\"optClose\" title=\"Fechar\">✕</button></div>\n    <div class=\"sheet-bd\">\n      <div class=\"opt-lbl\">Regra rígida — seleção dos setores destino</div>\n      <div class=\"opt-sub\">Define quais setores vizinhos podem entrar na lista de destinos de cada etapa. Vale pra toda a timeline desta sessão.</div>\n      <label class=\"opt-row\" data-r=\"any\">\n        <input type=\"radio\" name=\"destRule\" value=\"any\">\n        <div>\n          <div class=\"opt-t\">Adjacente a qualquer município <span class=\"badge\">padrão</span></div>\n          <div class=\"opt-d\">Um setor entra na lista de destinos se tiver município vizinho a <b>qualquer</b> município do setor fechado — inclusive os menores. É o comportamento de hoje.</div>\n        </div>\n      </label>\n      <label class=\"opt-row\" data-r=\"dominant\">\n        <input type=\"radio\" name=\"destRule\" value=\"dominant\">\n        <div>\n          <div class=\"opt-t\">Adjacente a municípios dominantes</div>\n          <div class=\"opt-d\">Só os municípios do setor fechado com <b>CBs suficientes</b> valem como ponte. Os pequenos continuam sendo redistribuídos normalmente — só não trazem setor novo pra lista de destinos.</div>\n          <div class=\"opt-inline\" id=\"optMinCbsWrap\">Ignorar municípios com menos de <input type=\"number\" id=\"optMinCbs\" min=\"1\" max=\"9999\" step=\"1\" style=\"width:74px\"> CBs</div>\n        </div>\n      </label>\n      <div class=\"opt-hr\"></div>\n      <div class=\"opt-lbl\" style=\"margin-top:15px\">Pré-requisitos do setor destino — tamanho em CBs</div>\n      <div class=\"opt-sub\">Vale pro tamanho de cada setor receptor <b>depois</b> da redistribuição (base + entrantes). Em branco = desligado.</div>\n      <div class=\"opt-grid\">\n        <label class=\"opt-fld\"><span>Span alvo <i>(tamanho ideal)</i></span><input type=\"number\" id=\"optTargetSpan\" min=\"1\" max=\"99999\" step=\"1\" placeholder=\"livre\"></label>\n        <label class=\"opt-fld\"><span>Span máximo <i>(nenhum setor acima)</i></span><input type=\"number\" id=\"optMaxSpan\" min=\"1\" max=\"99999\" step=\"1\" placeholder=\"sem limite\"></label>\n        <label class=\"opt-fld\"><span>Span mínimo <i>(nenhum setor abaixo)</i></span><input type=\"number\" id=\"optMinSpan\" min=\"1\" max=\"99999\" step=\"1\" placeholder=\"sem limite\"></label>\n      </div>\n      <div class=\"opt-err hidden\" id=\"optSpanErr\"></div>\n      <div class=\"opt-note\" id=\"optPreview\"></div>\n    </div>\n    <div class=\"sheet-ft\"><span class=\"status\" id=\"optStatus\"></span><div class=\"mac-spacer\"></div><button class=\"ghost\" id=\"optCancel\">Cancelar</button><button class=\"act\" id=\"optApply\">Aplicar</button></div>\n  </div>\n</div>\n\n<div class=\"sheet-bg hidden\" id=\"moveBg\">\n  <div class=\"sheet\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"moveTitle\">\n    <div class=\"sheet-hd\"><h3 id=\"moveTitle\">Adicionar movimentação</h3><div class=\"mac-spacer\"></div><button class=\"sheet-x\" id=\"moveClose\" title=\"Fechar\">✕</button></div>\n    <div class=\"sheet-bd\">\n      <div class=\"opt-lbl\">Tipo de movimentação</div>\n      <div class=\"opt-sub\" id=\"moveLockNote\">Escolha o nível a fechar. Você pode fechar setores à vontade até fechar uma GV; aí só GV (ou mercado) daqui pra frente. Fechar um mercado trava a sessão em mercado.</div>\n      <label class=\"opt-row\" data-lvl=\"setor\"><input type=\"radio\" name=\"moveLevel\" value=\"setor\"><div><div class=\"opt-t\">Fechar Setor</div><div class=\"opt-d\">Redistribui os municípios do setor entre setores vizinhos da mesma GV.</div></div></label>\n      <label class=\"opt-row\" data-lvl=\"gv\"><input type=\"radio\" name=\"moveLevel\" value=\"gv\"><div><div class=\"opt-t\">Fechar GV</div><div class=\"opt-d\">Redistribui os setores (com municípios e CBs) da GV entre GVs vizinhas do mesmo mercado.</div></div></label>\n      <label class=\"opt-row\" data-lvl=\"mercado\"><input type=\"radio\" name=\"moveLevel\" value=\"mercado\"><div><div class=\"opt-t\">Fechar Mercado</div><div class=\"opt-d\">Redistribui as GVs (com setores, municípios e CBs) do mercado entre mercados vizinhos.</div></div></label>\n      <div class=\"opt-hr\"></div>\n      <div class=\"opt-lbl\" style=\"margin-top:15px\" id=\"moveCodeLbl\">Setor a fechar</div>\n      <div class=\"opt-inline\" id=\"moveCodeRow\">\n        <input id=\"moveCode\" list=\"moveCodeList\" placeholder=\"código\" style=\"min-width:150px\">\n        <datalist id=\"moveCodeList\"></datalist>\n        <button class=\"ghost\" id=\"moveRand\" title=\"Aleatório\">🎲</button>\n      </div>\n      <div class=\"opt-err hidden\" id=\"moveErr\"></div>\n    </div>\n    <div class=\"sheet-ft\"><span class=\"status\" id=\"moveStatus\"></span><div class=\"mac-spacer\"></div><button class=\"ghost\" id=\"moveCancel\">Cancelar</button><button class=\"act\" id=\"moveGo\">Fechar ▶ (nova etapa)</button></div>\n  </div>\n</div>\n\n<div class=\"tip\" id=\"tip\"></div>\n<div class=\"load hidden\" id=\"loader\">carregando…</div>\n<span id=\"ready\" style=\"display:none\"></span></div>`;\n  },\n  mounted(d2, root){\n\nconst $=s=>root.querySelector(s);\nconst fmt=n=>n==null?'–':Math.round(+n).toLocaleString('pt-BR');\nconst money=n=>{n=+n||0;return n>=1e6?'R$'+(n/1e6).toFixed(1)+'M':n>=1e3?'R$'+(n/1e3).toFixed(0)+'k':'R$'+Math.round(n)};\nconst norm=s=>(s||'').normalize('NFKD').replace(/[̀-ͯ]/g,'').toUpperCase().replace(/[^A-Z0-9]+/g,' ').trim();\nconst esc=s=>(s==null?'':String(s)).replace(/[&<>]/g,c=>({'&':'&amp;','<':'&lt;','>':'&gt;'}[c]));\nconst blankM=()=>({cbs:0,receita:0,rec_nat:0,rec_avon:0,pontos:0,pedidos:0,ativas:0});\n// ---------- município identity ----------\n// Brazil has many municipalities sharing a name (Bom Jesus alone exists in PI, RN, RS, SC, PB, GO).\n// A stage loads the dominant UF PLUS every bordering UF, so those collisions land in the SAME\n// feature set routinely: keyed by name alone the last shape loaded won, the map could draw a\n// município from the wrong state, buildAdj merged two unrelated municipalities into one node, and\n// GROUP BY DS_MUNICIPIO summed two real municipalities into one row. The key is NAME/UF everywhere\n// — SQL rows, GeoJSON features, the dominantes base, assignments, persisted sessions. norm() maps\n// every non-alphanumeric to a space, so '/' can never occur inside a name and the split is exact.\n// A missing UF degrades to a bare NAME key rather than inventing one.\nconst mkey=(name,uf)=>{const n=norm(name),u=String(uf==null?'':uf).trim().toUpperCase();return u?n+'/'+u:n;};\nconst mName=k=>{const s=String(k==null?'':k),i=s.lastIndexOf('/');return i<0?s:s.slice(0,i);};\nconst mUf=k=>{const s=String(k==null?'':k),i=s.lastIndexOf('/');return i<0?'':s.slice(i+1);};\nconst mDisp=k=>{const u=mUf(k);return u?mName(k)+' ('+u+')':mName(k);};\n// The base CSV is the ONLY source of a município's UF now, so its column is accepted in whatever\n// shape the base is maintained in: sigla, IBGE numeric code, or full state name. Anything that does\n// not resolve to a real sigla is treated as UNKNOWN rather than passed through — a bogus UF would key\n// a município to a shape that does not exist and drop it off the map without a word.\nconst UF_OF_CODE={}; Object.keys(UF_CODE).forEach(k=>{ UF_OF_CODE[UF_CODE[k]]=k; });\nconst UF_OF_NAME={ACRE:'AC',ALAGOAS:'AL',AMAPA:'AP',AMAZONAS:'AM',BAHIA:'BA',CEARA:'CE','DISTRITO FEDERAL':'DF','ESPIRITO SANTO':'ES',GOIAS:'GO',MARANHAO:'MA','MATO GROSSO':'MT','MATO GROSSO DO SUL':'MS','MINAS GERAIS':'MG',PARA:'PA',PARAIBA:'PB',PARANA:'PR',PERNAMBUCO:'PE',PIAUI:'PI','RIO DE JANEIRO':'RJ','RIO GRANDE DO NORTE':'RN','RIO GRANDE DO SUL':'RS',RONDONIA:'RO',RORAIMA:'RR','SANTA CATARINA':'SC','SAO PAULO':'SP',SERGIPE:'SE',TOCANTINS:'TO'};\nconst ufNorm=v=>{const s=norm(v); if(!s) return '';\n  if(UF_CODE[s]) return s;\n  if(UF_OF_CODE[s]) return UF_OF_CODE[s];\n  return UF_OF_NAME[s]||'';};\nconst loader=(on,t)=>{const l=$('#loader');l.classList.toggle('hidden',!on);if(t)l.textContent=t;};\nconst setError=(msg)=>{ const t=$('#ds'); if(t){t.textContent=msg;t.classList.add('err');} const c=$('#confirmStatus'); if(c){c.textContent=msg;c.classList.add('err');} };\n\n// ---------- base de municípios dominantes (CSV) ----------\n// WHICH municipalities belong to a sector is a business fact, not something to infer from CB volume:\n// it comes from a maintained CSV (one row per setor x município) linked through the `dominantesCsvUrl`\n// param. Anything the closing sector has CBs in but that the base does NOT assign to it is spillover:\n// not realocated, not drawn on the map, and its CBs follow their leader. Loaded once per URL and\n// cached for the whole session; a failure is thrown, never swallowed — a silent fallback here would\n// quietly change every number on the screen.\nconst DOM={url:null,promise:null,bySetor:null,ufBySetorMuni:null,rows:0,setores:0,hasUf:false,ufCol:null,badUf:0,clashes:0,headers:null,error:null};\nfunction parseCsv(text){\n  const out=[]; let row=[],cur='',q=false;\n  const push=()=>{ row.push(cur); cur=''; };\n  const endRow=()=>{ push(); if(row.length>1||row[0]!=='') out.push(row); row=[]; };\n  for(let i=0;i<text.length;i++){ const ch=text[i];\n    if(q){ if(ch==='\"'){ if(text[i+1]==='\"'){ cur+='\"'; i++; } else q=false; } else cur+=ch; }\n    else if(ch==='\"') q=true;\n    else if(ch===',') push();\n    else if(ch==='\\n') endRow();\n    else if(ch!=='\\r') cur+=ch;\n  }\n  if(cur!==''||row.length) endRow();\n  return out;\n}\n// `dominantesCsvUrl` is declared as a FileComponentUrlReference, so the instance points at the Drive\n// FILE, not at a URL literal — the Drive is policy-gated behind the app's auth strategy and a baked\n// string would be both stale and unauthorised. What the resolver hands back varies by where it is\n// resolved (URL string / file record / bare reference), so accept every shape instead of silently\n// reading undefined and falling through to the fallback.\n// The Drive is gated by the app's AuthenticationStrategy, so this read has to travel as the LOGGED-IN\n// USER — an anonymous CDN GET is exactly what the policy is there to refuse. `<system>.data2.media` is\n// only a cache in front of the SSP: on a cache miss it 302s to `<system>.data2apis.com`, which is where\n// the policy is actually evaluated.\n// COOKIES CANNOT CARRY THAT SESSION, which is why the previous `credentials:'include'` attempt could\n// never have worked: the app runs on <app>.<system>.data2.app and the SSP on <system>.data2apis.com —\n// cross-site — and the SSP answers `Access-Control-Allow-Origin: *` with no `Allow-Credentials`, so the\n// browser rejects a credentialed CORS read before it ever leaves the page. What the SSP actually reads\n// is `Authorization: Bearer <token>`: the runtime keeps that token in localStorage under\n// `__data2-session-<systemDomain>` (`__data2-session-data2` inside the builder preview) and replays it\n// on every dataset and rush call — same token, same header, same session, so the Drive policy sees the\n// logged-in user. Preflight passes because the SSP echoes whatever header the request asks for.\nfunction d2SessionToken(sysDomain){\n  const read=k=>{ try{ return (k&&window.localStorage.getItem(k))||''; }catch(e){ return ''; } };\n  return read(sysDomain?('__data2-session-'+sysDomain):'')||read('__data2-session-data2')||'';\n}\nfunction domCsvSystemDomain(url){\n  const m=/^https?:\\/\\/([^.\\/]+)\\.data2\\.(?:media|app)\\//i.exec(url)||/^https?:\\/\\/([^.\\/]+)\\.data2apis\\.com\\//i.exec(url);\n  return m?m[1]:'';\n}\nfunction domCsvCandidates(url){\n  const out=[];\n  const isMedia=/^https?:\\/\\/[^.\\/]+\\.data2\\.media\\//i.test(url);\n  const api=isMedia?url.replace(/^(https?:\\/\\/[^.\\/]+)\\.data2\\.media\\//i,'$1.data2apis.com/'):null;\n  const tok=d2SessionToken(domCsvSystemDomain(url));\n  const auth=tok?{authorization:'Bearer '+tok}:null;\n  // Authenticated origin read first — the only candidate a GATED Drive can actually answer.\n  if(api&&auth) out.push({url:api,headers:auth,label:'api+sessão'});\n  if(!api&&auth) out.push({url:url,headers:auth,label:'origem+sessão'});\n  // Anonymous last: only ever succeeds on an UNGATED Drive — or on a stale CDN cache hit, which is NOT\n  // proof the file is public (the origin keeps answering 401 once the edge entry expires).\n  if(api) out.push({url:api,headers:null,label:'api anônimo'});\n  out.push({url:url,headers:null,label:'origem anônima'});\n  return out;\n}\nfunction domCsvUrl(){\n  const pick=v=>{\n    if(!v) return '';\n    if(typeof v==='string') return v;\n    const q=v.params||{};\n    const ref=q.reference||v.reference;\n    return q.fileUrl||q.url||v.fileUrl||v.url||(ref?DOM_MEDIA_BASE+ref:'');\n  };\n  return String(pick(d2.param('dominantesCsvUrl'))||DOM_CSV_FALLBACK||'').trim();\n}\nasync function ensureDominantes(){\n  const url=domCsvUrl();\n  if(!url) throw new Error('base de municípios dominantes não configurada — ligue o arquivo CSV no parâmetro dominantesCsvUrl da instância do componente');\n  if(DOM.url===url && DOM.bySetor) return DOM.bySetor;\n  if(DOM.url===url && DOM.promise) return DOM.promise;\n  DOM.url=url; DOM.error=null;\n  DOM.promise=(async()=>{\n    // Self-diagnosing on purpose: every candidate reports its own outcome and the message names the\n    // session it was carrying. \"Unauthorized\" alone cannot distinguish \"not logged into THIS strategy\"\n    // from \"cookie not sent cross-site\" from \"param never bound, so it tried the fallback URL\" — and\n    // guessing between those from the outside costs a round trip each time.\n    let r=null; const tried=[];\n    for(const c of domCsvCandidates(url)){\n      let res=null;\n      try{ res=await fetch(c.url,{cache:'no-store',credentials:'omit',headers:c.headers||undefined}); }\n      catch(e){ tried.push(c.label+' → rede/CORS'); continue; }\n      if(res.ok){ r=res; break; }\n      tried.push(c.label+' → '+res.status);\n    }\n    if(!r){\n      let sess='sessão desconhecida';\n      try{\n        const a=d2.auth(AUTH_REF);\n        sess=(a&&a.isAuthed)?('logado como '+((a.user&&(a.user.email||a.user.nome))||'?')):('NÃO logado na estratégia '+AUTH_REF);\n      }catch(e){ sess='estratégia '+AUTH_REF+' não resolvida'; }\n      const tk=d2SessionToken(domCsvSystemDomain(url));\n      throw new Error('base de municípios dominantes: não foi possível ler o arquivo — '+sess+' · token de sessão '+(tk?'presente':'AUSENTE no localStorage')+'. Tentativas: '+tried.join(' · '));\n    }\n    const table=parseCsv(await r.text());\n    if(table.length<2) throw new Error('base de municípios dominantes vazia');\n    const head=table[0].map(h=>norm(h));\n    const iS=head.indexOf('CD SETOR'), iM=head.indexOf('MUNICIPIO');\n    if(iS<0||iM<0) throw new Error('base de municípios dominantes sem as colunas CD_SETOR / MUNICIPIO');\n    // CD_GV is the gerência de vendas the setor answers to, and it is the authority for the hard rule\n    // that a closing sector only ever hands territory to sectors of its OWN gerência. Its absence is\n    // fatal rather than a warning: with no GV there is no way to PROVE two sectors share one, and\n    // falling through unchecked is exactly the leak this column exists to close.\n    const iG=['CD GV','CDGV','GV','CD GERENCIA','CD GERENCIA VENDAS','CD GERENCIA DE VENDAS','GERENCIA DE VENDAS','GERENCIA'].map(h=>head.indexOf(h)).find(i=>i>=0);\n    if(iG==null) throw new Error('base de municípios dominantes sem a coluna CD_GV — a regra de gerência de vendas não pode ser aplicada. Colunas lidas: '+head.slice(0,40).join(', '));\n    // MERCADO fica ACIMA de GV na hierarquia (mercado > GV > setor) — fechamento de Mercado e a regra\n    // \"GV só fecha pra GV do mesmo mercado\" dependem dela do mesmo jeito que a regra de GV depende\n    // de CD_GV, então a ausência é fatal pelo mesmo motivo.\n    const iK=['MERCADO','MERCADO REGIONAL','MKT','MARKET'].map(h=>head.indexOf(h)).find(i=>i>=0);\n    if(iK==null) throw new Error('base de municípios dominantes sem a coluna MERCADO — fechamento de GV/Mercado precisa dela. Colunas lidas: '+head.slice(0,40).join(', '));\n    // Nomes de exibição — opcionais: a hierarquia funciona só com os códigos, mas o código sozinho\n    // não diz nada pro operador escolhendo o que fechar.\n    const iDS=['DC SETOR','NOME SETOR','DESCRICAO SETOR','NM SETOR'].map(h=>head.indexOf(h)).find(i=>i>=0);\n    const iDG=['DC GV','NOME GV','DESCRICAO GV','NM GV','GV NOME'].map(h=>head.indexOf(h)).find(i=>i>=0);\n    // The UF column is what the whole keying now rests on — SQL no longer carries DS_ESTADO — so its\n    // absence is a first-class finding, not a footnote. The header actually matched is reported on the\n    // base pill, and when nothing matches the pill lists every column read, because guessing a header\n    // name from the outside costs a round trip each time.\n    const iU=['UF','SIGLA UF','SG UF','CD UF','ESTADO','DS ESTADO','SIGLA','ESTADO SIGLA','UF MUNICIPIO'].map(h=>head.indexOf(h)).find(i=>i>=0);\n    const by={},ufBy={},gvBy={},mkBySetor={},setorLabel={},gvLabel={}; let n=0,bad=0; const clash={},gvClash={},mkClash={};\n    for(let i=1;i<table.length;i++){\n      const line=table[i]; if(!line) continue;\n      const s=String(line[iS]==null?'':line[iS]).trim(), m=norm(line[iM]);\n      if(!s||!m) continue;\n      // One setor spans many rows (one per município) and every one of them repeats its CD_GV. Two\n      // DIFFERENT values for the same setor means the base itself disagrees about which gerência owns\n      // it — counted and reported, never keyed to whichever row happened to be read last.\n      const gvv=String(line[iG]==null?'':line[iG]).trim();\n      if(gvv){ if(gvBy[s]!==undefined && gvBy[s]!==gvv) gvClash[s]=true; else gvBy[s]=gvv; }\n      const mkv=String(line[iK]==null?'':line[iK]).trim();\n      if(mkv){ if(mkBySetor[s]!==undefined && mkBySetor[s]!==mkv) mkClash[s]=true; else mkBySetor[s]=mkv; }\n      if(iDS!=null){ const lbl=String(line[iDS]==null?'':line[iDS]).trim(); if(lbl && !setorLabel[s]) setorLabel[s]=lbl; }\n      if(iDG!=null && gvv){ const lbl=String(line[iDG]==null?'':line[iDG]).trim(); if(lbl && !gvLabel[gvv]) gvLabel[gvv]=lbl; }\n      const raw=(iU==null)?'':line[iU];\n      const u=(iU==null)?'':ufNorm(raw);\n      if(iU!=null && String(raw==null?'':raw).trim() && !u) bad++;\n      // The same name twice in ONE setor under two UFs is the single case the reverted SQL cannot\n      // survive: mSQL groups by DS_MUNICIPIO alone, so both municipalities arrive summed into one row\n      // and no lookup can split them again. Counted and reported — never quietly keyed to whichever\n      // UF happened to be read last.\n      const kk=s+'|'+m;\n      // An UNRESOLVED uf must never outrank a resolved one. Reading a blank/bogus UF row first wrote ''\n      // here, and the next row carrying the real sigla was then rejected as a clash — so the key stayed\n      // falsy for good, ufFor() fell through, and the município degraded to a bare NAME key that matches\n      // no shape and no dominance entry. With DISTRITO/ZONA in the base a município spans several rows,\n      // so which row lands first is pure luck. A clash is only two RESOLVED siglas that disagree.\n      if(!u){ if(ufBy[kk]===undefined) ufBy[kk]=''; }\n      else if(!ufBy[kk]) ufBy[kk]=u;\n      else if(ufBy[kk]!==u) clash[kk]=true;\n      (by[s]=by[s]||new Set()).add(u?m+'/'+u:m); n++;\n    }\n    if(!n) throw new Error('base de municípios dominantes sem linhas válidas');\n    DOM.bySetor=by; DOM.ufBySetorMuni=ufBy; DOM.rows=n; DOM.setores=Object.keys(by).length;\n    DOM.gvBySetor=gvBy; DOM.gvClashes=Object.keys(gvClash).length; DOM.gvCol=String(table[0][iG]||'').trim();\n    DOM.gvSetores=Object.keys(gvBy).length;\n    DOM.hasUf=(iU!=null); DOM.ufCol=(iU==null?null:String(table[0][iU]||'').trim());\n    DOM.badUf=bad; DOM.clashes=Object.keys(clash).length; DOM.headers=head.slice(0,40); DOM.error=null;\n    // ---- hierarquia: setor ⊂ GV ⊂ mercado, tudo derivado do MESMO csv que a regra de setor já\n    // confia — fechamento de GV/Mercado lê a mesma fonte, nunca uma segunda base paralela.\n    DOM.mercadoBySetor=mkBySetor; DOM.mercadoClashes=Object.keys(mkClash).length; DOM.mercadoCol=String(table[0][iK]||'').trim();\n    DOM.setorLabel=setorLabel; DOM.gvLabel=gvLabel;\n    const sectorsByGv={},sectorsByMercado={},gvsByMercado={},mercadoByGv={},gvMercClash={};\n    Object.keys(by).forEach(s=>{\n      const gv=gvBy[s], mk=mkBySetor[s];\n      if(gv) (sectorsByGv[gv]=sectorsByGv[gv]||new Set()).add(s);\n      if(mk) (sectorsByMercado[mk]=sectorsByMercado[mk]||new Set()).add(s);\n      if(gv&&mk){ if(mercadoByGv[gv]!==undefined && mercadoByGv[gv]!==mk) gvMercClash[gv]=true; else mercadoByGv[gv]=mk; }\n    });\n    Object.entries(mercadoByGv).forEach(([gv,mk])=>(gvsByMercado[mk]=gvsByMercado[mk]||new Set()).add(gv));\n    DOM.sectorsByGv=sectorsByGv; DOM.sectorsByMercado=sectorsByMercado; DOM.gvsByMercado=gvsByMercado;\n    DOM.mercadoByGv=mercadoByGv; DOM.gvMercadoClashes=Object.keys(gvMercClash).length;\n    return by;\n  })();\n  DOM.promise.catch(e=>{ DOM.promise=null; DOM.bySetor=null; DOM.error=e.message; renderAll(); });\n  return DOM.promise;\n}\n\nlet SESS={ snapshotRaw:null, snapshotSyncedAt:null, snapLiteral:null, eloMaxCycle:null, timeline:[], selected:0,\n           sessionId:null, sessionLabel:null, sessionsList:[], sectorsList:[], sectorBaseCache:{}, stage:'loading', dirtyFrom:null,\n           snapBusy:false, settings:{...DEFAULT_SETTINGS} };\n\nasync function q(sql){\n  let dbx,res;\n  try{\n    res=await d2.rush('AwW_11Nkg-dKksP7ic8V8').invoke({sql});\n  }catch(e){\n    throw new Error('Databricks indisponível (rush AwW_11Nkg-dKksP7ic8V8): '+e.message);\n  }\n  // The listener answers 200 with {sql} and NO `result` when its upstream probe times out: the\n  // handler builds `result: $result.data`, so an empty upstream simply drops the key rather than\n  // failing. Reading straight through to res.data.result.data reported \"Cannot read properties of\n  // undefined (reading 'data')\" — which reads like a bug in THIS component and sent a debugging\n  // session after the wrong thing. Name the layer that actually failed instead.\n  const payload=res&&res.data;\n  if(!payload) throw new Error('rush AwW_11Nkg-dKksP7ic8V8 não devolveu corpo — listener fora do ar?');\n  if(!payload.result) throw new Error('a sonda Databricks não respondeu: o listener AwW_11Nkg-dKksP7ic8V8 devolveu 200 sem `result`, o que normalmente é timeout do upstream (natura-x-app). O SQL não chegou a rodar.');\n  dbx=payload.result.data;\n  if(!dbx) throw new Error('sonda Databricks respondeu sem dados (result.data vazio).');\n  if(dbx.state && dbx.state!=='SUCCEEDED') throw new Error('Databricks '+dbx.state+': '+(dbx.error?.message||JSON.stringify(dbx.error)||'erro desconhecido'));\n  return dbx;\n}\nfunction rows(resp){const c=(resp.columns||[]).map(x=>x.name);\n  return (resp.rows||[]).map(a=>Object.fromEntries(c.map((k,i)=>[k,a[i]])));}\n// Stamps the UF onto every feature at load: the fetch is per-UF, so this is the ONLY point where a\n// shape's state is known for certain. Downstream the features are flattened into one array and the\n// origin would be unrecoverable. Persisted with the feature in saved sessions.\nasync function geoUF(uf){const code=UF_CODE[uf]||uf;const r=await fetch('https://raw.githubusercontent.com/tbrugz/geodata-br/master/geojson/geojs-'+code+'-mun.json');if(!r.ok)throw new Error('geo '+uf);\n  const g=await r.json(); const U=String(uf).toUpperCase();\n  (g.features||[]).forEach(f=>{ f.__uf=U; });\n  return g;}\n\nfunction buildAdj(features){\n  const pts=f=>{const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates],s=new Set();\n    ps.forEach(poly=>poly.forEach(ring=>ring.forEach(p=>s.add(Math.round(p[0]*1000)/1000+','+Math.round(p[1]*1000)/1000))));return s;};\n  const feat={},idx={};\n  features.forEach(f=>{const nm=mkey(f.properties.name||f.properties.NOME||f.properties.nome,f.__uf);feat[nm]={f,pts:pts(f)};});\n  for(const nm in feat) feat[nm].pts.forEach(p=>(idx[p]=idx[p]||[]).push(nm));\n  const nbrs=nm=>{const c={};feat[nm].pts.forEach(p=>idx[p].forEach(o=>{if(o!==nm)c[o]=(c[o]||0)+1;}));\n    return Object.entries(c).filter(([,n])=>n>=2).map(([o,n])=>({o,w:n}));};\n  return {feat,nbrs};\n}\nfunction centroidLL(f){let x=0,y=0,n=0;const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];\n  ps.forEach(poly=>poly[0].forEach(p=>{x+=p[0];y+=p[1];n++;}));return[x/n,y/n];}\n\n// ---------- snapshot pinning ----------\nasync function resolveSnapshotPin(){\n  const [rawR,liveCountR,eloR]=await Promise.all([\n    q(`SELECT MAX(DT_HISTORICO) snap FROM ${T} WHERE CD_PAIS=1`).then(rows),\n    q(`SELECT COUNT(*) n FROM ${T} WHERE CD_PAIS=1 AND DT_HISTORICO=(SELECT MAX(DT_HISTORICO) FROM ${T} WHERE CD_PAIS=1)`).then(rows),\n    q(`SELECT MAX(operational_cycle) mx FROM ${ELO} WHERE country_code=1`).then(rows).catch(()=>[]),\n  ]);\n  const raw=rawR[0]&&rawR[0].snap;\n  const liveCount=+((liveCountR[0]||{}).n||0);\n  const eloMax=+((eloR[0]||{}).mx||0);\n  const LIVE_SUBQ=`(SELECT MAX(DT_HISTORICO) FROM ${T} WHERE CD_PAIS=1)`;\n  const dbTs=(raw||'').replace('T',' ').replace(/Z$/,'');\n  const candidates=[`TIMESTAMP'${dbTs}'`,`'${dbTs}'`,`DATE'${dbTs}'`];\n  const tests=await Promise.all(candidates.map(c=>\n    q(`SELECT COUNT(*) n FROM ${T} WHERE CD_PAIS=1 AND DT_HISTORICO=${c}`).then(rows).then(r=>+((r[0]||{}).n||0)).catch(()=>-1)\n  ));\n  let chosen=LIVE_SUBQ;\n  for(let i=0;i<candidates.length;i++){ if(liveCount>0 && tests[i]===liveCount){ chosen=candidates[i]; break; } }\n  return {snapshotRaw:raw, snapLiteral:chosen, eloMaxCycle:eloMax, syncedAt:new Date().toISOString()};\n}\n// DISPLAY CONTRACT: the UI never prints the snapshot's own DT_HISTORICO (snapshotRaw). What the user\n// sees is `snapshotSyncedAt` — the date AND hour at which THIS instance last pulled/pinned the\n// snapshot it is querying. snapshotRaw is still resolved, still drives every SQL literal, and is\n// still persisted by saveSession/doShare; it is only kept off the screen.\nfunction fmtSyncedAt(iso){\n  if(!iso) return '—';\n  const d=new Date(iso);\n  if(isNaN(d.getTime())) return String(iso);\n  return d.toLocaleString('pt-BR',{day:'2-digit',month:'2-digit',year:'numeric',hour:'2-digit',minute:'2-digit'});\n}\nasync function ensurePinned(){\n  if(SESS.snapLiteral) return;\n  const p=await resolveSnapshotPin();\n  SESS.snapshotRaw=p.snapshotRaw; SESS.snapLiteral=p.snapLiteral; SESS.eloMaxCycle=p.eloMaxCycle;\n  SESS.snapshotSyncedAt=p.syncedAt;\n}\n\n// ---------- world-state fold ----------\nfunction accMetrics(base,add){\n  const out=base?{...base}:blankM();\n  Object.keys(blankM()).forEach(k=>{ out[k]=(out[k]||0)+((add&&add[k])||0); });\n  return out;\n}\nfunction foldWorldState(timeline,uptoIdx){\n  const closedSectors=new Set(),muniOverride={},muniGeo={},muniRow={},muniLevel={},sectorInflow={},sectorInflowLevel={},sectorOrphanRows={};\n  // GV/mercado: setores e GVs não se dissolvem quando o dono deles fecha — eles só passam a\n  // responder a um destino novo. Por isso o rastro do cascade mora numa camada PRÓPRIA\n  // (secOverride/gvOverride), separada da camada de município do fechamento de setor — a\n  // hierarquia trava a sessão num nível só, então nunca as duas camadas têm conteúdo ao mesmo tempo.\n  const closedGvs=new Set(),secOverride={},gvInflow={};\n  const closedMercados=new Set(),gvOverride={},mercadoInflow={};\n  for(let k=0;k<uptoIdx;k++){\n    const mv=timeline[k]; if(!mv||!mv.sector||!mv.munis) continue;\n    const level=mv.level||'setor';\n    if(level==='gv'){\n      closedGvs.add(String(mv.sector));\n      Object.keys(mv.munis).forEach(u=>{\n        if(u==='__OUTROS__') return;\n        const dest=mv.assign[u]; if(!dest) return;\n        secOverride[u]=String(dest);\n        gvInflow[dest]=accMetrics(gvInflow[dest],mv.munis[u]);\n      });\n      continue;\n    }\n    if(level==='mercado'){\n      closedMercados.add(String(mv.sector));\n      Object.keys(mv.munis).forEach(u=>{\n        if(u==='__OUTROS__') return;\n        const dest=mv.assign[u]; if(!dest) return;\n        gvOverride[u]=String(dest);\n        mercadoInflow[dest]=accMetrics(mercadoInflow[dest],mv.munis[u]);\n      });\n      continue;\n    }\n    closedSectors.add(String(mv.sector));\n    Object.keys(mv.munis).forEach(m=>{\n      if(m==='__OUTROS__') return;\n      const dest=mv.assign[m]; if(!dest) return;\n      muniOverride[m]=String(dest);\n      if(mv.geoFeat&&mv.geoFeat[m]) muniGeo[m]=mv.geoFeat[m];\n      const rws=(mv.matrix||[]).filter(r=>mkey(r.municipio,r.uf)===m);\n      muniRow[m]=(muniRow[m]||[]).concat(rws);\n      if(mv.levelByMuni&&mv.levelByMuni[m]) muniLevel[m]={...(muniLevel[m]||{}),...mv.levelByMuni[m]};\n      sectorInflow[dest]=accMetrics(sectorInflow[dest],mv.munis[m]);\n      const lv=(mv.levelByMuni&&mv.levelByMuni[m])||{};\n      sectorInflowLevel[dest]=sectorInflowLevel[dest]||{};\n      Object.entries(lv).forEach(([nv,c])=>{ sectorInflowLevel[dest][nv]=(sectorInflowLevel[dest][nv]||0)+c; });\n    });\n    // Orphan CBs follow their leader's home sector, so later etapas must inherit them the same way\n    // the allocated municipalities are inherited — otherwise a stage's span would not match the\n    // base carried into the next one.\n    if(mv.orphanMetricsByGroup && Object.keys(mv.orphanMetricsByGroup).length){\n      const d=computeDerived(mv);\n      d.leaders.forEach(L=>{\n        if(!L.home) return;\n        const om=mv.orphanMetricsByGroup[L.grupo];\n        if(om) sectorInflow[L.home]=accMetrics(sectorInflow[L.home],om);\n        // sectorInflow only reaches a sector while it is a DESTINATION (it lands in baseMetrics).\n        // Keep the rows as well, so the sector still carries these CBs on the day it is the one\n        // being closed — that read goes through mv.matrix, which baseMetrics never touches.\n        const orws=mv.orphanRowsByGroup&&mv.orphanRowsByGroup[L.grupo];\n        if(orws&&orws.length) sectorOrphanRows[L.home]=(sectorOrphanRows[L.home]||[]).concat(orws);\n        const ol=mv.orphanLevelByGroup&&mv.orphanLevelByGroup[L.grupo];\n        if(ol){ sectorInflowLevel[L.home]=sectorInflowLevel[L.home]||{};\n          Object.entries(ol).forEach(([nv,c])=>{ sectorInflowLevel[L.home][nv]=(sectorInflowLevel[L.home][nv]||0)+c; }); }\n      });\n    }\n  }\n  return {closedSectors,muniOverride,muniGeo,muniRow,muniLevel,sectorInflow,sectorInflowLevel,sectorOrphanRows,\n          closedGvs,secOverride,gvInflow,closedMercados,gvOverride,mercadoInflow};\n}\n\n// ---------- per-movement compute ----------\nfunction aggregateMovement(mv){\n  const level=mv.level||'setor';\n  const munis={},leaders={};\n  const exSet=new Set((mv.excludedMunis||[]).map(x=>x.muni));\n  const acc=(o,r)=>{o.cbs+=+r.cbs;o.receita+=+r.receita||0;o.rec_nat+=+r.rec_nat||0;o.rec_avon+=+r.rec_avon||0;o.pontos+=+r.pontos||0;o.pedidos+=+r.pedidos||0;o.ativas+=+r.ativas||0;};\n  // Orphans = CBs in municipalities outside the sector's dominance base. They are NOT allocated\n  // geographically; they follow their own leader's home sector. Kept per leader group so every\n  // consumer (span, cascade, impact report) can route them the same way. Só existe no nível setor —\n  // GV/mercado não têm spillover (todo setor pertence a exatamente uma GV/mercado na base).\n  mv.orphanByGroup={}; mv.orphanMetricsByGroup={}; mv.orphanRowsByGroup={};\n  // unidade que este nível redistribui: a própria município (setor fecha), o setor da linha (GV\n  // fecha), a GV do setor da linha (mercado fecha).\n  const unitOf=r=>level==='setor'?null:(level==='gv'?String(r.setor):(DOM.gvBySetor[String(r.setor)]||''));\n  mv.matrix.forEach(r=>{\n    const m=mkey(r.municipio,r.uf);\n    r._out=!mv.geoFeat[m];   // assign, never just set: absorbed rows are reused across etapas\n    const mm=level==='setor'?(r._out?'__OUTROS__':m):(unitOf(r)||'__OUTROS__');\n    munis[mm]=munis[mm]||{...blankM(),name:mm}; acc(munis[mm],r);\n    const g=String(r.grupo); leaders[g]=leaders[g]||{grupo:g,lider:r.lider,total:0,byMuni:{}};\n    leaders[g].total+=+r.cbs; leaders[g].byMuni[mm]=(leaders[g].byMuni[mm]||0)+ +r.cbs;\n    if(level==='setor' && r._out && exSet.has(m)){\n      mv.orphanByGroup[g]=(mv.orphanByGroup[g]||0)+ +r.cbs;\n      // The ROW too, not just the totals: when the leader's home sector is itself closed in a later\n      // etapa, that etapa rebuilds its matrix from SQL + absorbed municípios, and these CBs are in\n      // neither (their município never moved). Without the row they silently vanish from the sector\n      // they were just credited to — see sectorOrphanRows in foldWorldState.\n      (mv.orphanRowsByGroup[g]=mv.orphanRowsByGroup[g]||[]).push(r);\n      mv.orphanMetricsByGroup[g]=accMetrics(mv.orphanMetricsByGroup[g],\n        {cbs:+r.cbs,receita:+r.receita||0,rec_nat:+r.rec_nat||0,rec_avon:+r.rec_avon||0,pontos:+r.pontos||0,pedidos:+r.pedidos||0,ativas:+r.ativas||0});\n    }\n  });\n  // Level counts only exist per municipality, never per leader, so an excluded municipality's level\n  // mix is credited to the group holding most of its CBs (sub-threshold by definition, so usually one).\n  mv.orphanLevelByGroup={};\n  (mv.excludedMunis||[]).forEach(({muni})=>{\n    const lv=(mv.levelByMuni&&mv.levelByMuni[muni])||{}; if(!Object.keys(lv).length) return;\n    let bg=null,bc=-1;\n    mv.matrix.forEach(r=>{ if(mkey(r.municipio,r.uf)!==muni) return; const cc=+r.cbs; if(cc>bc){bc=cc;bg=String(r.grupo);} });\n    if(!bg) return;\n    mv.orphanLevelByGroup[bg]=mv.orphanLevelByGroup[bg]||{};\n    Object.entries(lv).forEach(([nv,cc])=>{ mv.orphanLevelByGroup[bg][nv]=(mv.orphanLevelByGroup[bg][nv]||0)+cc; });\n  });\n  mv.munis=munis; mv.leaders=Object.values(leaders).sort((a,b)=>b.total-a.total);\n}\nfunction autoAssignFor(mv){\n  const a={};\n  Object.keys(mv.munis).forEach(m=>{ if(m==='__OUTROS__')return;\n    const v=mv.allowed[m]||{}; const votes=Object.keys(v);\n    if(votes.length){ let best=votes[0],bw=-1; for(const s of votes) if(v[s]>bw){bw=v[s];best=s;} a[m]=best; }\n    else if(mv.dest.length){ const c=mv.muniCentroid[m]; let best=mv.dest[0],bd=Infinity;\n      for(const s of mv.dest){ const sc=mv.secCentroid[s]; if(!sc||!c)continue; const d=(c[0]-sc[0])**2+(c[1]-sc[1])**2; if(d<bd){bd=d;best=s;} }\n      a[m]=best; }\n  });\n  return a;\n}\nfunction deslocFor(mv,assign){\n  let d=0;\n  mv.leaders.forEach(L=>{const byS={};let tot=0;\n    for(const [m,c] of Object.entries(L.byMuni)){if(m==='__OUTROS__')continue;const s=assign[m];if(s){byS[s]=(byS[s]||0)+c;tot+=c;}}\n    const home=mv.dest.reduce((a,s)=>(byS[s]||0)>(byS[a]||0)?s:a,mv.dest[0]);\n    d+=tot-(byS[home]||0);});\n  return d;\n}\nfunction spanMapFor(mv,a){const inc={};mv.dest.forEach(s=>inc[s]=0);\n  Object.entries(mv.munis).forEach(([m,o])=>{if(m==='__OUTROS__')return;const s=a[m];if(s&&inc[s]!=null)inc[s]+=o.cbs;});\n  // Orphan CBs follow their leader's home sector, and that home depends on THIS candidate\n  // assignment — so they have to be counted here, or the optimizer would score and constrain a\n  // span that differs from the one the UI shows. Skipped entirely when there are no orphans.\n  if(mv.orphanByGroup&&Object.keys(mv.orphanByGroup).length){\n    mv.leaders.forEach(L=>{\n      const orphan=mv.orphanByGroup[L.grupo]||0; if(!orphan) return;\n      const byS={}; let tot=0;\n      for(const [m,c] of Object.entries(L.byMuni)){ if(m==='__OUTROS__') continue; const s=a[m]; if(s&&inc[s]!=null){ byS[s]=(byS[s]||0)+c; tot+=c; } }\n      if(!tot) return;   // no home to follow -> stranded, counted nowhere\n      const home=mv.dest.reduce((x,s)=>(byS[s]||0)>(byS[x]||0)?s:x,mv.dest[0]);\n      if(inc[home]!=null) inc[home]+=orphan;\n    });\n  }\n  const sp={};mv.dest.forEach(s=>sp[s]=(+(mv.baseMetrics[s]?.cbs||0))+inc[s]);return sp;}\nfunction maxSpanOfFor(mv,a){return Math.max(...Object.values(spanMapFor(mv,a)),0);}\nfunction spanLimits(mv){\n  // Span alvo/máximo/mínimo é uma regra de fechamento de SETOR (tamanho ideal de território) —\n  // GV/mercado não têm essa noção e ignoram qualquer valor configurado nas opções da sessão.\n  if(mv && (mv.level||'setor')!=='setor') return {target:null,max:null,min:null};\n  const st={...DEFAULT_SETTINGS,...(SESS.settings||{})};\n  return {target:numOrNull(st.targetSpan),max:numOrNull(st.maxSpan),min:numOrNull(st.minSpan)};}\nfunction spanLimitsOn(lim){return !!(lim.target||lim.max||lim.min);}\nfunction spanViolationsOf(sp,lim){const over=[],under=[];\n  Object.entries(sp).forEach(([s,v])=>{ if(lim.max&&v>lim.max)over.push(s); if(lim.min&&v<lim.min)under.push(s); });\n  return {over,under};}\nfunction spanViolationsFor(mv,a){return spanViolationsOf(spanMapFor(mv,a),spanLimits(mv));}\n// With a target span the objective becomes RMS distance from the ideal size (punishes too big AND\n// too small). With no target we keep the legacy objective: shave the biggest sector.\nfunction spanCostFor(mv,a){const lim=spanLimits(mv),vals=Object.values(spanMapFor(mv,a));\n  if(!vals.length) return 0;\n  if(lim.target) return Math.sqrt(vals.reduce((s,v)=>s+(v-lim.target)**2,0)/vals.length);\n  return Math.max(...vals);}\n// ---------- ÓTIMO: objetivo multi-critério ----------\n// Three normalised objectives, each 0..1, so the weights below are directly comparable. The old\n// score added a span cost measured in CBs to a desloc measured in CBs, so on a large sector the\n// balance term was numerically ~100x the desloc term and silently decided everything on its own.\n//   balance — RMS spread of the resulting spans (against the target span when one is set,\n//             otherwise against their own mean), over that reference. 0 = every destination\n//             sector ends up the same size.\n//   dist    — how far each município travels, CB-weighted: half from the share of its outer\n//             border that faces the sector it was given to, half from centroid distance. 0 =\n//             every município went to a sector it physically touches. Adjacency used to be a\n//             pure yes/no constraint (contiguity); this is what makes it a preference too.\n//   orphan  — stranded orphan CBs (leader left without a home sector, so they land nowhere at\n//             all) plus CBs split away from their leader's home, over the CBs at stake.\n//             Stranded ones count OPT_STRAND_K times: a stranded CB leaves the model entirely,\n//             a deslocated one merely changes hands.\nconst OPT_W={balance:1, dist:0.85, orphan:1};\nconst OPT_STRAND_K=3;\nconst OPT_SIMS=24;             // simultaneous simulations per run, scaled down on big stages\nconst OPT_PASSES=14;           // local-search sweeps inside one simulation\nconst OPT_EVAL_BUDGET=120000;  // total candidate evaluations across the whole portfolio\nconst OPT_EXHAUSTIVE_MAX=60000;\nfunction optDistPrep(mv){\n  let mx=0;\n  Object.keys(mv.munis).forEach(m=>{ if(m==='__OUTROS__') return; const c=mv.muniCentroid[m]; if(!c) return;\n    mv.dest.forEach(s=>{ const sc=mv.secCentroid[s]; if(!sc) return;\n      const d=Math.hypot(c[0]-sc[0],c[1]-sc[1]); if(d>mx) mx=d; }); });\n  return mx||1;\n}\nfunction optDistCost(mv,m,s,dmax){\n  const v=mv.allowed[m]||{}; let tot=0; for(const k in v) tot+=v[k];\n  const share=tot?((v[s]||0)/tot):0;\n  const c=mv.muniCentroid[m], sc=mv.secCentroid[s];\n  // Missing centroid on either side is neutral (0.5), never 0 — an unmeasurable move must not\n  // score as the cheapest one on the board.\n  const geo=(c&&sc)?Math.min(1,Math.hypot(c[0]-sc[0],c[1]-sc[1])/dmax):0.5;\n  return 0.5*(1-share)+0.5*geo;\n}\nfunction optEval(mv,a,dmax){\n  const lim=spanLimits(mv);\n  const sp=spanMapFor(mv,a), vals=Object.values(sp);\n  let balance=0;\n  if(vals.length){\n    const ref=lim.target||(vals.reduce((x,y)=>x+y,0)/vals.length);\n    if(ref) balance=Math.min(1,Math.sqrt(vals.reduce((s,v)=>s+(v-ref)**2,0)/vals.length)/ref);\n  }\n  let cbs=0,dist=0;\n  for(const m in a){ const o=mv.munis[m]; if(!o) continue; const w=+o.cbs||0; cbs+=w; dist+=w*optDistCost(mv,m,a[m],dmax); }\n  dist=cbs?(dist/cbs):0;\n  let stranded=0,desloc=0,tot=0;\n  mv.leaders.forEach(L=>{\n    const byS={}; let t=0;\n    for(const [m,c] of Object.entries(L.byMuni)){ if(m==='__OUTROS__') continue; const s=a[m]; if(s){ byS[s]=(byS[s]||0)+c; t+=c; } }\n    const orphan=(mv.orphanByGroup&&mv.orphanByGroup[L.grupo])||0;\n    tot+=t+orphan;\n    if(!t){ stranded+=orphan; return; }   // no allocated CBs -> no home -> these orphans land nowhere\n    const home=mv.dest.reduce((x,s)=>(byS[s]||0)>(byS[x]||0)?s:x,mv.dest[0]);\n    desloc+=t-(byS[home]||0);\n  });\n  const orphanTerm=tot?Math.min(1,(desloc+OPT_STRAND_K*stranded)/tot):0;\n  return { cost:OPT_W.balance*balance+OPT_W.dist*dist+OPT_W.orphan*orphanTerm,\n           balance, dist, desloc, stranded, sp, viol:spanViolationsOf(sp,lim) };\n}\nfunction optScoreFor(mv,a){ return optEval(mv,a,mv.__optDmax||optDistPrep(mv)).cost; }\n// Seeded PRNG on purpose. computeMovement runs the optimizer for EVERY stage and recomputeFrom\n// re-runs every stage downstream of an edit, so a Math.random() portfolio would hand back a\n// different allocation on each pass and a saved timeline would never reproduce.\nfunction optRng(seed){ let a=seed>>>0;\n  return ()=>{ a=(a+0x6D2B79F5)>>>0; let t=Math.imul(a^(a>>>15),1|a);\n    t=(t+Math.imul(t^(t>>>7),61|t))^t; return ((t^(t>>>14))>>>0)/4294967296; }; }\nfunction optSeed(mv,ms){ let h=2166136261>>>0;\n  const s=String(mv.sector)+'|'+ms.join(',')+'|'+mv.dest.join(',');\n  for(let i=0;i<s.length;i++) h=Math.imul(h^s.charCodeAt(i),16777619);\n  return h>>>0; }\nfunction contigBadFor(mv,assign){\n  // Contiguidade geográfica só faz sentido no grão de município (setor fechando): setores e GVs\n  // não precisam formar uma mancha contínua quando GV/mercado fecha — cada setor/GV vai pro destino\n  // que faz sentido pra ele, sem exigir que o conjunto redistribuído continue \"grudado\".\n  if((mv.level||'setor')!=='setor') return [];\n  const bySec={}; for(const m in assign){(bySec[assign[m]]=bySec[assign[m]]||[]).push(m);}\n  const bad=[];\n  for(const s in bySec){const grp=bySec[s],inGrp=new Set(grp);\n    const seeds=grp.filter(m=>(mv.allowed[m]||{})[s]);\n    if(!seeds.length){bad.push(s);continue;}\n    const seen=new Set(seeds),st=[...seeds];\n    while(st.length){const m=st.pop();(mv.closeAdj[m]||[]).forEach(o=>{if(inGrp.has(o)&&!seen.has(o)){seen.add(o);st.push(o);}});}\n    if(seen.size!==grp.length)bad.push(s);}\n  return bad;\n}\nfunction greedyFor(mv,ms,opts){const lim=spanLimits(mv);const a={};\n  ms.forEach((m,i)=>{let best=opts[i][0],bd=Infinity;\n    for(const s of opts[i]){a[m]=s;\n      // over-max only grows as we keep assigning, so it is safe to penalise mid-build;\n      // under-min shrinks, so penalising it here would just chase noise.\n      const over=lim.max?spanViolationsOf(spanMapFor(mv,a),{max:lim.max,min:null}).over.length:0;\n      const d=optScoreFor(mv,a)+(contigBadFor(mv,a).length?1e9:0)+over*1e6;\n      if(d<bd){bd=d;best=s;}}\n    a[m]=best;});\n  return a;}\nfunction optimizeFor(mv){\n  const ms=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__');\n  if(!ms.length||!mv.dest.length){ mv.optBadge=mv.dest.length?'':'sem setor destino identificado'; return {}; }\n  const opts=ms.map(m=>{const al=(mv.reachable[m]&&mv.reachable[m].length)?mv.reachable[m]:mv.dest.slice();return al.length?al:mv.dest.slice();});\n  const combos=opts.reduce((a,o)=>a*o.length,1);\n  const lim=spanLimits(mv);\n  const dmax=optDistPrep(mv); mv.__optDmax=dmax;\n\n  // Feasibility ladder — same meaning as before, because renderSpanRule and the saved sessions\n  // both read mv.optTier: 0 = contíguo + max + min span, 1 = contíguo + max span, 2 = contíguo\n  // only. Every candidate any simulation produces is offered to all three tiers; we ship the\n  // strictest tier that got a solution, so an unreachable min/max relaxes loudly instead of\n  // stranding the stage with nothing.\n  const tier=[null,null,null],tSc=[Infinity,Infinity,Infinity],tEv=[null,null,null];\n  let feasible=0,evals=0;\n  const offer=(a,ev)=>{\n    if(contigBadFor(mv,a).length) return false;\n    feasible++;\n    const put=t=>{ if(ev.cost<tSc[t]){ tSc[t]=ev.cost; tier[t]={...a}; tEv[t]=ev; } };\n    put(2);\n    if(!ev.viol.over.length){ put(1); if(!ev.viol.under.length) put(0); }\n    return true;\n  };\n  const evalOf=a=>{ evals++; return optEval(mv,a,dmax); };\n\n  // Small enough to settle the question outright: enumerate every contiguous allocation and the\n  // winner is provably the best one under this objective. No search needed, so none is run.\n  const exhaustive=combos<=OPT_EXHAUSTIVE_MAX;\n  let sims=0;\n  if(exhaustive){\n    const cur={};\n    const rec=i=>{ if(i===ms.length){ offer(cur,evalOf(cur)); return; }\n      for(const s of opts[i]){ cur[ms[i]]=s; rec(i+1); } };\n    rec(0);\n  } else {\n    // Too big to enumerate, so run a portfolio of independent simulations instead. Each one is a\n    // seed assignment, then hill-climbing on single-município reassignments, then one perturbation\n    // and another climb to escape whatever local optimum it settled into. Different seeds land in\n    // different basins; the ladder above keeps the best across all of them.\n    const improve=a=>{\n      let ev=evalOf(a); offer(a,ev);\n      for(let pass=0;pass<OPT_PASSES;pass++){\n        let moved=false;\n        for(let i=0;i<ms.length;i++){\n          const m=ms[i],cur=a[m]; let best=cur,bev=ev;\n          for(const s of opts[i]){\n            if(s===cur) continue;\n            a[m]=s;\n            const e=evalOf(a);\n            // contiguity is a hard constraint, and the cheaper test runs first on purpose\n            if(e.cost<bev.cost-1e-12 && !contigBadFor(mv,a).length){ best=s; bev=e; }\n          }\n          a[m]=best;\n          if(best!==cur){ ev=bev; moved=true; offer(a,ev); }\n        }\n        if(!moved) break;\n      }\n    };\n    const rng=optRng(optSeed(mv,ms));\n    const perSim=Math.max(1,ms.length*Math.max(1,mv.dest.length)*OPT_PASSES);\n    const budget=Math.max(4,Math.min(OPT_SIMS,Math.floor(OPT_EVAL_BUDGET/perSim)||4));\n    const seeds=[];\n    if(mv.assign&&ms.every(m=>mv.assign[m])) seeds.push({...mv.assign});   // never regress on what is already on screen\n    seeds.push(autoAssignFor(mv));                                        // adjacency-first seed\n    seeds.push(greedyFor(mv,ms,opts));                                    // balance-first seed\n    while(seeds.length<budget){\n      // randomised construction biased toward nearby sectors — the bias keeps each seed sane, the\n      // randomness is what sends the runs into different basins\n      const a={};\n      ms.forEach((m,i)=>{ let bs=opts[i][0],bw=-Infinity;\n        for(const s of opts[i]){ const w=(1-optDistCost(mv,m,s,dmax))+rng()*0.9; if(w>bw){bw=w;bs=s;} }\n        a[m]=bs; });\n      seeds.push(a);\n    }\n    seeds.forEach(seed=>{\n      const a={...seed};\n      // a restored or legacy assign can still name a sector this stage no longer offers\n      ms.forEach((m,i)=>{ if(!opts[i].includes(a[m])) a[m]=opts[i][0]; });\n      improve(a);\n      const kick=Math.max(1,Math.round(ms.length*0.25));\n      for(let k=0;k<kick;k++){ const i=Math.floor(rng()*ms.length); a[ms[i]]=opts[i][Math.floor(rng()*opts[i].length)]; }\n      improve(a);\n    });\n    sims=seeds.length;\n  }\n\n  const t=tier.findIndex(x=>x);\n  if(t<0){ mv.optTier=-1; mv.optBadge='sem solução conectada — heurística'; return greedyFor(mv,ms,opts); }\n  const best=tier[t], ev=tEv[t]; mv.optTier=t;\n  const relax=[];\n  if(t>0 && lim.min) relax.push('span mínimo '+fmt(lim.min));\n  if(t>1 && lim.max) relax.push('span máximo '+fmt(lim.max));\n  mv.optStats={balance:ev.balance,dist:ev.dist,desloc:ev.desloc,stranded:ev.stranded,sims,evals,feasible,combos,exhaustive};\n  mv.optBadge=`ótimo · ${exhaustive?`espaço completo (${fmt(combos)})`:`${fmt(sims)} simulações`}`\n    +` · equilíbrio ±${Math.round(ev.balance*100)}% · adjacência ${Math.round((1-ev.dist)*100)}%`\n    +` · quebra ${fmt(ev.desloc)} CBs · ${fmt(ev.stranded)} fora do setor sem destino`\n    +` · pico ${fmt(maxSpanOfFor(mv,best))} CBs`\n    +(lim.target?` · alvo ${fmt(lim.target)}`:'')\n    +(relax.length?` · ⚠ inatingível: ${relax.join(' + ')}`:(spanLimitsOn(lim)?' · limites ok':''));\n  return best;\n}\nfunction computeDerived(mv){\n  const inc={},gained={},orph={};mv.dest.forEach(s=>{inc[s]=0;gained[s]=0;orph[s]=0;});\n  Object.entries(mv.munis).forEach(([m,o])=>{if(m==='__OUTROS__')return;const s=mv.assign[m];if(s&&inc[s]!=null)inc[s]+=o.cbs;});\n  let desloc=0,orphanTotal=0,orphanStranded=0;\n  const L2=mv.leaders.map(L=>{const byS={};mv.dest.forEach(s=>byS[s]=0);let tot=0;\n    for(const [m,c] of Object.entries(L.byMuni)){if(m==='__OUTROS__')continue;const s=mv.assign[m];if(s&&byS[s]!=null){byS[s]+=c;tot+=c;}}\n    // no allocated CBs => no home. Picking dest[0] by default would silently dump this leader's\n    // orphan CBs into an arbitrary sector, so we leave it null and report them as stranded.\n    const home=(tot>0&&mv.dest.length)?mv.dest.reduce((a,s)=>byS[s]>byS[a]?s:a,mv.dest[0]):null;\n    const dl=tot-(home?byS[home]:0);desloc+=dl;if(home)gained[home]++;\n    const orphan=(mv.orphanByGroup&&mv.orphanByGroup[L.grupo])||0;\n    orphanTotal+=orphan;\n    if(orphan){ if(home&&orph[home]!=null) orph[home]+=orphan; else orphanStranded+=orphan; }\n    return {...L,byS,home,desloc:dl,assignedTotal:tot,orphan,orphanHome:(orphan&&home)?home:null};});\n  const span={};mv.dest.forEach(s=>span[s]=(+(mv.baseMetrics[s]?.cbs||0))+inc[s]+orph[s]);\n  return {inc,gained,desloc,leaders:L2,span,orph,orphanTotal,orphanStranded};\n}\n\nasync function computeMovement(code,level,world){\n  level=level||'setor';\n  code=String(code);\n  const mv={sector:code,level,policy:'fora',view:'tobe',selMuni:null,optBadge:''};\n  const SNAP=SESS.snapLiteral;\n  // GV/mercado precisam da base ANTES de montar a query (pra saber quais CD_SETOR entram no IN);\n  // setor não precisa — mantém o timing original (a query dispara sem esperar o CSV).\n  let domBase=level==='setor'?null:await ensureDominantes();\n  const memberSectors=level==='setor'?[code]:memberSectorsOf(level,code,world);\n  if(!memberSectors.length) throw new Error(`${LEVELS[level].label} ${code} não existe na base de municípios dominantes (CSV) — atualize a base antes de fechar`);\n  const secList=memberSectors.join(',');\n\n  const mSQL=`SELECT DS_MUNICIPIO municipio, CD_SETOR setor, CD_GRUPO grupo, MAX(DS_LEADER_NAME) lider,\n     COUNT(DISTINCT CD_CONSULTORA) cbs, ROUND(SUM(VL_PEDIDOS_CICLO),0) receita,\n     ROUND(SUM(VL_PEDIDOS_NATURA_CICLO),0) rec_nat, ROUND(SUM(VL_PEDIDOS_AVON_CICLO),0) rec_avon,\n     ROUND(SUM(QT_PONTOS_CICLO),0) pontos, ROUND(SUM(QT_PEDIDOS_CICLO),0) pedidos,\n     SUM(CASE WHEN ST_FEZ_PED_CICLO_ATUAL THEN 1 ELSE 0 END) ativas\n    FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR IN (${secList}) AND DT_HISTORICO=${SNAP}\n    GROUP BY DS_MUNICIPIO, CD_SETOR, CD_GRUPO`;\n  const ufSQL=`SELECT DS_ESTADO uf, COUNT(*) n FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR IN (${secList}) AND DT_HISTORICO=${SNAP} GROUP BY DS_ESTADO ORDER BY n DESC`;\n  const trendSQL=`SELECT operational_cycle ciclo, COUNT(DISTINCT person_code) cbs,\n     COUNT(DISTINCT CASE WHEN registered_bc_ind=1 THEN person_code END) ativas,\n     ROUND(SUM(revenue_nat_ss_amt),0) receita, ROUND(SUM(points_nat_ss_amt),0) pontos\n    FROM ${ELO} WHERE country_code=1 AND sector_code IN (${secList}) AND operational_cycle<=${SESS.eloMaxCycle||999999} GROUP BY operational_cycle ORDER BY operational_cycle DESC LIMIT 8`;\n  const lvlSQL=`SELECT DS_NVL_PLAN_CRESC nivel, COUNT(DISTINCT CD_CONSULTORA) cbs,\n     ROUND(SUM(VL_PEDIDOS_NATURA_CICLO),0) rec_nat, ROUND(SUM(VL_PEDIDOS_AVON_CICLO),0) rec_avon\n    FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR IN (${secList}) AND DS_NVL_PLAN_CRESC IS NOT NULL AND DT_HISTORICO=${SNAP} GROUP BY DS_NVL_PLAN_CRESC ORDER BY cbs DESC`;\n  const lvlMuniSQL=`SELECT DS_MUNICIPIO municipio, CD_SETOR setor, DS_NVL_PLAN_CRESC nivel, COUNT(DISTINCT CD_CONSULTORA) cbs\n    FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR IN (${secList}) AND DS_NVL_PLAN_CRESC IS NOT NULL AND DT_HISTORICO=${SNAP} GROUP BY DS_MUNICIPIO, CD_SETOR, DS_NVL_PLAN_CRESC`;\n  const [mR,ufR,tR,lR,lmR]=await Promise.all([q(mSQL),q(ufSQL),q(trendSQL),q(lvlSQL),q(lvlMuniSQL)]);\n\n  const ownMatrix=rows(mR).filter(r=>+r.cbs>0);\n  mv.pureOwnMetrics=blankM();\n  ownMatrix.forEach(r=>{ mv.pureOwnMetrics.cbs+=+r.cbs; mv.pureOwnMetrics.receita+=+r.receita||0; mv.pureOwnMetrics.rec_nat+=+r.rec_nat||0; mv.pureOwnMetrics.rec_avon+=+r.rec_avon||0; mv.pureOwnMetrics.pontos+=+r.pontos||0; mv.pureOwnMetrics.pedidos+=+r.pedidos||0; mv.pureOwnMetrics.ativas+=+r.ativas||0; });\n\n  mv.levelByMuni={};\n  if(level==='setor') Object.entries(world.muniLevel||{}).forEach(([m,lv])=>{ if(world.muniOverride[m]===code) mv.levelByMuni[m]={...lv}; });\n\n  mv.trend=rows(tR).map(r=>({...r,cbs:+r.cbs,ativas:+r.ativas,receita:+r.receita,pontos:+r.pontos})).filter(r=>r.cbs>10).reverse();\n  mv.levels=rows(lR);\n\n  let absorbedRows=[],inheritedOrphanRows=[];\n  if(level==='setor'){\n    Object.entries(world.muniOverride).forEach(([m,destSec])=>{ if(destSec===code && world.muniRow[m]) absorbedRows.push(...world.muniRow[m]); });\n    inheritedOrphanRows=(world.sectorOrphanRows&&world.sectorOrphanRows[code])||[];\n  }\n  mv.matrix=ownMatrix.concat(absorbedRows,inheritedOrphanRows);\n\n  const ufList=rows(ufR).map(r=>r.uf).filter(Boolean);\n  const domUF=ufList[0]||'PR';\n  mv.domUF=domUF;\n  domBase=domBase||await ensureDominantes();\n  // Uma GV ou mercado pode espalhar por mais UFs do que \"a UF dominante + suas vizinhas\" cobre —\n  // toda UF que aparece na base de dominantes de QUALQUER setor-membro entra na janela de shapes.\n  const memberUFs=new Set([domUF]);\n  memberSectors.forEach(s=>{ (domBase[String(s)]||new Set()).forEach(entry=>{ const u=mUf(entry); if(u) memberUFs.add(u); }); });\n  const ufSet=new Set(memberUFs);\n  memberUFs.forEach(u=>(UF_BORDERS[u]||[]).forEach(b=>ufSet.add(b)));\n  const geos=await Promise.all([...ufSet].map(u=>geoUF(u).catch(()=>null)));\n  const allFeat=geos.filter(Boolean).flatMap(g=>g.features);\n  const adj=buildAdj(allFeat);\n\n  // A UF só vem da base de dominantes (setor real da linha × município), nunca de \"esse nome só\n  // apareceu numa UF carregada\" ou de um chute pra UF dominante do fechamento inteiro. Os dois\n  // eram seguros quando só 1-3 UFs entravam na janela (fechamento de setor); GV e principalmente\n  // mercado carregam dezenas de UFs de uma vez, então \"único entre as UFs carregadas\" deixa de\n  // significar \"único no Brasil\" — era exatamente esse chute que colocava um homônimo de outra UF\n  // espalhado longe do resto do mapa. Sem entrada na base, o município fica sem UF (mesmo\n  // tratamento de \"sem shape\" que já existe) em vez de arriscar aparecer no lugar errado.\n  const ufGuessed={};\n  const ufFor=(setorOf,muni)=>{const nm=norm(muni);\n    return (DOM.ufBySetorMuni&&DOM.ufBySetorMuni[String(setorOf)+'|'+nm])||'';};\n  mv.matrix.forEach(r=>{ if(!r.uf) r.uf=ufFor(r.setor,r.municipio); });\n  rows(lmR).forEach(r=>{ const k=mkey(r.municipio,ufFor(r.setor,r.municipio)); (mv.levelByMuni[k]=mv.levelByMuni[k]||{})[r.nivel]=+r.cbs; });\n\n  const totBy={}; mv.matrix.forEach(r=>{const n=mkey(r.municipio,r.uf); totBy[n]=(totBy[n]||0)+ +r.cbs;});\n  const footprint=new Set(Object.entries(totBy).filter(([,c])=>c>0).map(([m])=>m));\n  const withShape=[...footprint].filter(n=>adj.feat[n]||world.muniGeo[n]);\n  mv.cbsByMuni={...totBy}; mv.shapeMunis=withShape.slice();\n  mv.noShapeMunis=[...footprint].filter(n=>!(adj.feat[n]||world.muniGeo[n])).map(n=>({muni:n,cbs:totBy[n]||0})).sort((a,b)=>b.cbs-a.cbs);\n  mv.noShapeCbs=mv.noShapeMunis.reduce((a,x)=>a+x.cbs,0);\n\n  // ---- RULE: quais municípios pertencem a este fechamento ----\n  // setor: exatamente a regra de hoje. GV/mercado: união da base de TODOS os setores-membro — a\n  // base já garante que um setor pertence a uma única GV/mercado, então não existe aqui o spillover\n  // fuzzy que município tem contra setor (por isso o orphan-handling abaixo é pulado nesses níveis).\n  let domOwn;\n  if(level==='setor'){\n    domOwn=domBase[code]||new Set();\n  } else {\n    domOwn=new Set();\n    memberSectors.forEach(s=>(domBase[String(s)]||new Set()).forEach(n=>domOwn.add(n)));\n  }\n  const inherited=level==='setor'?new Set(Object.keys(world.muniOverride||{}).filter(m=>world.muniOverride[m]===code)):new Set();\n  if(!domOwn.size && !inherited.size) throw new Error(`${LEVELS[level].label} ${code} não existe na base de municípios dominantes (CSV) — atualize a base antes de fechar`);\n  const belongs=n=>domOwn.has(n)||(!DOM.hasUf&&domOwn.has(mName(n)))||inherited.has(n);\n  mv.domCsvMunis=domOwn.size;\n  const dropped=level==='setor'?withShape.filter(n=>!belongs(n)):[];\n  if(withShape.length && dropped.length===withShape.length) throw new Error(`${LEVELS[level].label} ${code}: nenhum dos municípios com CBs está na base de dominantes — nada pra realocar`);\n  const droppedSet=new Set(dropped);\n  mv.excludedMunis=dropped.map(n=>({muni:n,cbs:totBy[n]||0})).sort((a,b)=>b.cbs-a.cbs);\n  mv.excludedCbs=dropped.reduce((a,n)=>a+(totBy[n]||0),0);\n\n  const closingNames=withShape.filter(n=>!droppedSet.has(n));\n  const closingSet=new Set(closingNames);\n  mv.geoFeat={}; closingNames.forEach(n=>{ mv.geoFeat[n]=(adj.feat[n]&&adj.feat[n].f)||world.muniGeo[n]; });\n\n  // ---- unidade de realocação: a geometria é sempre município; a UNIDADE que troca de dono é o\n  // próprio município (setor fecha), o setor inteiro (GV fecha) ou a GV inteira (mercado fecha).\n  const municipioSetor={}; mv.matrix.forEach(r=>{ const n=mkey(r.municipio,r.uf); if(!municipioSetor[n]) municipioSetor[n]=String(r.setor); });\n  const resolveUnit=n=>{\n    if(level==='setor') return n;\n    const sOf=municipioSetor[n]; if(!sOf) return '';\n    return level==='gv'?sOf:(DOM.gvBySetor[sOf]||'');\n  };\n  mv.unitOfMuni={}; closingNames.forEach(n=>{ mv.unitOfMuni[n]=resolveUnit(n); });\n  mv.unitMunis={}; closingNames.forEach(n=>{ const u=mv.unitOfMuni[n]; if(!u) return; (mv.unitMunis[u]=mv.unitMunis[u]||[]).push(n); });\n  const units=level==='setor'?closingNames:Object.keys(mv.unitMunis);\n\n  const drawnCsv=new Set(closingNames.map(n=>DOM.hasUf?n:mName(n)));\n  const footKeyOf=k=>DOM.hasUf?(footprint.has(k)?k:null):([...footprint].find(x=>mName(x)===k)||null);\n  mv.csvMunisTotal=domOwn.size;\n  mv.ufGuessed={...ufGuessed};\n  if(level==='setor'){\n    mv.missingMunis=[...domOwn].filter(k=>!drawnCsv.has(k)).map(k=>{\n      const fk=footKeyOf(k);\n      const hasShape=!!(adj.feat[fk||k]||world.muniGeo[fk||k]);\n      const alias=[...footprint].filter(x=>x!==k&&mName(x)===mName(k));\n      let reason;\n      if(!fk&&alias.length) reason=`UF divergente — as CBs entraram na chave ${alias.join(' / ')} e a base diz ${k}`;\n      else if(!fk) reason=hasShape?'sem CBs neste setor no snapshot — desenhado como vizinho':'sem CBs neste setor no snapshot';\n      else if(!hasShape) reason='sem shape nas UFs carregadas';\n      else reason='chave não casou com a base de dominantes';\n      return {muni:k,cbs:(fk?totBy[fk]:alias.reduce((a,x)=>a+(totBy[x]||0),0))||0,reason:reason};\n    });\n  } else {\n    mv.missingMunis=[];\n  }\n\n  // ---- HARD RULE: destino tem de compartilhar a fronteira certa acima do que está fechando ----\n  // setor → mesma GV; GV → mesmo mercado; mercado → nada acima, qualquer vizinho vale.\n  const ownParent=parentOf(level,code);\n  if(level!=='mercado' && !ownParent) throw new Error(`${LEVELS[level].label} ${code} não tem ${level==='setor'?'CD_GV':'MERCADO'} na base de municípios dominantes — sem essa fronteira não há como garantir que os destinos ficam do lado certo da hierarquia`);\n  const sameParent=destCode=>!ownParent||parentOf(level,destCode)===ownParent;\n  mv.gv=ownParent;\n  const alreadyClosed=destCode=>level==='setor'?world.closedSectors.has(destCode):(level==='gv'?(world.closedGvs||new Set()).has(destCode):(world.closedMercados||new Set()).has(destCode));\n\n  const destRule=(SESS.settings&&SESS.settings.destRule)||DEFAULT_SETTINGS.destRule;\n  const destMinCbs=Math.max(1,Math.round(+((SESS.settings||{}).destMinCbs)||DEFAULT_SETTINGS.destMinCbs));\n  mv.destRule=destRule; mv.destMinCbs=destMinCbs; mv.destRuleFallback=false;\n  mv.allowed={}; mv.allowedRaw={};\n  units.forEach(u=>{ mv.allowed[u]={}; mv.allowedRaw[u]={}; });\n\n  const extVotes={}; const nbrNames=new Set(); let domSecOf={};\n  if(level==='setor'){\n    // setor: destino descoberto por ADJACÊNCIA GEOGRÁFICA de município — uma query ao vivo por\n    // vizinho, mas o perímetro de UM setor é pequeno o bastante pra valer a pena.\n    closingNames.forEach(n=>{\n      if(!adj.feat[n]) return;\n      adj.nbrs(n).forEach(({o,w})=>{ if(!closingSet.has(o) && !droppedSet.has(o)){ nbrNames.add(o); (extVotes[n]=extVotes[n]||[]).push({o,w}); } });\n    });\n    let neigh=[];\n    if(nbrNames.size){\n      const inList=[...new Set([...nbrNames].map(n=>mName(n)))].map(n=>`'${n.replace(/'/g,\"''\")}'`).join(',');\n      const nSQL=`SELECT DS_MUNICIPIO municipio, CD_SETOR setor, COUNT(DISTINCT CD_CONSULTORA) cbs\n        FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR NOT IN (${secList}) AND CD_SETOR>0 AND DT_HISTORICO=${SNAP} AND DS_MUNICIPIO IN (${inList}) GROUP BY DS_MUNICIPIO, CD_SETOR`;\n      neigh=rows(await q(nSQL));\n    }\n    neigh.forEach(r=>{ if(!r.uf) r.uf=ufFor(r.setor,r.municipio); });\n    const byM={}; neigh.forEach(r=>{const m=mkey(r.municipio,r.uf); if(!nbrNames.has(m)) return; (byM[m]=byM[m]||[]).push(r);});\n    Object.entries(byM).forEach(([m,rs])=>{ rs.sort((a,b)=>+b.cbs-+a.cbs); domSecOf[m]=String(rs[0].setor); });\n    nbrNames.forEach(n=>{ if(world.muniOverride && world.muniOverride[n]) domSecOf[n]=world.muniOverride[n]; });\n\n    mv.nbrCurrentSector={};\n    mv.gvRejected=[];\n    const gvHidden=new Set();\n    nbrNames.forEach(n=>{\n      const destCode=destUnitOfSector(level,domSecOf[n],world);\n      if(destCode && !sameParent(destCode)){ gvHidden.add(n); if(mv.gvRejected.indexOf(destCode)<0) mv.gvRejected.push(destCode); return; }\n      if(domSecOf[n]) mv.nbrCurrentSector[n]=destCode;\n    });\n    gvHidden.forEach(n=>{ nbrNames.delete(n); delete domSecOf[n]; delete mv.nbrCurrentSector[n]; });\n    Object.keys(extVotes).forEach(n=>{ extVotes[n]=extVotes[n].filter(v=>!gvHidden.has(v.o)); });\n\n    const isBridge=n=>destRule!=='dominant'||(totBy[n]||0)>=destMinCbs;\n    mv.bridgeMunis=closingNames.filter(isBridge);\n    mv.ignoredBridges=closingNames.filter(n=>!isBridge(n));\n\n    const wAny={}, wDom={};\n    closingNames.forEach(n=>{\n      const u=n;\n      if(!mv.allowed[u]) return;\n      const bridge=isBridge(n);\n      (extVotes[n]||[]).forEach(({o,w})=>{\n        const destCode=mv.nbrCurrentSector[o];\n        if(!destCode || destCode===code || alreadyClosed(destCode)) return;\n        mv.allowed[u][destCode]=(mv.allowed[u][destCode]||0)+w;\n        mv.allowedRaw[u][destCode]=(mv.allowedRaw[u][destCode]||0)+w;\n        wAny[destCode]=(wAny[destCode]||0)+w;\n        if(bridge) wDom[destCode]=(wDom[destCode]||0)+w;\n      });\n    });\n    let secWeight=wAny;\n    if(destRule==='dominant'){\n      if(Object.keys(wDom).length) secWeight=wDom;\n      else { secWeight=wAny; mv.destRuleFallback=true; }\n    }\n    mv.dest=Object.keys(secWeight).sort((a,b)=>secWeight[b]-secWeight[a]).slice(0,6);\n    if(!mv.dest.length){\n      mv.dest=[...new Set(Object.values(mv.nbrCurrentSector))].filter(destCode=>destCode&&destCode!==code&&!alreadyClosed(destCode)&&sameParent(destCode)).slice(0,6);\n      units.forEach(u=>{ if(mv.allowed[u]&&!Object.keys(mv.allowed[u]).length){ mv.dest.forEach(destCode=>mv.allowed[u][destCode]=1); } });\n    }\n  } else {\n    // GV/mercado: destino é SEMPRE todo irmão válido na hierarquia — NUNCA descoberto por\n    // adjacência geográfica de município. Uma GV/mercado pode ter território espalhado por\n    // dezenas de UFs sem qualquer conexão física entre as partes (a hierarquia aqui é\n    // organizacional, não geográfica) — \"vizinho por fronteira de município\" não é só caro (a\n    // query ao vivo vira um IN-list de centenas de municípios e estoura timeout: foi exatamente\n    // isso que quebrou o fechamento de um mercado espalhado) — é a pergunta errada. A fronteira que\n    // já importa (mesma GV / mesmo mercado) é imposta pela regra de parentesco logo acima; dentro\n    // dela QUALQUER irmão é candidato, e o otimizador decide pelo equilíbrio de span e continuidade\n    // de líder, nunca por proximidade física — geografia não pesa aqui.\n    mv.nbrCurrentSector={};\n    mv.gvRejected=[];\n    mv.bridgeMunis=closingNames.slice();\n    mv.ignoredBridges=[];\n    const siblings=level==='gv'\n      ? [...(DOM.gvsByMercado[ownParent]||[])]\n      : Object.keys(DOM.sectorsByMercado||{});\n    mv.dest=siblings.filter(destCode=>destCode!==code && !alreadyClosed(destCode) && sameParent(destCode));\n    units.forEach(u=>{ mv.dest.forEach(destCode=>{ mv.allowed[u][destCode]=1; mv.allowedRaw[u][destCode]=1; }); });\n  }\n  mv.dest=mv.dest.filter(sameParent);\n\n  // ---- O QUE É DESENHADO: território COMPLETO de cada destino (não só a borda), sempre lido da\n  // mesma base de dominantes já usada pro lado que fecha.\n  const territoryOf=destCode=>{\n    const secs=memberSectorsOf(level,destCode,world);\n    const out=new Set();\n    secs.forEach(s=>(domBase[String(s)]||new Set()).forEach(n=>out.add(n)));\n    return out;\n  };\n  const drawSet=new Set(mv.dest);\n  mv.dest.forEach(destCode=>{\n    territoryOf(destCode).forEach(n=>{\n      if(nbrNames.has(n)) return;\n      nbrNames.add(n);\n      mv.nbrCurrentSector[n]=(level==='setor'&&world.muniOverride&&world.muniOverride[n])?world.muniOverride[n]:destCode;\n    });\n  });\n  mv.nbrFeat=[...nbrNames].filter(n=>drawSet.has(mv.nbrCurrentSector[n])).map(n=>adj.feat[n]&&adj.feat[n].f).filter(Boolean);\n  units.forEach(u=>{ Object.keys(mv.allowed[u]||{}).forEach(destCode=>{ if(!mv.dest.includes(destCode)) delete mv.allowed[u][destCode]; }); });\n  mv.color={}; mv.dest.forEach((destCode,i)=>mv.color[destCode]=PALETTE[i%PALETTE.length]);\n\n  const accC={}; Object.entries(mv.nbrCurrentSector).forEach(([nb,destCode])=>{ if(!mv.dest.includes(destCode))return; const f=(adj.feat[nb]&&adj.feat[nb].f)||world.muniGeo[nb]; if(!f)return; const c=centroidLL(f); accC[destCode]=accC[destCode]||[0,0,0]; accC[destCode][0]+=c[0]; accC[destCode][1]+=c[1]; accC[destCode][2]++; });\n  mv.secCentroid={}; mv.dest.forEach(destCode=>{ if(accC[destCode]) mv.secCentroid[destCode]=[accC[destCode][0]/accC[destCode][2],accC[destCode][1]/accC[destCode][2]]; });\n\n  if(level==='setor'){\n    mv.muniCentroid={}; closingNames.forEach(n=>{ if(mv.geoFeat[n]) mv.muniCentroid[n]=centroidLL(mv.geoFeat[n]); });\n    mv.closeAdj={}; closingNames.forEach(n=>{ mv.closeAdj[n]=adj.feat[n]?adj.nbrs(n).filter(({o})=>closingSet.has(o)).map(({o})=>o):[]; });\n  } else {\n    mv.muniCentroid={};\n    Object.entries(mv.unitMunis).forEach(([u,ms])=>{\n      const cs=ms.map(n=>mv.geoFeat[n]&&centroidLL(mv.geoFeat[n])).filter(Boolean);\n      if(cs.length) mv.muniCentroid[u]=[cs.reduce((a,c)=>a+c[0],0)/cs.length,cs.reduce((a,c)=>a+c[1],0)/cs.length];\n    });\n    mv.closeAdj={};\n    const unitSet=new Set(units);\n    Object.entries(mv.unitMunis).forEach(([u,ms])=>{\n      const touch=new Set();\n      ms.forEach(n=>{ if(!adj.feat[n]) return; adj.nbrs(n).forEach(({o})=>{ const ou=mv.unitOfMuni[o]; if(ou&&ou!==u&&unitSet.has(ou)) touch.add(ou); }); });\n      mv.closeAdj[u]=[...touch];\n    });\n  }\n  const comp={}; let ci=0; units.forEach(n=>{ if(comp[n]!=null)return; const st=[n]; comp[n]=ci; while(st.length){ const x=st.pop(); (mv.closeAdj[x]||[]).forEach(o=>{ if(comp[o]==null){ comp[o]=ci; st.push(o); } }); } ci++; });\n  const compAllowed={}; units.forEach(n=>{ const cid=comp[n]; (compAllowed[cid]=compAllowed[cid]||new Set()); Object.keys(mv.allowed[n]||{}).forEach(s=>compAllowed[cid].add(s)); });\n  mv.reachable={}; units.forEach(n=>{ mv.reachable[n]=[...(compAllowed[comp[n]]||[])].filter(s=>mv.dest.includes(s)); });\n\n  if(mv.dest.length){\n    const destSectorMap={}; mv.dest.forEach(destCode=>{ destSectorMap[destCode]=memberSectorsOf(level,destCode,world); });\n    const allDestSecs=[...new Set(Object.values(destSectorMap).flat())];\n    const rList=allDestSecs.join(',');\n    const bSQL=`SELECT CD_SETOR setor, COUNT(DISTINCT CD_CONSULTORA) cbs,\n       SUM(CASE WHEN ST_FEZ_PED_CICLO_ATUAL THEN 1 ELSE 0 END) ativas,\n       ROUND(SUM(VL_PEDIDOS_CICLO),0) receita, ROUND(SUM(VL_PEDIDOS_NATURA_CICLO),0) rec_nat,\n       ROUND(SUM(VL_PEDIDOS_AVON_CICLO),0) rec_avon, ROUND(SUM(QT_PONTOS_CICLO),0) pontos, ROUND(SUM(QT_PEDIDOS_CICLO),0) pedidos\n      FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR IN (${rList}) AND DT_HISTORICO=${SNAP} GROUP BY CD_SETOR`;\n    const blSQL=`SELECT CD_SETOR setor, DS_NVL_PLAN_CRESC nivel, COUNT(DISTINCT CD_CONSULTORA) cbs\n      FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR IN (${rList}) AND DS_NVL_PLAN_CRESC IS NOT NULL AND DT_HISTORICO=${SNAP} GROUP BY CD_SETOR, DS_NVL_PLAN_CRESC`;\n    const [bR,blR]=await Promise.all([q(bSQL),q(blSQL)]);\n    const secMetrics={}; rows(bR).forEach(r=>{ secMetrics[String(r.setor)]=r; if(!SESS.sectorBaseCache[String(r.setor)]) SESS.sectorBaseCache[String(r.setor)]=r; });\n    const secLevel={}; rows(blR).forEach(r=>{ const s=String(r.setor); (secLevel[s]=secLevel[s]||{})[r.nivel]=+r.cbs; });\n    mv.baseMetrics={}; mv.baseLevel={};\n    mv.dest.forEach(destCode=>{\n      const secs=destSectorMap[destCode];\n      const acc=blankM(); acc.setor=destCode;\n      secs.forEach(s=>{ const r=secMetrics[String(s)]; if(!r) return; Object.keys(blankM()).forEach(k=>{ acc[k]=(+acc[k]||0)+(+r[k]||0); }); });\n      mv.baseMetrics[destCode]=acc;\n      const lv={}; secs.forEach(s=>{ const l=secLevel[String(s)]; if(!l) return; Object.entries(l).forEach(([nv,c])=>{ lv[nv]=(lv[nv]||0)+c; }); });\n      mv.baseLevel[destCode]=lv;\n    });\n  } else { mv.baseMetrics={}; mv.baseLevel={}; }\n\n  mv.dest.forEach(destCode=>{\n    if(!mv.baseMetrics[destCode]) mv.baseMetrics[destCode]={setor:destCode,cbs:0,ativas:0,receita:0,rec_nat:0,rec_avon:0,pontos:0,pedidos:0};\n    const inflowSrc=level==='setor'?world.sectorInflow:(level==='gv'?world.gvInflow:world.mercadoInflow);\n    const infl=inflowSrc&&inflowSrc[destCode];\n    if(infl) Object.keys(blankM()).forEach(k=>{ mv.baseMetrics[destCode][k]=(+mv.baseMetrics[destCode][k]||0)+(infl[k]||0); });\n    if(level==='setor'){\n      const inflLv=world.sectorInflowLevel&&world.sectorInflowLevel[destCode];\n      if(inflLv){ mv.baseLevel[destCode]=mv.baseLevel[destCode]||{}; Object.entries(inflLv).forEach(([nv,c])=>{ mv.baseLevel[destCode][nv]=(mv.baseLevel[destCode][nv]||0)+c; }); }\n    }\n  });\n\n  aggregateMovement(mv);\n  mv.assign=optimizeFor(mv);\n  return mv;\n}\n\n// ---------- cascade engine ----------\nasync function computeAt(i){\n  await ensurePinned();\n  const world=foldWorldState(SESS.timeline,i);\n  const sec=SESS.timeline[i].sector;\n  const level=SESS.timeline[i].level||'setor';\n  const mv=await computeMovement(sec,level,world);\n  SESS.timeline[i]=mv;\n}\nasync function recomputeFrom(i){\n  for(let k=i;k<SESS.timeline.length;k++){\n    loader(true,`recalculando etapa ${k+1} de ${SESS.timeline.length}…`);\n    try{ await computeAt(k); }\n    catch(e){\n      // A stage that failed to recompute still holds its PREVIOUS result, so the timeline would\n      // silently mix pre- and post-change etapas. Flag this stage and everything after it as stale\n      // (dashed chip + ⟳) so the state is visible and flushDirty retries from here.\n      SESS.dirtyFrom = SESS.dirtyFrom==null ? k : Math.min(SESS.dirtyFrom,k);\n      throw e;\n    }\n  }\n}\nasync function flushDirty(){\n  if(SESS.dirtyFrom==null) return;\n  const from=SESS.dirtyFrom; SESS.dirtyFrom=null;\n  loader(true,'recalculando etapas seguintes…');\n  try{ await recomputeFrom(from); }\n  catch(e){ $('#ds').textContent='erro ao recalcular cadeia: '+e.message; $('#ds').classList.add('err'); }\n  finally{ loader(false); }\n}\nasync function addMovement(level,sec){\n  level=level||'setor';\n  sec=(sec==null?'':String(sec)).trim();\n  if(!sec) return;\n  if(!movementAvailable(level)){ $('#ds').textContent=`Fechar ${LEVELS[level].label} ainda não está disponível.`; $('#ds').classList.add('err'); return; }\n  if(!hierarchyAllows(level)){ const minLabel=LEVELS[Object.keys(LEVEL_RANK).find(k=>LEVEL_RANK[k]===sessionMinRank())].label; $('#ds').textContent=`esta sessão já fechou um nível mais alto — só \"${minLabel}\" (ou acima) fica disponível.`; $('#ds').classList.add('err'); return; }\n  const closedNow=new Set(SESS.timeline.filter(mv=>(mv.level||'setor')===level).map(mv=>mv.sector));\n  if(closedNow.has(sec)){ $('#ds').textContent=LEVELS[level].label+' '+sec+' já fechado(a) nesta timeline.'; $('#ds').classList.add('err'); return; }\n  if(level==='setor' && !SESS.sectorsList.some(s=>s.setor===sec)){ $('#ds').textContent='setor \"'+sec+'\" não existe no snapshot congelado.'; $('#ds').classList.add('err'); return; }\n  await flushDirty();\n  loader(true,`fechando ${lc(LEVELS[level].label)} `+sec+' — puxando dado do snapshot congelado…');\n  $('#liveState').classList.remove('err');\n  try{\n    SESS.timeline.push({sector:String(sec),level:level});\n    await computeAt(SESS.timeline.length-1);\n    SESS.selected=SESS.timeline.length-1;\n    $('#ds').classList.remove('err'); $('#ds').textContent='';\n  }catch(e){\n    SESS.timeline.pop();\n    $('#ds').textContent=`erro ao fechar ${lc(LEVELS[level].label)} `+sec+': '+e.message; $('#ds').classList.add('err');\n  } finally { loader(false); renderAll(); }\n}\nfunction removeFrom(i){\n  SESS.timeline.length=i;\n  SESS.selected=Math.min(SESS.selected,Math.max(0,SESS.timeline.length-1));\n  if(SESS.dirtyFrom!=null && SESS.dirtyFrom>=SESS.timeline.length) SESS.dirtyFrom=null;\n  renderAll();\n}\nasync function editSelected(mutator){\n  const mv=SESS.timeline[SESS.selected]; if(!mv) return;\n  mutator(mv);\n  if(SESS.selected<SESS.timeline.length-1){\n    SESS.dirtyFrom = SESS.dirtyFrom==null ? SESS.selected+1 : Math.min(SESS.dirtyFrom, SESS.selected+1);\n  }\n  renderAll();\n}\n\n// ---------- sectors list / picker ----------\nasync function loadSectors(){\n  const sql=`SELECT CD_SETOR setor, MAX(DS_ESTADO) uf, COUNT(DISTINCT CD_CONSULTORA) cbs, COUNT(DISTINCT DS_MUNICIPIO) munis\n    FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR>0 AND DT_HISTORICO=(SELECT MAX(DT_HISTORICO) FROM ${T} WHERE CD_PAIS=1) GROUP BY CD_SETOR ORDER BY CD_SETOR`;\n  SESS.sectorsList=rows(await q(sql)).map(r=>({setor:String(r.setor),uf:r.uf,cbs:+r.cbs,munis:+r.munis}));\n}\nfunction renderSectorPicker(){\n  const ready=SESS.stage==='main';\n  const ob=$('#openMove'); if(ob) ob.disabled=!ready;\n}\n\n// ---------- movement modal (setor / GV / mercado) ----------\n// Hierarquia mercado > GV > setor: a sessão trava no nível da primeira movimentação. Misturar\n// níveis quebraria a leitura de \"antes/depois\" da cadeia — fechar uma GV já redistribui setores\n// inteiros pra outras GVs; fechar um setor isolado depois não bate mais com o mundo que sobrou.\n// de/a/no: contrações de \"de\"/\"a\"/\"em\" com o artigo de cada nível — GV é feminina (a Gerência de\n// Vendas), setor e mercado são masculinos. Errar o gênero aqui é o tipo de coisa que grita \"isto foi\n// feito pra setor e só remendado pros outros níveis\", exatamente o que este objeto existe pra evitar.\nconst LEVELS={\n  setor:{label:'Setor',codeLbl:'Setor a fechar',placeholder:'código do setor',childLabel:'Município',destLabel:'Setor',de:'do',a:'ao',no:'no',parentLabel:'GV',parentPhrase:'da mesma GV',parentWord:'gerência'},\n  gv:{label:'GV',codeLbl:'GV a fechar',placeholder:'código da GV',childLabel:'Setor',destLabel:'GV',de:'da',a:'à',no:'na',parentLabel:'Mercado',parentPhrase:'do mesmo mercado',parentWord:'mercado'},\n  mercado:{label:'Mercado',codeLbl:'Mercado a fechar',placeholder:'nome do mercado',childLabel:'GV',destLabel:'Mercado',de:'do',a:'ao',no:'no',parentLabel:null,parentPhrase:null,parentWord:null},\n};\n// GV é sigla — .toLowerCase() a transformaria em \"gv\", errado em qualquer posição da frase. Palavras\n// normais (Setor/Mercado/Município) minúsculam à vontade no meio de uma frase; GV nunca.\nconst LOWER={Setor:'setor',Mercado:'mercado',Município:'município',GV:'GV'};\nconst lc=w=>LOWER[w]||w.toLowerCase();\n// Hierarquia é uma catraca, não um cadeado: mercado(0) > GV(1) > setor(2). Fechar um nível mais\n// alto (número menor) trava PRA SEMPRE nesta sessão qualquer nível mais baixo (número maior) —\n// mas o próprio nível, ou um ainda mais alto, continua liberado. É assim que \"posso fechar setores\n// até fechar uma GV; posso fechar GVs até fechar um mercado\" funciona: nunca destrava de volta.\nconst LEVEL_RANK={mercado:0,gv:1,setor:2};\nfunction sessionMinRank(){\n  let r=LEVEL_RANK.setor;\n  SESS.timeline.forEach(mv=>{ const rk=LEVEL_RANK[mv.level||'setor']; if(rk<r) r=rk; });\n  return r;\n}\nfunction hierarchyAllows(lvl){ return LEVEL_RANK[lvl]<=sessionMinRank(); }\nfunction movementAvailable(lvl){ return lvl==='setor'||lvl==='gv'||lvl==='mercado'; }\n// ---------- hierarquia: setor ⊂ GV ⊂ mercado — tudo derivado da base de dominantes (DOM) ----------\n// memberSectors: o escopo de CD_SETOR que a query no CRM precisa cobrir pra fechar este código, em\n// qualquer nível — um setor é ele mesmo; uma GV é todo setor que a base lhe atribui; um mercado é\n// todo setor de toda GV que a base atribui a ele.\n// membros ATUAIS de um GV/mercado, um nível abaixo (setores de uma GV; GVs de um mercado) — nunca\n// só a foto estática do CSV: uma etapa anterior NESTA MESMA sessão pode já ter movido um filho pra\n// dentro ou pra fora deste código, e um fechamento seguinte tem de enxergar o mundo como ele está\n// agora, não como o CSV descreveu antes de qualquer movimentação.\nfunction currentMembersOf(level,code,world){\n  code=String(code);\n  // \"gv\": setores da GV (DOM.sectorsByGv). \"mercado\": GVs do mercado (DOM.gvsByMercado) — NUNCA\n  // sectorsByMercado, que pula a camada de GV inteira e faz memberSectorsOf tratar códigos de\n  // setor como se fossem códigos de GV (não batem em DOM.sectorsByGv, e o fechamento morre com\n  // \"não existe na base\" mesmo quando o mercado está lá).\n  const staticMembers=level==='gv'?(DOM.sectorsByGv[code]||new Set()):(DOM.gvsByMercado[code]||new Set());\n  const overrideMap=level==='gv'?(world&&world.secOverride):(world&&world.gvOverride);\n  const out=new Set(staticMembers);\n  if(overrideMap){\n    Object.entries(overrideMap).forEach(([child,dest])=>{\n      if(dest===code) out.add(child);\n      else if(staticMembers.has(child)) out.delete(child);\n    });\n  }\n  return [...out];\n}\n// setores que a query no CRM precisa cobrir pra fechar este código, em qualquer nível — setor é\n// ele mesmo; GV é seus setores ATUAIS; mercado é todo setor de toda GV ATUALMENTE sua (setor não\n// troca de GV sozinho numa sessão de mercado — só GV inteira troca de mercado).\nfunction memberSectorsOf(level,code,world){\n  code=String(code);\n  if(level==='setor') return [code];\n  if(level==='gv') return currentMembersOf('gv',code,world);\n  const gvs=currentMembersOf('mercado',code,world);\n  const out=new Set();\n  gvs.forEach(gv=>(DOM.sectorsByGv[gv]||new Set()).forEach(s=>out.add(s)));\n  return [...out];\n}\n// fronteira que um destino tem de respeitar: GV do setor que fecha, mercado da GV que fecha —\n// mercado não tem nada acima, então não existe regra pra ele. Estática de propósito: um setor não\n// troca de GV nem uma GV troca de mercado só por existirem etapas anteriores nesta sessão — quem\n// muda de dono é o NÍVEL ABAIXO do que está fechando, nunca o próprio código sendo avaliado aqui.\nfunction parentOf(level,code){\n  code=String(code);\n  if(level==='setor') return DOM.gvBySetor[code]||'';\n  if(level==='gv') return DOM.mercadoByGv[code]||'';\n  return '';\n}\n// dado o setor que uma município vizinha atualmente pertence (fato ao vivo do CRM, nunca muda de\n// verdade), a que CANDIDATO A DESTINO isso corresponde neste nível — considerando que uma etapa\n// anterior desta sessão pode já ter movido esse setor (GV fechando) ou essa GV (mercado fechando)\n// pra outro dono, o que a foto estática do CSV sozinha não enxergaria.\nfunction destUnitOfSector(level,setorCode,world){\n  setorCode=String(setorCode);\n  if(level==='setor') return setorCode;\n  if(level==='gv'){ const ov=world&&world.secOverride&&world.secOverride[setorCode]; return ov||DOM.gvBySetor[setorCode]||''; }\n  const gv=DOM.gvBySetor[setorCode]||'';\n  const ov=world&&world.gvOverride&&world.gvOverride[gv];\n  return ov||DOM.mercadoBySetor[setorCode]||'';\n}\nfunction currentMoveLevel(){ const r=root.querySelector('input[name=\"moveLevel\"]:checked'); return (r&&r.value)||'setor'; }\nfunction openMove(){\n  const minRank=sessionMinRank();\n  const lastLevel=SESS.timeline.length?(SESS.timeline[SESS.timeline.length-1].level||'setor'):'setor';\n  root.querySelectorAll('input[name=\"moveLevel\"]').forEach(r=>{\n    const lvl=r.value;\n    r.disabled=!movementAvailable(lvl)||!hierarchyAllows(lvl);\n    r.checked=hierarchyAllows(lastLevel)?lvl===lastLevel:lvl===Object.keys(LEVEL_RANK).find(k=>LEVEL_RANK[k]===minRank);\n  });\n  const note=$('#moveLockNote');\n  const minLabel=LEVELS[Object.keys(LEVEL_RANK).find(k=>LEVEL_RANK[k]===minRank)].label;\n  if(note) note.textContent=minRank<LEVEL_RANK.setor\n    ? `Esta sessão já fechou um nível mais alto na hierarquia — só \"${minLabel}\" (ou acima) continua disponível daqui pra frente.`\n    : 'Escolha o nível a fechar. Você pode fechar setores à vontade até fechar uma GV; aí só GV (ou mercado) daqui pra frente. Fechar um mercado trava a sessão em mercado.';\n  $('#moveCode').value='';\n  const err=$('#moveErr'); if(err){ err.textContent=''; err.classList.add('hidden'); }\n  const st=$('#moveStatus'); if(st) st.textContent='';\n  $('#moveBg').classList.remove('hidden');\n  renderMoveForm();\n  const c=$('#moveCancel'); if(c) c.focus();\n}\nfunction closeMove(){ const b=$('#moveBg'); if(b) b.classList.add('hidden'); }\nfunction renderMoveForm(){\n  root.querySelectorAll('#moveBg .opt-row').forEach(r=>r.classList.toggle('on',r.dataset.lvl===currentMoveLevel()));\n  const lvl=LEVELS[currentMoveLevel()];\n  $('#moveCodeLbl').textContent=lvl.codeLbl;\n  $('#moveCode').placeholder=lvl.placeholder;\n  loadMoveOptions();\n}\nasync function loadMoveOptions(){\n  const lvl=currentMoveLevel();\n  const dl=$('#moveCodeList'); if(!dl) return;\n  const closedSet=new Set(SESS.timeline.filter(mv=>(mv.level||'setor')===lvl).map(mv=>mv.sector));\n  if(lvl==='setor'){\n    dl.innerHTML=SESS.sectorsList.filter(s=>!closedSet.has(s.setor))\n      .map(s=>`<option value=\"${s.setor}\">${s.setor} · ${s.uf||'?'} · ${fmt(s.cbs)} CBs · ${s.munis} munic.</option>`).join('');\n    return;\n  }\n  dl.innerHTML='';\n  try{ await ensureDominantes(); }catch(e){ return; }\n  if(lvl==='gv'){\n    const gvs=Object.keys(DOM.sectorsByGv||{}).filter(g=>!closedSet.has(g)).sort();\n    dl.innerHTML=gvs.map(g=>`<option value=\"${g}\">${g}${DOM.gvLabel[g]?' · '+esc(DOM.gvLabel[g]):''} · ${DOM.sectorsByGv[g].size} setor(es)</option>`).join('');\n  } else if(lvl==='mercado'){\n    const mks=Object.keys(DOM.sectorsByMercado||{}).filter(m=>!closedSet.has(m)).sort();\n    dl.innerHTML=mks.map(m=>`<option value=\"${m}\">${m} · ${(DOM.gvsByMercado[m]||new Set()).size} GV(s) · ${DOM.sectorsByMercado[m].size} setor(es)</option>`).join('');\n  }\n}\nfunction moveRandPick(){\n  const opts=[...($('#moveCodeList').options||[])].map(o=>o.value);\n  if(!opts.length) return;\n  $('#moveCode').value=opts[Math.floor(Math.random()*opts.length)];\n}\nasync function submitMove(){\n  const lvl=currentMoveLevel();\n  const code=($('#moveCode').value||'').trim();\n  const err=$('#moveErr');\n  const fail=msg=>{ if(err){ err.textContent=msg; err.classList.remove('hidden'); } };\n  if(err){ err.textContent=''; err.classList.add('hidden'); }\n  if(!movementAvailable(lvl)) return fail(`Fechar ${LEVELS[lvl].label} ainda não está disponível.`);\n  if(!hierarchyAllows(lvl)){ const minLabel=LEVELS[Object.keys(LEVEL_RANK).find(k=>LEVEL_RANK[k]===sessionMinRank())].label; return fail(`Esta sessão já fechou um nível mais alto — só \"${minLabel}\" (ou acima) fica disponível.`); }\n  if(!code) return fail('Informe um código.');\n  closeMove();\n  await addMovement(lvl,code);\n}\nfunction renderStage(){\n  const isMain=SESS.stage==='main';\n  const cc=$('#confirmCard'), mw=$('#mainWrap');\n  const hdr=$('#topHeader'), rl=$('#timelineRail');\n  if(hdr) hdr.classList.toggle('hidden', !isMain);\n  if(rl) rl.classList.toggle('hidden', !isMain);\n  if(cc) cc.classList.toggle('hidden', isMain);\n  if(mw) mw.classList.toggle('hidden', !isMain);\n  const cb=$('#confirmBody');\n  if(cb && !isMain) cb.innerHTML = SESS.snapshotRaw\n    ? `Snapshot congelado · atualizado em <b>${fmtSyncedAt(SESS.snapshotSyncedAt)}</b> · <b>${SESS.sectorsList.length}</b> setor(es) disponível(eis) pra fechar. Nenhuma consulta de detalhe roda até você confirmar e escolher o primeiro setor.`\n    : 'congelando snapshot…';\n}\n\n// ---------- session persistence ----------\n// ONE table (`timeline-shared-sessions`) holds BOTH kinds of row, so SESSIONS_DS and SHARED_DS\n// deliberately resolve to the SAME DataSet — the two names mark intent, not two stores:\n//   · working session  — carries `movements`; saveSession updates it in place\n//   · shared snapshot  — carries `sharedAt` + `stages`; doShare CREATES it and nothing updates it\n// listSessions MUST exclude the shared rows. They are write-once by contract, and if one showed\n// up in the picker, loading it and pressing Salvar would fire ds.update() straight at a frozen\n// snapshot. Filtering here is what keeps that unreachable — it is the guard, not a cosmetic.\n// Both lookups stay because a policy-gated DataSet's Process resolves late; same race the reader\n// component polls for. SESSIONS_DS lives at module scope so no call site can hit it in the TDZ.\nasync function listSessions(){\n  const ds=(d2.data('sessionsDataset')||d2.data(SESSIONS_DS)); if(!ds) return [];\n  await ds.refresh();\n  const recs=ds.records()||[];\n  return [...recs].filter(r=>!r.sharedAt).sort((a,b)=>new Date(b.updatedAt||0)-new Date(a.updatedAt||0));\n}\nasync function refreshSessionPicker(){\n  const list=await listSessions().catch(()=>[]);\n  SESS.sessionsList=list;\n  const opts=list.map(s=>`<option value=\"${s._id}\">${esc(s.label||'sem nome')} · ${fmt((s.movements||[]).length)} etapa(s)</option>`).join('')+`<option value=\"\">+ Nova sessão</option>`;\n  const sel=$('#sessionPick'); if(sel){ sel.innerHTML=opts; sel.value=SESS.sessionId||''; }\n  const csel=$('#confirmSessionPick'); if(csel){ csel.innerHTML=opts; csel.value=SESS.sessionId||''; }\n}\nasync function saveSession(){\n  const ds=(d2.data('sessionsDataset')||d2.data(SESSIONS_DS));\n  if(!ds){ $('#sessStatus').textContent='dataset de sessões indisponível'; return; }\n  if(!SESS.timeline.length){ $('#sessStatus').textContent='nada pra salvar ainda'; return; }\n  await flushDirty();\n  const label=SESS.sessionLabel||('Sessão '+new Date().toLocaleString('pt-BR'));\n  const nowIso=new Date().toISOString();\n  const payload={\n    label,\n    settings:{...DEFAULT_SETTINGS,...(SESS.settings||{})},\n    snapshotRaw:SESS.snapshotRaw, snapshotSyncedAt:SESS.snapshotSyncedAt, snapLiteral:SESS.snapLiteral, eloMaxCycle:SESS.eloMaxCycle,\n    movements:SESS.timeline.map(mv=>({\n      sector:mv.sector, level:mv.level||'setor', assign:mv.assign, policy:mv.policy,\n      matrix:mv.matrix, trend:mv.trend, levels:mv.levels, levelByMuni:mv.levelByMuni,\n      pureOwnMetrics:mv.pureOwnMetrics, domUF:mv.domUF, dest:mv.dest, color:mv.color,\n      gv:mv.gv, gvRejected:mv.gvRejected,\n      missingMunis:mv.missingMunis, csvMunisTotal:mv.csvMunisTotal, ufGuessed:mv.ufGuessed,\n      baseMetrics:mv.baseMetrics, baseLevel:mv.baseLevel, geoFeat:mv.geoFeat, nbrFeat:mv.nbrFeat,\n      nbrCurrentSector:mv.nbrCurrentSector, allowed:mv.allowed, allowedRaw:mv.allowedRaw, reachable:mv.reachable,\n      destRule:mv.destRule, destMinCbs:mv.destMinCbs, destRuleFallback:mv.destRuleFallback, optTier:mv.optTier,\n      cbsByMuni:mv.cbsByMuni, shapeMunis:mv.shapeMunis, excludedMunis:mv.excludedMunis, domCsvMunis:mv.domCsvMunis,\n      excludedCbs:mv.excludedCbs, noShapeMunis:mv.noShapeMunis, noShapeCbs:mv.noShapeCbs,\n      secCentroid:mv.secCentroid, muniCentroid:mv.muniCentroid, closeAdj:mv.closeAdj, optBadge:mv.optBadge,\n    })),\n    updatedAt:nowIso,\n  };\n  $('#sessStatus').textContent='salvando…';\n  try{\n    if(SESS.sessionId){\n      await ds.update({_id:SESS.sessionId,...payload});\n    } else {\n      payload.createdAt=nowIso;\n      const created=await ds.create(payload);\n      SESS.sessionId=(created&&created._id)||(created&&created.data&&created.data._id)||(ds.selected&&ds.selected()&&ds.selected()._id)||null;\n    }\n    SESS.sessionLabel=label;\n    await refreshSessionPicker();\n    $('#sessStatus').textContent='salvo ✓';\n  }catch(e){ $('#sessStatus').textContent='erro ao salvar: '+e.message; }\n  setTimeout(()=>{ if($('#sessStatus')) $('#sessStatus').textContent=''; },2200);\n}\n// Duplicate = drop sessionId so saveSession takes its CREATE branch instead of its update branch.\n// The source record is never written to, the copy gets a fresh _id and its own createdAt, and the\n// copy becomes the active session (so the next Salvar edits the copy, not the original).\nasync function duplicateSession(){\n  if(!SESS.timeline.length){ $('#sessStatus').textContent='nada pra duplicar ainda'; return; }\n  const prevId=SESS.sessionId, prevLabel=SESS.sessionLabel;\n  SESS.sessionId=null;\n  SESS.sessionLabel=(SESS.sessionLabel||'Sessão')+' (cópia)';\n  await saveSession();\n  if(!SESS.sessionId){\n    // saveSession swallows its own errors into #sessStatus, so a still-null id after the await is\n    // the only failure signal we get. Put the original identity back — otherwise a failed copy\n    // silently leaves the session detached, and the next Salvar would fork a new record instead\n    // of updating the one the user thought they were editing.\n    SESS.sessionId=prevId; SESS.sessionLabel=prevLabel;\n    await refreshSessionPicker().catch(()=>{});\n    return;\n  }\n  if($('#sessStatus')) $('#sessStatus').textContent='duplicado ✓';\n}\nasync function loadSession(id){\n  if(!id) return newSession();\n  const list=(SESS.sessionsList&&SESS.sessionsList.length)?SESS.sessionsList:await listSessions().catch(()=>[]);\n  const rec=list.find(s=>String(s._id)===String(id));\n  if(!rec) return newSession();\n  loader(true,'carregando sessão…');\n  SESS.sessionId=rec._id; SESS.sessionLabel=rec.label;\n  SESS.snapshotRaw=rec.snapshotRaw; SESS.snapshotSyncedAt=rec.snapshotSyncedAt||null; SESS.snapLiteral=rec.snapLiteral; SESS.eloMaxCycle=rec.eloMaxCycle;\n  SESS.settings={...DEFAULT_SETTINGS,...(rec.settings||{})};\n  SESS.timeline=(rec.movements||[]).map(m=>({sector:String(m.sector),level:m.level||'setor'}));\n  SESS.selected=0; SESS.sectorBaseCache={}; SESS.stage='main'; SESS.dirtyFrom=null;\n  try{\n    for(let i=0;i<SESS.timeline.length;i++){\n      const saved=(rec.movements||[])[i]||{};\n      // Sessions saved before the UF became part of the key hold bare-name keys in matrix rows,\n      // assign, geoFeat and closeAdj alike. Restoring that cache would mix key shapes the moment the\n      // stage is recomputed — and it would preserve the very collision this fixes — so those stages\n      // are replayed against the pinned snapshot and the manual assignment is remapped by name.\n      const legacyKeys=!!(saved.matrix&&saved.matrix.length&&saved.matrix.every(r=>r&&r.uf==null));\n      // Sessões salvas antes da regra de gerência podem carregar um destino de outra GV no cache.\n      // Restaurar esse cache manteria o setor proibido na tela para sempre, então essas etapas são\n      // reprocessadas contra o snapshot fixado — igual ao tratamento das chaves legadas.\n      const crossGv=await savedCrossesGv(saved);\n      if(saved.matrix&&!legacyKeys&&!crossGv){\n        loader(true,`restaurando etapa ${i+1}/${SESS.timeline.length} — setor ${SESS.timeline[i].sector} (cache, sem consulta)…`);\n        const mv={sector:String(saved.sector), level:saved.level||'setor', policy:saved.policy||'fora', view:'tobe', selMuni:null, optBadge:saved.optBadge||''};\n        mv.matrix=saved.matrix; mv.trend=saved.trend||[]; mv.levels=saved.levels||[]; mv.levelByMuni=saved.levelByMuni||{};\n        mv.pureOwnMetrics=saved.pureOwnMetrics||blankM(); mv.domUF=saved.domUF; mv.dest=saved.dest||[]; mv.color=saved.color||{};\n        mv.baseMetrics=saved.baseMetrics||{}; mv.baseLevel=saved.baseLevel||{}; mv.geoFeat=saved.geoFeat||{}; mv.nbrFeat=saved.nbrFeat||[];\n        mv.nbrCurrentSector=saved.nbrCurrentSector||{}; mv.allowed=saved.allowed||{}; mv.reachable=saved.reachable||{};\n        mv.allowedRaw=saved.allowedRaw||saved.allowed||{};\n        mv.destRule=saved.destRule||SESS.settings.destRule; mv.destMinCbs=saved.destMinCbs||SESS.settings.destMinCbs; mv.destRuleFallback=!!saved.destRuleFallback;\n        mv.optTier=(saved.optTier==null?0:saved.optTier);\n        mv.gv=saved.gv||''; mv.gvRejected=saved.gvRejected||[];\n        mv.missingMunis=saved.missingMunis||[]; mv.csvMunisTotal=saved.csvMunisTotal||0;\n        mv.ufGuessed=saved.ufGuessed||{};\n        mv.cbsByMuni=saved.cbsByMuni||{}; mv.shapeMunis=saved.shapeMunis||[];\n        mv.excludedMunis=saved.excludedMunis||[]; mv.excludedCbs=saved.excludedCbs||0; mv.domCsvMunis=saved.domCsvMunis||0;\n        mv.noShapeMunis=saved.noShapeMunis||[]; mv.noShapeCbs=saved.noShapeCbs||0;\n        mv.secCentroid=saved.secCentroid||{}; mv.muniCentroid=saved.muniCentroid||{}; mv.closeAdj=saved.closeAdj||{};\n        aggregateMovement(mv);\n        mv.assign=saved.assign||{};\n        if((mv.level||'setor')==='setor') mv.dest.forEach(s=>{ if(!SESS.sectorBaseCache[s]) SESS.sectorBaseCache[s]=mv.baseMetrics[s]; });\n        SESS.timeline[i]=mv;\n      } else {\n        loader(true,`replay ${i+1}/${SESS.timeline.length} — setor ${SESS.timeline[i].sector}…`);\n        await computeAt(i);\n        if(saved.assign) SESS.timeline[i].assign=legacyKeys?remapAssign(SESS.timeline[i],saved.assign):saved.assign;\n        if(saved.policy) SESS.timeline[i].policy=saved.policy;\n      }\n    }\n    await loadSectors();\n  }catch(e){ $('#ds').textContent='erro ao carregar sessão: '+e.message; $('#ds').classList.add('err'); }\n  finally{ loader(false); }\n  renderAll();\n}\n// Re-points a legacy bare-name assignment at the NAME/UF key it can only mean. When a name resolves\n// to more than one município in the recomputed stage the manual choice is genuinely ambiguous —\n// dropping it lets the optimizer allocate instead of guessing on the operator's behalf.\n// True when a cached stage names a destination outside the closing sector's gerência de vendas.\n// Judges the cache by TODAY's rule, reading the (memoised) dominantes base rather than trusting what\n// the session was saved with. Unknown GV on the closing sector answers false: the stage then loads\n// from cache instead of being replayed into the hard throw in computeMovement, which would leave the\n// operator staring at a broken session with no way back.\nasync function savedCrossesGv(saved){\n  if(!saved||!saved.sector||!(saved.dest||[]).length) return false;\n  let gvBy={};\n  try{ await ensureDominantes(); gvBy=DOM.gvBySetor||{}; }catch(e){ return false; }\n  const own=gvBy[String(saved.sector)]||'';\n  if(!own) return false;\n  if(saved.dest.some(s=>(gvBy[String(s)]||'')!==own)) return true;\n  // A stage saved before foreign-GV neighbours stopped being drawn can hold a perfectly clean dest and\n  // STILL carry their shapes in nbrFeat/nbrCurrentSector — it would repaint the old map straight from\n  // cache. An unknown gerência is not evidence of a foreign one, so only a known, differing GV replays.\n  return Object.values(saved.nbrCurrentSector||{}).some(s=>{ const g=gvBy[String(s)]||''; return g&&g!==own; });\n}\nfunction remapAssign(mv,savedAssign){\n  const keys=Object.keys(mv.munis||{}).filter(k=>k!=='__OUTROS__');\n  const out={};\n  Object.entries(savedAssign||{}).forEach(([k,v])=>{\n    if(keys.indexOf(k)>=0){ out[k]=v; return; }\n    const cand=keys.filter(x=>mName(x)===mName(k));\n    if(cand.length===1) out[cand[0]]=v;\n  });\n  return out;\n}\nfunction newSession(){\n  SESS.sessionId=null; SESS.sessionLabel=null; SESS.timeline=[]; SESS.selected=0; SESS.sectorBaseCache={};\n  SESS.settings={...DEFAULT_SETTINGS};\n  SESS.snapshotRaw=null; SESS.snapshotSyncedAt=null; SESS.snapLiteral=null; SESS.eloMaxCycle=null; SESS.stage='loading'; SESS.dirtyFrom=null;\n  (async()=>{\n    loader(true,'iniciando nova sessão…');\n    try{ await Promise.all([ensurePinned(), loadSectors()]); SESS.stage='confirm'; }\n    catch(e){ setError('erro init: '+e.message); }\n    finally{ loader(false); renderAll(); }\n  })();\n}\n\n// ---------- snapshot refresh ----------\n// Deliberately breaks the frozen-snapshot guarantee, on demand: re-resolves DT_HISTORICO and\n// replays the whole timeline against the new one. Skips the replay when the snapshot has not\n// actually moved, so a stray click on a long timeline costs one cheap probe instead of ~8 queries\n// per etapa.\nasync function refreshSnapshot(){\n  if(SESS.stage!=='main' || SESS.snapBusy) return;\n  SESS.snapBusy=true;\n  const prevRaw=SESS.snapshotRaw;\n  const pill=$('#liveState'); if(pill){ pill.classList.add('busy'); pill.textContent='◌ atualizando snapshot…'; }\n  loader(true,'buscando o snapshot mais recente…');\n  let ok=false;\n  try{\n    const p=await resolveSnapshotPin();\n    if(!p.snapshotRaw) throw new Error('não foi possível resolver DT_HISTORICO');\n    const same=String(p.snapshotRaw)===String(prevRaw);\n    SESS.snapshotRaw=p.snapshotRaw; SESS.snapshotSyncedAt=p.syncedAt; SESS.snapLiteral=p.snapLiteral; SESS.eloMaxCycle=p.eloMaxCycle;\n    await loadSectors();   // the sector list follows the live max, so it can have moved too\n    if(same){\n      $('#ds').textContent=`snapshot já era o mais recente · atualizado em ${fmtSyncedAt(p.syncedAt)} — nada recalculado`;\n    } else if(SESS.timeline.length){\n      SESS.dirtyFrom=null;\n      SESS.sectorBaseCache={};   // baselines come from the snapshot, so every one of them changed\n      loader(true,'snapshot novo — recalculando a timeline…');\n      await recomputeFrom(0);\n      $('#ds').textContent=`snapshot atualizado em ${fmtSyncedAt(p.syncedAt)} · ${fmt(SESS.timeline.length)} etapa(s) recalculada(s)`;\n    } else {\n      $('#ds').textContent=`snapshot atualizado em ${fmtSyncedAt(p.syncedAt)}`;\n    }\n    $('#ds').classList.remove('err');\n    ok=true;\n  }catch(e){\n    const at=(SESS.dirtyFrom==null?null:SESS.dirtyFrom+1);\n    $('#ds').textContent='erro ao atualizar o snapshot'+(at?` na etapa ${at} — etapa ${at} em diante ficou desatualizada (⟳)`:'')+': '+e.message;\n    $('#ds').classList.add('err');\n  }finally{\n    SESS.snapBusy=false;\n    if(pill) pill.classList.remove('busy');\n    loader(false); renderAll();\n    if(ok) setTimeout(()=>{ const d=$('#ds'); if(d&&!d.classList.contains('err')) d.textContent=''; },7000);\n  }\n}\n\n// ---------- session options ----------\nfunction previewDest(mv,rule,minCbs){\n  if(!mv||!mv.allowedRaw||!mv.munis) return null;\n  const w={}; let relaxed=false;\n  const cbsOf=m=>(mv.cbsByMuni&&mv.cbsByMuni[m]!=null)?mv.cbsByMuni[m]:((mv.munis[m]&&mv.munis[m].cbs)||0);\n  const add=m=>Object.entries(mv.allowedRaw[m]||{}).forEach(([s,v])=>{ w[s]=(w[s]||0)+v; });\n  // allowedRaw only carries municipalities already inside the sector's dominance base, so there is\n  // nothing left to filter out here beyond the destination rule itself.\n  Object.keys(mv.allowedRaw).forEach(m=>{ const cbs=cbsOf(m);\n    if(rule==='dominant'&&cbs<minCbs) return; add(m); });\n  if(rule==='dominant'&&!Object.keys(w).length){ Object.keys(mv.allowedRaw).forEach(add); relaxed=true; }\n  return {dest:Object.keys(w).sort((a,b)=>w[b]-w[a]).slice(0,6),relaxed};\n}\nfunction readOptForm(){\n  const r=root.querySelector('input[name=\"destRule\"]:checked');\n  let n=Math.round(+$('#optMinCbs').value);\n  if(!(n>0)) n=DEFAULT_SETTINGS.destMinCbs;\n  return {destRule:(r&&r.value)||DEFAULT_SETTINGS.destRule, destMinCbs:n,\n          targetSpan:numOrNull($('#optTargetSpan').value),\n          maxSpan:numOrNull($('#optMaxSpan').value),\n          minSpan:numOrNull($('#optMinSpan').value)};\n}\nfunction spanFormError(f){\n  if(f.minSpan&&f.maxSpan&&f.minSpan>f.maxSpan) return `Span mínimo (${fmt(f.minSpan)}) não pode ser maior que o máximo (${fmt(f.maxSpan)}).`;\n  if(f.targetSpan&&f.maxSpan&&f.targetSpan>f.maxSpan) return `Span alvo (${fmt(f.targetSpan)}) não pode passar do máximo (${fmt(f.maxSpan)}).`;\n  if(f.targetSpan&&f.minSpan&&f.targetSpan<f.minSpan) return `Span alvo (${fmt(f.targetSpan)}) não pode ficar abaixo do mínimo (${fmt(f.minSpan)}).`;\n  return '';\n}\nfunction renderOptPreview(){\n  const el=$('#optPreview'); if(!el) return;\n  const f=readOptForm();\n  root.querySelectorAll('.opt-row').forEach(r=>{\n    if(r.dataset.r!=null) r.classList.toggle('on',r.dataset.r===f.destRule);\n  });\n  const wrap=$('#optMinCbsWrap'); if(wrap) wrap.classList.toggle('off',f.destRule!=='dominant');\n  const err=spanFormError(f), ee=$('#optSpanErr');\n  if(ee){ ee.textContent=err; ee.classList.toggle('hidden',!err); }\n  const ap=$('#optApply'); if(ap) ap.disabled=!!err;\n  const mv=SESS.timeline[SESS.selected];\n  // Prévia inteira é sobre conceitos de setor (ponte por município, span alvo/máx/mín) que não\n  // existem em GV/mercado — mostrar aqui só confundiria com números que não valem nada.\n  if(mv && (mv.level||'setor')!=='setor'){ el.innerHTML=''; return; }\n  if(!mv||!mv.munis){ el.innerHTML='Nenhuma etapa calculada ainda — as regras passam a valer no próximo fechamento.'; return; }\n  const cbsOf=m=>(mv.cbsByMuni&&mv.cbsByMuni[m]!=null)?mv.cbsByMuni[m]:((mv.munis[m]&&mv.munis[m].cbs)||0);\n  const ms=Object.keys(mv.geoFeat||{});\n  const ig=f.destRule==='dominant'?ms.filter(m=>cbsOf(m)<f.destMinCbs):[];\n  const pv=previewDest(mv,f.destRule,f.destMinCbs);\n  let h=`<b style=\"color:var(--ink)\">Prévia — etapa ${SESS.selected+1}, setor ${mv.sector}</b><br>`;\n  const exN=(mv.excludedMunis||[]).length;\n  if(exN) h+=`Base de dominantes: <b>${fmt(ms.length)}</b> município(s) no mapa · <span style=\"color:var(--closing)\">${fmt(exN)} fora da base — ${fmt(mv.excludedCbs||0)} CBs seguem suas líderes</span><br>`;\n  h+=`${fmt(ms.length-ig.length)} de ${fmt(ms.length)} município(s) valem como ponte`;\n  if(ig.length) h+=` · <span style=\"color:var(--closing)\">ignorados:</span> ${ig.slice(0,8).join(', ')}${ig.length>8?' +'+(ig.length-8):''}`;\n  if(pv){\n    h+=`<br>Setores destino com esta regra: <b style=\"color:var(--ink)\">${pv.dest.join(', ')||'–'}</b>`;\n    const cur=(mv.dest||[]).join(', ');\n    if(pv.dest.join(',')!==(mv.dest||[]).join(',')) h+=` <span style=\"color:var(--closing)\">(hoje: ${cur||'–'})</span>`;\n    if(pv.relaxed) h+=`<br><b style=\"color:var(--closing)\">⚠ nenhum município dominante nesta etapa — a regra relaxa pra \"qualquer município\" pra não deixar a etapa sem destino.</b>`;\n  }\n  if(f.targetSpan||f.maxSpan||f.minSpan){\n    const sp=spanMapFor(mv,mv.assign||{}), v=spanViolationsOf(sp,{target:f.targetSpan,max:f.maxSpan,min:f.minSpan});\n    h+=`<br><br>Span dos destinos como está hoje: ${mv.dest.map(s=>s+' <b>'+fmt(sp[s])+'</b>').join(' · ')||'–'}`;\n    if(v.over.length||v.under.length) h+=`<br><span style=\"color:var(--closing)\">Fora dos limites: ${[...v.over.map(s=>s+' ▲ acima do máx'),...v.under.map(s=>s+' ▼ abaixo do mín')].join(', ')}</span> — o modelo ÓTIMO tenta corrigir no recálculo.`;\n    else h+=` <span style=\"color:var(--ok)\">— já dentro dos limites</span>`;\n  }\n  if(SESS.timeline.length) h+=`<br><span style=\"margin-top:4px;display:inline-block\">Aplicar <b>recalcula as ${fmt(SESS.timeline.length)} etapa(s)</b> contra o snapshot congelado — os destinos ajustados à mão serão refeitos pelo modelo ÓTIMO.</span>`;\n  el.innerHTML=h;\n}\nfunction openOptions(){\n  const st={...DEFAULT_SETTINGS,...(SESS.settings||{})};\n  root.querySelectorAll('input[name=\"destRule\"]').forEach(r=>{ r.checked=(r.value===st.destRule); });\n  $('#optMinCbs').value=st.destMinCbs;\n  $('#optTargetSpan').value=st.targetSpan||'';\n  $('#optMaxSpan').value=st.maxSpan||'';\n  $('#optMinSpan').value=st.minSpan||'';\n  $('#optApply').disabled=false;\n  $('#optSessName').textContent=SESS.sessionLabel||'sessão não salva';\n  $('#optStatus').textContent='';\n  $('#optionsBg').classList.remove('hidden');\n  renderOptPreview();\n  const c=$('#optCancel'); if(c) c.focus();\n}\nfunction closeOptions(){ const b=$('#optionsBg'); if(b) b.classList.add('hidden'); }\nasync function applyOptions(){\n  const f=readOptForm();\n  if(spanFormError(f)) return;\n  const prev={...DEFAULT_SETTINGS,...(SESS.settings||{})};\n  const changed = prev.destRule!==f.destRule\n    || (f.destRule==='dominant' && prev.destMinCbs!==f.destMinCbs)\n    || numOrNull(prev.targetSpan)!==f.targetSpan\n    || numOrNull(prev.maxSpan)!==f.maxSpan\n    || numOrNull(prev.minSpan)!==f.minSpan;\n  SESS.settings={...prev,...f};\n  closeOptions();\n  if(!changed || !SESS.timeline.length){ renderAll(); return; }\n  SESS.dirtyFrom=null;\n  SESS.sectorBaseCache={};   // the recompute re-derives every baseline; keeping the old ones would\n                             // leave \"Impacto acumulado\" comparing against pre-change numbers\n  loader(true,'aplicando nova regra de destino — recalculando timeline…');\n  try{\n    await recomputeFrom(0);\n    $('#ds').textContent=''; $('#ds').classList.remove('err');\n  }catch(e){\n    const at=(SESS.dirtyFrom==null?0:SESS.dirtyFrom)+1;\n    $('#ds').textContent=`erro ao aplicar a regra na etapa ${at}: ${e.message} — etapa ${at} em diante ficou desatualizada (⟳)`;\n    $('#ds').classList.add('err');\n  }finally{ loader(false); renderAll(); }\n}\n\nconst SHARED_DS='timeline-shared-sessionsDataSet';\nconst AUTH_REF='timelineSimAuthFinal';   // single source of truth for the auth strategy reference\nlet SHARE={busy:false,url:null,last:null};\n// Serialise a PRESENTATION model, not the raw session, so the reader stays purely presentational\n// and never re-derives spans/desloc/orphans — no second copy of this engine to keep in sync.\n// NOTE: METRICS_DEF[2] is the money marker; read it as !!md[2] (a literal dollar sign in this\n// position trips the upsert's parse check).\nfunction buildShareStages(){\n  return SESS.timeline.map((mv,i)=>{\n    const c=computeDerived(mv);\n    const incBy={};\n    mv.dest.forEach(s=>{ incBy[s]=Object.fromEntries(METRICS_DEF.map(md=>[md[0],0])); });\n    Object.entries(mv.munis).forEach(([m,o])=>{\n      if(m==='__OUTROS__') return;\n      const s=mv.assign[m]; if(!s||!incBy[s]) return;\n      METRICS_DEF.forEach(md=>{ incBy[s][md[0]]+=o[md[0]]||0; });\n    });\n    const saiTot={};\n    METRICS_DEF.forEach(md=>{\n      const k=md[0];\n      saiTot[k]=Object.entries(mv.munis).filter(([m])=>m!=='__OUTROS__').reduce((a,p)=>a+((p[1][k])||0),0);\n    });\n    // orphans follow their leader's home: they enter that sector AND leave the closing one\n    c.leaders.forEach(L=>{\n      const om=mv.orphanMetricsByGroup&&mv.orphanMetricsByGroup[L.grupo];\n      if(!om||!L.home) return;\n      METRICS_DEF.forEach(md=>{ const k=md[0];\n        if(incBy[L.home]) incBy[L.home][k]+=om[k]||0;\n        saiTot[k]+=om[k]||0; });\n    });\n    const ms=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__').sort((a,b)=>mv.munis[b].cbs-mv.munis[a].cbs);\n    const sv=mv.dest.map(s=>c.span[s]);\n    const baseOf=(s,k)=>{ const b=mv.baseMetrics[s]||{}; return +(b[k]||0); };\n    return {\n      i:i, sector:mv.sector, level:mv.level||'setor', unitOfMuni:mv.unitOfMuni||{}, policy:mv.policy, domUF:mv.domUF,\n      optTier:(mv.optTier==null?0:mv.optTier),\n      destRuleFallback:!!mv.destRuleFallback,\n      dest:mv.dest.slice(), color:Object.assign({},mv.color), assign:Object.assign({},mv.assign),\n      kpis:{ cbsRealocadas:closingCbsOf(mv), desloc:c.desloc,\n             spread:(sv.length?Math.max.apply(null,sv)-Math.min.apply(null,sv):0),\n             municipios:ms.length, lideres:mv.leaders.length },\n      destinos:mv.dest.map(s=>({ s:s, base:baseOf(s,'cbs'), inc:c.inc[s]||0, orph:c.orph[s]||0, span:c.span[s]||0, gained:c.gained[s]||0 })),\n      municipios:ms.map(m=>(mv.level&&mv.level!=='setor')?{ nome:m, uf:'', cbs:mv.munis[m].cbs, destino:mv.assign[m]||null }:{ nome:mName(m), uf:mUf(m), cbs:mv.munis[m].cbs, destino:mv.assign[m]||null }),\n      excluidos:(mv.excludedMunis||[]).map(x=>({ muni:x.muni, cbs:x.cbs })),\n      orphanTotal:c.orphanTotal||0, orphanStranded:c.orphanStranded||0, noShapeCbs:mv.noShapeCbs||0,\n      lideres:c.leaders.map(L=>({ lider:(L.lider||'').split(' ').slice(0,2).join(' '), grupo:L.grupo,\n        total:L.total, home:L.home, desloc:L.desloc, orphan:L.orphan||0 })),\n      metricas:METRICS_DEF.map(md=>{ const k=md[0];\n        return { key:k, label:md[1], money:!!md[2],\n          rows:mv.dest.map(s=>({ s:s, antes:baseOf(s,k), depois:baseOf(s,k)+((incBy[s]&&incBy[s][k])||0) })),\n          sai:saiTot[k]||0 }; }),\n      geoFeat:mv.geoFeat, nbrFeat:mv.nbrFeat, excludedFeat:[]\n    };\n  });\n}\nfunction buildShareSummary(stages){\n  const world=foldWorldState(SESS.timeline,SESS.timeline.length);\n  const receivers=[];\n  SESS.timeline.forEach((mv,i)=>{\n    const own=mv.pureOwnMetrics||{};\n    receivers.push({ s:mv.sector, situacao:'fechado (etapa '+(i+1)+')', antes:+(own.cbs||0), depois:0 });\n  });\n  const seen={};\n  Object.values(world.muniOverride).forEach(s=>{\n    if(seen[s]) return; seen[s]=1;\n    const base=SESS.sectorBaseCache[s]||{}, infl=world.sectorInflow[s]||{};\n    receivers.push({ s:s, situacao:'recebeu território', antes:+(base.cbs||0), depois:(+(base.cbs||0))+(infl.cbs||0) });\n  });\n  return { stages:stages.length, sectors:SESS.timeline.map(mv=>mv.sector),\n    totalCbs:stages.reduce((a,s)=>a+(s.kpis.cbsRealocadas||0),0),\n    totalDesloc:stages.reduce((a,s)=>a+(s.kpis.desloc||0),0), receivers:receivers };\n}\nfunction renderShareBody(){\n  const el=$('#shareBody'); if(!el) return;\n  const go=$('#shareGo'), cp=$('#shareCopy'), op=$('#shareOpen'), cc=$('#shareCancel');\n  if(SHARE.url){\n    el.innerHTML=`<div class=\"opt-note\" style=\"margin-top:0\"><b style=\"color:var(--ink)\">Sessão compartilhada ✓</b><br>\n      Link de leitura desta simulação congelada. Quem abrir precisa ter login no simulador.\n      <div class=\"shareurl\">${esc(SHARE.url)}</div></div>`;\n    if(go) go.classList.add('hidden');\n    if(cp) cp.classList.remove('hidden');\n    if(op) op.classList.remove('hidden');\n    if(cc) cc.textContent='Fechar';\n    return;\n  }\n  if(go) go.classList.remove('hidden');\n  if(cp) cp.classList.add('hidden');\n  if(op) op.classList.add('hidden');\n  if(cc) cc.textContent='Cancelar';\n  const st={...DEFAULT_SETTINGS,...(SESS.settings||{})};\n  const desloc=SESS.timeline.reduce((a,mv)=>a+(mv.munis?computeDerived(mv).desloc:0),0);\n  const destTxt=st.destRule==='dominant'?('dominantes ≥'+fmt(st.destMinCbs)+' CBs'):'qualquer município';\n  el.innerHTML=`<div class=\"opt-lbl\">Confirmar compartilhamento</div>\n    <div class=\"opt-sub\">Publica uma <b>cópia congelada</b> desta sessão, exatamente no estado atual.</div>\n    <div class=\"opt-note\" style=\"margin-top:0\">\n      · <b>${fmt(SESS.timeline.length)}</b> etapa(s) — ${esc(SESS.timeline.map(mv=>mv.sector).join(' → '))}<br>\n      · snapshot atualizado em <b>${esc(fmtSyncedAt(SESS.snapshotSyncedAt))}</b><br>\n      · base: <b>municípios dominantes (CSV)</b> · destino: <b>${esc(destTxt)}</b> · span: <b>${esc(spanShort(st))}</b><br>\n      · <b>${fmt(desloc)}</b> CBs deslocadas somando a cadeia\n    </div>\n    <div class=\"opt-note\">A cópia <b>não</b> acompanha edições posteriores desta sessão — pra atualizar, compartilhe de novo e use o link novo. O link exige login no simulador; não é público.</div>\n    ${SHARE.last?`<div class=\"opt-note\"><b style=\"color:var(--ink)\">Último link gerado nesta sessão</b> — aponta pro estado de <b>antes</b> das edições feitas depois dele.<div class=\"shareurl\">${esc(SHARE.last)}</div></div>`:''}`;\n}\nasync function openShare(){\n  if(!SESS.timeline.length){ $('#ds').textContent='nada pra compartilhar — feche pelo menos um setor primeiro.'; $('#ds').classList.add('err'); return; }\n  await flushDirty();\n  SHARE.url=null;\n  const s=$('#shareStatus'); if(s){ s.textContent=''; s.classList.remove('err'); }\n  renderShareBody();\n  $('#shareBg').classList.remove('hidden');\n  const b=$('#shareCancel'); if(b) b.focus();\n}\nfunction closeShare(){ const b=$('#shareBg'); if(b) b.classList.add('hidden'); }\nasync function doShare(){\n  if(SHARE.busy) return;\n  const go=$('#shareGo'), stx=$('#shareStatus');\n  SHARE.busy=true;\n  if(go){ go.disabled=true; go.textContent='Compartilhando…'; }\n  if(stx){ stx.textContent=''; stx.classList.remove('err'); }\n  try{\n    // Resolved as a GLOBAL PROCESS, not a declared param — which only works because the block\n    // instance on the `main` artboard binds `sharedDataset: @timeline-shared-sessionsDataSet`.\n    // That binding is load-bearing: a Process is only define()d once something on the rendering\n    // tree references it, so without it this lookup returns null and sharing dies on the guard\n    // below. Do NOT remove the instance param because this file never reads d2.params.sharedDataset.\n    const ds=d2.data(SHARED_DS);\n    if(!ds) throw new Error('dataset de sessões compartilhadas indisponível');\n    await flushDirty();\n    const stages=buildShareStages();\n    const summary=buildShareSummary(stages);\n    let who='';\n    try{ const a=d2.auth(AUTH_REF); who=(a&&a.user&&(a.user.email||a.user.nome))||''; }catch(e){}\n    const created=await ds.create({\n      label:SESS.sessionLabel||('Sessão '+new Date().toLocaleString('pt-BR')),\n      snapshotRaw:SESS.snapshotRaw, snapshotSyncedAt:SESS.snapshotSyncedAt,\n      settings:{...DEFAULT_SETTINGS,...(SESS.settings||{})},\n      stages:stages, summary:summary, sharedBy:who, sharedAt:new Date().toISOString()\n    });\n    const id=(created&&created._id)||(created&&created.data&&created.data._id)||(ds.selected&&ds.selected()&&ds.selected()._id)||null;\n    if(!id) throw new Error('registro gravado, mas sem _id na resposta — não foi possível montar o link');\n    SHARE.url=window.location.origin+'/sessions/'+id;\n    SHARE.last=SHARE.url;\n    renderShareBody();\n  }catch(e){\n    if(stx){ stx.textContent='erro ao compartilhar: '+e.message; stx.classList.add('err'); }\n  }finally{\n    SHARE.busy=false;\n    if(go){ go.disabled=false; go.textContent='Compartilhar'; }\n  }\n}\n\n// ---------- rendering ----------\nfunction renderTimeline(){\n  const el=$('#movementChips'); if(!el) return;\n  if(!SESS.timeline.length){ el.innerHTML='<span class=\"empty\">Nenhuma etapa ainda — use \"Adicionar movimentação\" à direita.</span>'; return; }\n  el.innerHTML=SESS.timeline.map((mv,i)=>{\n    const ready=mv.dest!==undefined;\n    const c=ready?computeDerived(mv):null;\n    const stale=SESS.dirtyFrom!=null && i>=SESS.dirtyFrom;\n    return `<div class=\"tchip ${i===SESS.selected?'on':''} ${stale?'stale':''}\" data-i=\"${i}\">\n      <span class=\"tnum\">${i+1}</span><span class=\"tsec\">${LEVELS[mv.level||'setor'].label} ${mv.sector}</span>\n      <span class=\"tstat\">${ready?((mv.level||'setor')==='setor'?fmt(c.desloc)+' desloc.':fmt(closingCbsOf(mv))+' CBs'):'…'}</span>\n      ${stale?'<span class=\"tstale\" title=\"recalcula ao selecionar outra etapa\">⟳</span>':''}\n      <span class=\"trm\" data-rm=\"${i}\" title=\"remover esta etapa e as seguintes\">✕</span>\n    </div>`;\n  }).join('');\n  el.querySelectorAll('.tchip').forEach(ch=>{\n    ch.addEventListener('click',async (e)=>{\n      if(e.target.dataset.rm!=null && e.target.dataset.rm!==''){ removeFrom(+e.target.dataset.rm); return; }\n      const i=+ch.dataset.i;\n      if(i!==SESS.selected) await flushDirty();\n      SESS.selected=i; renderAll();\n    });\n  });\n}\nfunction renderRuleNote(){\n  const el=$('#ruleNote'); if(!el) return;\n  const st={...DEFAULT_SETTINGS,...(SESS.settings||{})};\n  const mv=SESS.timeline[SESS.selected];\n  const lvl=LEVELS[(mv&&mv.level)||'setor'];\n  let h='';\n  if(!mv || (mv.level||'setor')==='setor'){\n    h+=`<b style=\"color:var(--ink)\">Base de municípios dominantes:</b> só os municípios que a base (CSV) atribui ao setor entram no mapa e na alocação`;\n    if(mv&&mv.domCsvMunis) h+=` · <b>${fmt(mv.domCsvMunis)}</b> na base do setor ${mv.sector}`;\n    if(mv&&mv.excludedCbs) h+=` · <b style=\"color:var(--closing)\">${fmt(mv.excludedMunis.length)} município(s) / ${fmt(mv.excludedCbs)} CBs</b> fora da base nesta etapa — não aparecem no mapa e as CBs seguem suas líderes (quebra de vínculo)`;\n  } else {\n    // GV/mercado não têm spillover (todo setor pertence a exatamente uma GV/mercado na base), então\n    // não existe \"excluído\" pra reportar aqui — só o tamanho da base e em quantas unidades ela se agrupa.\n    h+=`<b style=\"color:var(--ink)\">Base de ${lc(lvl.childLabel)}s dominantes:</b> ${mv.domCsvMunis!=null?`<b>${fmt(mv.domCsvMunis)}</b> município(s) `:''}na base ${lvl.de} ${lc(lvl.label)} ${mv.sector}, agrupados em <b>${fmt(Object.keys(mv.unitMunis||{}).length)}</b> ${lc(lvl.childLabel)}(s)`;\n  }\n  if(DOM.error) h+=` · <b style=\"color:var(--closing)\">⚠ base indisponível: ${esc(DOM.error)}</b>`;\n  h+=`<br>`;\n  h+=`<b style=\"color:var(--ink)\">Regra de destino:</b> `;\n  h+= st.destRule==='dominant'\n    ? `só municípios com <b>≥${fmt(st.destMinCbs)} CBs</b> trazem ${lc(lvl.destLabel)} pra lista de destinos`\n    : `qualquer município ${lvl.de} ${lc(lvl.label)} fechad${lvl.a==='à'?'a':'o'} vale como ponte <span style=\"opacity:.7\">(padrão)</span>`;\n  if(mv&&st.destRule==='dominant'){\n    // A ponte é sempre por MUNICÍPIO, em qualquer nível — mv.ignoredBridges já é a lista definitiva\n    // que computeMovement calculou, então lê-la aqui em vez de recalcular contra mv.munis, que em\n    // GV/mercado está no grão de setor/GV e daria o número errado.\n    const ig=mv.ignoredBridges||[];\n    if(ig.length) h+=` · <b style=\"color:var(--closing)\">${fmt(ig.length)}</b> ignorado(s) como ponte (ainda redistribuído(s)): ${ig.slice(0,5).join(', ')}${ig.length>5?' +'+(ig.length-5):''}`;\n    if(mv.destRuleFallback) h+=`<br><b style=\"color:var(--closing)\">⚠ nenhum município dominante nesta etapa — regra relaxada pra \"qualquer município\".</b>`;\n  }\n  el.innerHTML=h;\n}\nfunction renderSpanRule(){\n  const el=$('#spanRule'); if(!el) return;\n  const mv=SESS.timeline[SESS.selected], lim=spanLimits(mv);\n  if(!mv||!mv.munis||mv.view==='asis'||!spanLimitsOn(lim)){ el.innerHTML=''; return; }\n  const sp=spanMapFor(mv,mv.assign||{}), v=spanViolationsOf(sp,lim);\n  const bits=[];\n  if(lim.target) bits.push(`alvo <b>${fmt(lim.target)}</b>`);\n  if(lim.max) bits.push(`máx <b>${fmt(lim.max)}</b>`);\n  if(lim.min) bits.push(`mín <b>${fmt(lim.min)}</b>`);\n  let h=`Pré-requisito de span: ${bits.join(' · ')} CBs — `;\n  if(v.over.length||v.under.length){\n    h+=`<b style=\"color:var(--closing)\">⚠ `;\n    if(v.over.length) h+=`acima do máximo: ${v.over.map(s=>s+' ('+fmt(sp[s])+')').join(', ')}`;\n    if(v.over.length&&v.under.length) h+=' · ';\n    if(v.under.length) h+=`abaixo do mínimo: ${v.under.map(s=>s+' ('+fmt(sp[s])+')').join(', ')}`;\n    h+=`</b>`;\n    if(mv.optTier===1) h+=`<br><span style=\"opacity:.85\">Nenhuma alocação conectada respeita o span mínimo nesta etapa — o modelo relaxou essa exigência.</span>`;\n    else if(mv.optTier===2) h+=`<br><span style=\"opacity:.85\">Nenhuma alocação conectada respeita os limites nesta etapa — o modelo relaxou essa exigência.</span>`;\n    else if(mv.optTier===-1) h+=`<br><span style=\"opacity:.85\">Etapa resolvida por heurística — os limites não são garantidos.</span>`;\n  } else h+=`<b style=\"color:var(--ok)\">✓ todos os setores receptores dentro dos limites</b>`;\n  el.innerHTML=`<div class=\"note\" style=\"margin:-2px 0 6px\">${h}</div>`;\n}\nfunction renderContig(){const mv=SESS.timeline[SESS.selected];const el=$('#contig');if(!el||!mv)return;\n  if(mv.view==='asis'){el.innerHTML='';return;}\n  const lvl=LEVELS[mv.level||'setor'];\n  // Indicador de conectividade geográfica só se aplica a fechamento de setor — ver contigBadFor.\n  if((mv.level||'setor')!=='setor'){ el.innerHTML=''; return; }\n  const bad=contigBadFor(mv,mv.assign);\n  el.innerHTML=bad.length\n    ?`<div class=\"note\" style=\"color:var(--closing);font-weight:600;margin:-2px 0 6px\">⚠ Território desconectado em ${bad.join(', ')} — ${lc(lvl.childLabel)}(s) desconectado(s) do território ${lvl.de} ${lc(lvl.label)}. Use ★ ÓTIMO ou reassocie no mapa.</div>`\n    :`<div class=\"note\" style=\"color:var(--ok);margin:-2px 0 6px\">✓ Sem quebras — cada ${lc(lvl.label)} forma uma região conectada.</div>`;\n}\nfunction closingCbsOf(mv){ return Object.entries(mv.munis).filter(([m])=>m!=='__OUTROS__').reduce((a,[,o])=>a+o.cbs,0); }\nfunction sectorTotalCbs(mv){ return Object.values(mv.munis).reduce((a,o)=>a+o.cbs,0); }\nfunction renderKpis(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const c=computeDerived(mv); const lvl=LEVELS[mv.level||'setor'];\n  const childPlural=lvl.childLabel==='Setor'?'Setores':(lvl.childLabel==='GV'?'GVs':'Municípios');\n  if(mv.view==='asis'){const mc=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__').length;\n    $('#kpis').innerHTML=[\n      {n:fmt(sectorTotalCbs(mv)),l:`CBs ${lvl.no} ${lc(lvl.label)} ${mv.sector} (antes desta etapa)`,t:`Total de CBs ${lvl.no} ${lc(lvl.label)} hoje — já considerando o que etapas anteriores da timeline mandaram pra cá.`},\n      {n:mv.csvMunisTotal?`${fmt(mc)}/${fmt(mv.csvMunisTotal)}`:fmt(mc),l:`${childPlural} ${lvl.de} ${lc(lvl.label)}`,t:`${lvl.childLabel}(s) desenhados nesta etapa${mv.csvMunisTotal?` de ${fmt(mv.csvMunisTotal)} que a base de dominantes atribui ${lvl.a} ${lc(lvl.label)}`:''}.${(mv.missingMunis||[]).length?' Fora do mapa: '+mv.missingMunis.map(x=>x.muni+' ('+x.reason+')').join(' · '):''}${Object.keys(mv.ufGuessed||{}).length?' UF inferida da UF dominante do setor (nome repetido em outra UF carregada): '+Object.entries(mv.ufGuessed).map(([nm,u])=>nm+'→'+u).join(', '):''}`},\n      {n:fmt(mv.leaders.length),l:'Líderes (grupos)',t:`Líderes presentes ${lvl.no} ${lc(lvl.label)} nesta etapa.`},\n      {n:fmt(mv.dest.length),l:`${lvl.destLabel}s adjacentes`,t:`${lvl.destLabel}s vizinh${lvl.destLabel==='GV'?'as':'os'} (ainda abertas)${lvl.parentPhrase?` ${lvl.parentPhrase}`:''}${mv.gv?` (${mv.gv})`:''} que poderiam receber os ${lc(lvl.childLabel)}s.${(mv.gvRejected||[]).length&&lvl.parentWord?' Fora do mapa, por serem de outr'+(lvl.parentWord==='gerência'?'a':'o')+' '+lvl.parentWord+': '+mv.gvRejected.join(', ')+'.':''}`},\n    ].map(k=>`<div class=\"kpi\" title=\"${k.t}\"><div class=\"n\">${k.n}</div><div class=\"l\">${k.l}</div></div>`).join('');\n    return;}\n  const sv=mv.dest.map(s=>c.span[s]);const spread=sv.length?Math.max(...sv)-Math.min(...sv):0;\n  const zero=mv.dest.filter(s=>c.gained[s]===0);const totCbs=closingCbsOf(mv);\n  $('#kpis').innerHTML=[\n    // \"CBs fora do X\" só faz sentido pra fechamento de setor — a mecânica de vínculo (CBs que\n    // seguem a líder pra fora do território) é uma coisa de setor/orphan, não de GV/mercado.\n    (mv.level||'setor')==='setor'?{n:fmt(c.desloc),l:mv.policy==='fora'?`CBs fora ${lvl.de} ${lc(lvl.destLabel)}`:'CBs c/ quebra de relação',cls:'warn',t:`CBs cuja líder acabou noutr${lvl.a==='à'?'a':'o'} ${lc(lvl.destLabel)} nesta etapa.`}:null,\n    {n:fmt(spread),l:'Desequilíbrio (máx−mín CBs)',cls:spread>800?'warn':'ok',t:`Diferença de tamanho entre ${lvl.destLabel==='GV'?'a maior e a menor':'o maior e o menor'} ${lc(lvl.destLabel)} depois desta etapa.`},\n    {n:fmt(totCbs),l:'CBs realocadas',cls:'',t:`Total de CBs ${lvl.de} ${lc(lvl.label)} ${mv.sector} sendo redistribuídas nesta etapa.`},\n    (mv.level||'setor')==='setor'?{n:zero.length?zero.join(', '):'nenhum',l:`${lvl.destLabel} sem líder herdada`,cls:zero.length?'warn':'ok',t:`${lvl.destLabel} que recebe ${lc(lvl.childLabel)}(s) mas nenhuma líder nesta etapa.`}:null,\n  ].filter(Boolean).concat(mv.excludedCbs?[{n:fmt(mv.excludedCbs),l:`CBs fora do setor · ${fmt(mv.excludedMunis.length)} município(s) fora da base`,cls:'warn',t:'CBs em municípios que a base de dominantes não atribui a este setor: ficam fora do mapa e da alocação geográfica e seguem a líder do seu grupo.'}]:[])\n   .concat((mv.missingMunis||[]).length?[{n:fmt(mv.missingMunis.length),l:`Município(s) da base fora do mapa · ${fmt(mv.csvMunisTotal)} na base`,cls:'warn',t:`A base de dominantes atribui ${fmt(mv.csvMunisTotal)} município(s) ao setor ${mv.sector} e ${fmt(mv.csvMunisTotal-mv.missingMunis.length)} chegaram ao mapa. Fora: ${mv.missingMunis.map(x=>x.muni+' — '+x.reason+(x.cbs?' ('+fmt(x.cbs)+' CBs)':'')).join(' · ')}`}]:[])\n   .map(k=>`<div class=\"kpi ${k.cls}\" title=\"${k.t}\"><div class=\"n\">${k.n}</div><div class=\"l\">${k.l}</div></div>`).join('');\n}\nfunction renderSpans(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const c=computeDerived(mv); const lvl=LEVELS[mv.level||'setor'];\n  if(mv.view==='asis'){const items=[{s:mv.sector,val:sectorTotalCbs(mv),color:CLOSE_COLOR}].concat(mv.dest.map(s=>({s,val:+(mv.baseMetrics[s]?.cbs||0),color:mv.color[s]})));\n    const max=Math.max(...items.map(x=>x.val),1);\n    $('#spans').innerHTML=items.map(x=>`<div class=\"bar-row\"><div class=\"tag\" style=\"color:${x.color}\">${x.s}</div><div class=\"bar-track\">\n      <div class=\"bar-inc\" style=\"width:${x.val/max*100}%;background:${x.color}\"></div></div>\n      <div class=\"bar-val\">${fmt(x.val)}</div></div>`).join('')\n      +`<div class=\"note\">Estrutura antes desta etapa — ${lvl.a} ${lc(lvl.label)} <b>${mv.sector}</b> ainda existe. Alterne pra <b>TOBE</b> pra ver a redistribuição.</div>`;\n    return;}\n  const lim=spanLimits(mv),on=spanLimitsOn(lim);\n  const rawMax=Math.max(...mv.dest.map(s=>c.span[s]),lim.target||0,lim.max||0,1);\n  const max=on?rawMax*1.04:rawMax;   // headroom so a marker sitting at the scale top stays visible\n  const marks='';\n  $('#spans').innerHTML=mv.dest.map(s=>{const base=+(mv.baseMetrics[s]?.cbs||0),i=c.inc[s];\n    const over=lim.max&&c.span[s]>lim.max,under=lim.min&&c.span[s]<lim.min;\n    return `<div class=\"bar-row\"><div class=\"tag\" style=\"color:${mv.color[s]}\">${s}</div><div class=\"bar-track\">\n      <div class=\"bar-base\" style=\"width:${base/max*100}%;background:${mv.color[s]}\"></div>\n      <div class=\"bar-inc\" style=\"width:${i/max*100}%;background:${mv.color[s]}\"></div>${marks}</div>\n      <div class=\"bar-val\" style=\"${over?'color:var(--closing);font-weight:700':(under?'color:#ff9500;font-weight:700':'')}\">${fmt(c.span[s])} <span style=\"opacity:.6\">(+${fmt(i)})</span>${over?' ▲':''}${under?' ▼':''}</div></div>`;}).join('')\n    +`<div class=\"note\">Claro = base (já incluindo etapas anteriores) · cheio = CBs entrantes ${lvl.de} ${mv.sector} nesta etapa.${c.orphanTotal?` Inclui <b>${fmt(c.orphanTotal-c.orphanStranded)}</b> CB(s) de municípios fora da base de dominantes que seguiram suas líderes.`:''}</div>`;\n}\n// Two very different reasons land rows in the __OUTROS__ bucket — no IBGE shape, or outside the\n// sector's dominance base. Same bucket computationally, but they must not read as the same thing.\nfunction outsideNote(mv){\n  const bits=[];\n  if(mv.noShapeCbs) bits.push(`<b>${fmt(mv.noShapeCbs)}</b> CBs em ${fmt(mv.noShapeMunis.length)} município(s) sem shape na UF`);\n  if(mv.excludedCbs) bits.push(`<b>${fmt(mv.excludedCbs)}</b> CBs em ${fmt(mv.excludedMunis.length)} município(s) <b>fora da base de dominantes</b> deste setor — <b style=\"color:var(--closing)\">quebra de vínculo</b>`);\n  if(!bits.length) return '';\n  let h=`<div class=\"note\">Fora do mapa e da alocação geográfica: ${bits.join(' · ')}.`;\n  if(mv.excludedCbs){\n    const c=computeDerived(mv);\n    h+=` As <b>${fmt(mv.excludedCbs)}</b> CBs em quebra de vínculo <b>seguem a líder do seu grupo</b>`;\n    const byS=mv.dest.filter(s=>c.orph[s]).map(s=>`<b style=\"color:${mv.color[s]}\">${s}</b> (${fmt(c.orph[s])})`);\n    h+=byS.length?`: ${byS.join(' · ')}.`:'.';\n    if(c.orphanStranded) h+=` <b style=\"color:var(--closing)\">${fmt(c.orphanStranded)} CB(s) sem destino</b> — a líder não ficou com nenhum município realocado, então não há setor pra seguir.`;\n  }\n  if(mv.noShapeCbs) h+=` As CBs sem shape na UF continuam fora de qualquer setor destino.`;\n  if(mv.excludedMunis&&mv.excludedMunis.length) h+=`<br><span style=\"opacity:.85\">${mv.excludedMunis.slice(0,8).map(x=>x.muni+' ('+fmt(x.cbs)+')').join(', ')}${mv.excludedMunis.length>8?' +'+(mv.excludedMunis.length-8):''}</span>`;\n  return h+`</div>`;\n}\nfunction renderMuni(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const lvl=LEVELS[mv.level||'setor'];\n  const plural=lvl.childLabel==='Setor'?'Setores':(lvl.childLabel==='GV'?'GVs':'Municípios');\n  const fem=lvl.childLabel==='GV';\n  const t=$('#muniListTitle'); if(t) t.textContent=`${plural} → ${lc(lvl.destLabel)} destino`;\n  const nt=$('#muniListNote'); if(nt) nt.innerHTML=`Clique no <b>código ${lvl.a} ${lc(lvl.destLabel)}</b> pra mandar ${lvl.a} ${lc(lvl.childLabel)} <b>inteir${fem?'a':'o'}</b> pra lá (regra de negócio). A cor acompanha o mapa.`;\n  const ms=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__').sort((a,b)=>mv.munis[b].cbs-mv.munis[a].cbs);\n  if(mv.view==='asis'){$('#muniList').innerHTML=ms.map(m=>`<div class=\"muni-item\"><div class=\"nm\">${m}</div><div class=\"ct\">${fmt(mv.munis[m].cbs)} CBs</div><span class=\"badge\" style=\"background:${CLOSE_COLOR};color:#fff;border-color:${CLOSE_COLOR}\">${lc(lvl.label)} ${mv.sector}</span></div>`).join('')\n      +`<div class=\"note\">Hoje tod${fem?'as':'os'} pertencem ${lvl.a} ${lc(lvl.label)} <b>${mv.sector}</b>. No <b>TOBE</b> cada um vira botões de destino.</div>`+outsideNote(mv);return;}\n  $('#muniList').innerHTML=ms.map(m=>`<div class=\"muni-item\"><div class=\"nm\">${m}</div><div class=\"ct\">${fmt(mv.munis[m].cbs)} CBs</div>\n    <div class=\"seg\" data-m=\"${m}\">${mv.dest.map(s=>`<button data-s=\"${s}\" class=\"${mv.assign[m]===s?'on':''}\" style=\"${mv.assign[m]===s?'background:'+mv.color[s]:''}\">${s}</button>`).join('')}</div></div>`).join('')\n    +outsideNote(mv);\n  $('#muniList').querySelectorAll('.seg button').forEach(b=>b.onclick=()=>{const m=b.parentElement.dataset.m,s=b.dataset.s;editSelected(m2=>{m2.assign[m]=s;});});\n}\nfunction renderLeaders(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const c=computeDerived(mv);\n  if(mv.view==='asis'){$('#leaders').innerHTML=`<thead><tr><th>Líder</th><th>Grupo</th><th>CBs</th><th>${LEVELS[mv.level||'setor'].label}</th></tr></thead><tbody>`\n    +mv.leaders.map(L=>`<tr><td>${(L.lider||'').split(' ').slice(0,2).join(' ')}</td><td>${L.grupo}</td><td>${fmt(L.total)}</td><td><span class=\"home\" style=\"background:${CLOSE_COLOR}\"></span>${mv.sector}</td></tr>`).join('')\n    +`<tr style=\"font-weight:700\"><td>TOTAL</td><td></td><td>${fmt(mv.leaders.reduce((a,L)=>a+L.total,0))}</td><td></td></tr></tbody>`;return;}\n  const showOrph=c.orphanTotal>0;\n  $('#leaders').innerHTML=`<thead><tr><th>Líder</th><th>CBs</th><th>Home</th>${mv.dest.map(s=>`<th>${s}</th>`).join('')}${showOrph?'<th title=\"CBs em municípios fora da base de dominantes que seguiram esta líder\">Fora do setor</th>':''}<th>Desloc.</th></tr></thead><tbody>`\n   +c.leaders.map(L=>`<tr><td>${(L.lider||'').split(' ').slice(0,2).join(' ')}</td><td>${fmt(L.total)}</td>\n     <td>${L.home?`<span class=\"home\" style=\"background:${mv.color[L.home]}\"></span>${L.home}`:'–'}</td>\n     ${mv.dest.map(s=>`<td class=\"cell\" style=\"${s===L.home?'color:'+mv.color[s]+';font-weight:700':''}\">${L.byS[s]||'·'}</td>`).join('')}\n     ${showOrph?`<td class=\"cell\" style=\"${L.orphan&&!L.orphanHome?'color:var(--closing);font-weight:700':''}\" title=\"${L.orphan?(L.orphanHome?'seguem a líder para o setor '+L.orphanHome:'sem home — CBs sem setor pra seguir'):''}\">${L.orphan?fmt(L.orphan)+(L.orphanHome?'':' ⚠'):'·'}</td>`:''}\n     <td style=\"color:${L.desloc?'var(--closing)':'var(--mut)'};font-weight:${L.desloc?700:400}\">${L.desloc||'0'}</td></tr>`).join('')\n   +`<tr style=\"font-weight:700\"><td>TOTAL</td><td>${fmt(c.leaders.reduce((a,L)=>a+L.total,0))}</td><td></td>${mv.dest.map(s=>`<td>${fmt(c.leaders.reduce((a,L)=>a+L.byS[s],0))}</td>`).join('')}${showOrph?`<td>${fmt(c.orphanTotal)}</td>`:''}<td style=\"color:var(--closing)\">${fmt(c.desloc)}</td></tr></tbody>`;\n}\nfunction renderMatrix(){const mv=SESS.timeline[SESS.selected]; if(!mv) return;\n  // Esta matriz cruza LINHAS DO CRM (município x grupo) — no fechamento de GV/mercado a unidade\n  // que troca de dono é setor/GV, não município, e reconstruir a matriz nesse grão é trabalho ainda\n  // não feito; mostrar a tabela como se fosse por município aqui daria linhas vazias sem avisar.\n  if((mv.level||'setor')!=='setor'){ $('#matrix').innerHTML=`<tr><td class=\"note\" style=\"padding:10px\">Matriz por município × grupo ainda não disponível pra fechamento de ${LEVELS[mv.level].label} — use os KPIs, líderes e plano de migração acima.</td></tr>`; return; }\n  const ms=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__').sort((a,b)=>mv.munis[b].cbs-mv.munis[a].cbs);\n  // `_out` is a flag stamped on the ROW, and rows are shared between etapas (absorbed + inherited\n  // orphans), so the last etapa to aggregate wins and reading it here can describe the wrong etapa.\n  // Derive the bucket from THIS mv instead. Summing rather than .find() because several out-municípios\n  // of the same group all collapse into __OUTROS__, and only the first was being counted.\n  const outOf=x=>!mv.geoFeat[mkey(x.municipio,x.uf)];\n  const cell=(m,g)=>mv.matrix.reduce((a,x)=>a+((((outOf(x)?'__OUTROS__':mkey(x.municipio,x.uf))===m)&&String(x.grupo)===g)?+x.cbs:0),0);\n  const mx=Math.max(...ms.flatMap(m=>mv.leaders.map(L=>cell(m,L.grupo))),1);\n  // No destination column here. This is the AS-IS matrix: every município in it still belongs to the\n  // closing sector, so showing where it is HEADED mixed the two states of the world in one table and\n  // made the ASIS view read like a plan. The destination lives on the map and in \"Municípios → setor\n  // destino\", which are about the to-be.\n  $('#matrix').innerHTML=`<thead><tr><th>Município</th>${mv.leaders.map(L=>`<th title=\"${L.lider}\">${L.grupo}</th>`).join('')}<th>Tot</th></tr></thead><tbody>`\n   +ms.map(m=>`<tr><td>${m}</td>`\n     +mv.leaders.map(L=>{const v=cell(m,L.grupo);return `<td class=\"cell\" style=\"${v?`background:rgba(229,181,63,${.08+v/mx*.5})`:''}\">${v||'·'}</td>`;}).join('')\n     +`<td style=\"font-weight:700\">${fmt(mv.munis[m].cbs)}</td></tr>`).join('')+`</tbody>`;\n}\n// TOBE counterpart of the AS-IS matrix: the same município × grupo grid plus the two columns the AS-IS\n// view deliberately refuses to carry — where the município ends up, and under which líder.\n// \"Líder resultante\" is the líder holding the most CBs in that município. A município is served by several\n// grupos at once and the data names no single owner, so the dominant one is the honest answer and its\n// share is printed beside it instead of being hidden behind a single name.\nfunction renderMatrixTobe(){const mv=SESS.timeline[SESS.selected]; const el=$('#matrixTobe'); const nt=$('#tobeNote');\n  if(!el) return;\n  if(!mv||!mv.munis){ el.innerHTML=''; if(nt) nt.innerHTML=''; return; }\n  if((mv.level||'setor')!=='setor'){ el.innerHTML=`<tr><td class=\"note\" style=\"padding:10px\">Matriz por município × grupo ainda não disponível pra fechamento de ${LEVELS[mv.level].label} — use os KPIs, líderes e plano de migração acima.</td></tr>`; if(nt) nt.innerHTML=''; return; }\n  const c=computeDerived(mv);\n  const homeOf={}; c.leaders.forEach(L=>{ homeOf[L.grupo]=L.home; });\n  const ms=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__').sort((a,b)=>mv.munis[b].cbs-mv.munis[a].cbs);\n  // One pass over the matrix instead of a scan per cell: the AS-IS table can afford the naive version\n  // on six municípios, but this one asks for the dominant líder too, which multiplies the lookups.\n  const outOf=x=>!mv.geoFeat[mkey(x.municipio,x.uf)];\n  const cellBy={}; mv.matrix.forEach(x=>{ const k=(outOf(x)?'__OUTROS__':mkey(x.municipio,x.uf))+'|'+String(x.grupo);\n    cellBy[k]=(cellBy[k]||0)+ +x.cbs; });\n  const cell=(m,g)=>cellBy[m+'|'+g]||0;\n  const mx=Math.max(...ms.flatMap(m=>mv.leaders.map(L=>cell(m,L.grupo))),1);\n  const domLeader=m=>{ let best=null,bc=0;\n    mv.leaders.forEach(L=>{ const v=cell(m,L.grupo); if(v>bc){ bc=v; best=L; } });\n    return best?{L:best,cbs:bc}:null; };\n  const short=L=>(L.lider||'').split(' ').slice(0,2).join(' ')||('grupo '+L.grupo);\n  // NOT named `rows` — that is the module-level Databricks response helper, and shadowing it inside a\n  // render function is a trap for whoever adds a query here later.\n  // Off-mismatch ainda calculado pra alimentar a nota abaixo da tabela — só não vira mais coluna: o\n  // destino agora é \"Setor destino\" por GRUPO no rodapé, não mais por município na grade.\n  const recs=ms.map(m=>{ const d=mv.assign[m]||null, dl=domLeader(m);\n    const home=dl?(homeOf[dl.L.grupo]||null):null;\n    return {m:m,off:!!(dl&&home&&d&&home!==d)}; });\n  el.innerHTML=`<thead><tr><th>Município</th>${mv.leaders.map(L=>`<th title=\"${esc(L.lider||'')}\">${L.grupo}<br><span style=\"font-weight:400;font-size:10px;color:var(--mut)\">${esc(short(L))}</span></th>`).join('')}<th>Tot</th></tr></thead><tbody>`\n   +ms.map(m=>`<tr><td>${m}</td>`\n     +mv.leaders.map(L=>{const v=cell(m,L.grupo);return `<td class=\"cell\" style=\"${v?`background:rgba(229,181,63,${.08+v/mx*.5})`:''}\">${v||'·'}</td>`;}).join('')\n     +`<td style=\"font-weight:700\">${fmt(mv.munis[m].cbs)}</td></tr>`).join('')\n   // Um rótulo de destino por GRUPO (coluna), não por município (linha) — cada grupo tem UM home\n   // fixo (computeDerived já calculou), então ele mora uma vez no rodapé, igual o nome já morava.\n   +`<tr class=\"lider-foot\"><td>Setor destino</td>`\n     +mv.leaders.map(L=>{const h=homeOf[L.grupo]; return `<td>${h?`<span class=\"home\" style=\"background:${mv.color[h]}\"></span>${h}`:'–'}</td>`;}).join('')\n     +`<td></td></tr>`\n   +`</tbody>`;\n  if(nt){\n    const offN=recs.filter(r=>r.off).length;\n    nt.innerHTML=(mv.policy!=='fora')\n      ? `Política <b>quebrar relação</b>: as CBs deixam a líder atual e passam à estrutura do setor destino — o rodapé mostra pra onde cada grupo vai.`\n      : `<b>Setor destino</b> = o setor que recebe a maior parte das CBs de cada líder (rodapé, uma vez por grupo). `\n        +(offN?`<span style=\"color:var(--closing)\">${fmt(offN)} município(s) ⚠</span> têm a líder dominante indo para um setor diferente do dela — as CBs seguem a líder (é disso que o KPI “CBs fora do setor” é feito).`\n          :`Em todos os municípios a líder dominante termina no mesmo setor que recebe o território.`);\n  }\n}\nfunction renderPolicy(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const c=computeDerived(mv); const lvl=LEVELS[mv.level||'setor'];\n  // O toggle fora-do-setor/quebra-de-relação é uma decisão de setor fechando — em GV/mercado a\n  // seção some inteira em vez de mostrar um controle que não corresponde a nada calculado.\n  const sec=$('#policySection'); if(sec) sec.classList.toggle('hidden',(mv.level||'setor')!=='setor');\n  if((mv.level||'setor')!=='setor') return;\n  $('#policyNote').innerHTML=mv.policy==='fora'\n    ?`<b style=\"color:var(--acc)\">Mantendo vínculo:</b> ${fmt(c.desloc)} CBs seguem com a líder mas ficam <b>fisicamente noutr${lvl.a==='à'?'a':'o'} ${lc(lvl.destLabel)}</b>. Preserva relação; suja geografia.`\n    :`<b style=\"color:var(--acc)\">Quebrando vínculo:</b> ${fmt(c.desloc)} CBs <b>re-vinculam a uma líder d${lvl.a==='à'?'a':'o'} ${lc(lvl.destLabel)} destino</b>. Geografia limpa; rompe relação.`;\n}\nfunction renderPlan(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const c=computeDerived(mv); const lvl=LEVELS[mv.level||'setor']; const ms=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__').sort((a,b)=>a.localeCompare(b));\n  // GV/mercado: a chave \"m\" aqui é um código de setor/GV, não uma chave município/UF — mName/mUf\n  // parseariam lixo, então o CSV de plano exporta o código cru nesses níveis.\n  mv._plan=ms.map(m=>(mv.level&&mv.level!=='setor')?{municipio:m,uf:'',cbs:mv.munis[m].cbs,destino:mv.assign[m]}:{municipio:mName(m),uf:mUf(m),cbs:mv.munis[m].cbs,destino:mv.assign[m]});\n  $('#plan').innerHTML=`Etapa ${SESS.selected+1} · ${lvl.label} <b>${mv.sector}</b> → ${ms.map(m=>`${m}→<b style=\"color:${mv.color[mv.assign[m]]}\">${mv.assign[m]||'–'}</b>`).join(' · ')}<br>\n   Política: <b>${mv.policy==='fora'?`manter vínculo (CBs fora ${lvl.de} ${lc(lvl.destLabel)})`:'quebrar relação'}</b> · ${fmt(c.desloc)} CBs impactadas nesta etapa.`\n   +(c.orphanTotal?`<br>Fora da base de dominantes: ${fmt(c.orphanTotal)} CB(s) seguem suas líderes — ${mv.dest.filter(s=>c.orph[s]).map(s=>`${s} (${fmt(c.orph[s])})`).join(' · ')||'–'}${c.orphanStranded?` · <b style=\"color:var(--closing)\">${fmt(c.orphanStranded)} sem líder com destino</b>`:''}. Não entram no CSV, que é por município.`:'');\n}\nfunction renderReport(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const c=computeDerived(mv);\n  mv.metric=mv.metric||'cbs';\n  const KEYS=METRICS_DEF.map(m=>m[0]);\n  const incBy={};mv.dest.forEach(s=>incBy[s]=Object.fromEntries(KEYS.map(k=>[k,0])));\n  Object.entries(mv.munis).forEach(([m,o])=>{if(m==='__OUTROS__')return;const s=mv.assign[m];if(!s||!incBy[s])return;KEYS.forEach(k=>incBy[s][k]+=o[k]||0);});\n  // orphan CBs land on their leader's home sector, not on a geographic destination\n  c.leaders.forEach(L=>{ const om=mv.orphanMetricsByGroup&&mv.orphanMetricsByGroup[L.grupo];\n    if(om&&L.home&&incBy[L.home]) KEYS.forEach(k=>incBy[L.home][k]+=om[k]||0); });\n  const closeTot={};KEYS.forEach(k=>closeTot[k]=Object.entries(mv.munis).filter(([m])=>m!=='__OUTROS__').reduce((a,[,o])=>a+(o[k]||0),0));\n  // they leave the closing sector too, so antes → depois still balances\n  c.leaders.forEach(L=>{ const om=mv.orphanMetricsByGroup&&mv.orphanMetricsByGroup[L.grupo];\n    if(om&&L.home) KEYS.forEach(k=>closeTot[k]+=om[k]||0); });\n  const trend=mv.trend.slice(-6);\n  const chartHTML=mk=>{\n    const isM=['receita','rec_nat','rec_avon'].includes(mk); const fN=isM?money:fmt;\n    const data=mv.dest.map(s=>({label:s,color:mv.color[s],antes:+(mv.baseMetrics[s]?.[mk]||0),depois:+(mv.baseMetrics[s]?.[mk]||0)+(incBy[s]?.[mk]||0)}));\n    data.push({label:mv.sector+'✕',color:'#ff3b30',antes:closeTot[mk]||0,depois:0});\n    const max=Math.max(...data.flatMap(d=>[d.antes,d.depois]),1);\n    const W=720,H=290,base=238,top=42,maxH=base-top,n=data.length,gw=(W-16)/n;\n    let g='';\n    data.forEach((d,i)=>{const cx=8+gw*i+gw/2,bw=Math.min(30,gw*0.30);\n      const ah=d.antes/max*maxH,dh=d.depois/max*maxH,ax=cx-bw-2,dx=cx+2;\n      g+=`<rect x=\"${ax.toFixed(1)}\" y=\"${(base-ah).toFixed(1)}\" width=\"${bw.toFixed(1)}\" height=\"${ah.toFixed(1)}\" rx=\"2.5\" fill=\"${d.color}\" opacity=\"0.35\"/>`;\n      g+=`<rect x=\"${dx.toFixed(1)}\" y=\"${(base-dh).toFixed(1)}\" width=\"${bw.toFixed(1)}\" height=\"${dh.toFixed(1)}\" rx=\"2.5\" fill=\"${d.color}\"/>`;\n      g+=`<text x=\"${(ax+bw/2).toFixed(1)}\" y=\"${(base-ah-4).toFixed(1)}\" text-anchor=\"middle\" font-size=\"9\" fill=\"#9a9aa8\">${fN(d.antes)}</text>`;\n      g+=`<text x=\"${(dx+bw/2).toFixed(1)}\" y=\"${(base-dh-4).toFixed(1)}\" text-anchor=\"middle\" font-size=\"9.5\" font-weight=\"700\" fill=\"${d.color}\">${fN(d.depois)}</text>`;\n      const dp=d.antes?((d.depois-d.antes)/d.antes*100):(d.depois?100:0);\n      g+=`<text x=\"${cx.toFixed(1)}\" y=\"16\" text-anchor=\"middle\" font-size=\"10.5\" font-weight=\"700\" fill=\"${dp>=0?'#34c759':'#ff3b30'}\">${dp>0?'+':''}${dp.toFixed(0)}%</text>`;\n      g+=`<text x=\"${cx.toFixed(1)}\" y=\"${base+16}\" text-anchor=\"middle\" font-size=\"10.5\" font-weight=\"700\" fill=\"#1c1c2b\">${d.label}</text>`;});\n    return `<svg viewBox=\"0 0 ${W} ${H}\" style=\"width:100%\"><line x1=\"8\" y1=\"${base}\" x2=\"${W-8}\" y2=\"${base}\" stroke=\"#e7e7ef\"/>${g}</svg>`;\n  };\n  let h=`<div style=\"display:flex;justify-content:space-between;align-items:center;gap:10px;flex-wrap:wrap\">\n      <h2 style=\"margin:0\">Impacto antes → depois desta etapa</h2>\n      <select id=\"metricSel\">${METRICS_DEF.map(m=>`<option value=\"${m[0]}\" ${m[0]===mv.metric?'selected':''}>${m[1]}</option>`).join('')}</select></div>\n    <div class=\"note\" style=\"margin:2px 0 4px\">Barra clara = <b>antes desta etapa</b> (já incluindo etapas anteriores) · barra cheia = <b>depois</b> · <b style=\"color:var(--acc)\">${mv.sector}✕</b> = ${lc(lvl.label)} fechad${lvl.a==='à'?'a':'o'} nesta etapa · % = variação</div>\n    ${chartHTML(mv.metric)}`;\n  h+=`<h2 style=\"margin-top:16px\">Antes → Depois por ${lc(lvl.destLabel)} receptor (snapshot congelado)</h2>\n    <div class=\"scroll\"><table><thead><tr><th>${lvl.destLabel}</th>${METRICS_DEF.map(m=>`<th>${m[1]}</th>`).join('')}</tr></thead><tbody>`;\n  mv.dest.forEach(s=>{const b=mv.baseMetrics[s]||{};const inc=incBy[s];\n    h+=`<tr><td><span class=\"home\" style=\"background:${mv.color[s]}\"></span>${s}</td>`+\n      METRICS_DEF.map(([k])=>{const bv=+b[k]||0,av=bv+(inc[k]||0);const d=bv?((av-bv)/bv*100):0;const f=METRICS_DEF.find(x=>x[0]===k)[2]==='$'?money:fmt;\n        return `<td>${f(av)}<div class=\"delta ${d>=0?'up':'dn'}\">${d>0?'+':''}${d.toFixed(0)}%</div></td>`;}).join('')+`</tr>`;});\n  h+=`<tr style=\"opacity:.8\"><td>${mv.sector} (sai)</td>`+METRICS_DEF.map(([k,,t])=>`<td>${(t==='$'?money:fmt)(closeTot[k]||0)}</td>`).join('')+`</tr>`;\n  h+=`</tbody></table></div>`;\n  const incLvl={};mv.dest.forEach(s=>incLvl[s]={});\n  Object.keys(mv.munis).forEach(m=>{if(m==='__OUTROS__')return;const s=mv.assign[m];if(!s||!incLvl[s])return;const lv=mv.levelByMuni[m]||{};for(const nv in lv)incLvl[s][nv]=(incLvl[s][nv]||0)+lv[nv];});\n  c.leaders.forEach(L=>{ const ol=mv.orphanLevelByGroup&&mv.orphanLevelByGroup[L.grupo];\n    if(ol&&L.home&&incLvl[L.home]) Object.entries(ol).forEach(([nv,n])=>incLvl[L.home][nv]=(incLvl[L.home][nv]||0)+n); });\n  h+=`<h2 style=\"margin-top:18px\">Consultoras por nível — antes → depois por ${lc(lvl.destLabel)} receptor</h2>\n    <div class=\"scroll\"><table><thead><tr><th>${lvl.destLabel}</th>${NIVEIS.map(n=>`<th>${n}</th>`).join('')}<th>Total</th></tr></thead><tbody>`;\n  mv.dest.forEach(s=>{const base=mv.baseLevel[s]||{},inc=incLvl[s]||{};let tb=0,ta=0;\n    h+=`<tr><td><span class=\"home\" style=\"background:${mv.color[s]}\"></span>${s}</td>`+\n      NIVEIS.map(nv=>{const b=base[nv]||0,i=inc[nv]||0,a=b+i;tb+=b;ta+=a;\n        return `<td>${a?fmt(a):'·'}${i?`<div class=\"delta up\">+${fmt(i)}</div>`:''}</td>`;}).join('')+\n      `<td style=\"font-weight:700\">${fmt(ta)}${ta-tb?`<div class=\"delta up\">+${fmt(ta-tb)}</div>`:''}</td></tr>`;});\n  h+=`</tbody></table></div><div class=\"note\">Número = CBs por nível <b>depois</b> desta etapa · <span style=\"color:var(--ok)\">+N</span> = entrantes do ${mv.sector}.</div>`;\n  const spk=(key)=>{const vals=trend.map(t=>+t[key]||0);const mx=Math.max(...vals,1);\n    return `<div class=\"spark\">${vals.map(v=>`<div class=\"b\" style=\"height:${(v/mx*100).toFixed(0)}%\" title=\"${fmt(v)}\"></div>`).join('')}</div>\n      <div class=\"note\">${trend.map(t=>String(t.ciclo).slice(-2)).join(' · ')}</div>`;};\n  h+=`<h2 style=\"margin-top:18px\">Setor ${mv.sector} — últimos ${trend.length} ciclos até o snapshot congelado</h2>\n    <div class=\"note\" style=\"margin:-4px 0 8px\">Tendência histórica <b>do próprio setor</b> — não ajustada pela absorção hipotética de etapas anteriores (limitação conhecida: tendência é por setor, não decomponível por município).</div>\n    <div style=\"display:grid;grid-template-columns:repeat(4,1fr);gap:10px\">\n    ${[['cbs','CBs'],['ativas','Ativas'],['receita','Receita'],['pontos','Pontos']].map(([k,l])=>`<div><div class=\"note\" style=\"margin:0 0 3px;font-weight:600;color:var(--ink)\">${l}</div>${spk(k)}</div>`).join('')}</div>`;\n  $('#tab-report').innerHTML=h;\n  const sel=$('#metricSel'); if(sel) sel.onchange=()=>{mv.metric=sel.value; renderReport();};\n}\nfunction renderCumulative(){\n  const el=$('#tab-cumulative'); if(!el) return;\n  // Esta view soma a cadeia inteira via foldWorldState().muniOverride/sectorBaseCache — hoje só\n  // populados pelo fechamento de setor. GV/mercado têm o rastro equivalente (secOverride/gvOverride),\n  // mas essa agregação ainda não foi refeita nesse grão; melhor avisar do que mostrar tabela vazia.\n  const lockLvl=SESS.timeline.length?(SESS.timeline[0].level||'setor'):'setor';\n  if(lockLvl!=='setor'){ el.innerHTML=`<div class=\"note\">Impacto acumulado da cadeia ainda não disponível pra sessões de ${lc(LEVELS[lockLvl].label)} — use o relatório da etapa (aba anterior) etapa a etapa.</div>`; return; }\n  if(!SESS.timeline.length){ el.innerHTML='<div class=\"note\">Nenhuma etapa na timeline ainda.</div>'; return; }\n  const ready=SESS.timeline.every(mv=>mv.munis);\n  if(!ready){ el.innerHTML='<div class=\"note\">Aguardando etapas terminarem de calcular…</div>'; return; }\n  const finalWorld=foldWorldState(SESS.timeline,SESS.timeline.length);\n  const openSectors=[...new Set(Object.values(finalWorld.muniOverride))];\n  let h=`<h2 style=\"margin:0 0 8px\">Linha do tempo — ${SESS.timeline.length} fechamento(s)</h2>\n    <div class=\"note\" style=\"margin:-2px 0 10px\">Setores fechados, em ordem: ${SESS.timeline.map(mv=>mv.sector).join(' → ')}. Cada linha abaixo soma o efeito de <b>toda a cadeia</b>, não apenas da última etapa.</div>`;\n  h+=`<div class=\"scroll\"><table><thead><tr><th>Setor</th><th>Situação</th>${METRICS_DEF.map(([,l])=>`<th>${l}</th>`).join('')}</tr></thead><tbody>`;\n  SESS.timeline.forEach((mv,i)=>{\n    h+=`<tr style=\"opacity:.75\"><td>${mv.sector}</td><td>fechado (etapa ${i+1})</td>`+METRICS_DEF.map(([k,,t])=>`<td>${(t==='$'?money:fmt)(mv.pureOwnMetrics?.[k]||0)}</td>`).join('')+`</tr>`;\n  });\n  openSectors.forEach(s=>{\n    const base=SESS.sectorBaseCache[s]||{};\n    const infl=finalWorld.sectorInflow[s]||{};\n    h+=`<tr><td>${s}</td><td>recebeu território</td>`+METRICS_DEF.map(([k,,t])=>{\n      const bv=+base[k]||0, av=bv+(infl[k]||0); const d=bv?((av-bv)/bv*100):0; const f=(t==='$'?money:fmt);\n      return `<td>${f(av)}<div class=\"delta ${d>=0?'up':'dn'}\">${d>0?'+':''}${d.toFixed(0)}%</div></td>`;\n    }).join('')+`</tr>`;\n  });\n  h+=`</tbody></table></div><div class=\"note\">\"Antes\" de um setor receptor é o snapshot congelado (sem nenhum fechamento aplicado); \"depois\" soma tudo que a cadeia inteira jogou pra ele.</div>`;\n  el.innerHTML=h;\n}\nfunction project(feats){let mnx=1/0,mny=1/0,mxx=-1/0,mxy=-1/0;\n  const each=cb=>feats.forEach(f=>{const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];ps.forEach(p=>p.forEach(r=>r.forEach(cb)));});\n  each(p=>{mnx=Math.min(mnx,p[0]);mxx=Math.max(mxx,p[0]);mny=Math.min(mny,p[1]);mxy=Math.max(mxy,p[1]);});\n  const mlat=(mny+mxy)/2,kx=Math.cos(mlat*Math.PI/180),W=700,H=500,pad=22;\n  const gw=(mxx-mnx)*kx,gh=(mxy-mny),sc=Math.min((W-2*pad)/gw,(H-2*pad)/gh);\n  const ox=(W-gw*sc)/2,oy=(H-gh*sc)/2;\n  return p=>[ox+(p[0]-mnx)*kx*sc, oy+(mxy-p[1])*sc];\n}\nfunction pathFor(f,pr){const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];\n  return ps.map(poly=>poly.map(r=>'M'+r.map(p=>{const q=pr(p);return q[0].toFixed(1)+','+q[1].toFixed(1);}).join('L')+'Z').join('')).join('');}\nfunction cxy(f,pr){let x=0,y=0,n=0;const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];ps.forEach(poly=>poly[0].forEach(p=>{const q=pr(p);x+=q[0];y+=q[1];n++;}));return[x/n,y/n];}\n// ---------- label placement ----------\n// Pole of inaccessibility: the interior point farthest from ANY boundary of the dissolved area. A\n// centroid is only a mean — on a concave sector, one split across a river, or a member whose vertex\n// average falls in a bay, it lands outside the very territory it is supposed to name, which is what\n// pushed the sector numbers off their own shapes. Even-odd across every ring of every member is a\n// correct union test here because municipalities tile rather than overlap.\n// The search box is clipped to the viewBox, so the result is inside the territory AND on screen.\n// Rings are decimated first — this is a label, not a measurement — which keeps a 20-município sector\n// to a few million ops, and the result is cached per stage: geometry never changes between renders,\n// only the fill does.\nfunction labelPointFor(fs,pr){\n  const rings=[];\n  (fs||[]).forEach(f=>{ if(!f||!f.geometry) return;\n    const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];\n    ps.forEach(poly=>poly.forEach(r=>{\n      if(!r||r.length<4) return;\n      const step=Math.max(1,Math.floor(r.length/120)),pts=[];\n      for(let i=0;i<r.length;i+=step) pts.push(pr(r[i]));\n      if(pts.length>3) rings.push(pts);\n    }));});\n  if(!rings.length) return null;\n  let mnx=1/0,mny=1/0,mxx=-1/0,mxy=-1/0;\n  rings.forEach(r=>r.forEach(p=>{ if(p[0]<mnx)mnx=p[0]; if(p[0]>mxx)mxx=p[0]; if(p[1]<mny)mny=p[1]; if(p[1]>mxy)mxy=p[1]; }));\n  mnx=Math.max(mnx,2); mny=Math.max(mny,2); mxx=Math.min(mxx,698); mxy=Math.min(mxy,498);\n  if(!(mxx>mnx&&mxy>mny)) return null;\n  const inside=(x,y)=>{ let c=false;\n    for(const r of rings) for(let i=0,j=r.length-1;i<r.length;j=i++){ const a=r[i],b=r[j];\n      if(((a[1]>y)!==(b[1]>y)) && (x<(b[0]-a[0])*(y-a[1])/(b[1]-a[1])+a[0])) c=!c; }\n    return c; };\n  const edgeDist=(x,y)=>{ let m=Infinity;\n    for(const r of rings) for(let i=0,j=r.length-1;i<r.length;j=i++){ const a=r[i],b=r[j];\n      const dx=b[0]-a[0],dy=b[1]-a[1],L=dx*dx+dy*dy;\n      let t=L?(((x-a[0])*dx+(y-a[1])*dy)/L):0; t=t<0?0:(t>1?1:t);\n      const ex=a[0]+t*dx-x,ey=a[1]+t*dy-y,d=ex*ex+ey*ey; if(d<m)m=d; }\n    return Math.sqrt(m); };\n  const W=mxx-mnx,H=mxy-mny,N=26;\n  let best=null,bd=-1;\n  for(let i=0;i<=N;i++) for(let j=0;j<=N;j++){\n    const x=mnx+W*i/N,y=mny+H*j/N;\n    if(!inside(x,y)) continue;\n    const d=edgeDist(x,y); if(d>bd){ bd=d; best=[x,y]; }\n  }\n  if(!best) return null;\n  // Hill-climb off the coarse grid: the grid only has to land somewhere in the right lobe, the\n  // refinement finds the deep point inside it — halving the step whenever no neighbour improves.\n  let step=Math.max(W,H)/N/2;\n  for(let k=0;k<7;k++){\n    let moved=false;\n    for(const o of [[1,0],[-1,0],[0,1],[0,-1],[1,1],[1,-1],[-1,1],[-1,-1]]){\n      const x=best[0]+o[0]*step,y=best[1]+o[1]*step;\n      if(x<mnx||x>mxx||y<mny||y>mxy||!inside(x,y)) continue;\n      const d=edgeDist(x,y); if(d>bd){ bd=d; best=[x,y]; moved=true; }\n    }\n    if(!moved) step/=2;\n  }\n  // The clearance travels with the point: it is the radius of the largest circle that fits inside the\n  // territory there, which is exactly the budget a caller needs to decide how much text will fit.\n  return {p:best,r:bd};\n}\nfunction labelPointOf(mv,key,fs,pr){\n  if(!mv._lbl) mv._lbl={};\n  if(!(key in mv._lbl)) mv._lbl[key]=labelPointFor(fs,pr);\n  return mv._lbl[key];\n}\n// ---------- map zoom/pan ----------\n// Zoom é feito manipulando o viewBox, nunca um transform CSS — assim rótulos e polígonos vivem no\n// MESMO sistema de coordenadas e escalam juntos automaticamente (texto tem font-size em unidades do\n// viewBox, então encolher o viewBox amplia tudo por igual, sem lógica extra pro tamanho da fonte).\nconst MAP_W=700, MAP_H=500, MAP_ZOOM_MAX=8;\nlet mapView={x:0,y:0,w:MAP_W,h:MAP_H};\nfunction applyMapView(){\n  const svg=$('#map'); if(!svg) return;\n  svg.setAttribute('viewBox', mapView.x.toFixed(2)+' '+mapView.y.toFixed(2)+' '+mapView.w.toFixed(2)+' '+mapView.h.toFixed(2));\n  // Rótulo tem font-size em unidades do viewBox, então sem isso ele cresceria junto com o zoom até\n  // virar um borrão — encolhendo o font-size na mesma proporção que o viewBox encolhe cancela\n  // exatamente o zoom, e o texto fica do MESMO tamanho na tela em qualquer nível de zoom.\n  const fsScale=mapView.w/MAP_W;\n  svg.querySelectorAll('text[data-fs]').forEach(t=>{\n    const base=+t.getAttribute('data-fs')||8;\n    t.setAttribute('font-size',(base*fsScale).toFixed(2));\n  });\n}\nfunction zoomMapBy(factor){\n  const cx=mapView.x+mapView.w/2, cy=mapView.y+mapView.h/2;\n  let w=mapView.w/factor, h=mapView.h/factor;\n  w=Math.min(MAP_W, Math.max(MAP_W/MAP_ZOOM_MAX, w));\n  h=Math.min(MAP_H, Math.max(MAP_H/MAP_ZOOM_MAX, h));\n  let x=cx-w/2, y=cy-h/2;\n  x=Math.min(MAP_W-w, Math.max(0,x));\n  y=Math.min(MAP_H-h, Math.max(0,y));\n  mapView={x,y,w,h};\n  applyMapView();\n}\n// Arrastar sempre fica DENTRO do canvas de 700x500 (clamp em [0, MAP_W-w] / [0, MAP_H-h]) — nunca\n// existe um x/y que deixa o viewBox parcialmente fora da área com conteúdo, então o mapa nunca\n// \"some\" da tela, só pode chegar até a borda do que existe pra ver.\nlet mapDrag=null, mapDidDrag=false;\nfunction mapPointerDown(e){\n  const svg=$('#map'); if(!svg) return;\n  mapDrag={x0:e.clientX,y0:e.clientY,vx0:mapView.x,vy0:mapView.y,rect:svg.getBoundingClientRect()};\n  mapDidDrag=false;\n  svg.classList.add('dragging');\n  // NÃO setPointerCapture aqui: capturar o ponteiro no <svg> reencaminha o click resultante pro\n  // próprio <svg> em vez do <path> do município embaixo do cursor — todo clique parava de chegar\n  // no onclick de reatribuição, não só depois de um arrasto de verdade. move/up escutam em `root`\n  // (nunca substituído por renderAll) em vez de no <svg>, então o arrasto continua funcionando\n  // mesmo se o ponteiro sair da área do mapa no meio do gesto.\n}\nfunction mapPointerMove(e){\n  if(!mapDrag) return;\n  const dxPix=e.clientX-mapDrag.x0, dyPix=e.clientY-mapDrag.y0;\n  if(!mapDidDrag && Math.hypot(dxPix,dyPix)>4) mapDidDrag=true;\n  if(!mapDrag.rect.width||!mapDrag.rect.height) return;\n  const sx=mapView.w/mapDrag.rect.width, sy=mapView.h/mapDrag.rect.height;\n  let x=mapDrag.vx0-dxPix*sx, y=mapDrag.vy0-dyPix*sy;\n  x=Math.min(MAP_W-mapView.w, Math.max(0,x));\n  y=Math.min(MAP_H-mapView.h, Math.max(0,y));\n  mapView={...mapView,x,y};\n  applyMapView();\n}\nfunction mapPointerUp(){\n  if(!mapDrag) return;\n  mapDrag=null;\n  const svg=$('#map'); if(svg) svg.classList.remove('dragging');\n}\nfunction drawMap(){\n  const mv=SESS.timeline[SESS.selected]; const svg=$('#map'); const ignNote=$('#mapIgnoredNote');\n  if(!mv){ svg.innerHTML=''; if(ignNote) ignNote.innerHTML=''; return; }\n  const level=mv.level||'setor';\n  // setor fecha: a unidade É o município. GV/mercado fecham: cada município herda a atribuição do\n  // setor/GV a que pertence — municípios do mesmo setor sempre têm a MESMA cor e giram JUNTOS no\n  // clique, porque é o setor inteiro (não o município) que troca de dono nesses níveis.\n  const unitAssign=m=>level==='setor'?mv.assign[m]:mv.assign[(mv.unitOfMuni||{})[m]];\n  const c=computeDerived(mv);const NS='http://www.w3.org/2000/svg'; svg.innerHTML='';\n  const feats=[...mv.nbrFeat,...Object.values(mv.geoFeat)]; if(!feats.length) return;\n  const pr=project(feats);\n  const world=foldWorldState(SESS.timeline,SESS.selected);\n  // The context layer is ONE area per SECTOR, not one shape per município. The unit of this decision\n  // is the destination sector; a scatter of individually outlined municipalities carrying their own\n  // names invited exactly the wrong reading of the map. Members of a sector are filled AND stroked in\n  // the same colour, so the shared borders vanish and the group reads as a single dissolved\n  // territory — the IBGE shapes do not share vertices precisely enough to extract a clean union\n  // outline, and carrying a real polygon-clipping union for a context layer is not worth it.\n  // Labels are COLLECTED here and drawn last, after every path. Drawn inline they were buried by the\n  // next sector's fill, and placement cannot avoid a collision it has not seen yet.\n  const labels=[],placed=[];\n  const textW=(s,fs)=>String(s).length*fs*0.56;\n  // WCAG relative luminance of the fill a label sits on, so ink and halo can invert per label. \"Would\n  // white be better?\" has no single answer on this map: white reads on #5856d6 (L≈0.14) and disappears\n  // on #ff9500 and #34c759 (both L≈0.43, where black wins ~9:1 against white's ~2.2:1) and on every\n  // context fill, which is .32 opacity over white. Decided per label, never globally.\n  const lum=col=>{let h=String(col||'').replace('#','');\n    if(h.length===3) h=h[0]+h[0]+h[1]+h[1]+h[2]+h[2];\n    if(h.length!==6) return 1;\n    const c=[0,2,4].map(i=>parseInt(h.slice(i,i+2),16)/255)\n      .map(v=>v<=0.03928?v/12.92:Math.pow((v+0.055)/1.055,2.4));\n    return 0.2126*c[0]+0.7152*c[1]+0.0722*c[2];};\n  // Centred on (x,y) in BOTH axes. The old box hung off the first line's baseline, so every two-line\n  // label sat half its own height below the point it was supposed to mark.\n  const rectOf=(x,y,lines)=>{const w=Math.max.apply(null,lines.map(l=>textW(l.t,l.size)));\n    const h=lines.reduce((a,l)=>a+l.size*1.2,0);\n    return {x1:x-w/2-2.5,x2:x+w/2+2.5,y1:y-h/2-1.5,y2:y+h/2+1.5};};\n  const nbrBySec={};\n  mv.nbrFeat.forEach(f=>{\n    const nm=mkey(f.properties.name||f.properties.NOME||f.properties.nome||'',f.__uf);\n    const s=String((mv.nbrCurrentSector&&mv.nbrCurrentSector[nm])||'');\n    (nbrBySec[s]=nbrBySec[s]||[]).push(f);\n  });\n  Object.keys(nbrBySec).forEach(s=>{\n    const fs=nbrBySec[s];\n    const isDest=!!s&&mv.dest.includes(s);\n    const closedCtx=!!s&&world.closedSectors.has(s);\n    const col=isDest?(mv.color[s]||null):null;\n    fs.forEach(f=>{\n      const p=document.createElementNS(NS,'path');\n      p.setAttribute('d',pathFor(f,pr));\n      p.setAttribute('class','sect'+(isDest?'':(closedCtx?' closed-ctx':' plain')));\n      if(col){ p.setAttribute('fill',col); p.setAttribute('stroke',col); }\n      svg.appendChild(p);\n    });\n    if(!s) return;\n    // One number per sector, at the pole of inaccessibility of its DISSOLVED area — the whole group\n    // of members at once, not a representative member, so the number sits in the visual middle of the\n    // territory the operator actually sees.\n    const lp=labelPointOf(mv,'s:'+s,fs,pr);\n    // Context areas always read LIGHT — .sect paints dest colours at fill-opacity .32 over white, and\n    // plain/closed-ctx are near-white greys — so a sector number never wants white ink, whatever colour\n    // the sector itself was assigned.\n    if(lp&&lp.p) labels.push({anchor:lp.p,big:true,dark:false,lines:[{t:s,size:11.5,weight:700}]});\n  });\n  const asis=mv.view==='asis';\n  // The UF prefix is information only when the stage actually straddles a border. On a single-UF setor\n  // it is the same three characters repeated on every label — a large share of the clutter and none of\n  // the meaning. The hover tooltip carries the UF either way.\n  const showUf=new Set(Object.keys(mv.geoFeat).map(k=>mUf(k)).filter(Boolean)).size>1;\n  if(level==='setor'){\n    // Setor fechando: a UNIDADE é o próprio município — cada um se comporta, colore e rotula\n    // individualmente, exatamente como sempre foi.\n    Object.entries(mv.geoFeat).forEach(([m,f])=>{const p=document.createElementNS(NS,'path');p.setAttribute('d',pathFor(f,pr));\n      const fillCol=asis?CLOSE_COLOR:(mv.color[unitAssign(m)]||'#444');\n      p.setAttribute('class','muni');p.setAttribute('fill',fillCol);\n      if(!asis) p.onclick=()=>{editSelected(m2=>{const i=m2.dest.indexOf(m2.assign[m]);if(m2.dest.length)m2.assign[m]=m2.dest[(i+1)%m2.dest.length];m2.selMuni=m;});};\n      p.style.cursor=asis?'default':'pointer';\n      p.onmousemove=e=>{const t=$('#tip');t.style.opacity=1;t.style.left=(e.clientX+12)+'px';t.style.top=(e.clientY+12)+'px';\n        t.innerHTML=asis?`<b>${mDisp(m)}</b><br>${fmt(mv.cbsByMuni[m]||0)} CBs · setor ${mv.sector}`:`<b>${mDisp(m)}</b><br>${fmt(mv.cbsByMuni[m]||0)} CBs → ${unitAssign(m)||'–'}<br><span style=\"color:var(--mut)\">clique p/ trocar</span>`;};\n      p.onmouseleave=()=>$('#tip').style.opacity=0;svg.appendChild(p);\n      const lp=labelPointOf(mv,'m:'+m,[f],pr);\n      const at=(lp&&lp.p)||cxy(f,pr);\n      const nmFull=(showUf&&mUf(m)?mUf(m)+'-':'')+mName(m);\n      const num=fmt(mv.cbsByMuni[m]||0)+(asis?'':'·'+(unitAssign(m)||'–'));\n      labels.push({anchor:at,cbs:+(mv.cbsByMuni[m]||0),dark:lum(fillCol)<0.18,\n        lines:[{t:nmFull,size:8.2,weight:700},{t:num,size:7,weight:500,mut:true}]});\n    });\n  } else {\n    // GV/mercado fechando: a UNIDADE é o setor (ou a GV) inteiro, nunca o município isolado —\n    // vários municípios do mesmo setor têm de ler como UMA área só, nunca como municípios separados\n    // que por acaso têm a mesma cor. Mesmo truque do contexto vizinho logo acima: stroke = fill via\n    // estilo inline (uma regra de classe como .muni{stroke:#fff} outrank­aria um atributo stroke\n    // comum, então a costura entre membros só some setando o style direto) — e UM rótulo só por\n    // unidade, no ponto de inacessibilidade da área dissolvida, nunca um rótulo por município.\n    Object.entries(mv.unitMunis||{}).forEach(([u,ms])=>{\n      const fillCol=asis?CLOSE_COLOR:(mv.color[mv.assign[u]]||'#444');\n      const feats=ms.map(m=>mv.geoFeat[m]).filter(Boolean);\n      // Todo município deste u é UMA unidade só na tela — passar o mouse sobre qualquer pedaço tem\n      // que acender o grupo inteiro, não só o pedaço que o cursor está tocando. :hover no CSS só\n      // sabe acender o próprio <path>; o grupo inteiro precisa de JS guardando os irmãos.\n      const els=[];\n      ms.forEach(m=>{\n        const f=mv.geoFeat[m]; if(!f) return;\n        const p=document.createElementNS(NS,'path');p.setAttribute('d',pathFor(f,pr));\n        p.setAttribute('class','muni');p.setAttribute('fill',fillCol);p.style.stroke=fillCol;\n        els.push(p);\n        if(!asis) p.onclick=()=>{editSelected(m2=>{const i=m2.dest.indexOf(m2.assign[u]);if(m2.dest.length)m2.assign[u]=m2.dest[(i+1)%m2.dest.length];m2.selMuni=u;});};\n        p.style.cursor=asis?'default':'pointer';\n        p.onmouseenter=()=>{ els.forEach(e=>e.classList.add('munihl')); };\n        p.onmousemove=e=>{const t=$('#tip');t.style.opacity=1;t.style.left=(e.clientX+12)+'px';t.style.top=(e.clientY+12)+'px';\n          t.innerHTML=asis?`<b>${LEVELS[level].childLabel} ${u}</b><br>${fmt(mv.munis[u]?.cbs||0)} CBs · ${LEVELS[level].label} ${mv.sector}`:`<b>${LEVELS[level].childLabel} ${u}</b><br>${fmt(mv.munis[u]?.cbs||0)} CBs → ${mv.assign[u]||'–'}<br><span style=\"color:var(--mut)\">clique p/ trocar</span>`;};\n        p.onmouseleave=()=>{ els.forEach(e=>e.classList.remove('munihl')); $('#tip').style.opacity=0; };svg.appendChild(p);\n      });\n      const lp=labelPointOf(mv,'u:'+u,feats,pr);\n      const at=(lp&&lp.p)||(feats[0]&&cxy(feats[0],pr));\n      if(at){\n        const num=fmt(mv.munis[u]?.cbs||0)+(asis?'':'·'+(mv.assign[u]||'–'));\n        labels.push({anchor:at,big:true,cbs:+(mv.munis[u]?.cbs||0),dark:lum(fillCol)<0.18,\n          lines:[{t:`${LEVELS[level].childLabel} ${u}`,size:9,weight:700},{t:num,size:7.5,weight:500,mut:true}]});\n      }\n    });\n  }\n  // Placement, not de-cluttering. Every label IS drawn: it starts at its anchor and, if the text does\n  // not fit the territory or the slot is already taken, walks outward ring by ring until it finds\n  // clear canvas, trailing a hairline leader back to the shape it names. The previous pass dropped the\n  // loser of every collision outright, which is why municípios silently had no name at all.\n  // Order still matters — sector numbers first, then municípios by CB weight — because the earlier a\n  // label is placed the closer to home it lands.\n  const CW=700,CH=500,CPAD=2;\n  const inBounds=r=>r.x1>=CPAD&&r.x2<=CW-CPAD&&r.y1>=CPAD&&r.y2<=CH-CPAD;\n  const hits=r=>placed.reduce((a,q)=>a+((r.x2<q.x1||r.x1>q.x2||r.y2<q.y1||r.y1>q.y2)?0:1),0);\n  // Ring 0 is the anchor itself. Rings step 9u out over 16 directions, stretched horizontally because\n  // a label is wider than it is tall and sideways room is the room it actually needs.\n  const CAND=[[0,0]];\n  for(let ring=1;ring<=7;ring++){ const d=ring*9;\n    for(let a=0;a<16;a++){ const th=a*Math.PI/8; CAND.push([Math.cos(th)*d*1.35,Math.sin(th)*d]); } }\n  labels.sort((a,b)=>(b.big?1:0)-(a.big?1:0)||((b.cbs||0)-(a.cbs||0)));\n  labels.forEach(L=>{\n    let chosen=null,best=null,bestN=Infinity;\n    // Centred on the anchor is ALWAYS the first choice. An earlier cut here refused the anchor whenever\n    // the text was wider than the município's inscribed circle — true of almost every real name at this\n    // scale (BA-SAO SEBASTIAO DO PASSE is ~140u against ~80u of clearance), so every single label got\n    // nudged outside and nothing ended up centred on anything. Spilling past a border is normal on a\n    // choropleth and the halo keeps it readable; only a genuine COLLISION earns a move.\n    for(const off of CAND){\n      const x=L.anchor[0]+off[0], y=L.anchor[1]+off[1];\n      const r=rectOf(x,y,L.lines);\n      if(!inBounds(r)) continue;\n      const n=hits(r);\n      if(!n){ chosen={x,y,r,off}; break; }\n      // No clear slot yet — remember the LEAST crowded one. Falling back to the first in-bounds\n      // candidate meant falling back to the anchor every time, so a crowded map piled every loser onto\n      // the same point. CAND is ordered nearest-first and the compare is strict, so ties keep the\n      // closest slot.\n      if(n<bestN){ bestN=n; best={x,y,r,off}; }\n    }\n    // Canvas genuinely full: take the nearest in-bounds slot and accept the overlap. A label sitting\n    // on top of another is recoverable by eye; a name that was never drawn is not.\n    if(!chosen) chosen=best||{x:L.anchor[0],y:L.anchor[1],r:rectOf(L.anchor[0],L.anchor[1],L.lines),off:[0,0]};\n    placed.push(chosen.r);\n    const g=document.createElementNS(NS,'g'); g.setAttribute('class','lbl'+(L.big?' big':''));\n    if(Math.abs(chosen.off[0])>0.5||Math.abs(chosen.off[1])>0.5){\n      // The leader stops at the label's edge rather than its centre, so it never runs under the glyphs.\n      const cx=(chosen.r.x1+chosen.r.x2)/2, cy=(chosen.r.y1+chosen.r.y2)/2;\n      const hw=(chosen.r.x2-chosen.r.x1)/2, hh=(chosen.r.y2-chosen.r.y1)/2;\n      const dx=L.anchor[0]-cx, dy=L.anchor[1]-cy;\n      const tt=Math.min(dx?hw/Math.abs(dx):Infinity, dy?hh/Math.abs(dy):Infinity);\n      const ln=document.createElementNS(NS,'line'); ln.setAttribute('class','lead');\n      ln.style.stroke=L.dark?'#fff':'#1c1c1e';\n      // A largura do fio também é fixa em unidades do viewBox, igual o halo do texto — sem\n      // reescalar junto, no zoom alto ela vira uma barra grossa em vez de um fio fino.\n      ln.setAttribute('data-sw','0.8'); ln.style.strokeWidth='0.8px';\n      ln.setAttribute('x1',L.anchor[0].toFixed(1)); ln.setAttribute('y1',L.anchor[1].toFixed(1));\n      ln.setAttribute('x2',(cx+dx*tt).toFixed(1)); ln.setAttribute('y2',(cy+dy*tt).toFixed(1));\n      g.appendChild(ln);\n    }\n    const hTot=L.lines.reduce((a,l)=>a+l.size*1.2,0);\n    let ty=chosen.y-hTot/2+L.lines[0].size*0.86;\n    // Inline style rather than a class: a stylesheet rule would outrank a presentation attribute and\n    // undo the per-label contrast decision made above.\n    const ink=L.dark?'#fff':'#1c1c1e', inkMut=L.dark?'rgba(255,255,255,.85)':'#48484d';\n    const halo=L.dark?'rgba(0,0,0,.6)':'#fff';\n    // Halo do texto (o \"contorno\" que garante legibilidade sobre qualquer cor de fundo) também é\n    // fixo em unidades do viewBox via .lbl text{stroke-width}/.lbl.big text{stroke-width} — sem\n    // reescalar junto com o font-size, no zoom alto ele vira uma mancha escura cobrindo a letra\n    // inteira em vez de um contorno fino, exatamente o \"Setor 3570\" ilegível reportado.\n    const swBase=L.big?2.9:2.2;\n    L.lines.forEach(l=>{ const t=document.createElementNS(NS,'text');\n      t.setAttribute('x',chosen.x.toFixed(1)); t.setAttribute('y',ty.toFixed(1));\n      t.setAttribute('font-size',l.size); t.setAttribute('data-fs',l.size); t.setAttribute('font-weight',l.weight||600);\n      t.setAttribute('data-sw',swBase); t.style.strokeWidth=swBase+'px';\n      t.style.fill=l.mut?inkMut:ink; t.style.stroke=halo;\n      t.textContent=l.t; g.appendChild(t); ty+=l.size*1.2; });\n    svg.appendChild(g);\n  });\n  $('#legend').innerHTML=asis\n    ?`<span><b style=\"background:${CLOSE_COLOR}\"></b>${LEVELS[level].label} ${mv.sector} (estrutura antes desta etapa — ${level==='setor'?Object.keys(mv.geoFeat).length+' municípios':Object.keys(mv.unitMunis||{}).length+' '+LEVELS[level].childLabel.toLowerCase()+'(s)'})</span>`\n    // No \"vizinhos (contexto)\" or \"setor já fechado antes\" entry any more: every feature still drawn\n    // belongs to a destination sector, so .sect.plain and .sect.closed-ctx can no longer be produced\n    // and a legend key for them would point at nothing on the map.\n    :mv.dest.map(s=>`<span><b style=\"background:${mv.color[s]}\"></b>${LEVELS[level].destLabel} ${s} — ${c.gained[s]} líder(es)</span>`).join('');\n  // Municipalities outside the dominance base are deliberately NOT drawn — no shape, no hover, no\n  // legend entry. They are reported in the panel instead, so the map only ever shows territory that\n  // is actually being reallocated.\n  if(ignNote) ignNote.innerHTML=(mv.excludedMunis&&mv.excludedMunis.length)\n    ? `<b style=\"color:var(--closing)\">${fmt(mv.excludedMunis.length)} município(s) / ${fmt(mv.excludedCbs||0)} CBs</b> fora da base de dominantes deste setor não são desenhados no mapa — as CBs seguem a líder do seu grupo (detalhe em “Municípios → setor destino”).`\n    : '';\n  applyMapView();\n}\nasync function runSql(){const sql=$('#sqlIn').value.trim();$('#sqlStatus').textContent='rodando…';$('#sqlStatus').classList.remove('err');\n  try{ await ensurePinned(); const resp=await q(sql);const rs=rows(resp);const cols=(resp.manifest?.schema?.columns||[]).map(c=>c.name);\n    $('#sqlOut').innerHTML=`<thead><tr>${cols.map(c=>`<th>${c}</th>`).join('')}</tr></thead><tbody>`+rs.slice(0,200).map(r=>`<tr>${cols.map(c=>`<td>${r[c]??'·'}</td>`).join('')}</tr>`).join('')+`</tbody>`;\n    $('#sqlStatus').textContent=rs.length+' linha(s)';}\n  catch(e){$('#sqlStatus').textContent='bloqueado/erro: '+e.message;$('#sqlStatus').classList.add('err');}\n}\nfunction renderAll(){\n  renderStage();\n  renderTimeline(); renderSectorPicker();\n  const shb=$('#openShare'); if(shb) shb.disabled=!SESS.timeline.length;\n  const dpb=$('#dupSession'); if(dpb) dpb.disabled=!SESS.timeline.length;\n  const mv=SESS.timeline[SESS.selected];\n  // resolveSnapshotPin falls back to a live sub-select when it cannot pin a literal; saying\n  // \"congelado\" in that case would be a lie, so the pill reports what is actually in the SQL.\n  const pinned=SESS.snapLiteral && !/^\\(SELECT/i.test(SESS.snapLiteral);\n  $('#liveState').textContent = SESS.snapshotRaw\n    ? (pinned?'● snapshot congelado · ':'◍ snapshot ao vivo (não fixado) · ')+'atualizado em '+fmtSyncedAt(SESS.snapshotSyncedAt)+' · ↻'\n    : '● iniciando';\n  const mp=$('#basePill');\n  if(mp){\n    const warn=[];\n    if(DOM.bySetor&&!DOM.hasUf) warn.push('⚠ sem coluna UF');\n    if(DOM.badUf) warn.push('⚠ '+fmt(DOM.badUf)+' UF não reconhecida(s)');\n    if(DOM.clashes) warn.push('⚠ '+fmt(DOM.clashes)+' homônimo(s) no mesmo setor');\n    mp.textContent=DOM.bySetor?('◇ base dominantes: '+fmt(DOM.setores)+' setores · '+fmt(DOM.rows)+' municípios'+(warn.length?' · '+warn.join(' · '):'')):(DOM.error?'◇ base dominantes: indisponível':'◇ base dominantes: carregando…');\n    mp.title=DOM.error||(DOM.bySetor?((DOM.hasUf\n        ?('Coluna de UF usada: \"'+DOM.ufCol+'\".')\n        :('SEM coluna de UF. Colunas lidas: '+((DOM.headers||[]).join(' | ')||'?')+'. A UF de cada município vem desta base — sem ela, homônimos voltam a ser casados só pelo nome.'))\n      +(DOM.badUf?('\\n'+DOM.badUf+' linha(s) com UF irreconhecível — tratadas como desconhecida.'):'')\n      +(DOM.clashes?('\\n'+DOM.clashes+' município(s) aparecem no mesmo setor com UFs diferentes. O SQL agrupa só por DS_MUNICIPIO, então esses chegam somados numa linha única e não há como separá-los.'):'')\n      ):'')||DOM.url||''; }\n  const rp=$('#rulePill'); if(rp) rp.textContent='◈ destino: '+ruleShort(SESS.settings);\n  const sp=$('#spanPill'); if(sp) sp.textContent='◎ span: '+spanShort(SESS.settings);\n  renderRuleNote(); renderSpanRule();\n  if(!mv){ ['#map','#matrix','#matrixTobe','#tobeNote','#leaders'].forEach(s=>{const el=$(s);if(el)el.innerHTML='';}); $('#kpis').innerHTML=''; $('#spans').innerHTML=''; $('#muniList').innerHTML=''; $('#plan').innerHTML=''; return; }\n  $('#mapTitle').textContent=`Etapa ${SESS.selected+1}/${SESS.timeline.length} — fechando ${lc(LEVELS[mv.level||'setor'].label)} ${mv.sector}`;\n  $('#viewToggle').querySelectorAll('button').forEach(b=>b.classList.toggle('on',b.dataset.v===mv.view));\n  $('#policy').querySelectorAll('button').forEach(b=>b.classList.toggle('on',b.dataset.p===mv.policy));\n  $('#optBadge').textContent=mv.optBadge||'';\n  drawMap(); renderContig(); renderSpanRule(); renderKpis(); renderSpans(); renderMuni(); renderLeaders(); renderMatrix(); renderMatrixTobe(); renderPolicy(); renderPlan(); renderReport(); renderCumulative();\n}\n\n// ---------- event wiring ----------\n$('#confirmSnap').onclick=()=>{ SESS.stage='main'; renderAll(); };\n$('#openMove').onclick=openMove;\n$('#moveClose').onclick=closeMove;\n$('#moveCancel').onclick=closeMove;\n$('#moveBg').addEventListener('click',e=>{ if(e.target.id==='moveBg') closeMove(); });\nroot.querySelectorAll('input[name=\"moveLevel\"]').forEach(r=>r.addEventListener('change',renderMoveForm));\n$('#moveRand').onclick=moveRandPick;\n$('#moveGo').onclick=submitMove;\n$('#moveCode').addEventListener('keydown',e=>{ if(e.key==='Enter') submitMove(); });\n$('#confirmSessionPick').onchange=()=>loadSession($('#confirmSessionPick').value);\n$('#optim').onclick=()=>editSelected(mv=>{ mv.assign=optimizeFor(mv); });\n$('#autoTobe').onclick=()=>editSelected(mv=>{ mv.assign=autoAssignFor(mv); mv.optBadge='TOBE por adjacência'; });\n$('#viewToggle').querySelectorAll('button').forEach(b=>b.onclick=()=>{const mv=SESS.timeline[SESS.selected];if(!mv)return;mv.view=b.dataset.v;renderAll();});\n$('#mapZoomIn').onclick=()=>zoomMapBy(1.4);\n$('#mapZoomOut').onclick=()=>zoomMapBy(1/1.4);\n$('#map').addEventListener('pointerdown',mapPointerDown);\nroot.addEventListener('pointermove',mapPointerMove);\nroot.addEventListener('pointerup',mapPointerUp);\nroot.addEventListener('pointerleave',mapPointerUp);\n// Arrastar não pode virar \"cliquei num município e troquei o destino sem querer\": se o ponteiro se\n// moveu além do limiar de arrasto, este clique (capture, antes de chegar no <path>) é engolido.\n$('#map').addEventListener('click',e=>{ if(mapDidDrag){ e.stopPropagation(); e.preventDefault(); mapDidDrag=false; } },true);\n$('#policy').querySelectorAll('button').forEach(b=>b.onclick=()=>{const mv=SESS.timeline[SESS.selected];if(!mv)return;mv.policy=b.dataset.p;renderKpis();renderPolicy();renderPlan();});\nroot.querySelectorAll('.tabs button').forEach(b=>b.onclick=()=>{root.querySelectorAll('.tabs button').forEach(x=>x.classList.toggle('on',x===b));\n  ['matrix','tobe','report','cumulative','sql'].forEach(t=>$('#tab-'+t).classList.toggle('hidden',t!==b.dataset.tab));});\n$('#runSql').onclick=runSql;\n$('#copyPlan').onclick=()=>{const mv=SESS.timeline[SESS.selected];if(!mv)return;navigator.clipboard.writeText(JSON.stringify({setor:mv.sector,politica:mv.policy,plano:mv._plan},null,2));$('#copyPlan').textContent='copiado ✓';setTimeout(()=>$('#copyPlan').textContent='Copiar',1500);};\n$('#csvPlan').onclick=()=>{const mv=SESS.timeline[SESS.selected];if(!mv)return;const csv='municipio,uf,cbs,setor_destino\\n'+mv._plan.map(p=>`${p.municipio},${p.uf||''},${p.cbs},${p.destino}`).join('\\n');\n  const a=document.createElement('a');a.href=URL.createObjectURL(new Blob([csv],{type:'text/csv'}));a.download=`plano_migracao_setor_${mv.sector}.csv`;a.click();};\n$('#saveSession').onclick=saveSession;\n$('#dupSession').onclick=duplicateSession;\n$('#sessionPick').onchange=()=>loadSession($('#sessionPick').value);\n$('#liveState').onclick=refreshSnapshot;\n$('#liveState').addEventListener('keydown',e=>{ if(e.key==='Enter'||e.key===' '){ e.preventDefault(); refreshSnapshot(); } });\n$('#openOptions').onclick=openOptions;\n$('#optClose').onclick=closeOptions;\n$('#optCancel').onclick=closeOptions;\n$('#optApply').onclick=applyOptions;\n$('#optMinCbs').addEventListener('input',renderOptPreview);\n['#optTargetSpan','#optMaxSpan','#optMinSpan'].forEach(id=>$(id).addEventListener('input',renderOptPreview));\nroot.querySelectorAll('input[name=\"destRule\"]').forEach(r=>r.addEventListener('change',renderOptPreview));\n$('#optionsBg').addEventListener('click',e=>{ if(e.target.id==='optionsBg') closeOptions(); });\nroot.addEventListener('keydown',e=>{ if(e.key==='Escape'){ closeOptions(); closeShare(); closeMove(); } });\n\n$('#openShare').onclick=openShare;\n$('#shareX').onclick=closeShare;\n$('#shareCancel').onclick=closeShare;\n$('#shareGo').onclick=doShare;\n$('#shareCopy').onclick=()=>{ if(!SHARE.url) return; navigator.clipboard.writeText(SHARE.url);\n  const b=$('#shareCopy'); if(b){ b.textContent='copiado ✓'; setTimeout(()=>{ const x=$('#shareCopy'); if(x) x.textContent='Copiar link'; },1500); } };\n$('#shareOpen').onclick=()=>{ if(SHARE.url) window.open(SHARE.url,'_blank'); };\n$('#shareBg').addEventListener('click',e=>{ if(e.target.id==='shareBg') closeShare(); });\n\n// ---------- init ----------\n(async()=>{\n  loader(true,'congelando snapshot da sessão…');\n  try{\n    await Promise.all([ensurePinned(), loadSectors(), refreshSessionPicker()]);\n    SESS.stage='confirm';\n  }catch(e){ setError('erro init: '+e.message); }\n  finally{ loader(false); renderAll(); const rd=$('#ready'); if(rd) rd.setAttribute('data-loaded','1'); }\n})();\n\n  }\n}\n","at":"2026-08-13T14:21:29.778Z"}},"updatedAt":"2026-08-13T14:21:29.911Z","createdAt":"2026-08-12T23:55:49.223Z"},{"_id":"6a7f2f11a14a6f1480484324","component":"data2-core-types@Component","system":"6a57cfe9673eb7e3c5e57784","params":{"component":"KRgNUar3hCwC4PglklYuS","package":"natura-geomarketing","title":"Ventura — Simulador","extends":"data2-core-primitives@Block","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"sessionsDataset":{"component":"data2-core-types@InteractiveModuleReference"},"dominantesCsvUrl":{"component":"data2-core-types@FileComponentUrlReference"}}}},"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"const T='product.perfil_cb.crm_perfil_cb_diaria_historico';\nconst ELO='product.elo_modelo_combinado.commercial_consultant_index';\nconst PALETTE=['#5856d6','#ff9500','#34c759','#af52de','#ff2d55','#a2845e'];\nconst CLOSE_COLOR='#8e8e93';\nconst UF_CODE={RO:'11',AC:'12',AM:'13',RR:'14',PA:'15',AP:'16',TO:'17',MA:'21',PI:'22',CE:'23',RN:'24',PB:'25',PE:'26',AL:'27',SE:'28',BA:'29',MG:'31',ES:'32',RJ:'33',SP:'35',PR:'41',SC:'42',RS:'43',MS:'50',MT:'51',GO:'52',DF:'53'};\nconst UF_BORDERS={AC:['AM','RO'],AL:['BA','PE','SE'],AM:['AC','RO','RR','PA','MT'],AP:['PA'],\n BA:['AL','SE','PE','PI','TO','GO','MG','ES'],CE:['PI','PB','PE','RN'],DF:['GO','MG'],\n ES:['BA','MG','RJ'],GO:['DF','MT','MS','MG','BA','TO'],MA:['PA','TO','PI'],\n MG:['BA','GO','DF','MS','SP','RJ','ES'],MS:['MT','GO','MG','SP','PR'],MT:['RO','AM','PA','TO','GO','MS'],\n PA:['AP','AM','MT','TO','MA','RR'],PB:['RN','CE','PE'],PE:['PB','CE','PI','BA','AL'],\n PI:['MA','TO','BA','PE','CE'],PR:['SP','MS','SC'],RJ:['ES','MG','SP'],RN:['CE','PB'],\n RO:['AC','AM','MT'],RR:['AM','PA'],RS:['SC'],SC:['PR','RS'],SE:['BA','AL'],\n SP:['MG','RJ','PR','MS'],TO:['PA','MA','PI','BA','GO','MT']};\nconst NIVEIS=['Bronze','Cristal','Prata','Ouro','Diamante','Diamante+'];\nconst METRICS_DEF=[['cbs','CBs'],['ativas','Ativas'],['pedidos','Pedidos'],['pontos','Pontos'],['receita','Receita','$'],['rec_nat','Rec. Natura','$'],['rec_avon','Rec. Avon','$']];\nconst OPT_K=1.5;\nconst SESSIONS_DS='timeline-shared-sessionsDataSet';   // same table as SHARED_DS — see notes at listSessions()\n// Span defaults are the real operating band for a setor receptor, not placeholders: 2200 ≤ span ≤ 3500\n// with 2700 as the target. null meant \"sem limite\", so every new session started with the optimiser\n// balancing against nothing. Existing sessions are NOT touched — their persisted settings carry explicit\n// values that spread OVER these in openOptions/applyOptions, which is deliberate: their etapas were\n// computed under the old band and changing it silently would leave the stored result and the rule that\n// produced it out of sync.\nconst DEFAULT_SETTINGS={destRule:'any',destMinCbs:9,targetSpan:2700,maxSpan:3500,minSpan:2200};\nconst DOM_MEDIA_BASE='https://natura-geomarketing.data2.media/file/';\nconst DOM_CSV_FALLBACK=DOM_MEDIA_BASE+'yw_TQdp0QXEk6JsrliAqP'; \nconst numOrNull=v=>{const n=Math.round(+v);return (isFinite(n)&&n>0)?n:null;};\nconst spanShort=st=>{const p=[];if(st&&st.targetSpan)p.push('alvo '+st.targetSpan);if(st&&st.maxSpan)p.push('máx '+st.maxSpan);if(st&&st.minSpan)p.push('mín '+st.minSpan);return p.length?p.join(' · '):'livre';};\nconst ruleShort=st=>((st&&st.destRule)==='dominant')?('dominantes ≥'+((st&&st.destMinCbs)||DEFAULT_SETTINGS.destMinCbs)+' CBs'):'qualquer municipio';\n\nexport default {\n  css: `\n  :host{display:block;height:100%;--bg:#f5f5f7;--panel:#ffffff;--panel2:#f2f2f7;--line:#e5e5ea;--ink:#1c1c1e;--mut:#6e6e73;--acc:#007aff;--acc2:#0060df;--closing:#ff3b30;--ok:#34c759}\n  *{box-sizing:border-box}\n  .simroot{position:relative;height:100%;overflow:auto;font:13px/1.45 -apple-system,BlinkMacSystemFont,\"SF Pro Text\",\"Segoe UI\",Roboto,sans-serif;background:var(--bg);color:var(--ink);-webkit-font-smoothing:antialiased}\n  header{padding:10px 16px;background:rgba(246,246,248,.85);backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);border-bottom:1px solid var(--line);display:flex;align-items:center;gap:10px;flex-wrap:wrap}\n  header h1{font-size:14.5px;margin:0;font-weight:600;letter-spacing:-.1px;color:var(--ink)}\n  .mac-spacer{flex:1}\n  .howto{padding:8px 16px;background:var(--panel);border-bottom:1px solid var(--line);display:flex;gap:16px;flex-wrap:wrap;font-size:11.5px;color:var(--mut);align-items:center}\n  .howto b{color:var(--ink)} .howto span{max-width:340px}\n  .pill{font-size:10.5px;padding:2.5px 9px;border-radius:99px;border:1px solid var(--line);color:var(--mut);background:var(--panel2)}\n  .pill.live{color:var(--ink);cursor:pointer;user-select:none;transition:border-color .1s,color .1s,background .1s}\n  .pill.live:hover{border-color:var(--acc);color:var(--acc);background:#eaf3ff}\n  .pill.live:focus-visible{outline:2px solid rgba(0,122,255,.35);outline-offset:1px}\n  .pill.live.busy{border-color:var(--acc);color:var(--acc);cursor:progress}\n  .status{font-size:11px;color:var(--mut)}.status.err{color:var(--closing)}\n  select,input,textarea,button{font:inherit}\n  select,input{background:var(--panel);border:1px solid var(--line);color:var(--ink);border-radius:7px;padding:5.5px 9px}\n  select:focus,input:focus{outline:2px solid rgba(0,122,255,.35);outline-offset:0;border-color:var(--acc)}\n  button.act{background:var(--acc);color:#fff;border:1px solid transparent;border-radius:7px;padding:6px 13px;font-weight:600;cursor:pointer;box-shadow:0 1px 1px rgba(0,0,0,.08)}\n  button.act:hover{background:var(--acc2)}\n  button.ghost{background:var(--panel);color:var(--ink);border:1px solid var(--line);border-radius:7px;padding:5.5px 12px;cursor:pointer}\n  button.ghost:hover{background:var(--panel2)}\n  button.ghost.on{border-color:var(--acc);color:var(--acc);background:#eaf3ff}\n  button.ghost:disabled,button.act:disabled{opacity:.4;cursor:not-allowed}\n  .sessbar{padding:9px 20px;background:var(--panel2);border-bottom:1px solid var(--line);display:flex;gap:8px;flex-wrap:wrap;align-items:center}\n  .rail{padding:9px 16px;background:var(--panel);border-bottom:1px solid var(--line);display:flex;gap:8px;align-items:center;overflow-x:auto}\n  #movementChips{display:flex;gap:8px;flex:0 0 auto}\n  #addMovementGroup{display:flex;gap:8px;align-items:center;flex:0 0 auto;margin-left:auto;padding-left:12px;border-left:1px solid var(--line)}\n  #addMovementGroup input{min-width:150px}\n  .tchip{display:flex;align-items:center;gap:7px;background:var(--panel2);border:1px solid var(--line);border-radius:8px;padding:6px 10px;cursor:pointer;font-size:12px;flex:0 0 auto}\n  .tchip.on{border-color:var(--acc);background:#eaf3ff}\n  .tchip.stale{border-style:dashed;opacity:.85}\n  .tchip .tstale{color:#ff9500;font-weight:700}\n  .tchip .tnum{background:var(--ink);color:#fff;border-radius:99px;width:16px;height:16px;font-size:9.5px;display:flex;align-items:center;justify-content:center;font-weight:700}\n  .tchip .tsec{font-weight:600}\n  .tchip .tstat{color:var(--mut)}\n  .tchip .trm{color:var(--mut);font-weight:700;padding:0 3px}\n  .tchip .trm:hover{color:var(--closing)}\n  .rail .empty{color:var(--mut);font-size:12px}\n  .wrap{display:grid;grid-template-columns:minmax(360px,1fr) 430px;gap:14px;padding:14px 16px;align-items:start}\n  @media(max-width:1150px){.wrap{grid-template-columns:1fr}}\n  .card{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:14px 16px;margin-bottom:14px;box-shadow:0 1px 2px rgba(0,0,0,.04)}\n  .card h2{font-size:11px;text-transform:uppercase;letter-spacing:.4px;color:var(--mut);margin:0 0 9px;font-weight:600}\n  /* user-select, not pointer-events. .lbl already sets pointer-events:none, which stops the text from\n     RECEIVING clicks but does not exclude it from the browser's selection range — so cycling a\n     município's destination with repeated clicks kept dragging a double-click selection across the\n     labels. Nothing drawn in an svg here is text anyone needs to copy. */\n  svg{width:100%;height:auto;display:block;user-select:none;-webkit-user-select:none}\n  .map-wrap{position:relative}\n  #map{cursor:grab;touch-action:none}\n  #map.dragging{cursor:grabbing}\n  .zoom-pill{position:absolute;left:10px;bottom:10px;display:flex;align-items:stretch;background:var(--panel);border:1px solid var(--line);border-radius:99px;box-shadow:0 2px 8px rgba(0,0,0,.14);overflow:hidden;z-index:3}\n  .zoom-pill button{width:30px;height:30px;border:0;background:transparent;color:var(--ink);font:16px/1 -apple-system,BlinkMacSystemFont,sans-serif;font-weight:600;cursor:pointer;display:flex;align-items:center;justify-content:center}\n  .zoom-pill button:hover{background:var(--panel2)}\n  .zoom-pill button:active{background:#e5e5ea}\n  .zoom-pill .zoom-div{width:1px;background:var(--line)}\n  /* White hairlines inside the closing sector: the municipios read as one territory cut into parts\n     rather than as separate outlined units, and the saturated fills carry the grouping instead of the\n     ink. Neighbour sectors keep their own coloured strokes (.sect) — that contrast is what separates\n     what is being reallocated from what is only context. Selection no longer draws an outline; the\n     white border was the click affordance AND the default is now white, so it had nothing left to say. */\n  .muni{stroke:#fff;stroke-width:1.1;cursor:pointer;transition:filter .1s}.muni:hover{filter:brightness(1.15)}.muni.munihl{filter:brightness(1.15)}\n  .sect{stroke-width:1;fill-opacity:.32;stroke-opacity:.6}\n  .sect.plain{fill:#e8e8ec;stroke:#d4d4d9;fill-opacity:1;stroke-opacity:1}\n  .sect.closed-ctx{fill:#e2e2e7;stroke:#aeaeb2;stroke-dasharray:3 2;fill-opacity:1;stroke-opacity:1}\n  .lbl{pointer-events:none}\n  /* No plate behind the text: a halo painted UNDER the glyphs (paint-order) keeps a name legible on any\n     fill without stamping an opaque box over the territory it names. Ink and halo are chosen per label\n     from the luminance of the fill underneath, so they are deliberately NOT declared here — a\n     stylesheet rule outranks a presentation attribute and would silently override that choice. */\n  .lbl text{text-anchor:middle;paint-order:stroke fill;stroke-width:2.2px;stroke-linejoin:round;stroke-linecap:round}\n  .lbl.big text{stroke-width:2.9px}\n  .lbl line.lead{stroke-opacity:.5;stroke-width:.8}\n  .legend{display:flex;gap:12px;flex-wrap:wrap;margin-top:8px;font-size:12px}\n  .legend b{display:inline-block;width:11px;height:11px;border-radius:3px;margin-right:5px;vertical-align:-1px}\n  .kpis{display:grid;grid-template-columns:1fr 1fr;gap:9px;margin-bottom:12px}\n  .kpi{background:var(--panel2);border:1px solid var(--line);border-radius:10px;padding:9px 11px}\n  .kpi .n{font-size:19px;font-weight:700}.kpi .l{font-size:10.5px;color:var(--mut);margin-top:2px}\n  .kpi.warn{border-color:#ffd1cc}.kpi.warn .n{color:var(--closing)}.kpi.ok{border-color:#bdeecb}.kpi.ok .n{color:var(--ok)}\n  .bar-row{display:flex;align-items:center;gap:8px;margin:6px 0}\n  .bar-row .tag{width:42px;font-weight:600;font-size:12px}\n  .bar-track{flex:1;height:18px;background:var(--panel2);border-radius:5px;overflow:hidden;display:flex;position:relative}\n  .bar-mark{position:absolute;top:0;bottom:0;width:2px;opacity:.9;z-index:2}\n  .bar-base{height:100%;opacity:.4}.bar-inc{height:100%}\n  .bar-val{width:132px;text-align:right;font-size:11px;color:var(--mut);font-variant-numeric:tabular-nums}\n  table{border-collapse:collapse;width:100%;font-size:11.5px}\n  th,td{padding:5px 6px;text-align:right;border-bottom:1px solid var(--line);font-variant-numeric:tabular-nums}\n  th:first-child,td:first-child{text-align:left}\n  thead th{color:var(--mut);font-weight:600;font-size:10.5px;position:sticky;top:0;background:var(--panel)}\n  .home{display:inline-block;width:9px;height:9px;border-radius:2px;margin-right:4px}\n  .muni-item{display:flex;align-items:center;gap:8px;background:var(--panel2);border:1px solid var(--line);border-radius:8px;padding:5px 8px;margin-bottom:6px}\n  .muni-item .nm{flex:1;font-weight:600;font-size:12px}.muni-item .ct{color:var(--mut);font-size:11px}\n  .seg{display:flex;border:1px solid var(--line);border-radius:7px;overflow:hidden}\n  .seg button{border:0;background:transparent;color:var(--mut);padding:4px 8px;font-size:11px;font-weight:600;cursor:pointer}\n  .seg button.on{color:#fff}\n  .toolbar{display:flex;gap:8px;align-items:center;flex-wrap:wrap}\n  .toggle{display:flex;border:1px solid var(--line);border-radius:8px;overflow:hidden;font-size:12px}\n  .toggle button{background:transparent;border:0;color:var(--mut);padding:6px 10px;cursor:pointer;font-weight:600}\n  .toggle button.on{background:var(--panel2);color:var(--ink)}\n  .note{color:var(--mut);font-size:10.5px;margin-top:7px;line-height:1.5}\n  .cell{font-variant-numeric:tabular-nums}\n  .lider-foot td{background:var(--panel2);font-weight:600;font-size:11px;color:var(--ink);border-bottom:2px solid var(--line);padding:5px 6px;text-align:left}\n  .scroll{max-height:240px;overflow:auto}\n  /* Tables meant to be READ in full rather than sampled. Only the vertical cap is dropped — overflow\n     stays auto so the wide grupo grid can still scroll sideways inside its card, which is the one axis\n     that genuinely cannot fit. */\n  .scroll.grow{max-height:none}\n  .tip{position:fixed;pointer-events:none;background:#1c1c1e;color:#fff;border-radius:8px;padding:7px 9px;font-size:11px;opacity:0;transition:opacity .1s;z-index:9;max-width:230px}\n  .spark{display:flex;align-items:flex-end;gap:3px;height:44px}\n  .spark .b{flex:1;background:var(--acc);border-radius:2px 2px 0 0;min-height:2px;opacity:.85}\n  .delta{font-size:10px}.delta.up{color:var(--ok)}.delta.dn{color:var(--closing)}\n  .tabs{display:flex;gap:6px;margin-bottom:10px;flex-wrap:wrap}\n  .tabs button{background:transparent;border:1px solid var(--line);border-radius:8px;color:var(--mut);padding:6px 12px;cursor:pointer;font-weight:600}\n  .tabs button.on{background:var(--panel2);color:var(--ink);border-color:var(--acc)}\n  .hidden{display:none}\n  .sqlbox{width:100%;height:60px;font-family:ui-monospace,Menlo,monospace;font-size:11px;resize:vertical}\n  .load{position:absolute;inset:0;background:rgba(245,245,247,.85);backdrop-filter:blur(4px);display:flex;align-items:center;justify-content:center;z-index:20;font-size:13px;color:var(--acc);font-weight:600;text-align:center;padding:20px}\n  .load.hidden{display:none}\n  .badge{font-size:10px;padding:1px 6px;border-radius:5px;background:var(--panel2);border:1px solid var(--line);color:var(--mut)}\n  .sheet-bg{position:fixed;inset:0;background:rgba(28,28,30,.34);backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);display:flex;align-items:center;justify-content:center;z-index:40;padding:24px}\n  .sheet-bg.hidden{display:none}\n  .sheet{background:var(--panel);border:1px solid var(--line);border-radius:14px;box-shadow:0 24px 60px rgba(0,0,0,.22);width:min(580px,100%);max-height:100%;display:flex;flex-direction:column;overflow:hidden}\n  .sheet-hd{display:flex;align-items:center;gap:9px;padding:12px 16px;border-bottom:1px solid var(--line)}\n  .sheet-hd h3{margin:0;font-size:14px;font-weight:600;letter-spacing:-.1px}\n  .sheet-x{background:transparent;border:0;color:var(--mut);font-size:13px;cursor:pointer;padding:3px 7px;border-radius:6px}\n  .sheet-x:hover{background:var(--panel2);color:var(--ink)}\n  .sheet-bd{padding:14px 16px;overflow:auto}\n  .sheet-ft{display:flex;align-items:center;gap:8px;padding:11px 16px;border-top:1px solid var(--line);background:var(--panel2)}\n  .opt-lbl{font-size:11px;text-transform:uppercase;letter-spacing:.4px;color:var(--mut);font-weight:600}\n  .opt-sub{font-size:11.5px;color:var(--mut);margin:4px 0 10px;line-height:1.5}\n  .opt-row{display:flex;gap:10px;align-items:flex-start;border:1px solid var(--line);border-radius:10px;padding:10px 12px;margin-bottom:8px;cursor:pointer;background:var(--panel)}\n  .opt-row:hover{background:var(--panel2)}\n  .opt-row.on{border-color:var(--acc);background:#eaf3ff}\n  .opt-row:has(input:disabled){opacity:.5;cursor:not-allowed}\n  .opt-row input[type=radio]{margin:2px 0 0;accent-color:var(--acc);flex:0 0 auto}\n  .opt-t{font-size:12.5px;font-weight:600;display:flex;align-items:center;gap:6px;flex-wrap:wrap}\n  .opt-d{font-size:11.5px;color:var(--mut);margin-top:3px;line-height:1.55}\n  .opt-inline{font-size:11.5px;color:var(--mut);margin-top:9px;display:flex;align-items:center;gap:7px;flex-wrap:wrap}\n  .opt-inline.off{opacity:.4;pointer-events:none}\n  .opt-note{border:1px solid var(--line);background:var(--panel2);border-radius:10px;padding:9px 11px;font-size:11.5px;color:var(--mut);line-height:1.6;margin-top:12px}\n  .opt-grid{display:grid;grid-template-columns:1fr 1fr 1fr;gap:8px;margin-top:2px}\n  .opt-fld{display:flex;flex-direction:column;gap:5px;border:1px solid var(--line);border-radius:9px;padding:8px 10px;background:var(--panel2)}\n  .opt-fld span{font-size:11px;color:var(--mut);font-weight:600;line-height:1.35}\n  .opt-fld i{font-style:normal;font-weight:400;opacity:.72}\n  .opt-fld input{width:100%;background:var(--panel)}\n  .opt-err{margin-top:9px;font-size:11.5px;color:var(--closing);font-weight:600}\n  .opt-hr{height:1px;background:var(--line);margin:17px 0 0}\n  .shareurl{margin-top:9px;padding:9px 10px;border-radius:8px;background:var(--panel);border:1px solid var(--acc);\n    font-family:ui-monospace,Menlo,monospace;font-size:11px;color:var(--ink);word-break:break-all;user-select:all}\n`,\n  render(d2){\n    return `<div class=\"simroot\"><header id=\"topHeader\" class=\"hidden\">\n  <h1>Simulador de Timeline de Fechamentos</h1>\n  <span class=\"pill live\" id=\"liveState\" role=\"button\" tabindex=\"0\" title=\"Clique pra buscar o snapshot mais recente e recalcular a timeline inteira\">● iniciando</span>\n  <span class=\"pill ro\">read-only · nunca escreve</span>\n  <span class=\"pill\" id=\"basePill\"></span>\n  <span class=\"pill\" id=\"rulePill\"></span>\n  <span class=\"pill\" id=\"spanPill\"></span>\n  <span class=\"status\" id=\"ds\"></span>\n  <div class=\"mac-spacer\"></div>\n  <select id=\"sessionPick\" style=\"min-width:200px\"></select>\n  <button class=\"ghost\" id=\"openOptions\" title=\"Configurações desta sessão\">⚙ Opções</button>\n  <button class=\"act\" id=\"saveSession\">Salvar sessão</button>\n  <button class=\"ghost\" id=\"dupSession\" title=\"Cria uma cópia independente desta sessão — a original fica intacta e a cópia passa a ser a sessão ativa\">⧉ Duplicar</button>\n  <button class=\"ghost\" id=\"openShare\" title=\"Publicar uma cópia congelada desta sessão em modo leitura\">⇪ Compartilhar</button>\n  <span class=\"status\" id=\"sessStatus\"></span>\n</header>\n\n<div class=\"rail hidden\" id=\"timelineRail\">\n  <div id=\"movementChips\"></div>\n  <div id=\"addMovementGroup\">\n    <button class=\"act\" id=\"openMove\">Adicionar movimentação</button>\n  </div>\n</div>\n\n<div class=\"card\" id=\"confirmCard\" style=\"margin:14px 20px\">\n  <h2 style=\"margin:0 0 9px\">Confirmar snapshot antes de simular</h2>\n  <div class=\"note\" id=\"confirmBody\">congelando snapshot…</div>\n  <button class=\"act\" id=\"confirmSnap\" style=\"margin-top:12px\">Confirmar snapshot ▶ ir pra simulação</button>\n  <div class=\"note\" style=\"margin-top:16px\">ou continue uma sessão salva:</div>\n  <select id=\"confirmSessionPick\" style=\"min-width:260px;margin-top:4px\"></select>\n  <div class=\"status\" id=\"confirmStatus\" style=\"margin-top:8px\"></div>\n</div>\n\n<div class=\"wrap hidden\" id=\"mainWrap\">\n  <div>\n    <div class=\"card\">\n      <div style=\"display:flex;justify-content:space-between;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:9px\">\n        <h2 id=\"mapTitle\" style=\"margin:0\">Mapa — clique num município p/ trocar o setor destino</h2>\n        <div class=\"toggle\" id=\"viewToggle\" title=\"ASIS = estrutura do setor antes desta etapa (já considerando etapas anteriores) · TOBE = após a redistribuição desta etapa\">\n          <button data-v=\"asis\">◧ ASIS (antes desta etapa)</button>\n          <button data-v=\"tobe\" class=\"on\">◨ TOBE (simulação)</button>\n        </div>\n      </div>\n      <div class=\"map-wrap\">\n        <svg id=\"map\" viewBox=\"0 0 700 500\" preserveAspectRatio=\"xMidYMid meet\"></svg>\n        <div class=\"zoom-pill\" id=\"mapZoom\">\n          <button type=\"button\" id=\"mapZoomOut\" title=\"Diminuir zoom\">−</button>\n          <span class=\"zoom-div\"></span>\n          <button type=\"button\" id=\"mapZoomIn\" title=\"Aumentar zoom\">+</button>\n        </div>\n      </div>\n      <div class=\"legend\" id=\"legend\"></div>\n      <div class=\"note\">Coloridos = municípios do setor fechado nesta etapa (cor = destino). Ao redor, cada área é um <b>setor vizinho inteiro</b> com o código no meio — não municípios soltos: cor = setor destino, cinza = contexto, cinza tracejado = setor já fechado numa etapa anterior. Shapes reais IBGE/tbrugz.</div>\n      <div class=\"note\" id=\"mapIgnoredNote\"></div>\n    </div>\n\n    <div class=\"card\">\n      <h2>Líderes — destino e CBs deslocadas (nesta etapa)</h2>\n      <div class=\"note\" style=\"margin:-4px 0 9px\"><b>Home</b> = setor que ficou com a maioria das CBs da líder. <b style=\"color:var(--closing)\">Deslocadas</b> = CBs dela que caíram noutro setor.</div>\n      <div class=\"scroll grow\"><table id=\"leaders\"></table></div>\n    </div>\n\n    <div class=\"card\">\n      <div class=\"tabs\">\n        <button data-tab=\"matrix\" class=\"on\">Matriz ASIS</button>\n        <button data-tab=\"tobe\">Matriz TOBE</button>\n        <button data-tab=\"report\">Relatório de impacto (etapa)</button>\n        <button data-tab=\"cumulative\">Impacto acumulado (timeline)</button>\n        <button data-tab=\"sql\">Console SQL</button>\n      </div>\n      <div id=\"tab-matrix\"><div class=\"scroll grow\"><table id=\"matrix\"></table></div></div>\n      <div id=\"tab-tobe\" class=\"hidden\"><div class=\"scroll grow\"><table id=\"matrixTobe\"></table></div>\n        <div class=\"note\" id=\"tobeNote\"></div></div>\n      <div id=\"tab-report\" class=\"hidden\"></div>\n      <div id=\"tab-cumulative\" class=\"hidden\"></div>\n      <div id=\"tab-sql\" class=\"hidden\">\n        <textarea class=\"sqlbox\" id=\"sqlIn\">SELECT DS_MUNICIPIO, COUNT(DISTINCT CD_CONSULTORA) qtd FROM product.perfil_cb.crm_perfil_cb_diaria_historico WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR=3504 GROUP BY DS_MUNICIPIO ORDER BY qtd DESC</textarea>\n        <div class=\"toolbar\" style=\"margin:8px 0\"><button class=\"act\" id=\"runSql\">▶ Rodar</button><span class=\"status\" id=\"sqlStatus\"></span></div>\n        <div class=\"note\" style=\"margin:-4px 0 8px\">Roda contra o snapshot congelado desta sessão (não \"ao vivo\") — mesma coerência da timeline.</div>\n        <div class=\"scroll\"><table id=\"sqlOut\"></table></div>\n      </div>\n    </div>\n  </div>\n\n  <div>\n    <div class=\"card\">\n      <div class=\"toolbar\" style=\"margin-bottom:11px\">\n        <button class=\"ghost\" id=\"optim\" title=\"testa alocações que mantêm cada setor conectado e escolhe a que equilibra a carga entre setores + minimiza a quebra (evita empilhar tudo num setor)\">★ Modelo ÓTIMO (equilíbrio + quebra)</button>\n        <button class=\"ghost\" id=\"autoTobe\" title=\"preenche cada município pelo setor vizinho mais próximo (geografia)\">TOBE por adjacência</button>\n        <span class=\"badge\" id=\"optBadge\"></span>\n      </div>\n      <div class=\"note\" style=\"margin:-4px 0 10px\"><b style=\"color:var(--ink)\">★ ÓTIMO</b> = equilibra a carga entre os setores <b>e</b> minimiza a quebra (mantém o território conectado; não empilha tudo num setor). <b style=\"color:var(--ink)\">TOBE</b> = sugestão por vizinhança. Editar esta etapa recalcula automaticamente as etapas seguintes da timeline.</div>\n      <div class=\"note\" id=\"ruleNote\" style=\"margin:-6px 0 11px;padding:7px 9px;background:var(--panel2);border:1px solid var(--line);border-radius:8px\"></div>\n      <div class=\"kpis\" id=\"kpis\"></div>\n      <div id=\"contig\"></div>\n      <div id=\"spanRule\"></div>\n      <h2>Span por setor (CBs) — base + entrantes</h2>\n      <div id=\"spans\"></div>\n      <div id=\"policySection\">\n      <div style=\"display:flex;justify-content:space-between;align-items:center;margin:14px 0 7px\">\n        <h2 style=\"margin:0\">CBs deslocadas</h2>\n        <div class=\"toggle\" id=\"policy\">\n          <button data-p=\"fora\" class=\"on\">= fora do setor</button>\n          <button data-p=\"quebra\">= quebra de relação</button>\n        </div>\n      </div>\n      <div class=\"note\" id=\"policyNote\"></div>\n      </div>\n    </div>\n\n    <div class=\"card\">\n      <h2 id=\"muniListTitle\">Municípios → setor destino</h2>\n      <div class=\"note\" id=\"muniListNote\" style=\"margin:-4px 0 9px\">Clique no <b>código do setor</b> pra mandar o município <b>inteiro</b> pra lá (regra de negócio). A cor acompanha o mapa.</div>\n      <div id=\"muniList\"></div>\n    </div>\n\n    <div class=\"card\">\n      <div class=\"toolbar\" style=\"justify-content:space-between\">\n        <h2 style=\"margin:0\">Plano de migração (etapa selecionada)</h2>\n        <div><button class=\"ghost\" id=\"copyPlan\">Copiar</button> <button class=\"ghost\" id=\"csvPlan\">CSV</button></div>\n      </div>\n      <div id=\"plan\" class=\"note\"></div>\n    </div>\n  </div>\n</div>\n\n<div class=\"sheet-bg hidden\" id=\"shareBg\">\n  <div class=\"sheet\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"shareTitle\">\n    <div class=\"sheet-hd\"><h3 id=\"shareTitle\">Compartilhar sessão</h3><div class=\"mac-spacer\"></div><button class=\"sheet-x\" id=\"shareX\" title=\"Fechar\">✕</button></div>\n    <div class=\"sheet-bd\" id=\"shareBody\"></div>\n    <div class=\"sheet-ft\">\n      <span class=\"status\" id=\"shareStatus\"></span>\n      <div class=\"mac-spacer\"></div>\n      <button class=\"ghost hidden\" id=\"shareCopy\">Copiar link</button>\n      <button class=\"ghost hidden\" id=\"shareOpen\">Abrir</button>\n      <button class=\"ghost\" id=\"shareCancel\">Cancelar</button>\n      <button class=\"act\" id=\"shareGo\">Compartilhar</button>\n    </div>\n  </div>\n</div>\n\n<div class=\"sheet-bg hidden\" id=\"optionsBg\">\n  <div class=\"sheet\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"optTitle\">\n    <div class=\"sheet-hd\"><h3 id=\"optTitle\">Opções da sessão</h3><span class=\"badge\" id=\"optSessName\"></span><div class=\"mac-spacer\"></div><button class=\"sheet-x\" id=\"optClose\" title=\"Fechar\">✕</button></div>\n    <div class=\"sheet-bd\">\n      <div class=\"opt-lbl\">Regra rígida — seleção dos setores destino</div>\n      <div class=\"opt-sub\">Define quais setores vizinhos podem entrar na lista de destinos de cada etapa. Vale pra toda a timeline desta sessão.</div>\n      <label class=\"opt-row\" data-r=\"any\">\n        <input type=\"radio\" name=\"destRule\" value=\"any\">\n        <div>\n          <div class=\"opt-t\">Adjacente a qualquer município <span class=\"badge\">padrão</span></div>\n          <div class=\"opt-d\">Um setor entra na lista de destinos se tiver município vizinho a <b>qualquer</b> município do setor fechado — inclusive os menores. É o comportamento de hoje.</div>\n        </div>\n      </label>\n      <label class=\"opt-row\" data-r=\"dominant\">\n        <input type=\"radio\" name=\"destRule\" value=\"dominant\">\n        <div>\n          <div class=\"opt-t\">Adjacente a municípios dominantes</div>\n          <div class=\"opt-d\">Só os municípios do setor fechado com <b>CBs suficientes</b> valem como ponte. Os pequenos continuam sendo redistribuídos normalmente — só não trazem setor novo pra lista de destinos.</div>\n          <div class=\"opt-inline\" id=\"optMinCbsWrap\">Ignorar municípios com menos de <input type=\"number\" id=\"optMinCbs\" min=\"1\" max=\"9999\" step=\"1\" style=\"width:74px\"> CBs</div>\n        </div>\n      </label>\n      <div class=\"opt-hr\"></div>\n      <div class=\"opt-lbl\" style=\"margin-top:15px\">Pré-requisitos do setor destino — tamanho em CBs</div>\n      <div class=\"opt-sub\">Vale pro tamanho de cada setor receptor <b>depois</b> da redistribuição (base + entrantes). Em branco = desligado.</div>\n      <div class=\"opt-grid\">\n        <label class=\"opt-fld\"><span>Span alvo <i>(tamanho ideal)</i></span><input type=\"number\" id=\"optTargetSpan\" min=\"1\" max=\"99999\" step=\"1\" placeholder=\"livre\"></label>\n        <label class=\"opt-fld\"><span>Span máximo <i>(nenhum setor acima)</i></span><input type=\"number\" id=\"optMaxSpan\" min=\"1\" max=\"99999\" step=\"1\" placeholder=\"sem limite\"></label>\n        <label class=\"opt-fld\"><span>Span mínimo <i>(nenhum setor abaixo)</i></span><input type=\"number\" id=\"optMinSpan\" min=\"1\" max=\"99999\" step=\"1\" placeholder=\"sem limite\"></label>\n      </div>\n      <div class=\"opt-err hidden\" id=\"optSpanErr\"></div>\n      <div class=\"opt-note\" id=\"optPreview\"></div>\n    </div>\n    <div class=\"sheet-ft\"><span class=\"status\" id=\"optStatus\"></span><div class=\"mac-spacer\"></div><button class=\"ghost\" id=\"optCancel\">Cancelar</button><button class=\"act\" id=\"optApply\">Aplicar</button></div>\n  </div>\n</div>\n\n<div class=\"sheet-bg hidden\" id=\"moveBg\">\n  <div class=\"sheet\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"moveTitle\">\n    <div class=\"sheet-hd\"><h3 id=\"moveTitle\">Adicionar movimentação</h3><div class=\"mac-spacer\"></div><button class=\"sheet-x\" id=\"moveClose\" title=\"Fechar\">✕</button></div>\n    <div class=\"sheet-bd\">\n      <div class=\"opt-lbl\">Tipo de movimentação</div>\n      <div class=\"opt-sub\" id=\"moveLockNote\">Escolha o nível a fechar. Você pode fechar setores à vontade até fechar uma GV; aí só GV (ou mercado) daqui pra frente. Fechar um mercado trava a sessão em mercado.</div>\n      <label class=\"opt-row\" data-lvl=\"setor\"><input type=\"radio\" name=\"moveLevel\" value=\"setor\"><div><div class=\"opt-t\">Fechar Setor</div><div class=\"opt-d\">Redistribui os municípios do setor entre setores vizinhos da mesma GV.</div></div></label>\n      <label class=\"opt-row\" data-lvl=\"gv\"><input type=\"radio\" name=\"moveLevel\" value=\"gv\"><div><div class=\"opt-t\">Fechar GV</div><div class=\"opt-d\">Redistribui os setores (com municípios e CBs) da GV entre GVs vizinhas do mesmo mercado.</div></div></label>\n      <label class=\"opt-row\" data-lvl=\"mercado\"><input type=\"radio\" name=\"moveLevel\" value=\"mercado\"><div><div class=\"opt-t\">Fechar Mercado</div><div class=\"opt-d\">Redistribui as GVs (com setores, municípios e CBs) do mercado entre mercados vizinhos.</div></div></label>\n      <div class=\"opt-hr\"></div>\n      <div class=\"opt-lbl\" style=\"margin-top:15px\" id=\"moveCodeLbl\">Setor a fechar</div>\n      <div class=\"opt-inline\" id=\"moveCodeRow\">\n        <input id=\"moveCode\" list=\"moveCodeList\" placeholder=\"código\" style=\"min-width:150px\">\n        <datalist id=\"moveCodeList\"></datalist>\n        <button class=\"ghost\" id=\"moveRand\" title=\"Aleatório\">🎲</button>\n      </div>\n      <div class=\"opt-err hidden\" id=\"moveErr\"></div>\n    </div>\n    <div class=\"sheet-ft\"><span class=\"status\" id=\"moveStatus\"></span><div class=\"mac-spacer\"></div><button class=\"ghost\" id=\"moveCancel\">Cancelar</button><button class=\"act\" id=\"moveGo\">Fechar ▶ (nova etapa)</button></div>\n  </div>\n</div>\n\n<div class=\"tip\" id=\"tip\"></div>\n<div class=\"load hidden\" id=\"loader\">carregando…</div>\n<span id=\"ready\" style=\"display:none\"></span></div>`;\n  },\n  mounted(d2, root){\n\nconst $=s=>root.querySelector(s);\nconst fmt=n=>n==null?'–':Math.round(+n).toLocaleString('pt-BR');\nconst money=n=>{n=+n||0;return n>=1e6?'R$'+(n/1e6).toFixed(1)+'M':n>=1e3?'R$'+(n/1e3).toFixed(0)+'k':'R$'+Math.round(n)};\nconst norm=s=>(s||'').normalize('NFKD').replace(/[̀-ͯ]/g,'').toUpperCase().replace(/[^A-Z0-9]+/g,' ').trim();\nconst esc=s=>(s==null?'':String(s)).replace(/[&<>]/g,c=>({'&':'&amp;','<':'&lt;','>':'&gt;'}[c]));\nconst blankM=()=>({cbs:0,receita:0,rec_nat:0,rec_avon:0,pontos:0,pedidos:0,ativas:0});\n// ---------- município identity ----------\n// Brazil has many municipalities sharing a name (Bom Jesus alone exists in PI, RN, RS, SC, PB, GO).\n// A stage loads the dominant UF PLUS every bordering UF, so those collisions land in the SAME\n// feature set routinely: keyed by name alone the last shape loaded won, the map could draw a\n// município from the wrong state, buildAdj merged two unrelated municipalities into one node, and\n// GROUP BY DS_MUNICIPIO summed two real municipalities into one row. The key is NAME/UF everywhere\n// — SQL rows, GeoJSON features, the dominantes base, assignments, persisted sessions. norm() maps\n// every non-alphanumeric to a space, so '/' can never occur inside a name and the split is exact.\n// A missing UF degrades to a bare NAME key rather than inventing one.\nconst mkey=(name,uf)=>{const n=norm(name),u=String(uf==null?'':uf).trim().toUpperCase();return u?n+'/'+u:n;};\nconst mName=k=>{const s=String(k==null?'':k),i=s.lastIndexOf('/');return i<0?s:s.slice(0,i);};\nconst mUf=k=>{const s=String(k==null?'':k),i=s.lastIndexOf('/');return i<0?'':s.slice(i+1);};\nconst mDisp=k=>{const u=mUf(k);return u?mName(k)+' ('+u+')':mName(k);};\n// The base CSV is the ONLY source of a município's UF now, so its column is accepted in whatever\n// shape the base is maintained in: sigla, IBGE numeric code, or full state name. Anything that does\n// not resolve to a real sigla is treated as UNKNOWN rather than passed through — a bogus UF would key\n// a município to a shape that does not exist and drop it off the map without a word.\nconst UF_OF_CODE={}; Object.keys(UF_CODE).forEach(k=>{ UF_OF_CODE[UF_CODE[k]]=k; });\nconst UF_OF_NAME={ACRE:'AC',ALAGOAS:'AL',AMAPA:'AP',AMAZONAS:'AM',BAHIA:'BA',CEARA:'CE','DISTRITO FEDERAL':'DF','ESPIRITO SANTO':'ES',GOIAS:'GO',MARANHAO:'MA','MATO GROSSO':'MT','MATO GROSSO DO SUL':'MS','MINAS GERAIS':'MG',PARA:'PA',PARAIBA:'PB',PARANA:'PR',PERNAMBUCO:'PE',PIAUI:'PI','RIO DE JANEIRO':'RJ','RIO GRANDE DO NORTE':'RN','RIO GRANDE DO SUL':'RS',RONDONIA:'RO',RORAIMA:'RR','SANTA CATARINA':'SC','SAO PAULO':'SP',SERGIPE:'SE',TOCANTINS:'TO'};\nconst ufNorm=v=>{const s=norm(v); if(!s) return '';\n  if(UF_CODE[s]) return s;\n  if(UF_OF_CODE[s]) return UF_OF_CODE[s];\n  return UF_OF_NAME[s]||'';};\nconst loader=(on,t)=>{const l=$('#loader');l.classList.toggle('hidden',!on);if(t)l.textContent=t;};\nconst setError=(msg)=>{ const t=$('#ds'); if(t){t.textContent=msg;t.classList.add('err');} const c=$('#confirmStatus'); if(c){c.textContent=msg;c.classList.add('err');} };\n\n// ---------- base de municípios dominantes (CSV) ----------\n// WHICH municipalities belong to a sector is a business fact, not something to infer from CB volume:\n// it comes from a maintained CSV (one row per setor x município) linked through the `dominantesCsvUrl`\n// param. Anything the closing sector has CBs in but that the base does NOT assign to it is spillover:\n// not realocated, not drawn on the map, and its CBs follow their leader. Loaded once per URL and\n// cached for the whole session; a failure is thrown, never swallowed — a silent fallback here would\n// quietly change every number on the screen.\nconst DOM={url:null,promise:null,bySetor:null,ufBySetorMuni:null,rows:0,setores:0,hasUf:false,ufCol:null,badUf:0,clashes:0,headers:null,error:null};\nfunction parseCsv(text){\n  const out=[]; let row=[],cur='',q=false;\n  const push=()=>{ row.push(cur); cur=''; };\n  const endRow=()=>{ push(); if(row.length>1||row[0]!=='') out.push(row); row=[]; };\n  for(let i=0;i<text.length;i++){ const ch=text[i];\n    if(q){ if(ch==='\"'){ if(text[i+1]==='\"'){ cur+='\"'; i++; } else q=false; } else cur+=ch; }\n    else if(ch==='\"') q=true;\n    else if(ch===',') push();\n    else if(ch==='\\n') endRow();\n    else if(ch!=='\\r') cur+=ch;\n  }\n  if(cur!==''||row.length) endRow();\n  return out;\n}\n// `dominantesCsvUrl` is declared as a FileComponentUrlReference, so the instance points at the Drive\n// FILE, not at a URL literal — the Drive is policy-gated behind the app's auth strategy and a baked\n// string would be both stale and unauthorised. What the resolver hands back varies by where it is\n// resolved (URL string / file record / bare reference), so accept every shape instead of silently\n// reading undefined and falling through to the fallback.\n// The Drive is gated by the app's AuthenticationStrategy, so this read has to travel as the LOGGED-IN\n// USER — an anonymous CDN GET is exactly what the policy is there to refuse. `<system>.data2.media` is\n// only a cache in front of the SSP: on a cache miss it 302s to `<system>.data2apis.com`, which is where\n// the policy is actually evaluated.\n// COOKIES CANNOT CARRY THAT SESSION, which is why the previous `credentials:'include'` attempt could\n// never have worked: the app runs on <app>.<system>.data2.app and the SSP on <system>.data2apis.com —\n// cross-site — and the SSP answers `Access-Control-Allow-Origin: *` with no `Allow-Credentials`, so the\n// browser rejects a credentialed CORS read before it ever leaves the page. What the SSP actually reads\n// is `Authorization: Bearer <token>`: the runtime keeps that token in localStorage under\n// `__data2-session-<systemDomain>` (`__data2-session-data2` inside the builder preview) and replays it\n// on every dataset and rush call — same token, same header, same session, so the Drive policy sees the\n// logged-in user. Preflight passes because the SSP echoes whatever header the request asks for.\nfunction d2SessionToken(sysDomain){\n  const read=k=>{ try{ return (k&&window.localStorage.getItem(k))||''; }catch(e){ return ''; } };\n  return read(sysDomain?('__data2-session-'+sysDomain):'')||read('__data2-session-data2')||'';\n}\nfunction domCsvSystemDomain(url){\n  const m=/^https?:\\/\\/([^.\\/]+)\\.data2\\.(?:media|app)\\//i.exec(url)||/^https?:\\/\\/([^.\\/]+)\\.data2apis\\.com\\//i.exec(url);\n  return m?m[1]:'';\n}\nfunction domCsvCandidates(url){\n  const out=[];\n  const isMedia=/^https?:\\/\\/[^.\\/]+\\.data2\\.media\\//i.test(url);\n  const api=isMedia?url.replace(/^(https?:\\/\\/[^.\\/]+)\\.data2\\.media\\//i,'$1.data2apis.com/'):null;\n  const tok=d2SessionToken(domCsvSystemDomain(url));\n  const auth=tok?{authorization:'Bearer '+tok}:null;\n  // Authenticated origin read first — the only candidate a GATED Drive can actually answer.\n  if(api&&auth) out.push({url:api,headers:auth,label:'api+sessão'});\n  if(!api&&auth) out.push({url:url,headers:auth,label:'origem+sessão'});\n  // Anonymous last: only ever succeeds on an UNGATED Drive — or on a stale CDN cache hit, which is NOT\n  // proof the file is public (the origin keeps answering 401 once the edge entry expires).\n  if(api) out.push({url:api,headers:null,label:'api anônimo'});\n  out.push({url:url,headers:null,label:'origem anônima'});\n  return out;\n}\nfunction domCsvUrl(){\n  const pick=v=>{\n    if(!v) return '';\n    if(typeof v==='string') return v;\n    const q=v.params||{};\n    const ref=q.reference||v.reference;\n    return q.fileUrl||q.url||v.fileUrl||v.url||(ref?DOM_MEDIA_BASE+ref:'');\n  };\n  return String(pick(d2.param('dominantesCsvUrl'))||DOM_CSV_FALLBACK||'').trim();\n}\nasync function ensureDominantes(){\n  const url=domCsvUrl();\n  if(!url) throw new Error('base de municípios dominantes não configurada — ligue o arquivo CSV no parâmetro dominantesCsvUrl da instância do componente');\n  if(DOM.url===url && DOM.bySetor) return DOM.bySetor;\n  if(DOM.url===url && DOM.promise) return DOM.promise;\n  DOM.url=url; DOM.error=null;\n  DOM.promise=(async()=>{\n    // Self-diagnosing on purpose: every candidate reports its own outcome and the message names the\n    // session it was carrying. \"Unauthorized\" alone cannot distinguish \"not logged into THIS strategy\"\n    // from \"cookie not sent cross-site\" from \"param never bound, so it tried the fallback URL\" — and\n    // guessing between those from the outside costs a round trip each time.\n    let r=null; const tried=[];\n    for(const c of domCsvCandidates(url)){\n      let res=null;\n      try{ res=await fetch(c.url,{cache:'no-store',credentials:'omit',headers:c.headers||undefined}); }\n      catch(e){ tried.push(c.label+' → rede/CORS'); continue; }\n      if(res.ok){ r=res; break; }\n      tried.push(c.label+' → '+res.status);\n    }\n    if(!r){\n      let sess='sessão desconhecida';\n      try{\n        const a=d2.auth(AUTH_REF);\n        sess=(a&&a.isAuthed)?('logado como '+((a.user&&(a.user.email||a.user.nome))||'?')):('NÃO logado na estratégia '+AUTH_REF);\n      }catch(e){ sess='estratégia '+AUTH_REF+' não resolvida'; }\n      const tk=d2SessionToken(domCsvSystemDomain(url));\n      throw new Error('base de municípios dominantes: não foi possível ler o arquivo — '+sess+' · token de sessão '+(tk?'presente':'AUSENTE no localStorage')+'. Tentativas: '+tried.join(' · '));\n    }\n    const table=parseCsv(await r.text());\n    if(table.length<2) throw new Error('base de municípios dominantes vazia');\n    const head=table[0].map(h=>norm(h));\n    const iS=head.indexOf('CD SETOR'), iM=head.indexOf('MUNICIPIO');\n    if(iS<0||iM<0) throw new Error('base de municípios dominantes sem as colunas CD_SETOR / MUNICIPIO');\n    // CD_GV is the gerência de vendas the setor answers to, and it is the authority for the hard rule\n    // that a closing sector only ever hands territory to sectors of its OWN gerência. Its absence is\n    // fatal rather than a warning: with no GV there is no way to PROVE two sectors share one, and\n    // falling through unchecked is exactly the leak this column exists to close.\n    const iG=['CD GV','CDGV','GV','CD GERENCIA','CD GERENCIA VENDAS','CD GERENCIA DE VENDAS','GERENCIA DE VENDAS','GERENCIA'].map(h=>head.indexOf(h)).find(i=>i>=0);\n    if(iG==null) throw new Error('base de municípios dominantes sem a coluna CD_GV — a regra de gerência de vendas não pode ser aplicada. Colunas lidas: '+head.slice(0,40).join(', '));\n    // MERCADO fica ACIMA de GV na hierarquia (mercado > GV > setor) — fechamento de Mercado e a regra\n    // \"GV só fecha pra GV do mesmo mercado\" dependem dela do mesmo jeito que a regra de GV depende\n    // de CD_GV, então a ausência é fatal pelo mesmo motivo.\n    const iK=['MERCADO','MERCADO REGIONAL','MKT','MARKET'].map(h=>head.indexOf(h)).find(i=>i>=0);\n    if(iK==null) throw new Error('base de municípios dominantes sem a coluna MERCADO — fechamento de GV/Mercado precisa dela. Colunas lidas: '+head.slice(0,40).join(', '));\n    // Nomes de exibição — opcionais: a hierarquia funciona só com os códigos, mas o código sozinho\n    // não diz nada pro operador escolhendo o que fechar.\n    const iDS=['DC SETOR','NOME SETOR','DESCRICAO SETOR','NM SETOR'].map(h=>head.indexOf(h)).find(i=>i>=0);\n    const iDG=['DC GV','NOME GV','DESCRICAO GV','NM GV','GV NOME'].map(h=>head.indexOf(h)).find(i=>i>=0);\n    // The UF column is what the whole keying now rests on — SQL no longer carries DS_ESTADO — so its\n    // absence is a first-class finding, not a footnote. The header actually matched is reported on the\n    // base pill, and when nothing matches the pill lists every column read, because guessing a header\n    // name from the outside costs a round trip each time.\n    const iU=['UF','SIGLA UF','SG UF','CD UF','ESTADO','DS ESTADO','SIGLA','ESTADO SIGLA','UF MUNICIPIO'].map(h=>head.indexOf(h)).find(i=>i>=0);\n    const by={},ufBy={},gvBy={},mkBySetor={},setorLabel={},gvLabel={}; let n=0,bad=0; const clash={},gvClash={},mkClash={};\n    for(let i=1;i<table.length;i++){\n      const line=table[i]; if(!line) continue;\n      const s=String(line[iS]==null?'':line[iS]).trim(), m=norm(line[iM]);\n      if(!s||!m) continue;\n      // One setor spans many rows (one per município) and every one of them repeats its CD_GV. Two\n      // DIFFERENT values for the same setor means the base itself disagrees about which gerência owns\n      // it — counted and reported, never keyed to whichever row happened to be read last.\n      const gvv=String(line[iG]==null?'':line[iG]).trim();\n      if(gvv){ if(gvBy[s]!==undefined && gvBy[s]!==gvv) gvClash[s]=true; else gvBy[s]=gvv; }\n      const mkv=String(line[iK]==null?'':line[iK]).trim();\n      if(mkv){ if(mkBySetor[s]!==undefined && mkBySetor[s]!==mkv) mkClash[s]=true; else mkBySetor[s]=mkv; }\n      if(iDS!=null){ const lbl=String(line[iDS]==null?'':line[iDS]).trim(); if(lbl && !setorLabel[s]) setorLabel[s]=lbl; }\n      if(iDG!=null && gvv){ const lbl=String(line[iDG]==null?'':line[iDG]).trim(); if(lbl && !gvLabel[gvv]) gvLabel[gvv]=lbl; }\n      const raw=(iU==null)?'':line[iU];\n      const u=(iU==null)?'':ufNorm(raw);\n      if(iU!=null && String(raw==null?'':raw).trim() && !u) bad++;\n      // The same name twice in ONE setor under two UFs is the single case the reverted SQL cannot\n      // survive: mSQL groups by DS_MUNICIPIO alone, so both municipalities arrive summed into one row\n      // and no lookup can split them again. Counted and reported — never quietly keyed to whichever\n      // UF happened to be read last.\n      const kk=s+'|'+m;\n      // An UNRESOLVED uf must never outrank a resolved one. Reading a blank/bogus UF row first wrote ''\n      // here, and the next row carrying the real sigla was then rejected as a clash — so the key stayed\n      // falsy for good, ufFor() fell through, and the município degraded to a bare NAME key that matches\n      // no shape and no dominance entry. With DISTRITO/ZONA in the base a município spans several rows,\n      // so which row lands first is pure luck. A clash is only two RESOLVED siglas that disagree.\n      if(!u){ if(ufBy[kk]===undefined) ufBy[kk]=''; }\n      else if(!ufBy[kk]) ufBy[kk]=u;\n      else if(ufBy[kk]!==u) clash[kk]=true;\n      (by[s]=by[s]||new Set()).add(u?m+'/'+u:m); n++;\n    }\n    if(!n) throw new Error('base de municípios dominantes sem linhas válidas');\n    DOM.bySetor=by; DOM.ufBySetorMuni=ufBy; DOM.rows=n; DOM.setores=Object.keys(by).length;\n    DOM.gvBySetor=gvBy; DOM.gvClashes=Object.keys(gvClash).length; DOM.gvCol=String(table[0][iG]||'').trim();\n    DOM.gvSetores=Object.keys(gvBy).length;\n    DOM.hasUf=(iU!=null); DOM.ufCol=(iU==null?null:String(table[0][iU]||'').trim());\n    DOM.badUf=bad; DOM.clashes=Object.keys(clash).length; DOM.headers=head.slice(0,40); DOM.error=null;\n    // ---- hierarquia: setor ⊂ GV ⊂ mercado, tudo derivado do MESMO csv que a regra de setor já\n    // confia — fechamento de GV/Mercado lê a mesma fonte, nunca uma segunda base paralela.\n    DOM.mercadoBySetor=mkBySetor; DOM.mercadoClashes=Object.keys(mkClash).length; DOM.mercadoCol=String(table[0][iK]||'').trim();\n    DOM.setorLabel=setorLabel; DOM.gvLabel=gvLabel;\n    const sectorsByGv={},sectorsByMercado={},gvsByMercado={},mercadoByGv={},gvMercClash={};\n    Object.keys(by).forEach(s=>{\n      const gv=gvBy[s], mk=mkBySetor[s];\n      if(gv) (sectorsByGv[gv]=sectorsByGv[gv]||new Set()).add(s);\n      if(mk) (sectorsByMercado[mk]=sectorsByMercado[mk]||new Set()).add(s);\n      if(gv&&mk){ if(mercadoByGv[gv]!==undefined && mercadoByGv[gv]!==mk) gvMercClash[gv]=true; else mercadoByGv[gv]=mk; }\n    });\n    Object.entries(mercadoByGv).forEach(([gv,mk])=>(gvsByMercado[mk]=gvsByMercado[mk]||new Set()).add(gv));\n    DOM.sectorsByGv=sectorsByGv; DOM.sectorsByMercado=sectorsByMercado; DOM.gvsByMercado=gvsByMercado;\n    DOM.mercadoByGv=mercadoByGv; DOM.gvMercadoClashes=Object.keys(gvMercClash).length;\n    return by;\n  })();\n  DOM.promise.catch(e=>{ DOM.promise=null; DOM.bySetor=null; DOM.error=e.message; renderAll(); });\n  return DOM.promise;\n}\n\nlet SESS={ snapshotRaw:null, snapshotSyncedAt:null, snapLiteral:null, eloMaxCycle:null, timeline:[], selected:0,\n           sessionId:null, sessionLabel:null, sessionsList:[], sectorsList:[], sectorBaseCache:{}, stage:'loading', dirtyFrom:null,\n           snapBusy:false, settings:{...DEFAULT_SETTINGS} };\n\nasync function q(sql){\n  let dbx,res;\n  try{\n    res=await d2.rush('AwW_11Nkg-dKksP7ic8V8').invoke({sql});\n  }catch(e){\n    throw new Error('Databricks indisponível (rush AwW_11Nkg-dKksP7ic8V8): '+e.message);\n  }\n  // The listener answers 200 with {sql} and NO `result` when its upstream probe times out: the\n  // handler builds `result: $result.data`, so an empty upstream simply drops the key rather than\n  // failing. Reading straight through to res.data.result.data reported \"Cannot read properties of\n  // undefined (reading 'data')\" — which reads like a bug in THIS component and sent a debugging\n  // session after the wrong thing. Name the layer that actually failed instead.\n  const payload=res&&res.data;\n  if(!payload) throw new Error('rush AwW_11Nkg-dKksP7ic8V8 não devolveu corpo — listener fora do ar?');\n  if(!payload.result) throw new Error('a sonda Databricks não respondeu: o listener AwW_11Nkg-dKksP7ic8V8 devolveu 200 sem `result`, o que normalmente é timeout do upstream (natura-x-app). O SQL não chegou a rodar.');\n  dbx=payload.result.data;\n  if(!dbx) throw new Error('sonda Databricks respondeu sem dados (result.data vazio).');\n  if(dbx.state && dbx.state!=='SUCCEEDED') throw new Error('Databricks '+dbx.state+': '+(dbx.error?.message||JSON.stringify(dbx.error)||'erro desconhecido'));\n  return dbx;\n}\nfunction rows(resp){const c=(resp.columns||[]).map(x=>x.name);\n  return (resp.rows||[]).map(a=>Object.fromEntries(c.map((k,i)=>[k,a[i]])));}\n// Stamps the UF onto every feature at load: the fetch is per-UF, so this is the ONLY point where a\n// shape's state is known for certain. Downstream the features are flattened into one array and the\n// origin would be unrecoverable. Persisted with the feature in saved sessions.\nasync function geoUF(uf){const code=UF_CODE[uf]||uf;const r=await fetch('https://raw.githubusercontent.com/tbrugz/geodata-br/master/geojson/geojs-'+code+'-mun.json');if(!r.ok)throw new Error('geo '+uf);\n  const g=await r.json(); const U=String(uf).toUpperCase();\n  (g.features||[]).forEach(f=>{ f.__uf=U; });\n  return g;}\n\nfunction buildAdj(features){\n  const pts=f=>{const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates],s=new Set();\n    ps.forEach(poly=>poly.forEach(ring=>ring.forEach(p=>s.add(Math.round(p[0]*1000)/1000+','+Math.round(p[1]*1000)/1000))));return s;};\n  const feat={},idx={};\n  features.forEach(f=>{const nm=mkey(f.properties.name||f.properties.NOME||f.properties.nome,f.__uf);feat[nm]={f,pts:pts(f)};});\n  for(const nm in feat) feat[nm].pts.forEach(p=>(idx[p]=idx[p]||[]).push(nm));\n  const nbrs=nm=>{const c={};feat[nm].pts.forEach(p=>idx[p].forEach(o=>{if(o!==nm)c[o]=(c[o]||0)+1;}));\n    return Object.entries(c).filter(([,n])=>n>=2).map(([o,n])=>({o,w:n}));};\n  return {feat,nbrs};\n}\nfunction centroidLL(f){let x=0,y=0,n=0;const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];\n  ps.forEach(poly=>poly[0].forEach(p=>{x+=p[0];y+=p[1];n++;}));return[x/n,y/n];}\n\n// ---------- snapshot pinning ----------\nasync function resolveSnapshotPin(){\n  const [rawR,liveCountR,eloR]=await Promise.all([\n    q(`SELECT MAX(DT_HISTORICO) snap FROM ${T} WHERE CD_PAIS=1`).then(rows),\n    q(`SELECT COUNT(*) n FROM ${T} WHERE CD_PAIS=1 AND DT_HISTORICO=(SELECT MAX(DT_HISTORICO) FROM ${T} WHERE CD_PAIS=1)`).then(rows),\n    q(`SELECT MAX(operational_cycle) mx FROM ${ELO} WHERE country_code=1`).then(rows).catch(()=>[]),\n  ]);\n  const raw=rawR[0]&&rawR[0].snap;\n  const liveCount=+((liveCountR[0]||{}).n||0);\n  const eloMax=+((eloR[0]||{}).mx||0);\n  const LIVE_SUBQ=`(SELECT MAX(DT_HISTORICO) FROM ${T} WHERE CD_PAIS=1)`;\n  const dbTs=(raw||'').replace('T',' ').replace(/Z$/,'');\n  const candidates=[`TIMESTAMP'${dbTs}'`,`'${dbTs}'`,`DATE'${dbTs}'`];\n  const tests=await Promise.all(candidates.map(c=>\n    q(`SELECT COUNT(*) n FROM ${T} WHERE CD_PAIS=1 AND DT_HISTORICO=${c}`).then(rows).then(r=>+((r[0]||{}).n||0)).catch(()=>-1)\n  ));\n  let chosen=LIVE_SUBQ;\n  for(let i=0;i<candidates.length;i++){ if(liveCount>0 && tests[i]===liveCount){ chosen=candidates[i]; break; } }\n  return {snapshotRaw:raw, snapLiteral:chosen, eloMaxCycle:eloMax, syncedAt:new Date().toISOString()};\n}\n// DISPLAY CONTRACT: the UI never prints the snapshot's own DT_HISTORICO (snapshotRaw). What the user\n// sees is `snapshotSyncedAt` — the date AND hour at which THIS instance last pulled/pinned the\n// snapshot it is querying. snapshotRaw is still resolved, still drives every SQL literal, and is\n// still persisted by saveSession/doShare; it is only kept off the screen.\nfunction fmtSyncedAt(iso){\n  if(!iso) return '—';\n  const d=new Date(iso);\n  if(isNaN(d.getTime())) return String(iso);\n  return d.toLocaleString('pt-BR',{day:'2-digit',month:'2-digit',year:'numeric',hour:'2-digit',minute:'2-digit'});\n}\nasync function ensurePinned(){\n  if(SESS.snapLiteral) return;\n  const p=await resolveSnapshotPin();\n  SESS.snapshotRaw=p.snapshotRaw; SESS.snapLiteral=p.snapLiteral; SESS.eloMaxCycle=p.eloMaxCycle;\n  SESS.snapshotSyncedAt=p.syncedAt;\n}\n\n// ---------- world-state fold ----------\nfunction accMetrics(base,add){\n  const out=base?{...base}:blankM();\n  Object.keys(blankM()).forEach(k=>{ out[k]=(out[k]||0)+((add&&add[k])||0); });\n  return out;\n}\nfunction foldWorldState(timeline,uptoIdx){\n  const closedSectors=new Set(),muniOverride={},muniGeo={},muniRow={},muniLevel={},sectorInflow={},sectorInflowLevel={},sectorOrphanRows={};\n  // GV/mercado: setores e GVs não se dissolvem quando o dono deles fecha — eles só passam a\n  // responder a um destino novo. Por isso o rastro do cascade mora numa camada PRÓPRIA\n  // (secOverride/gvOverride), separada da camada de município do fechamento de setor — a\n  // hierarquia trava a sessão num nível só, então nunca as duas camadas têm conteúdo ao mesmo tempo.\n  const closedGvs=new Set(),secOverride={},gvInflow={};\n  const closedMercados=new Set(),gvOverride={},mercadoInflow={};\n  for(let k=0;k<uptoIdx;k++){\n    const mv=timeline[k]; if(!mv||!mv.sector||!mv.munis) continue;\n    const level=mv.level||'setor';\n    if(level==='gv'){\n      closedGvs.add(String(mv.sector));\n      Object.keys(mv.munis).forEach(u=>{\n        if(u==='__OUTROS__') return;\n        const dest=mv.assign[u]; if(!dest) return;\n        secOverride[u]=String(dest);\n        gvInflow[dest]=accMetrics(gvInflow[dest],mv.munis[u]);\n      });\n      continue;\n    }\n    if(level==='mercado'){\n      closedMercados.add(String(mv.sector));\n      Object.keys(mv.munis).forEach(u=>{\n        if(u==='__OUTROS__') return;\n        const dest=mv.assign[u]; if(!dest) return;\n        gvOverride[u]=String(dest);\n        mercadoInflow[dest]=accMetrics(mercadoInflow[dest],mv.munis[u]);\n      });\n      continue;\n    }\n    closedSectors.add(String(mv.sector));\n    Object.keys(mv.munis).forEach(m=>{\n      if(m==='__OUTROS__') return;\n      const dest=mv.assign[m]; if(!dest) return;\n      muniOverride[m]=String(dest);\n      if(mv.geoFeat&&mv.geoFeat[m]) muniGeo[m]=mv.geoFeat[m];\n      const rws=(mv.matrix||[]).filter(r=>mkey(r.municipio,r.uf)===m);\n      muniRow[m]=(muniRow[m]||[]).concat(rws);\n      if(mv.levelByMuni&&mv.levelByMuni[m]) muniLevel[m]={...(muniLevel[m]||{}),...mv.levelByMuni[m]};\n      sectorInflow[dest]=accMetrics(sectorInflow[dest],mv.munis[m]);\n      const lv=(mv.levelByMuni&&mv.levelByMuni[m])||{};\n      sectorInflowLevel[dest]=sectorInflowLevel[dest]||{};\n      Object.entries(lv).forEach(([nv,c])=>{ sectorInflowLevel[dest][nv]=(sectorInflowLevel[dest][nv]||0)+c; });\n    });\n    // Orphan CBs follow their leader's home sector, so later etapas must inherit them the same way\n    // the allocated municipalities are inherited — otherwise a stage's span would not match the\n    // base carried into the next one.\n    if(mv.orphanMetricsByGroup && Object.keys(mv.orphanMetricsByGroup).length){\n      const d=computeDerived(mv);\n      d.leaders.forEach(L=>{\n        if(!L.home) return;\n        const om=mv.orphanMetricsByGroup[L.grupo];\n        if(om) sectorInflow[L.home]=accMetrics(sectorInflow[L.home],om);\n        // sectorInflow only reaches a sector while it is a DESTINATION (it lands in baseMetrics).\n        // Keep the rows as well, so the sector still carries these CBs on the day it is the one\n        // being closed — that read goes through mv.matrix, which baseMetrics never touches.\n        const orws=mv.orphanRowsByGroup&&mv.orphanRowsByGroup[L.grupo];\n        if(orws&&orws.length) sectorOrphanRows[L.home]=(sectorOrphanRows[L.home]||[]).concat(orws);\n        const ol=mv.orphanLevelByGroup&&mv.orphanLevelByGroup[L.grupo];\n        if(ol){ sectorInflowLevel[L.home]=sectorInflowLevel[L.home]||{};\n          Object.entries(ol).forEach(([nv,c])=>{ sectorInflowLevel[L.home][nv]=(sectorInflowLevel[L.home][nv]||0)+c; }); }\n      });\n    }\n  }\n  return {closedSectors,muniOverride,muniGeo,muniRow,muniLevel,sectorInflow,sectorInflowLevel,sectorOrphanRows,\n          closedGvs,secOverride,gvInflow,closedMercados,gvOverride,mercadoInflow};\n}\n\n// ---------- per-movement compute ----------\nfunction aggregateMovement(mv){\n  const level=mv.level||'setor';\n  const munis={},leaders={};\n  const exSet=new Set((mv.excludedMunis||[]).map(x=>x.muni));\n  const acc=(o,r)=>{o.cbs+=+r.cbs;o.receita+=+r.receita||0;o.rec_nat+=+r.rec_nat||0;o.rec_avon+=+r.rec_avon||0;o.pontos+=+r.pontos||0;o.pedidos+=+r.pedidos||0;o.ativas+=+r.ativas||0;};\n  // Orphans = CBs in municipalities outside the sector's dominance base. They are NOT allocated\n  // geographically; they follow their own leader's home sector. Kept per leader group so every\n  // consumer (span, cascade, impact report) can route them the same way. Só existe no nível setor —\n  // GV/mercado não têm spillover (todo setor pertence a exatamente uma GV/mercado na base).\n  mv.orphanByGroup={}; mv.orphanMetricsByGroup={}; mv.orphanRowsByGroup={};\n  // unidade que este nível redistribui: a própria município (setor fecha), o setor da linha (GV\n  // fecha), a GV do setor da linha (mercado fecha).\n  const unitOf=r=>level==='setor'?null:(level==='gv'?String(r.setor):(DOM.gvBySetor[String(r.setor)]||''));\n  mv.matrix.forEach(r=>{\n    const m=mkey(r.municipio,r.uf);\n    r._out=!mv.geoFeat[m];   // assign, never just set: absorbed rows are reused across etapas\n    const mm=level==='setor'?(r._out?'__OUTROS__':m):(unitOf(r)||'__OUTROS__');\n    munis[mm]=munis[mm]||{...blankM(),name:mm}; acc(munis[mm],r);\n    const g=String(r.grupo); leaders[g]=leaders[g]||{grupo:g,lider:r.lider,total:0,byMuni:{}};\n    leaders[g].total+=+r.cbs; leaders[g].byMuni[mm]=(leaders[g].byMuni[mm]||0)+ +r.cbs;\n    if(level==='setor' && r._out && exSet.has(m)){\n      mv.orphanByGroup[g]=(mv.orphanByGroup[g]||0)+ +r.cbs;\n      // The ROW too, not just the totals: when the leader's home sector is itself closed in a later\n      // etapa, that etapa rebuilds its matrix from SQL + absorbed municípios, and these CBs are in\n      // neither (their município never moved). Without the row they silently vanish from the sector\n      // they were just credited to — see sectorOrphanRows in foldWorldState.\n      (mv.orphanRowsByGroup[g]=mv.orphanRowsByGroup[g]||[]).push(r);\n      mv.orphanMetricsByGroup[g]=accMetrics(mv.orphanMetricsByGroup[g],\n        {cbs:+r.cbs,receita:+r.receita||0,rec_nat:+r.rec_nat||0,rec_avon:+r.rec_avon||0,pontos:+r.pontos||0,pedidos:+r.pedidos||0,ativas:+r.ativas||0});\n    }\n  });\n  // Level counts only exist per municipality, never per leader, so an excluded municipality's level\n  // mix is credited to the group holding most of its CBs (sub-threshold by definition, so usually one).\n  mv.orphanLevelByGroup={};\n  (mv.excludedMunis||[]).forEach(({muni})=>{\n    const lv=(mv.levelByMuni&&mv.levelByMuni[muni])||{}; if(!Object.keys(lv).length) return;\n    let bg=null,bc=-1;\n    mv.matrix.forEach(r=>{ if(mkey(r.municipio,r.uf)!==muni) return; const cc=+r.cbs; if(cc>bc){bc=cc;bg=String(r.grupo);} });\n    if(!bg) return;\n    mv.orphanLevelByGroup[bg]=mv.orphanLevelByGroup[bg]||{};\n    Object.entries(lv).forEach(([nv,cc])=>{ mv.orphanLevelByGroup[bg][nv]=(mv.orphanLevelByGroup[bg][nv]||0)+cc; });\n  });\n  mv.munis=munis; mv.leaders=Object.values(leaders).sort((a,b)=>b.total-a.total);\n}\nfunction autoAssignFor(mv){\n  const a={};\n  Object.keys(mv.munis).forEach(m=>{ if(m==='__OUTROS__')return;\n    const v=mv.allowed[m]||{}; const votes=Object.keys(v);\n    if(votes.length){ let best=votes[0],bw=-1; for(const s of votes) if(v[s]>bw){bw=v[s];best=s;} a[m]=best; }\n    else if(mv.dest.length){ const c=mv.muniCentroid[m]; let best=mv.dest[0],bd=Infinity;\n      for(const s of mv.dest){ const sc=mv.secCentroid[s]; if(!sc||!c)continue; const d=(c[0]-sc[0])**2+(c[1]-sc[1])**2; if(d<bd){bd=d;best=s;} }\n      a[m]=best; }\n  });\n  return a;\n}\nfunction deslocFor(mv,assign){\n  let d=0;\n  mv.leaders.forEach(L=>{const byS={};let tot=0;\n    for(const [m,c] of Object.entries(L.byMuni)){if(m==='__OUTROS__')continue;const s=assign[m];if(s){byS[s]=(byS[s]||0)+c;tot+=c;}}\n    const home=mv.dest.reduce((a,s)=>(byS[s]||0)>(byS[a]||0)?s:a,mv.dest[0]);\n    d+=tot-(byS[home]||0);});\n  return d;\n}\nfunction spanMapFor(mv,a){const inc={};mv.dest.forEach(s=>inc[s]=0);\n  Object.entries(mv.munis).forEach(([m,o])=>{if(m==='__OUTROS__')return;const s=a[m];if(s&&inc[s]!=null)inc[s]+=o.cbs;});\n  // Orphan CBs follow their leader's home sector, and that home depends on THIS candidate\n  // assignment — so they have to be counted here, or the optimizer would score and constrain a\n  // span that differs from the one the UI shows. Skipped entirely when there are no orphans.\n  if(mv.orphanByGroup&&Object.keys(mv.orphanByGroup).length){\n    mv.leaders.forEach(L=>{\n      const orphan=mv.orphanByGroup[L.grupo]||0; if(!orphan) return;\n      const byS={}; let tot=0;\n      for(const [m,c] of Object.entries(L.byMuni)){ if(m==='__OUTROS__') continue; const s=a[m]; if(s&&inc[s]!=null){ byS[s]=(byS[s]||0)+c; tot+=c; } }\n      if(!tot) return;   // no home to follow -> stranded, counted nowhere\n      const home=mv.dest.reduce((x,s)=>(byS[s]||0)>(byS[x]||0)?s:x,mv.dest[0]);\n      if(inc[home]!=null) inc[home]+=orphan;\n    });\n  }\n  const sp={};mv.dest.forEach(s=>sp[s]=(+(mv.baseMetrics[s]?.cbs||0))+inc[s]);return sp;}\nfunction maxSpanOfFor(mv,a){return Math.max(...Object.values(spanMapFor(mv,a)),0);}\nfunction spanLimits(mv){\n  // Span alvo/máximo/mínimo é uma regra de fechamento de SETOR (tamanho ideal de território) —\n  // GV/mercado não têm essa noção e ignoram qualquer valor configurado nas opções da sessão.\n  if(mv && (mv.level||'setor')!=='setor') return {target:null,max:null,min:null};\n  const st={...DEFAULT_SETTINGS,...(SESS.settings||{})};\n  return {target:numOrNull(st.targetSpan),max:numOrNull(st.maxSpan),min:numOrNull(st.minSpan)};}\nfunction spanLimitsOn(lim){return !!(lim.target||lim.max||lim.min);}\nfunction spanViolationsOf(sp,lim){const over=[],under=[];\n  Object.entries(sp).forEach(([s,v])=>{ if(lim.max&&v>lim.max)over.push(s); if(lim.min&&v<lim.min)under.push(s); });\n  return {over,under};}\nfunction spanViolationsFor(mv,a){return spanViolationsOf(spanMapFor(mv,a),spanLimits(mv));}\n// With a target span the objective becomes RMS distance from the ideal size (punishes too big AND\n// too small). With no target we keep the legacy objective: shave the biggest sector.\nfunction spanCostFor(mv,a){const lim=spanLimits(mv),vals=Object.values(spanMapFor(mv,a));\n  if(!vals.length) return 0;\n  if(lim.target) return Math.sqrt(vals.reduce((s,v)=>s+(v-lim.target)**2,0)/vals.length);\n  return Math.max(...vals);}\n// ---------- ÓTIMO: objetivo multi-critério ----------\n// Three normalised objectives, each 0..1, so the weights below are directly comparable. The old\n// score added a span cost measured in CBs to a desloc measured in CBs, so on a large sector the\n// balance term was numerically ~100x the desloc term and silently decided everything on its own.\n//   balance — RMS spread of the resulting spans (against the target span when one is set,\n//             otherwise against their own mean), over that reference. 0 = every destination\n//             sector ends up the same size.\n//   dist    — how far each município travels, CB-weighted: half from the share of its outer\n//             border that faces the sector it was given to, half from centroid distance. 0 =\n//             every município went to a sector it physically touches. Adjacency used to be a\n//             pure yes/no constraint (contiguity); this is what makes it a preference too.\n//   orphan  — stranded orphan CBs (leader left without a home sector, so they land nowhere at\n//             all) plus CBs split away from their leader's home, over the CBs at stake.\n//             Stranded ones count OPT_STRAND_K times: a stranded CB leaves the model entirely,\n//             a deslocated one merely changes hands.\nconst OPT_W={balance:1, dist:0.85, orphan:1};\nconst OPT_STRAND_K=3;\nconst OPT_SIMS=24;             // simultaneous simulations per run, scaled down on big stages\nconst OPT_PASSES=14;           // local-search sweeps inside one simulation\nconst OPT_EVAL_BUDGET=120000;  // total candidate evaluations across the whole portfolio\nconst OPT_EXHAUSTIVE_MAX=60000;\nfunction optDistPrep(mv){\n  let mx=0;\n  Object.keys(mv.munis).forEach(m=>{ if(m==='__OUTROS__') return; const c=mv.muniCentroid[m]; if(!c) return;\n    mv.dest.forEach(s=>{ const sc=mv.secCentroid[s]; if(!sc) return;\n      const d=Math.hypot(c[0]-sc[0],c[1]-sc[1]); if(d>mx) mx=d; }); });\n  return mx||1;\n}\nfunction optDistCost(mv,m,s,dmax){\n  const v=mv.allowed[m]||{}; let tot=0; for(const k in v) tot+=v[k];\n  const share=tot?((v[s]||0)/tot):0;\n  const c=mv.muniCentroid[m], sc=mv.secCentroid[s];\n  // Missing centroid on either side is neutral (0.5), never 0 — an unmeasurable move must not\n  // score as the cheapest one on the board.\n  const geo=(c&&sc)?Math.min(1,Math.hypot(c[0]-sc[0],c[1]-sc[1])/dmax):0.5;\n  return 0.5*(1-share)+0.5*geo;\n}\nfunction optEval(mv,a,dmax){\n  const lim=spanLimits(mv);\n  const sp=spanMapFor(mv,a), vals=Object.values(sp);\n  let balance=0;\n  if(vals.length){\n    const ref=lim.target||(vals.reduce((x,y)=>x+y,0)/vals.length);\n    if(ref) balance=Math.min(1,Math.sqrt(vals.reduce((s,v)=>s+(v-ref)**2,0)/vals.length)/ref);\n  }\n  let cbs=0,dist=0;\n  for(const m in a){ const o=mv.munis[m]; if(!o) continue; const w=+o.cbs||0; cbs+=w; dist+=w*optDistCost(mv,m,a[m],dmax); }\n  dist=cbs?(dist/cbs):0;\n  let stranded=0,desloc=0,tot=0;\n  mv.leaders.forEach(L=>{\n    const byS={}; let t=0;\n    for(const [m,c] of Object.entries(L.byMuni)){ if(m==='__OUTROS__') continue; const s=a[m]; if(s){ byS[s]=(byS[s]||0)+c; t+=c; } }\n    const orphan=(mv.orphanByGroup&&mv.orphanByGroup[L.grupo])||0;\n    tot+=t+orphan;\n    if(!t){ stranded+=orphan; return; }   // no allocated CBs -> no home -> these orphans land nowhere\n    const home=mv.dest.reduce((x,s)=>(byS[s]||0)>(byS[x]||0)?s:x,mv.dest[0]);\n    desloc+=t-(byS[home]||0);\n  });\n  const orphanTerm=tot?Math.min(1,(desloc+OPT_STRAND_K*stranded)/tot):0;\n  return { cost:OPT_W.balance*balance+OPT_W.dist*dist+OPT_W.orphan*orphanTerm,\n           balance, dist, desloc, stranded, sp, viol:spanViolationsOf(sp,lim) };\n}\nfunction optScoreFor(mv,a){ return optEval(mv,a,mv.__optDmax||optDistPrep(mv)).cost; }\n// Seeded PRNG on purpose. computeMovement runs the optimizer for EVERY stage and recomputeFrom\n// re-runs every stage downstream of an edit, so a Math.random() portfolio would hand back a\n// different allocation on each pass and a saved timeline would never reproduce.\nfunction optRng(seed){ let a=seed>>>0;\n  return ()=>{ a=(a+0x6D2B79F5)>>>0; let t=Math.imul(a^(a>>>15),1|a);\n    t=(t+Math.imul(t^(t>>>7),61|t))^t; return ((t^(t>>>14))>>>0)/4294967296; }; }\nfunction optSeed(mv,ms){ let h=2166136261>>>0;\n  const s=String(mv.sector)+'|'+ms.join(',')+'|'+mv.dest.join(',');\n  for(let i=0;i<s.length;i++) h=Math.imul(h^s.charCodeAt(i),16777619);\n  return h>>>0; }\nfunction contigBadFor(mv,assign){\n  // Contiguidade geográfica só faz sentido no grão de município (setor fechando): setores e GVs\n  // não precisam formar uma mancha contínua quando GV/mercado fecha — cada setor/GV vai pro destino\n  // que faz sentido pra ele, sem exigir que o conjunto redistribuído continue \"grudado\".\n  if((mv.level||'setor')!=='setor') return [];\n  const bySec={}; for(const m in assign){(bySec[assign[m]]=bySec[assign[m]]||[]).push(m);}\n  const bad=[];\n  for(const s in bySec){const grp=bySec[s],inGrp=new Set(grp);\n    const seeds=grp.filter(m=>(mv.allowed[m]||{})[s]);\n    if(!seeds.length){bad.push(s);continue;}\n    const seen=new Set(seeds),st=[...seeds];\n    while(st.length){const m=st.pop();(mv.closeAdj[m]||[]).forEach(o=>{if(inGrp.has(o)&&!seen.has(o)){seen.add(o);st.push(o);}});}\n    if(seen.size!==grp.length)bad.push(s);}\n  return bad;\n}\nfunction greedyFor(mv,ms,opts){const lim=spanLimits(mv);const a={};\n  ms.forEach((m,i)=>{let best=opts[i][0],bd=Infinity;\n    for(const s of opts[i]){a[m]=s;\n      // over-max only grows as we keep assigning, so it is safe to penalise mid-build;\n      // under-min shrinks, so penalising it here would just chase noise.\n      const over=lim.max?spanViolationsOf(spanMapFor(mv,a),{max:lim.max,min:null}).over.length:0;\n      const d=optScoreFor(mv,a)+(contigBadFor(mv,a).length?1e9:0)+over*1e6;\n      if(d<bd){bd=d;best=s;}}\n    a[m]=best;});\n  return a;}\nfunction optimizeFor(mv){\n  const ms=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__');\n  if(!ms.length||!mv.dest.length){ mv.optBadge=mv.dest.length?'':'sem setor destino identificado'; return {}; }\n  const opts=ms.map(m=>{const al=(mv.reachable[m]&&mv.reachable[m].length)?mv.reachable[m]:mv.dest.slice();return al.length?al:mv.dest.slice();});\n  const combos=opts.reduce((a,o)=>a*o.length,1);\n  const lim=spanLimits(mv);\n  const dmax=optDistPrep(mv); mv.__optDmax=dmax;\n\n  // Feasibility ladder — same meaning as before, because renderSpanRule and the saved sessions\n  // both read mv.optTier: 0 = contíguo + max + min span, 1 = contíguo + max span, 2 = contíguo\n  // only. Every candidate any simulation produces is offered to all three tiers; we ship the\n  // strictest tier that got a solution, so an unreachable min/max relaxes loudly instead of\n  // stranding the stage with nothing.\n  const tier=[null,null,null],tSc=[Infinity,Infinity,Infinity],tEv=[null,null,null];\n  let feasible=0,evals=0;\n  const offer=(a,ev)=>{\n    if(contigBadFor(mv,a).length) return false;\n    feasible++;\n    const put=t=>{ if(ev.cost<tSc[t]){ tSc[t]=ev.cost; tier[t]={...a}; tEv[t]=ev; } };\n    put(2);\n    if(!ev.viol.over.length){ put(1); if(!ev.viol.under.length) put(0); }\n    return true;\n  };\n  const evalOf=a=>{ evals++; return optEval(mv,a,dmax); };\n\n  // Small enough to settle the question outright: enumerate every contiguous allocation and the\n  // winner is provably the best one under this objective. No search needed, so none is run.\n  const exhaustive=combos<=OPT_EXHAUSTIVE_MAX;\n  let sims=0;\n  if(exhaustive){\n    const cur={};\n    const rec=i=>{ if(i===ms.length){ offer(cur,evalOf(cur)); return; }\n      for(const s of opts[i]){ cur[ms[i]]=s; rec(i+1); } };\n    rec(0);\n  } else {\n    // Too big to enumerate, so run a portfolio of independent simulations instead. Each one is a\n    // seed assignment, then hill-climbing on single-município reassignments, then one perturbation\n    // and another climb to escape whatever local optimum it settled into. Different seeds land in\n    // different basins; the ladder above keeps the best across all of them.\n    const improve=a=>{\n      let ev=evalOf(a); offer(a,ev);\n      for(let pass=0;pass<OPT_PASSES;pass++){\n        let moved=false;\n        for(let i=0;i<ms.length;i++){\n          const m=ms[i],cur=a[m]; let best=cur,bev=ev;\n          for(const s of opts[i]){\n            if(s===cur) continue;\n            a[m]=s;\n            const e=evalOf(a);\n            // contiguity is a hard constraint, and the cheaper test runs first on purpose\n            if(e.cost<bev.cost-1e-12 && !contigBadFor(mv,a).length){ best=s; bev=e; }\n          }\n          a[m]=best;\n          if(best!==cur){ ev=bev; moved=true; offer(a,ev); }\n        }\n        if(!moved) break;\n      }\n    };\n    const rng=optRng(optSeed(mv,ms));\n    const perSim=Math.max(1,ms.length*Math.max(1,mv.dest.length)*OPT_PASSES);\n    const budget=Math.max(4,Math.min(OPT_SIMS,Math.floor(OPT_EVAL_BUDGET/perSim)||4));\n    const seeds=[];\n    if(mv.assign&&ms.every(m=>mv.assign[m])) seeds.push({...mv.assign});   // never regress on what is already on screen\n    seeds.push(autoAssignFor(mv));                                        // adjacency-first seed\n    seeds.push(greedyFor(mv,ms,opts));                                    // balance-first seed\n    while(seeds.length<budget){\n      // randomised construction biased toward nearby sectors — the bias keeps each seed sane, the\n      // randomness is what sends the runs into different basins\n      const a={};\n      ms.forEach((m,i)=>{ let bs=opts[i][0],bw=-Infinity;\n        for(const s of opts[i]){ const w=(1-optDistCost(mv,m,s,dmax))+rng()*0.9; if(w>bw){bw=w;bs=s;} }\n        a[m]=bs; });\n      seeds.push(a);\n    }\n    seeds.forEach(seed=>{\n      const a={...seed};\n      // a restored or legacy assign can still name a sector this stage no longer offers\n      ms.forEach((m,i)=>{ if(!opts[i].includes(a[m])) a[m]=opts[i][0]; });\n      improve(a);\n      const kick=Math.max(1,Math.round(ms.length*0.25));\n      for(let k=0;k<kick;k++){ const i=Math.floor(rng()*ms.length); a[ms[i]]=opts[i][Math.floor(rng()*opts[i].length)]; }\n      improve(a);\n    });\n    sims=seeds.length;\n  }\n\n  const t=tier.findIndex(x=>x);\n  if(t<0){ mv.optTier=-1; mv.optBadge='sem solução conectada — heurística'; return greedyFor(mv,ms,opts); }\n  const best=tier[t], ev=tEv[t]; mv.optTier=t;\n  const relax=[];\n  if(t>0 && lim.min) relax.push('span mínimo '+fmt(lim.min));\n  if(t>1 && lim.max) relax.push('span máximo '+fmt(lim.max));\n  mv.optStats={balance:ev.balance,dist:ev.dist,desloc:ev.desloc,stranded:ev.stranded,sims,evals,feasible,combos,exhaustive};\n  mv.optBadge=`ótimo · ${exhaustive?`espaço completo (${fmt(combos)})`:`${fmt(sims)} simulações`}`\n    +` · equilíbrio ±${Math.round(ev.balance*100)}% · adjacência ${Math.round((1-ev.dist)*100)}%`\n    +` · quebra ${fmt(ev.desloc)} CBs · ${fmt(ev.stranded)} fora do setor sem destino`\n    +` · pico ${fmt(maxSpanOfFor(mv,best))} CBs`\n    +(lim.target?` · alvo ${fmt(lim.target)}`:'')\n    +(relax.length?` · ⚠ inatingível: ${relax.join(' + ')}`:(spanLimitsOn(lim)?' · limites ok':''));\n  return best;\n}\nfunction computeDerived(mv){\n  const inc={},gained={},orph={};mv.dest.forEach(s=>{inc[s]=0;gained[s]=0;orph[s]=0;});\n  Object.entries(mv.munis).forEach(([m,o])=>{if(m==='__OUTROS__')return;const s=mv.assign[m];if(s&&inc[s]!=null)inc[s]+=o.cbs;});\n  let desloc=0,orphanTotal=0,orphanStranded=0;\n  const L2=mv.leaders.map(L=>{const byS={};mv.dest.forEach(s=>byS[s]=0);let tot=0;\n    for(const [m,c] of Object.entries(L.byMuni)){if(m==='__OUTROS__')continue;const s=mv.assign[m];if(s&&byS[s]!=null){byS[s]+=c;tot+=c;}}\n    // no allocated CBs => no home. Picking dest[0] by default would silently dump this leader's\n    // orphan CBs into an arbitrary sector, so we leave it null and report them as stranded.\n    const home=(tot>0&&mv.dest.length)?mv.dest.reduce((a,s)=>byS[s]>byS[a]?s:a,mv.dest[0]):null;\n    const dl=tot-(home?byS[home]:0);desloc+=dl;if(home)gained[home]++;\n    const orphan=(mv.orphanByGroup&&mv.orphanByGroup[L.grupo])||0;\n    orphanTotal+=orphan;\n    if(orphan){ if(home&&orph[home]!=null) orph[home]+=orphan; else orphanStranded+=orphan; }\n    return {...L,byS,home,desloc:dl,assignedTotal:tot,orphan,orphanHome:(orphan&&home)?home:null};});\n  const span={};mv.dest.forEach(s=>span[s]=(+(mv.baseMetrics[s]?.cbs||0))+inc[s]+orph[s]);\n  return {inc,gained,desloc,leaders:L2,span,orph,orphanTotal,orphanStranded};\n}\n\nasync function computeMovement(code,level,world){\n  level=level||'setor';\n  code=String(code);\n  const mv={sector:code,level,policy:'fora',view:'tobe',selMuni:null,optBadge:''};\n  const SNAP=SESS.snapLiteral;\n  // GV/mercado precisam da base ANTES de montar a query (pra saber quais CD_SETOR entram no IN);\n  // setor não precisa — mantém o timing original (a query dispara sem esperar o CSV).\n  let domBase=level==='setor'?null:await ensureDominantes();\n  const memberSectors=level==='setor'?[code]:memberSectorsOf(level,code,world);\n  if(!memberSectors.length) throw new Error(`${LEVELS[level].label} ${code} não existe na base de municípios dominantes (CSV) — atualize a base antes de fechar`);\n  const secList=memberSectors.join(',');\n\n  const mSQL=`SELECT DS_MUNICIPIO municipio, CD_SETOR setor, CD_GRUPO grupo, MAX(DS_LEADER_NAME) lider,\n     COUNT(DISTINCT CD_CONSULTORA) cbs, ROUND(SUM(VL_PEDIDOS_CICLO),0) receita,\n     ROUND(SUM(VL_PEDIDOS_NATURA_CICLO),0) rec_nat, ROUND(SUM(VL_PEDIDOS_AVON_CICLO),0) rec_avon,\n     ROUND(SUM(QT_PONTOS_CICLO),0) pontos, ROUND(SUM(QT_PEDIDOS_CICLO),0) pedidos,\n     SUM(CASE WHEN ST_FEZ_PED_CICLO_ATUAL THEN 1 ELSE 0 END) ativas\n    FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR IN (${secList}) AND DT_HISTORICO=${SNAP}\n    GROUP BY DS_MUNICIPIO, CD_SETOR, CD_GRUPO`;\n  const ufSQL=`SELECT DS_ESTADO uf, COUNT(*) n FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR IN (${secList}) AND DT_HISTORICO=${SNAP} GROUP BY DS_ESTADO ORDER BY n DESC`;\n  const trendSQL=`SELECT operational_cycle ciclo, COUNT(DISTINCT person_code) cbs,\n     COUNT(DISTINCT CASE WHEN registered_bc_ind=1 THEN person_code END) ativas,\n     ROUND(SUM(revenue_nat_ss_amt),0) receita, ROUND(SUM(points_nat_ss_amt),0) pontos\n    FROM ${ELO} WHERE country_code=1 AND sector_code IN (${secList}) AND operational_cycle<=${SESS.eloMaxCycle||999999} GROUP BY operational_cycle ORDER BY operational_cycle DESC LIMIT 8`;\n  const lvlSQL=`SELECT DS_NVL_PLAN_CRESC nivel, COUNT(DISTINCT CD_CONSULTORA) cbs,\n     ROUND(SUM(VL_PEDIDOS_NATURA_CICLO),0) rec_nat, ROUND(SUM(VL_PEDIDOS_AVON_CICLO),0) rec_avon\n    FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR IN (${secList}) AND DS_NVL_PLAN_CRESC IS NOT NULL AND DT_HISTORICO=${SNAP} GROUP BY DS_NVL_PLAN_CRESC ORDER BY cbs DESC`;\n  const lvlMuniSQL=`SELECT DS_MUNICIPIO municipio, CD_SETOR setor, DS_NVL_PLAN_CRESC nivel, COUNT(DISTINCT CD_CONSULTORA) cbs\n    FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR IN (${secList}) AND DS_NVL_PLAN_CRESC IS NOT NULL AND DT_HISTORICO=${SNAP} GROUP BY DS_MUNICIPIO, CD_SETOR, DS_NVL_PLAN_CRESC`;\n  const [mR,ufR,tR,lR,lmR]=await Promise.all([q(mSQL),q(ufSQL),q(trendSQL),q(lvlSQL),q(lvlMuniSQL)]);\n\n  const ownMatrix=rows(mR).filter(r=>+r.cbs>0);\n  mv.pureOwnMetrics=blankM();\n  ownMatrix.forEach(r=>{ mv.pureOwnMetrics.cbs+=+r.cbs; mv.pureOwnMetrics.receita+=+r.receita||0; mv.pureOwnMetrics.rec_nat+=+r.rec_nat||0; mv.pureOwnMetrics.rec_avon+=+r.rec_avon||0; mv.pureOwnMetrics.pontos+=+r.pontos||0; mv.pureOwnMetrics.pedidos+=+r.pedidos||0; mv.pureOwnMetrics.ativas+=+r.ativas||0; });\n\n  mv.levelByMuni={};\n  if(level==='setor') Object.entries(world.muniLevel||{}).forEach(([m,lv])=>{ if(world.muniOverride[m]===code) mv.levelByMuni[m]={...lv}; });\n\n  mv.trend=rows(tR).map(r=>({...r,cbs:+r.cbs,ativas:+r.ativas,receita:+r.receita,pontos:+r.pontos})).filter(r=>r.cbs>10).reverse();\n  mv.levels=rows(lR);\n\n  let absorbedRows=[],inheritedOrphanRows=[];\n  if(level==='setor'){\n    Object.entries(world.muniOverride).forEach(([m,destSec])=>{ if(destSec===code && world.muniRow[m]) absorbedRows.push(...world.muniRow[m]); });\n    inheritedOrphanRows=(world.sectorOrphanRows&&world.sectorOrphanRows[code])||[];\n  }\n  mv.matrix=ownMatrix.concat(absorbedRows,inheritedOrphanRows);\n\n  const ufList=rows(ufR).map(r=>r.uf).filter(Boolean);\n  const domUF=ufList[0]||'PR';\n  mv.domUF=domUF;\n  domBase=domBase||await ensureDominantes();\n  // Uma GV ou mercado pode espalhar por mais UFs do que \"a UF dominante + suas vizinhas\" cobre —\n  // toda UF que aparece na base de dominantes de QUALQUER setor-membro entra na janela de shapes.\n  const memberUFs=new Set([domUF]);\n  memberSectors.forEach(s=>{ (domBase[String(s)]||new Set()).forEach(entry=>{ const u=mUf(entry); if(u) memberUFs.add(u); }); });\n  const ufSet=new Set(memberUFs);\n  memberUFs.forEach(u=>(UF_BORDERS[u]||[]).forEach(b=>ufSet.add(b)));\n  const geos=await Promise.all([...ufSet].map(u=>geoUF(u).catch(()=>null)));\n  const allFeat=geos.filter(Boolean).flatMap(g=>g.features);\n  const adj=buildAdj(allFeat);\n\n  // A UF só vem da base de dominantes (setor real da linha × município), nunca de \"esse nome só\n  // apareceu numa UF carregada\" ou de um chute pra UF dominante do fechamento inteiro. Os dois\n  // eram seguros quando só 1-3 UFs entravam na janela (fechamento de setor); GV e principalmente\n  // mercado carregam dezenas de UFs de uma vez, então \"único entre as UFs carregadas\" deixa de\n  // significar \"único no Brasil\" — era exatamente esse chute que colocava um homônimo de outra UF\n  // espalhado longe do resto do mapa. Sem entrada na base, o município fica sem UF (mesmo\n  // tratamento de \"sem shape\" que já existe) em vez de arriscar aparecer no lugar errado.\n  const ufGuessed={};\n  const ufFor=(setorOf,muni)=>{const nm=norm(muni);\n    return (DOM.ufBySetorMuni&&DOM.ufBySetorMuni[String(setorOf)+'|'+nm])||'';};\n  mv.matrix.forEach(r=>{ if(!r.uf) r.uf=ufFor(r.setor,r.municipio); });\n  rows(lmR).forEach(r=>{ const k=mkey(r.municipio,ufFor(r.setor,r.municipio)); (mv.levelByMuni[k]=mv.levelByMuni[k]||{})[r.nivel]=+r.cbs; });\n\n  const totBy={}; mv.matrix.forEach(r=>{const n=mkey(r.municipio,r.uf); totBy[n]=(totBy[n]||0)+ +r.cbs;});\n  const footprint=new Set(Object.entries(totBy).filter(([,c])=>c>0).map(([m])=>m));\n  const withShape=[...footprint].filter(n=>adj.feat[n]||world.muniGeo[n]);\n  mv.cbsByMuni={...totBy}; mv.shapeMunis=withShape.slice();\n  mv.noShapeMunis=[...footprint].filter(n=>!(adj.feat[n]||world.muniGeo[n])).map(n=>({muni:n,cbs:totBy[n]||0})).sort((a,b)=>b.cbs-a.cbs);\n  mv.noShapeCbs=mv.noShapeMunis.reduce((a,x)=>a+x.cbs,0);\n\n  // ---- RULE: quais municípios pertencem a este fechamento ----\n  // setor: exatamente a regra de hoje. GV/mercado: união da base de TODOS os setores-membro — a\n  // base já garante que um setor pertence a uma única GV/mercado, então não existe aqui o spillover\n  // fuzzy que município tem contra setor (por isso o orphan-handling abaixo é pulado nesses níveis).\n  let domOwn;\n  if(level==='setor'){\n    domOwn=domBase[code]||new Set();\n  } else {\n    domOwn=new Set();\n    memberSectors.forEach(s=>(domBase[String(s)]||new Set()).forEach(n=>domOwn.add(n)));\n  }\n  const inherited=level==='setor'?new Set(Object.keys(world.muniOverride||{}).filter(m=>world.muniOverride[m]===code)):new Set();\n  if(!domOwn.size && !inherited.size) throw new Error(`${LEVELS[level].label} ${code} não existe na base de municípios dominantes (CSV) — atualize a base antes de fechar`);\n  const belongs=n=>domOwn.has(n)||(!DOM.hasUf&&domOwn.has(mName(n)))||inherited.has(n);\n  mv.domCsvMunis=domOwn.size;\n  const dropped=level==='setor'?withShape.filter(n=>!belongs(n)):[];\n  if(withShape.length && dropped.length===withShape.length) throw new Error(`${LEVELS[level].label} ${code}: nenhum dos municípios com CBs está na base de dominantes — nada pra realocar`);\n  const droppedSet=new Set(dropped);\n  mv.excludedMunis=dropped.map(n=>({muni:n,cbs:totBy[n]||0})).sort((a,b)=>b.cbs-a.cbs);\n  mv.excludedCbs=dropped.reduce((a,n)=>a+(totBy[n]||0),0);\n\n  const closingNames=withShape.filter(n=>!droppedSet.has(n));\n  const closingSet=new Set(closingNames);\n  mv.geoFeat={}; closingNames.forEach(n=>{ mv.geoFeat[n]=(adj.feat[n]&&adj.feat[n].f)||world.muniGeo[n]; });\n\n  // ---- unidade de realocação: a geometria é sempre município; a UNIDADE que troca de dono é o\n  // próprio município (setor fecha), o setor inteiro (GV fecha) ou a GV inteira (mercado fecha).\n  const municipioSetor={}; mv.matrix.forEach(r=>{ const n=mkey(r.municipio,r.uf); if(!municipioSetor[n]) municipioSetor[n]=String(r.setor); });\n  const resolveUnit=n=>{\n    if(level==='setor') return n;\n    const sOf=municipioSetor[n]; if(!sOf) return '';\n    return level==='gv'?sOf:(DOM.gvBySetor[sOf]||'');\n  };\n  mv.unitOfMuni={}; closingNames.forEach(n=>{ mv.unitOfMuni[n]=resolveUnit(n); });\n  mv.unitMunis={}; closingNames.forEach(n=>{ const u=mv.unitOfMuni[n]; if(!u) return; (mv.unitMunis[u]=mv.unitMunis[u]||[]).push(n); });\n  const units=level==='setor'?closingNames:Object.keys(mv.unitMunis);\n\n  const drawnCsv=new Set(closingNames.map(n=>DOM.hasUf?n:mName(n)));\n  const footKeyOf=k=>DOM.hasUf?(footprint.has(k)?k:null):([...footprint].find(x=>mName(x)===k)||null);\n  mv.csvMunisTotal=domOwn.size;\n  mv.ufGuessed={...ufGuessed};\n  if(level==='setor'){\n    mv.missingMunis=[...domOwn].filter(k=>!drawnCsv.has(k)).map(k=>{\n      const fk=footKeyOf(k);\n      const hasShape=!!(adj.feat[fk||k]||world.muniGeo[fk||k]);\n      const alias=[...footprint].filter(x=>x!==k&&mName(x)===mName(k));\n      let reason;\n      if(!fk&&alias.length) reason=`UF divergente — as CBs entraram na chave ${alias.join(' / ')} e a base diz ${k}`;\n      else if(!fk) reason=hasShape?'sem CBs neste setor no snapshot — desenhado como vizinho':'sem CBs neste setor no snapshot';\n      else if(!hasShape) reason='sem shape nas UFs carregadas';\n      else reason='chave não casou com a base de dominantes';\n      return {muni:k,cbs:(fk?totBy[fk]:alias.reduce((a,x)=>a+(totBy[x]||0),0))||0,reason:reason};\n    });\n  } else {\n    mv.missingMunis=[];\n  }\n\n  // ---- HARD RULE: destino tem de compartilhar a fronteira certa acima do que está fechando ----\n  // setor → mesma GV; GV → mesmo mercado; mercado → nada acima, qualquer vizinho vale.\n  const ownParent=parentOf(level,code);\n  if(level!=='mercado' && !ownParent) throw new Error(`${LEVELS[level].label} ${code} não tem ${level==='setor'?'CD_GV':'MERCADO'} na base de municípios dominantes — sem essa fronteira não há como garantir que os destinos ficam do lado certo da hierarquia`);\n  const sameParent=destCode=>!ownParent||parentOf(level,destCode)===ownParent;\n  mv.gv=ownParent;\n  const alreadyClosed=destCode=>level==='setor'?world.closedSectors.has(destCode):(level==='gv'?(world.closedGvs||new Set()).has(destCode):(world.closedMercados||new Set()).has(destCode));\n\n  const destRule=(SESS.settings&&SESS.settings.destRule)||DEFAULT_SETTINGS.destRule;\n  const destMinCbs=Math.max(1,Math.round(+((SESS.settings||{}).destMinCbs)||DEFAULT_SETTINGS.destMinCbs));\n  mv.destRule=destRule; mv.destMinCbs=destMinCbs; mv.destRuleFallback=false;\n  mv.allowed={}; mv.allowedRaw={};\n  units.forEach(u=>{ mv.allowed[u]={}; mv.allowedRaw[u]={}; });\n\n  const extVotes={}; const nbrNames=new Set(); let domSecOf={};\n  if(level==='setor'){\n    // setor: destino descoberto por ADJACÊNCIA GEOGRÁFICA de município — uma query ao vivo por\n    // vizinho, mas o perímetro de UM setor é pequeno o bastante pra valer a pena.\n    closingNames.forEach(n=>{\n      if(!adj.feat[n]) return;\n      adj.nbrs(n).forEach(({o,w})=>{ if(!closingSet.has(o) && !droppedSet.has(o)){ nbrNames.add(o); (extVotes[n]=extVotes[n]||[]).push({o,w}); } });\n    });\n    let neigh=[];\n    if(nbrNames.size){\n      const inList=[...new Set([...nbrNames].map(n=>mName(n)))].map(n=>`'${n.replace(/'/g,\"''\")}'`).join(',');\n      const nSQL=`SELECT DS_MUNICIPIO municipio, CD_SETOR setor, COUNT(DISTINCT CD_CONSULTORA) cbs\n        FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR NOT IN (${secList}) AND CD_SETOR>0 AND DT_HISTORICO=${SNAP} AND DS_MUNICIPIO IN (${inList}) GROUP BY DS_MUNICIPIO, CD_SETOR`;\n      neigh=rows(await q(nSQL));\n    }\n    neigh.forEach(r=>{ if(!r.uf) r.uf=ufFor(r.setor,r.municipio); });\n    const byM={}; neigh.forEach(r=>{const m=mkey(r.municipio,r.uf); if(!nbrNames.has(m)) return; (byM[m]=byM[m]||[]).push(r);});\n    Object.entries(byM).forEach(([m,rs])=>{ rs.sort((a,b)=>+b.cbs-+a.cbs); domSecOf[m]=String(rs[0].setor); });\n    nbrNames.forEach(n=>{ if(world.muniOverride && world.muniOverride[n]) domSecOf[n]=world.muniOverride[n]; });\n\n    mv.nbrCurrentSector={};\n    mv.gvRejected=[];\n    const gvHidden=new Set();\n    nbrNames.forEach(n=>{\n      const destCode=destUnitOfSector(level,domSecOf[n],world);\n      if(destCode && !sameParent(destCode)){ gvHidden.add(n); if(mv.gvRejected.indexOf(destCode)<0) mv.gvRejected.push(destCode); return; }\n      if(domSecOf[n]) mv.nbrCurrentSector[n]=destCode;\n    });\n    gvHidden.forEach(n=>{ nbrNames.delete(n); delete domSecOf[n]; delete mv.nbrCurrentSector[n]; });\n    Object.keys(extVotes).forEach(n=>{ extVotes[n]=extVotes[n].filter(v=>!gvHidden.has(v.o)); });\n\n    const isBridge=n=>destRule!=='dominant'||(totBy[n]||0)>=destMinCbs;\n    mv.bridgeMunis=closingNames.filter(isBridge);\n    mv.ignoredBridges=closingNames.filter(n=>!isBridge(n));\n\n    const wAny={}, wDom={};\n    closingNames.forEach(n=>{\n      const u=n;\n      if(!mv.allowed[u]) return;\n      const bridge=isBridge(n);\n      (extVotes[n]||[]).forEach(({o,w})=>{\n        const destCode=mv.nbrCurrentSector[o];\n        if(!destCode || destCode===code || alreadyClosed(destCode)) return;\n        mv.allowed[u][destCode]=(mv.allowed[u][destCode]||0)+w;\n        mv.allowedRaw[u][destCode]=(mv.allowedRaw[u][destCode]||0)+w;\n        wAny[destCode]=(wAny[destCode]||0)+w;\n        if(bridge) wDom[destCode]=(wDom[destCode]||0)+w;\n      });\n    });\n    let secWeight=wAny;\n    if(destRule==='dominant'){\n      if(Object.keys(wDom).length) secWeight=wDom;\n      else { secWeight=wAny; mv.destRuleFallback=true; }\n    }\n    mv.dest=Object.keys(secWeight).sort((a,b)=>secWeight[b]-secWeight[a]).slice(0,6);\n    if(!mv.dest.length){\n      mv.dest=[...new Set(Object.values(mv.nbrCurrentSector))].filter(destCode=>destCode&&destCode!==code&&!alreadyClosed(destCode)&&sameParent(destCode)).slice(0,6);\n      units.forEach(u=>{ if(mv.allowed[u]&&!Object.keys(mv.allowed[u]).length){ mv.dest.forEach(destCode=>mv.allowed[u][destCode]=1); } });\n    }\n  } else {\n    // GV/mercado: destino é SEMPRE todo irmão válido na hierarquia — NUNCA descoberto por\n    // adjacência geográfica de município. Uma GV/mercado pode ter território espalhado por\n    // dezenas de UFs sem qualquer conexão física entre as partes (a hierarquia aqui é\n    // organizacional, não geográfica) — \"vizinho por fronteira de município\" não é só caro (a\n    // query ao vivo vira um IN-list de centenas de municípios e estoura timeout: foi exatamente\n    // isso que quebrou o fechamento de um mercado espalhado) — é a pergunta errada. A fronteira que\n    // já importa (mesma GV / mesmo mercado) é imposta pela regra de parentesco logo acima; dentro\n    // dela QUALQUER irmão é candidato, e o otimizador decide pelo equilíbrio de span e continuidade\n    // de líder, nunca por proximidade física — geografia não pesa aqui.\n    mv.nbrCurrentSector={};\n    mv.gvRejected=[];\n    mv.bridgeMunis=closingNames.slice();\n    mv.ignoredBridges=[];\n    const siblings=level==='gv'\n      ? [...(DOM.gvsByMercado[ownParent]||[])]\n      : Object.keys(DOM.sectorsByMercado||{});\n    mv.dest=siblings.filter(destCode=>destCode!==code && !alreadyClosed(destCode) && sameParent(destCode));\n    units.forEach(u=>{ mv.dest.forEach(destCode=>{ mv.allowed[u][destCode]=1; mv.allowedRaw[u][destCode]=1; }); });\n  }\n  mv.dest=mv.dest.filter(sameParent);\n\n  // ---- O QUE É DESENHADO: território COMPLETO de cada destino (não só a borda), sempre lido da\n  // mesma base de dominantes já usada pro lado que fecha.\n  const territoryOf=destCode=>{\n    const secs=memberSectorsOf(level,destCode,world);\n    const out=new Set();\n    secs.forEach(s=>(domBase[String(s)]||new Set()).forEach(n=>out.add(n)));\n    return out;\n  };\n  const drawSet=new Set(mv.dest);\n  mv.dest.forEach(destCode=>{\n    territoryOf(destCode).forEach(n=>{\n      if(nbrNames.has(n)) return;\n      nbrNames.add(n);\n      mv.nbrCurrentSector[n]=(level==='setor'&&world.muniOverride&&world.muniOverride[n])?world.muniOverride[n]:destCode;\n    });\n  });\n  mv.nbrFeat=[...nbrNames].filter(n=>drawSet.has(mv.nbrCurrentSector[n])).map(n=>adj.feat[n]&&adj.feat[n].f).filter(Boolean);\n  units.forEach(u=>{ Object.keys(mv.allowed[u]||{}).forEach(destCode=>{ if(!mv.dest.includes(destCode)) delete mv.allowed[u][destCode]; }); });\n  mv.color={}; mv.dest.forEach((destCode,i)=>mv.color[destCode]=PALETTE[i%PALETTE.length]);\n\n  const accC={}; Object.entries(mv.nbrCurrentSector).forEach(([nb,destCode])=>{ if(!mv.dest.includes(destCode))return; const f=(adj.feat[nb]&&adj.feat[nb].f)||world.muniGeo[nb]; if(!f)return; const c=centroidLL(f); accC[destCode]=accC[destCode]||[0,0,0]; accC[destCode][0]+=c[0]; accC[destCode][1]+=c[1]; accC[destCode][2]++; });\n  mv.secCentroid={}; mv.dest.forEach(destCode=>{ if(accC[destCode]) mv.secCentroid[destCode]=[accC[destCode][0]/accC[destCode][2],accC[destCode][1]/accC[destCode][2]]; });\n\n  if(level==='setor'){\n    mv.muniCentroid={}; closingNames.forEach(n=>{ if(mv.geoFeat[n]) mv.muniCentroid[n]=centroidLL(mv.geoFeat[n]); });\n    mv.closeAdj={}; closingNames.forEach(n=>{ mv.closeAdj[n]=adj.feat[n]?adj.nbrs(n).filter(({o})=>closingSet.has(o)).map(({o})=>o):[]; });\n  } else {\n    mv.muniCentroid={};\n    Object.entries(mv.unitMunis).forEach(([u,ms])=>{\n      const cs=ms.map(n=>mv.geoFeat[n]&&centroidLL(mv.geoFeat[n])).filter(Boolean);\n      if(cs.length) mv.muniCentroid[u]=[cs.reduce((a,c)=>a+c[0],0)/cs.length,cs.reduce((a,c)=>a+c[1],0)/cs.length];\n    });\n    mv.closeAdj={};\n    const unitSet=new Set(units);\n    Object.entries(mv.unitMunis).forEach(([u,ms])=>{\n      const touch=new Set();\n      ms.forEach(n=>{ if(!adj.feat[n]) return; adj.nbrs(n).forEach(({o})=>{ const ou=mv.unitOfMuni[o]; if(ou&&ou!==u&&unitSet.has(ou)) touch.add(ou); }); });\n      mv.closeAdj[u]=[...touch];\n    });\n  }\n  const comp={}; let ci=0; units.forEach(n=>{ if(comp[n]!=null)return; const st=[n]; comp[n]=ci; while(st.length){ const x=st.pop(); (mv.closeAdj[x]||[]).forEach(o=>{ if(comp[o]==null){ comp[o]=ci; st.push(o); } }); } ci++; });\n  const compAllowed={}; units.forEach(n=>{ const cid=comp[n]; (compAllowed[cid]=compAllowed[cid]||new Set()); Object.keys(mv.allowed[n]||{}).forEach(s=>compAllowed[cid].add(s)); });\n  mv.reachable={}; units.forEach(n=>{ mv.reachable[n]=[...(compAllowed[comp[n]]||[])].filter(s=>mv.dest.includes(s)); });\n\n  if(mv.dest.length){\n    const destSectorMap={}; mv.dest.forEach(destCode=>{ destSectorMap[destCode]=memberSectorsOf(level,destCode,world); });\n    const allDestSecs=[...new Set(Object.values(destSectorMap).flat())];\n    const rList=allDestSecs.join(',');\n    const bSQL=`SELECT CD_SETOR setor, COUNT(DISTINCT CD_CONSULTORA) cbs,\n       SUM(CASE WHEN ST_FEZ_PED_CICLO_ATUAL THEN 1 ELSE 0 END) ativas,\n       ROUND(SUM(VL_PEDIDOS_CICLO),0) receita, ROUND(SUM(VL_PEDIDOS_NATURA_CICLO),0) rec_nat,\n       ROUND(SUM(VL_PEDIDOS_AVON_CICLO),0) rec_avon, ROUND(SUM(QT_PONTOS_CICLO),0) pontos, ROUND(SUM(QT_PEDIDOS_CICLO),0) pedidos\n      FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR IN (${rList}) AND DT_HISTORICO=${SNAP} GROUP BY CD_SETOR`;\n    const blSQL=`SELECT CD_SETOR setor, DS_NVL_PLAN_CRESC nivel, COUNT(DISTINCT CD_CONSULTORA) cbs\n      FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR IN (${rList}) AND DS_NVL_PLAN_CRESC IS NOT NULL AND DT_HISTORICO=${SNAP} GROUP BY CD_SETOR, DS_NVL_PLAN_CRESC`;\n    const [bR,blR]=await Promise.all([q(bSQL),q(blSQL)]);\n    const secMetrics={}; rows(bR).forEach(r=>{ secMetrics[String(r.setor)]=r; if(!SESS.sectorBaseCache[String(r.setor)]) SESS.sectorBaseCache[String(r.setor)]=r; });\n    const secLevel={}; rows(blR).forEach(r=>{ const s=String(r.setor); (secLevel[s]=secLevel[s]||{})[r.nivel]=+r.cbs; });\n    mv.baseMetrics={}; mv.baseLevel={};\n    mv.dest.forEach(destCode=>{\n      const secs=destSectorMap[destCode];\n      const acc=blankM(); acc.setor=destCode;\n      secs.forEach(s=>{ const r=secMetrics[String(s)]; if(!r) return; Object.keys(blankM()).forEach(k=>{ acc[k]=(+acc[k]||0)+(+r[k]||0); }); });\n      mv.baseMetrics[destCode]=acc;\n      const lv={}; secs.forEach(s=>{ const l=secLevel[String(s)]; if(!l) return; Object.entries(l).forEach(([nv,c])=>{ lv[nv]=(lv[nv]||0)+c; }); });\n      mv.baseLevel[destCode]=lv;\n    });\n  } else { mv.baseMetrics={}; mv.baseLevel={}; }\n\n  mv.dest.forEach(destCode=>{\n    if(!mv.baseMetrics[destCode]) mv.baseMetrics[destCode]={setor:destCode,cbs:0,ativas:0,receita:0,rec_nat:0,rec_avon:0,pontos:0,pedidos:0};\n    const inflowSrc=level==='setor'?world.sectorInflow:(level==='gv'?world.gvInflow:world.mercadoInflow);\n    const infl=inflowSrc&&inflowSrc[destCode];\n    if(infl) Object.keys(blankM()).forEach(k=>{ mv.baseMetrics[destCode][k]=(+mv.baseMetrics[destCode][k]||0)+(infl[k]||0); });\n    if(level==='setor'){\n      const inflLv=world.sectorInflowLevel&&world.sectorInflowLevel[destCode];\n      if(inflLv){ mv.baseLevel[destCode]=mv.baseLevel[destCode]||{}; Object.entries(inflLv).forEach(([nv,c])=>{ mv.baseLevel[destCode][nv]=(mv.baseLevel[destCode][nv]||0)+c; }); }\n    }\n  });\n\n  aggregateMovement(mv);\n  mv.assign=optimizeFor(mv);\n  return mv;\n}\n\n// ---------- cascade engine ----------\nasync function computeAt(i){\n  await ensurePinned();\n  const world=foldWorldState(SESS.timeline,i);\n  const sec=SESS.timeline[i].sector;\n  const level=SESS.timeline[i].level||'setor';\n  const mv=await computeMovement(sec,level,world);\n  SESS.timeline[i]=mv;\n}\nasync function recomputeFrom(i){\n  for(let k=i;k<SESS.timeline.length;k++){\n    loader(true,`recalculando etapa ${k+1} de ${SESS.timeline.length}…`);\n    try{ await computeAt(k); }\n    catch(e){\n      // A stage that failed to recompute still holds its PREVIOUS result, so the timeline would\n      // silently mix pre- and post-change etapas. Flag this stage and everything after it as stale\n      // (dashed chip + ⟳) so the state is visible and flushDirty retries from here.\n      SESS.dirtyFrom = SESS.dirtyFrom==null ? k : Math.min(SESS.dirtyFrom,k);\n      throw e;\n    }\n  }\n}\nasync function flushDirty(){\n  if(SESS.dirtyFrom==null) return;\n  const from=SESS.dirtyFrom; SESS.dirtyFrom=null;\n  loader(true,'recalculando etapas seguintes…');\n  try{ await recomputeFrom(from); }\n  catch(e){ $('#ds').textContent='erro ao recalcular cadeia: '+e.message; $('#ds').classList.add('err'); }\n  finally{ loader(false); }\n}\nasync function addMovement(level,sec){\n  level=level||'setor';\n  sec=(sec==null?'':String(sec)).trim();\n  if(!sec) return;\n  if(!movementAvailable(level)){ $('#ds').textContent=`Fechar ${LEVELS[level].label} ainda não está disponível.`; $('#ds').classList.add('err'); return; }\n  if(!hierarchyAllows(level)){ const minLabel=LEVELS[Object.keys(LEVEL_RANK).find(k=>LEVEL_RANK[k]===sessionMinRank())].label; $('#ds').textContent=`esta sessão já fechou um nível mais alto — só \"${minLabel}\" (ou acima) fica disponível.`; $('#ds').classList.add('err'); return; }\n  const closedNow=new Set(SESS.timeline.filter(mv=>(mv.level||'setor')===level).map(mv=>mv.sector));\n  if(closedNow.has(sec)){ $('#ds').textContent=LEVELS[level].label+' '+sec+' já fechado(a) nesta timeline.'; $('#ds').classList.add('err'); return; }\n  if(level==='setor' && !SESS.sectorsList.some(s=>s.setor===sec)){ $('#ds').textContent='setor \"'+sec+'\" não existe no snapshot congelado.'; $('#ds').classList.add('err'); return; }\n  await flushDirty();\n  loader(true,`fechando ${lc(LEVELS[level].label)} `+sec+' — puxando dado do snapshot congelado…');\n  $('#liveState').classList.remove('err');\n  try{\n    SESS.timeline.push({sector:String(sec),level:level});\n    await computeAt(SESS.timeline.length-1);\n    SESS.selected=SESS.timeline.length-1;\n    $('#ds').classList.remove('err'); $('#ds').textContent='';\n  }catch(e){\n    SESS.timeline.pop();\n    $('#ds').textContent=`erro ao fechar ${lc(LEVELS[level].label)} `+sec+': '+e.message; $('#ds').classList.add('err');\n  } finally { loader(false); renderAll(); }\n}\nfunction removeFrom(i){\n  SESS.timeline.length=i;\n  SESS.selected=Math.min(SESS.selected,Math.max(0,SESS.timeline.length-1));\n  if(SESS.dirtyFrom!=null && SESS.dirtyFrom>=SESS.timeline.length) SESS.dirtyFrom=null;\n  renderAll();\n}\nasync function editSelected(mutator){\n  const mv=SESS.timeline[SESS.selected]; if(!mv) return;\n  mutator(mv);\n  if(SESS.selected<SESS.timeline.length-1){\n    SESS.dirtyFrom = SESS.dirtyFrom==null ? SESS.selected+1 : Math.min(SESS.dirtyFrom, SESS.selected+1);\n  }\n  renderAll();\n}\n\n// ---------- sectors list / picker ----------\nasync function loadSectors(){\n  const sql=`SELECT CD_SETOR setor, MAX(DS_ESTADO) uf, COUNT(DISTINCT CD_CONSULTORA) cbs, COUNT(DISTINCT DS_MUNICIPIO) munis\n    FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR>0 AND DT_HISTORICO=(SELECT MAX(DT_HISTORICO) FROM ${T} WHERE CD_PAIS=1) GROUP BY CD_SETOR ORDER BY CD_SETOR`;\n  SESS.sectorsList=rows(await q(sql)).map(r=>({setor:String(r.setor),uf:r.uf,cbs:+r.cbs,munis:+r.munis}));\n}\nfunction renderSectorPicker(){\n  const ready=SESS.stage==='main';\n  const ob=$('#openMove'); if(ob) ob.disabled=!ready;\n}\n\n// ---------- movement modal (setor / GV / mercado) ----------\n// Hierarquia mercado > GV > setor: a sessão trava no nível da primeira movimentação. Misturar\n// níveis quebraria a leitura de \"antes/depois\" da cadeia — fechar uma GV já redistribui setores\n// inteiros pra outras GVs; fechar um setor isolado depois não bate mais com o mundo que sobrou.\n// de/a/no: contrações de \"de\"/\"a\"/\"em\" com o artigo de cada nível — GV é feminina (a Gerência de\n// Vendas), setor e mercado são masculinos. Errar o gênero aqui é o tipo de coisa que grita \"isto foi\n// feito pra setor e só remendado pros outros níveis\", exatamente o que este objeto existe pra evitar.\nconst LEVELS={\n  setor:{label:'Setor',codeLbl:'Setor a fechar',placeholder:'código do setor',childLabel:'Município',destLabel:'Setor',de:'do',a:'ao',no:'no',parentLabel:'GV',parentPhrase:'da mesma GV',parentWord:'gerência'},\n  gv:{label:'GV',codeLbl:'GV a fechar',placeholder:'código da GV',childLabel:'Setor',destLabel:'GV',de:'da',a:'à',no:'na',parentLabel:'Mercado',parentPhrase:'do mesmo mercado',parentWord:'mercado'},\n  mercado:{label:'Mercado',codeLbl:'Mercado a fechar',placeholder:'nome do mercado',childLabel:'GV',destLabel:'Mercado',de:'do',a:'ao',no:'no',parentLabel:null,parentPhrase:null,parentWord:null},\n};\n// GV é sigla — .toLowerCase() a transformaria em \"gv\", errado em qualquer posição da frase. Palavras\n// normais (Setor/Mercado/Município) minúsculam à vontade no meio de uma frase; GV nunca.\nconst LOWER={Setor:'setor',Mercado:'mercado',Município:'município',GV:'GV'};\nconst lc=w=>LOWER[w]||w.toLowerCase();\n// Hierarquia é uma catraca, não um cadeado: mercado(0) > GV(1) > setor(2). Fechar um nível mais\n// alto (número menor) trava PRA SEMPRE nesta sessão qualquer nível mais baixo (número maior) —\n// mas o próprio nível, ou um ainda mais alto, continua liberado. É assim que \"posso fechar setores\n// até fechar uma GV; posso fechar GVs até fechar um mercado\" funciona: nunca destrava de volta.\nconst LEVEL_RANK={mercado:0,gv:1,setor:2};\nfunction sessionMinRank(){\n  let r=LEVEL_RANK.setor;\n  SESS.timeline.forEach(mv=>{ const rk=LEVEL_RANK[mv.level||'setor']; if(rk<r) r=rk; });\n  return r;\n}\nfunction hierarchyAllows(lvl){ return LEVEL_RANK[lvl]<=sessionMinRank(); }\nfunction movementAvailable(lvl){ return lvl==='setor'||lvl==='gv'||lvl==='mercado'; }\n// ---------- hierarquia: setor ⊂ GV ⊂ mercado — tudo derivado da base de dominantes (DOM) ----------\n// memberSectors: o escopo de CD_SETOR que a query no CRM precisa cobrir pra fechar este código, em\n// qualquer nível — um setor é ele mesmo; uma GV é todo setor que a base lhe atribui; um mercado é\n// todo setor de toda GV que a base atribui a ele.\n// membros ATUAIS de um GV/mercado, um nível abaixo (setores de uma GV; GVs de um mercado) — nunca\n// só a foto estática do CSV: uma etapa anterior NESTA MESMA sessão pode já ter movido um filho pra\n// dentro ou pra fora deste código, e um fechamento seguinte tem de enxergar o mundo como ele está\n// agora, não como o CSV descreveu antes de qualquer movimentação.\nfunction currentMembersOf(level,code,world){\n  code=String(code);\n  // \"gv\": setores da GV (DOM.sectorsByGv). \"mercado\": GVs do mercado (DOM.gvsByMercado) — NUNCA\n  // sectorsByMercado, que pula a camada de GV inteira e faz memberSectorsOf tratar códigos de\n  // setor como se fossem códigos de GV (não batem em DOM.sectorsByGv, e o fechamento morre com\n  // \"não existe na base\" mesmo quando o mercado está lá).\n  const staticMembers=level==='gv'?(DOM.sectorsByGv[code]||new Set()):(DOM.gvsByMercado[code]||new Set());\n  const overrideMap=level==='gv'?(world&&world.secOverride):(world&&world.gvOverride);\n  const out=new Set(staticMembers);\n  if(overrideMap){\n    Object.entries(overrideMap).forEach(([child,dest])=>{\n      if(dest===code) out.add(child);\n      else if(staticMembers.has(child)) out.delete(child);\n    });\n  }\n  return [...out];\n}\n// setores que a query no CRM precisa cobrir pra fechar este código, em qualquer nível — setor é\n// ele mesmo; GV é seus setores ATUAIS; mercado é todo setor de toda GV ATUALMENTE sua (setor não\n// troca de GV sozinho numa sessão de mercado — só GV inteira troca de mercado).\nfunction memberSectorsOf(level,code,world){\n  code=String(code);\n  if(level==='setor') return [code];\n  if(level==='gv') return currentMembersOf('gv',code,world);\n  const gvs=currentMembersOf('mercado',code,world);\n  const out=new Set();\n  gvs.forEach(gv=>(DOM.sectorsByGv[gv]||new Set()).forEach(s=>out.add(s)));\n  return [...out];\n}\n// fronteira que um destino tem de respeitar: GV do setor que fecha, mercado da GV que fecha —\n// mercado não tem nada acima, então não existe regra pra ele. Estática de propósito: um setor não\n// troca de GV nem uma GV troca de mercado só por existirem etapas anteriores nesta sessão — quem\n// muda de dono é o NÍVEL ABAIXO do que está fechando, nunca o próprio código sendo avaliado aqui.\nfunction parentOf(level,code){\n  code=String(code);\n  if(level==='setor') return DOM.gvBySetor[code]||'';\n  if(level==='gv') return DOM.mercadoByGv[code]||'';\n  return '';\n}\n// dado o setor que uma município vizinha atualmente pertence (fato ao vivo do CRM, nunca muda de\n// verdade), a que CANDIDATO A DESTINO isso corresponde neste nível — considerando que uma etapa\n// anterior desta sessão pode já ter movido esse setor (GV fechando) ou essa GV (mercado fechando)\n// pra outro dono, o que a foto estática do CSV sozinha não enxergaria.\nfunction destUnitOfSector(level,setorCode,world){\n  setorCode=String(setorCode);\n  if(level==='setor') return setorCode;\n  if(level==='gv'){ const ov=world&&world.secOverride&&world.secOverride[setorCode]; return ov||DOM.gvBySetor[setorCode]||''; }\n  const gv=DOM.gvBySetor[setorCode]||'';\n  const ov=world&&world.gvOverride&&world.gvOverride[gv];\n  return ov||DOM.mercadoBySetor[setorCode]||'';\n}\nfunction currentMoveLevel(){ const r=root.querySelector('input[name=\"moveLevel\"]:checked'); return (r&&r.value)||'setor'; }\nfunction openMove(){\n  const minRank=sessionMinRank();\n  const lastLevel=SESS.timeline.length?(SESS.timeline[SESS.timeline.length-1].level||'setor'):'setor';\n  root.querySelectorAll('input[name=\"moveLevel\"]').forEach(r=>{\n    const lvl=r.value;\n    r.disabled=!movementAvailable(lvl)||!hierarchyAllows(lvl);\n    r.checked=hierarchyAllows(lastLevel)?lvl===lastLevel:lvl===Object.keys(LEVEL_RANK).find(k=>LEVEL_RANK[k]===minRank);\n  });\n  const note=$('#moveLockNote');\n  const minLabel=LEVELS[Object.keys(LEVEL_RANK).find(k=>LEVEL_RANK[k]===minRank)].label;\n  if(note) note.textContent=minRank<LEVEL_RANK.setor\n    ? `Esta sessão já fechou um nível mais alto na hierarquia — só \"${minLabel}\" (ou acima) continua disponível daqui pra frente.`\n    : 'Escolha o nível a fechar. Você pode fechar setores à vontade até fechar uma GV; aí só GV (ou mercado) daqui pra frente. Fechar um mercado trava a sessão em mercado.';\n  $('#moveCode').value='';\n  const err=$('#moveErr'); if(err){ err.textContent=''; err.classList.add('hidden'); }\n  const st=$('#moveStatus'); if(st) st.textContent='';\n  $('#moveBg').classList.remove('hidden');\n  renderMoveForm();\n  const c=$('#moveCancel'); if(c) c.focus();\n}\nfunction closeMove(){ const b=$('#moveBg'); if(b) b.classList.add('hidden'); }\nfunction renderMoveForm(){\n  root.querySelectorAll('#moveBg .opt-row').forEach(r=>r.classList.toggle('on',r.dataset.lvl===currentMoveLevel()));\n  const lvl=LEVELS[currentMoveLevel()];\n  $('#moveCodeLbl').textContent=lvl.codeLbl;\n  $('#moveCode').placeholder=lvl.placeholder;\n  loadMoveOptions();\n}\nasync function loadMoveOptions(){\n  const lvl=currentMoveLevel();\n  const dl=$('#moveCodeList'); if(!dl) return;\n  const closedSet=new Set(SESS.timeline.filter(mv=>(mv.level||'setor')===lvl).map(mv=>mv.sector));\n  if(lvl==='setor'){\n    dl.innerHTML=SESS.sectorsList.filter(s=>!closedSet.has(s.setor))\n      .map(s=>`<option value=\"${s.setor}\">${s.setor} · ${s.uf||'?'} · ${fmt(s.cbs)} CBs · ${s.munis} munic.</option>`).join('');\n    return;\n  }\n  dl.innerHTML='';\n  try{ await ensureDominantes(); }catch(e){ return; }\n  if(lvl==='gv'){\n    const gvs=Object.keys(DOM.sectorsByGv||{}).filter(g=>!closedSet.has(g)).sort();\n    dl.innerHTML=gvs.map(g=>`<option value=\"${g}\">${g}${DOM.gvLabel[g]?' · '+esc(DOM.gvLabel[g]):''} · ${DOM.sectorsByGv[g].size} setor(es)</option>`).join('');\n  } else if(lvl==='mercado'){\n    const mks=Object.keys(DOM.sectorsByMercado||{}).filter(m=>!closedSet.has(m)).sort();\n    dl.innerHTML=mks.map(m=>`<option value=\"${m}\">${m} · ${(DOM.gvsByMercado[m]||new Set()).size} GV(s) · ${DOM.sectorsByMercado[m].size} setor(es)</option>`).join('');\n  }\n}\nfunction moveRandPick(){\n  const opts=[...($('#moveCodeList').options||[])].map(o=>o.value);\n  if(!opts.length) return;\n  $('#moveCode').value=opts[Math.floor(Math.random()*opts.length)];\n}\nasync function submitMove(){\n  const lvl=currentMoveLevel();\n  const code=($('#moveCode').value||'').trim();\n  const err=$('#moveErr');\n  const fail=msg=>{ if(err){ err.textContent=msg; err.classList.remove('hidden'); } };\n  if(err){ err.textContent=''; err.classList.add('hidden'); }\n  if(!movementAvailable(lvl)) return fail(`Fechar ${LEVELS[lvl].label} ainda não está disponível.`);\n  if(!hierarchyAllows(lvl)){ const minLabel=LEVELS[Object.keys(LEVEL_RANK).find(k=>LEVEL_RANK[k]===sessionMinRank())].label; return fail(`Esta sessão já fechou um nível mais alto — só \"${minLabel}\" (ou acima) fica disponível.`); }\n  if(!code) return fail('Informe um código.');\n  closeMove();\n  await addMovement(lvl,code);\n}\nfunction renderStage(){\n  const isMain=SESS.stage==='main';\n  const cc=$('#confirmCard'), mw=$('#mainWrap');\n  const hdr=$('#topHeader'), rl=$('#timelineRail');\n  if(hdr) hdr.classList.toggle('hidden', !isMain);\n  if(rl) rl.classList.toggle('hidden', !isMain);\n  if(cc) cc.classList.toggle('hidden', isMain);\n  if(mw) mw.classList.toggle('hidden', !isMain);\n  const cb=$('#confirmBody');\n  if(cb && !isMain) cb.innerHTML = SESS.snapshotRaw\n    ? `Snapshot congelado · atualizado em <b>${fmtSyncedAt(SESS.snapshotSyncedAt)}</b> · <b>${SESS.sectorsList.length}</b> setor(es) disponível(eis) pra fechar. Nenhuma consulta de detalhe roda até você confirmar e escolher o primeiro setor.`\n    : 'congelando snapshot…';\n}\n\n// ---------- session persistence ----------\n// ONE table (`timeline-shared-sessions`) holds BOTH kinds of row, so SESSIONS_DS and SHARED_DS\n// deliberately resolve to the SAME DataSet — the two names mark intent, not two stores:\n//   · working session  — carries `movements`; saveSession updates it in place\n//   · shared snapshot  — carries `sharedAt` + `stages`; doShare CREATES it and nothing updates it\n// listSessions MUST exclude the shared rows. They are write-once by contract, and if one showed\n// up in the picker, loading it and pressing Salvar would fire ds.update() straight at a frozen\n// snapshot. Filtering here is what keeps that unreachable — it is the guard, not a cosmetic.\n// Both lookups stay because a policy-gated DataSet's Process resolves late; same race the reader\n// component polls for. SESSIONS_DS lives at module scope so no call site can hit it in the TDZ.\nasync function listSessions(){\n  const ds=(d2.data('sessionsDataset')||d2.data(SESSIONS_DS)); if(!ds) return [];\n  await ds.refresh();\n  const recs=ds.records()||[];\n  return [...recs].filter(r=>!r.sharedAt).sort((a,b)=>new Date(b.updatedAt||0)-new Date(a.updatedAt||0));\n}\nasync function refreshSessionPicker(){\n  const list=await listSessions().catch(()=>[]);\n  SESS.sessionsList=list;\n  const opts=list.map(s=>`<option value=\"${s._id}\">${esc(s.label||'sem nome')} · ${fmt((s.movements||[]).length)} etapa(s)</option>`).join('')+`<option value=\"\">+ Nova sessão</option>`;\n  const sel=$('#sessionPick'); if(sel){ sel.innerHTML=opts; sel.value=SESS.sessionId||''; }\n  const csel=$('#confirmSessionPick'); if(csel){ csel.innerHTML=opts; csel.value=SESS.sessionId||''; }\n}\nasync function saveSession(){\n  const ds=(d2.data('sessionsDataset')||d2.data(SESSIONS_DS));\n  if(!ds){ $('#sessStatus').textContent='dataset de sessões indisponível'; return; }\n  if(!SESS.timeline.length){ $('#sessStatus').textContent='nada pra salvar ainda'; return; }\n  await flushDirty();\n  const label=SESS.sessionLabel||('Sessão '+new Date().toLocaleString('pt-BR'));\n  const nowIso=new Date().toISOString();\n  const payload={\n    label,\n    settings:{...DEFAULT_SETTINGS,...(SESS.settings||{})},\n    snapshotRaw:SESS.snapshotRaw, snapshotSyncedAt:SESS.snapshotSyncedAt, snapLiteral:SESS.snapLiteral, eloMaxCycle:SESS.eloMaxCycle,\n    movements:SESS.timeline.map(mv=>({\n      sector:mv.sector, level:mv.level||'setor', assign:mv.assign, policy:mv.policy,\n      matrix:mv.matrix, trend:mv.trend, levels:mv.levels, levelByMuni:mv.levelByMuni,\n      pureOwnMetrics:mv.pureOwnMetrics, domUF:mv.domUF, dest:mv.dest, color:mv.color,\n      gv:mv.gv, gvRejected:mv.gvRejected,\n      missingMunis:mv.missingMunis, csvMunisTotal:mv.csvMunisTotal, ufGuessed:mv.ufGuessed,\n      baseMetrics:mv.baseMetrics, baseLevel:mv.baseLevel, geoFeat:mv.geoFeat, nbrFeat:mv.nbrFeat,\n      nbrCurrentSector:mv.nbrCurrentSector, allowed:mv.allowed, allowedRaw:mv.allowedRaw, reachable:mv.reachable,\n      destRule:mv.destRule, destMinCbs:mv.destMinCbs, destRuleFallback:mv.destRuleFallback, optTier:mv.optTier,\n      cbsByMuni:mv.cbsByMuni, shapeMunis:mv.shapeMunis, excludedMunis:mv.excludedMunis, domCsvMunis:mv.domCsvMunis,\n      excludedCbs:mv.excludedCbs, noShapeMunis:mv.noShapeMunis, noShapeCbs:mv.noShapeCbs,\n      secCentroid:mv.secCentroid, muniCentroid:mv.muniCentroid, closeAdj:mv.closeAdj, optBadge:mv.optBadge,\n    })),\n    updatedAt:nowIso,\n  };\n  $('#sessStatus').textContent='salvando…';\n  try{\n    if(SESS.sessionId){\n      await ds.update({_id:SESS.sessionId,...payload});\n    } else {\n      payload.createdAt=nowIso;\n      const created=await ds.create(payload);\n      SESS.sessionId=(created&&created._id)||(created&&created.data&&created.data._id)||(ds.selected&&ds.selected()&&ds.selected()._id)||null;\n    }\n    SESS.sessionLabel=label;\n    await refreshSessionPicker();\n    $('#sessStatus').textContent='salvo ✓';\n  }catch(e){ $('#sessStatus').textContent='erro ao salvar: '+e.message; }\n  setTimeout(()=>{ if($('#sessStatus')) $('#sessStatus').textContent=''; },2200);\n}\n// Duplicate = drop sessionId so saveSession takes its CREATE branch instead of its update branch.\n// The source record is never written to, the copy gets a fresh _id and its own createdAt, and the\n// copy becomes the active session (so the next Salvar edits the copy, not the original).\nasync function duplicateSession(){\n  if(!SESS.timeline.length){ $('#sessStatus').textContent='nada pra duplicar ainda'; return; }\n  const prevId=SESS.sessionId, prevLabel=SESS.sessionLabel;\n  SESS.sessionId=null;\n  SESS.sessionLabel=(SESS.sessionLabel||'Sessão')+' (cópia)';\n  await saveSession();\n  if(!SESS.sessionId){\n    // saveSession swallows its own errors into #sessStatus, so a still-null id after the await is\n    // the only failure signal we get. Put the original identity back — otherwise a failed copy\n    // silently leaves the session detached, and the next Salvar would fork a new record instead\n    // of updating the one the user thought they were editing.\n    SESS.sessionId=prevId; SESS.sessionLabel=prevLabel;\n    await refreshSessionPicker().catch(()=>{});\n    return;\n  }\n  if($('#sessStatus')) $('#sessStatus').textContent='duplicado ✓';\n}\nasync function loadSession(id){\n  if(!id) return newSession();\n  const list=(SESS.sessionsList&&SESS.sessionsList.length)?SESS.sessionsList:await listSessions().catch(()=>[]);\n  const rec=list.find(s=>String(s._id)===String(id));\n  if(!rec) return newSession();\n  loader(true,'carregando sessão…');\n  SESS.sessionId=rec._id; SESS.sessionLabel=rec.label;\n  SESS.snapshotRaw=rec.snapshotRaw; SESS.snapshotSyncedAt=rec.snapshotSyncedAt||null; SESS.snapLiteral=rec.snapLiteral; SESS.eloMaxCycle=rec.eloMaxCycle;\n  SESS.settings={...DEFAULT_SETTINGS,...(rec.settings||{})};\n  SESS.timeline=(rec.movements||[]).map(m=>({sector:String(m.sector),level:m.level||'setor'}));\n  SESS.selected=0; SESS.sectorBaseCache={}; SESS.stage='main'; SESS.dirtyFrom=null;\n  try{\n    for(let i=0;i<SESS.timeline.length;i++){\n      const saved=(rec.movements||[])[i]||{};\n      // Sessions saved before the UF became part of the key hold bare-name keys in matrix rows,\n      // assign, geoFeat and closeAdj alike. Restoring that cache would mix key shapes the moment the\n      // stage is recomputed — and it would preserve the very collision this fixes — so those stages\n      // are replayed against the pinned snapshot and the manual assignment is remapped by name.\n      const legacyKeys=!!(saved.matrix&&saved.matrix.length&&saved.matrix.every(r=>r&&r.uf==null));\n      // Sessões salvas antes da regra de gerência podem carregar um destino de outra GV no cache.\n      // Restaurar esse cache manteria o setor proibido na tela para sempre, então essas etapas são\n      // reprocessadas contra o snapshot fixado — igual ao tratamento das chaves legadas.\n      const crossGv=await savedCrossesGv(saved);\n      if(saved.matrix&&!legacyKeys&&!crossGv){\n        loader(true,`restaurando etapa ${i+1}/${SESS.timeline.length} — setor ${SESS.timeline[i].sector} (cache, sem consulta)…`);\n        const mv={sector:String(saved.sector), level:saved.level||'setor', policy:saved.policy||'fora', view:'tobe', selMuni:null, optBadge:saved.optBadge||''};\n        mv.matrix=saved.matrix; mv.trend=saved.trend||[]; mv.levels=saved.levels||[]; mv.levelByMuni=saved.levelByMuni||{};\n        mv.pureOwnMetrics=saved.pureOwnMetrics||blankM(); mv.domUF=saved.domUF; mv.dest=saved.dest||[]; mv.color=saved.color||{};\n        mv.baseMetrics=saved.baseMetrics||{}; mv.baseLevel=saved.baseLevel||{}; mv.geoFeat=saved.geoFeat||{}; mv.nbrFeat=saved.nbrFeat||[];\n        mv.nbrCurrentSector=saved.nbrCurrentSector||{}; mv.allowed=saved.allowed||{}; mv.reachable=saved.reachable||{};\n        mv.allowedRaw=saved.allowedRaw||saved.allowed||{};\n        mv.destRule=saved.destRule||SESS.settings.destRule; mv.destMinCbs=saved.destMinCbs||SESS.settings.destMinCbs; mv.destRuleFallback=!!saved.destRuleFallback;\n        mv.optTier=(saved.optTier==null?0:saved.optTier);\n        mv.gv=saved.gv||''; mv.gvRejected=saved.gvRejected||[];\n        mv.missingMunis=saved.missingMunis||[]; mv.csvMunisTotal=saved.csvMunisTotal||0;\n        mv.ufGuessed=saved.ufGuessed||{};\n        mv.cbsByMuni=saved.cbsByMuni||{}; mv.shapeMunis=saved.shapeMunis||[];\n        mv.excludedMunis=saved.excludedMunis||[]; mv.excludedCbs=saved.excludedCbs||0; mv.domCsvMunis=saved.domCsvMunis||0;\n        mv.noShapeMunis=saved.noShapeMunis||[]; mv.noShapeCbs=saved.noShapeCbs||0;\n        mv.secCentroid=saved.secCentroid||{}; mv.muniCentroid=saved.muniCentroid||{}; mv.closeAdj=saved.closeAdj||{};\n        aggregateMovement(mv);\n        mv.assign=saved.assign||{};\n        if((mv.level||'setor')==='setor') mv.dest.forEach(s=>{ if(!SESS.sectorBaseCache[s]) SESS.sectorBaseCache[s]=mv.baseMetrics[s]; });\n        SESS.timeline[i]=mv;\n      } else {\n        loader(true,`replay ${i+1}/${SESS.timeline.length} — setor ${SESS.timeline[i].sector}…`);\n        await computeAt(i);\n        if(saved.assign) SESS.timeline[i].assign=legacyKeys?remapAssign(SESS.timeline[i],saved.assign):saved.assign;\n        if(saved.policy) SESS.timeline[i].policy=saved.policy;\n      }\n    }\n    await loadSectors();\n  }catch(e){ $('#ds').textContent='erro ao carregar sessão: '+e.message; $('#ds').classList.add('err'); }\n  finally{ loader(false); }\n  renderAll();\n}\n// Re-points a legacy bare-name assignment at the NAME/UF key it can only mean. When a name resolves\n// to more than one município in the recomputed stage the manual choice is genuinely ambiguous —\n// dropping it lets the optimizer allocate instead of guessing on the operator's behalf.\n// True when a cached stage names a destination outside the closing sector's gerência de vendas.\n// Judges the cache by TODAY's rule, reading the (memoised) dominantes base rather than trusting what\n// the session was saved with. Unknown GV on the closing sector answers false: the stage then loads\n// from cache instead of being replayed into the hard throw in computeMovement, which would leave the\n// operator staring at a broken session with no way back.\nasync function savedCrossesGv(saved){\n  if(!saved||!saved.sector||!(saved.dest||[]).length) return false;\n  let gvBy={};\n  try{ await ensureDominantes(); gvBy=DOM.gvBySetor||{}; }catch(e){ return false; }\n  const own=gvBy[String(saved.sector)]||'';\n  if(!own) return false;\n  if(saved.dest.some(s=>(gvBy[String(s)]||'')!==own)) return true;\n  // A stage saved before foreign-GV neighbours stopped being drawn can hold a perfectly clean dest and\n  // STILL carry their shapes in nbrFeat/nbrCurrentSector — it would repaint the old map straight from\n  // cache. An unknown gerência is not evidence of a foreign one, so only a known, differing GV replays.\n  return Object.values(saved.nbrCurrentSector||{}).some(s=>{ const g=gvBy[String(s)]||''; return g&&g!==own; });\n}\nfunction remapAssign(mv,savedAssign){\n  const keys=Object.keys(mv.munis||{}).filter(k=>k!=='__OUTROS__');\n  const out={};\n  Object.entries(savedAssign||{}).forEach(([k,v])=>{\n    if(keys.indexOf(k)>=0){ out[k]=v; return; }\n    const cand=keys.filter(x=>mName(x)===mName(k));\n    if(cand.length===1) out[cand[0]]=v;\n  });\n  return out;\n}\nfunction newSession(){\n  SESS.sessionId=null; SESS.sessionLabel=null; SESS.timeline=[]; SESS.selected=0; SESS.sectorBaseCache={};\n  SESS.settings={...DEFAULT_SETTINGS};\n  SESS.snapshotRaw=null; SESS.snapshotSyncedAt=null; SESS.snapLiteral=null; SESS.eloMaxCycle=null; SESS.stage='loading'; SESS.dirtyFrom=null;\n  (async()=>{\n    loader(true,'iniciando nova sessão…');\n    try{ await Promise.all([ensurePinned(), loadSectors()]); SESS.stage='confirm'; }\n    catch(e){ setError('erro init: '+e.message); }\n    finally{ loader(false); renderAll(); }\n  })();\n}\n\n// ---------- snapshot refresh ----------\n// Deliberately breaks the frozen-snapshot guarantee, on demand: re-resolves DT_HISTORICO and\n// replays the whole timeline against the new one. Skips the replay when the snapshot has not\n// actually moved, so a stray click on a long timeline costs one cheap probe instead of ~8 queries\n// per etapa.\nasync function refreshSnapshot(){\n  if(SESS.stage!=='main' || SESS.snapBusy) return;\n  SESS.snapBusy=true;\n  const prevRaw=SESS.snapshotRaw;\n  const pill=$('#liveState'); if(pill){ pill.classList.add('busy'); pill.textContent='◌ atualizando snapshot…'; }\n  loader(true,'buscando o snapshot mais recente…');\n  let ok=false;\n  try{\n    const p=await resolveSnapshotPin();\n    if(!p.snapshotRaw) throw new Error('não foi possível resolver DT_HISTORICO');\n    const same=String(p.snapshotRaw)===String(prevRaw);\n    SESS.snapshotRaw=p.snapshotRaw; SESS.snapshotSyncedAt=p.syncedAt; SESS.snapLiteral=p.snapLiteral; SESS.eloMaxCycle=p.eloMaxCycle;\n    await loadSectors();   // the sector list follows the live max, so it can have moved too\n    if(same){\n      $('#ds').textContent=`snapshot já era o mais recente · atualizado em ${fmtSyncedAt(p.syncedAt)} — nada recalculado`;\n    } else if(SESS.timeline.length){\n      SESS.dirtyFrom=null;\n      SESS.sectorBaseCache={};   // baselines come from the snapshot, so every one of them changed\n      loader(true,'snapshot novo — recalculando a timeline…');\n      await recomputeFrom(0);\n      $('#ds').textContent=`snapshot atualizado em ${fmtSyncedAt(p.syncedAt)} · ${fmt(SESS.timeline.length)} etapa(s) recalculada(s)`;\n    } else {\n      $('#ds').textContent=`snapshot atualizado em ${fmtSyncedAt(p.syncedAt)}`;\n    }\n    $('#ds').classList.remove('err');\n    ok=true;\n  }catch(e){\n    const at=(SESS.dirtyFrom==null?null:SESS.dirtyFrom+1);\n    $('#ds').textContent='erro ao atualizar o snapshot'+(at?` na etapa ${at} — etapa ${at} em diante ficou desatualizada (⟳)`:'')+': '+e.message;\n    $('#ds').classList.add('err');\n  }finally{\n    SESS.snapBusy=false;\n    if(pill) pill.classList.remove('busy');\n    loader(false); renderAll();\n    if(ok) setTimeout(()=>{ const d=$('#ds'); if(d&&!d.classList.contains('err')) d.textContent=''; },7000);\n  }\n}\n\n// ---------- session options ----------\nfunction previewDest(mv,rule,minCbs){\n  if(!mv||!mv.allowedRaw||!mv.munis) return null;\n  const w={}; let relaxed=false;\n  const cbsOf=m=>(mv.cbsByMuni&&mv.cbsByMuni[m]!=null)?mv.cbsByMuni[m]:((mv.munis[m]&&mv.munis[m].cbs)||0);\n  const add=m=>Object.entries(mv.allowedRaw[m]||{}).forEach(([s,v])=>{ w[s]=(w[s]||0)+v; });\n  // allowedRaw only carries municipalities already inside the sector's dominance base, so there is\n  // nothing left to filter out here beyond the destination rule itself.\n  Object.keys(mv.allowedRaw).forEach(m=>{ const cbs=cbsOf(m);\n    if(rule==='dominant'&&cbs<minCbs) return; add(m); });\n  if(rule==='dominant'&&!Object.keys(w).length){ Object.keys(mv.allowedRaw).forEach(add); relaxed=true; }\n  return {dest:Object.keys(w).sort((a,b)=>w[b]-w[a]).slice(0,6),relaxed};\n}\nfunction readOptForm(){\n  const r=root.querySelector('input[name=\"destRule\"]:checked');\n  let n=Math.round(+$('#optMinCbs').value);\n  if(!(n>0)) n=DEFAULT_SETTINGS.destMinCbs;\n  return {destRule:(r&&r.value)||DEFAULT_SETTINGS.destRule, destMinCbs:n,\n          targetSpan:numOrNull($('#optTargetSpan').value),\n          maxSpan:numOrNull($('#optMaxSpan').value),\n          minSpan:numOrNull($('#optMinSpan').value)};\n}\nfunction spanFormError(f){\n  if(f.minSpan&&f.maxSpan&&f.minSpan>f.maxSpan) return `Span mínimo (${fmt(f.minSpan)}) não pode ser maior que o máximo (${fmt(f.maxSpan)}).`;\n  if(f.targetSpan&&f.maxSpan&&f.targetSpan>f.maxSpan) return `Span alvo (${fmt(f.targetSpan)}) não pode passar do máximo (${fmt(f.maxSpan)}).`;\n  if(f.targetSpan&&f.minSpan&&f.targetSpan<f.minSpan) return `Span alvo (${fmt(f.targetSpan)}) não pode ficar abaixo do mínimo (${fmt(f.minSpan)}).`;\n  return '';\n}\nfunction renderOptPreview(){\n  const el=$('#optPreview'); if(!el) return;\n  const f=readOptForm();\n  root.querySelectorAll('.opt-row').forEach(r=>{\n    if(r.dataset.r!=null) r.classList.toggle('on',r.dataset.r===f.destRule);\n  });\n  const wrap=$('#optMinCbsWrap'); if(wrap) wrap.classList.toggle('off',f.destRule!=='dominant');\n  const err=spanFormError(f), ee=$('#optSpanErr');\n  if(ee){ ee.textContent=err; ee.classList.toggle('hidden',!err); }\n  const ap=$('#optApply'); if(ap) ap.disabled=!!err;\n  const mv=SESS.timeline[SESS.selected];\n  // Prévia inteira é sobre conceitos de setor (ponte por município, span alvo/máx/mín) que não\n  // existem em GV/mercado — mostrar aqui só confundiria com números que não valem nada.\n  if(mv && (mv.level||'setor')!=='setor'){ el.innerHTML=''; return; }\n  if(!mv||!mv.munis){ el.innerHTML='Nenhuma etapa calculada ainda — as regras passam a valer no próximo fechamento.'; return; }\n  const cbsOf=m=>(mv.cbsByMuni&&mv.cbsByMuni[m]!=null)?mv.cbsByMuni[m]:((mv.munis[m]&&mv.munis[m].cbs)||0);\n  const ms=Object.keys(mv.geoFeat||{});\n  const ig=f.destRule==='dominant'?ms.filter(m=>cbsOf(m)<f.destMinCbs):[];\n  const pv=previewDest(mv,f.destRule,f.destMinCbs);\n  let h=`<b style=\"color:var(--ink)\">Prévia — etapa ${SESS.selected+1}, setor ${mv.sector}</b><br>`;\n  const exN=(mv.excludedMunis||[]).length;\n  if(exN) h+=`Base de dominantes: <b>${fmt(ms.length)}</b> município(s) no mapa · <span style=\"color:var(--closing)\">${fmt(exN)} fora da base — ${fmt(mv.excludedCbs||0)} CBs seguem suas líderes</span><br>`;\n  h+=`${fmt(ms.length-ig.length)} de ${fmt(ms.length)} município(s) valem como ponte`;\n  if(ig.length) h+=` · <span style=\"color:var(--closing)\">ignorados:</span> ${ig.slice(0,8).join(', ')}${ig.length>8?' +'+(ig.length-8):''}`;\n  if(pv){\n    h+=`<br>Setores destino com esta regra: <b style=\"color:var(--ink)\">${pv.dest.join(', ')||'–'}</b>`;\n    const cur=(mv.dest||[]).join(', ');\n    if(pv.dest.join(',')!==(mv.dest||[]).join(',')) h+=` <span style=\"color:var(--closing)\">(hoje: ${cur||'–'})</span>`;\n    if(pv.relaxed) h+=`<br><b style=\"color:var(--closing)\">⚠ nenhum município dominante nesta etapa — a regra relaxa pra \"qualquer município\" pra não deixar a etapa sem destino.</b>`;\n  }\n  if(f.targetSpan||f.maxSpan||f.minSpan){\n    const sp=spanMapFor(mv,mv.assign||{}), v=spanViolationsOf(sp,{target:f.targetSpan,max:f.maxSpan,min:f.minSpan});\n    h+=`<br><br>Span dos destinos como está hoje: ${mv.dest.map(s=>s+' <b>'+fmt(sp[s])+'</b>').join(' · ')||'–'}`;\n    if(v.over.length||v.under.length) h+=`<br><span style=\"color:var(--closing)\">Fora dos limites: ${[...v.over.map(s=>s+' ▲ acima do máx'),...v.under.map(s=>s+' ▼ abaixo do mín')].join(', ')}</span> — o modelo ÓTIMO tenta corrigir no recálculo.`;\n    else h+=` <span style=\"color:var(--ok)\">— já dentro dos limites</span>`;\n  }\n  if(SESS.timeline.length) h+=`<br><span style=\"margin-top:4px;display:inline-block\">Aplicar <b>recalcula as ${fmt(SESS.timeline.length)} etapa(s)</b> contra o snapshot congelado — os destinos ajustados à mão serão refeitos pelo modelo ÓTIMO.</span>`;\n  el.innerHTML=h;\n}\nfunction openOptions(){\n  const st={...DEFAULT_SETTINGS,...(SESS.settings||{})};\n  root.querySelectorAll('input[name=\"destRule\"]').forEach(r=>{ r.checked=(r.value===st.destRule); });\n  $('#optMinCbs').value=st.destMinCbs;\n  $('#optTargetSpan').value=st.targetSpan||'';\n  $('#optMaxSpan').value=st.maxSpan||'';\n  $('#optMinSpan').value=st.minSpan||'';\n  $('#optApply').disabled=false;\n  $('#optSessName').textContent=SESS.sessionLabel||'sessão não salva';\n  $('#optStatus').textContent='';\n  $('#optionsBg').classList.remove('hidden');\n  renderOptPreview();\n  const c=$('#optCancel'); if(c) c.focus();\n}\nfunction closeOptions(){ const b=$('#optionsBg'); if(b) b.classList.add('hidden'); }\nasync function applyOptions(){\n  const f=readOptForm();\n  if(spanFormError(f)) return;\n  const prev={...DEFAULT_SETTINGS,...(SESS.settings||{})};\n  const changed = prev.destRule!==f.destRule\n    || (f.destRule==='dominant' && prev.destMinCbs!==f.destMinCbs)\n    || numOrNull(prev.targetSpan)!==f.targetSpan\n    || numOrNull(prev.maxSpan)!==f.maxSpan\n    || numOrNull(prev.minSpan)!==f.minSpan;\n  SESS.settings={...prev,...f};\n  closeOptions();\n  if(!changed || !SESS.timeline.length){ renderAll(); return; }\n  SESS.dirtyFrom=null;\n  SESS.sectorBaseCache={};   // the recompute re-derives every baseline; keeping the old ones would\n                             // leave \"Impacto acumulado\" comparing against pre-change numbers\n  loader(true,'aplicando nova regra de destino — recalculando timeline…');\n  try{\n    await recomputeFrom(0);\n    $('#ds').textContent=''; $('#ds').classList.remove('err');\n  }catch(e){\n    const at=(SESS.dirtyFrom==null?0:SESS.dirtyFrom)+1;\n    $('#ds').textContent=`erro ao aplicar a regra na etapa ${at}: ${e.message} — etapa ${at} em diante ficou desatualizada (⟳)`;\n    $('#ds').classList.add('err');\n  }finally{ loader(false); renderAll(); }\n}\n\nconst SHARED_DS='timeline-shared-sessionsDataSet';\nconst AUTH_REF='timelineSimAuthFinal';   // single source of truth for the auth strategy reference\nlet SHARE={busy:false,url:null,last:null};\n// Serialise a PRESENTATION model, not the raw session, so the reader stays purely presentational\n// and never re-derives spans/desloc/orphans — no second copy of this engine to keep in sync.\n// NOTE: METRICS_DEF[2] is the money marker; read it as !!md[2] (a literal dollar sign in this\n// position trips the upsert's parse check).\nfunction buildShareStages(){\n  return SESS.timeline.map((mv,i)=>{\n    const c=computeDerived(mv);\n    const incBy={};\n    mv.dest.forEach(s=>{ incBy[s]=Object.fromEntries(METRICS_DEF.map(md=>[md[0],0])); });\n    Object.entries(mv.munis).forEach(([m,o])=>{\n      if(m==='__OUTROS__') return;\n      const s=mv.assign[m]; if(!s||!incBy[s]) return;\n      METRICS_DEF.forEach(md=>{ incBy[s][md[0]]+=o[md[0]]||0; });\n    });\n    const saiTot={};\n    METRICS_DEF.forEach(md=>{\n      const k=md[0];\n      saiTot[k]=Object.entries(mv.munis).filter(([m])=>m!=='__OUTROS__').reduce((a,p)=>a+((p[1][k])||0),0);\n    });\n    // orphans follow their leader's home: they enter that sector AND leave the closing one\n    c.leaders.forEach(L=>{\n      const om=mv.orphanMetricsByGroup&&mv.orphanMetricsByGroup[L.grupo];\n      if(!om||!L.home) return;\n      METRICS_DEF.forEach(md=>{ const k=md[0];\n        if(incBy[L.home]) incBy[L.home][k]+=om[k]||0;\n        saiTot[k]+=om[k]||0; });\n    });\n    const ms=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__').sort((a,b)=>mv.munis[b].cbs-mv.munis[a].cbs);\n    const sv=mv.dest.map(s=>c.span[s]);\n    const baseOf=(s,k)=>{ const b=mv.baseMetrics[s]||{}; return +(b[k]||0); };\n    return {\n      i:i, sector:mv.sector, level:mv.level||'setor', unitOfMuni:mv.unitOfMuni||{}, policy:mv.policy, domUF:mv.domUF,\n      optTier:(mv.optTier==null?0:mv.optTier),\n      destRuleFallback:!!mv.destRuleFallback,\n      dest:mv.dest.slice(), color:Object.assign({},mv.color), assign:Object.assign({},mv.assign),\n      kpis:{ cbsRealocadas:closingCbsOf(mv), desloc:c.desloc,\n             spread:(sv.length?Math.max.apply(null,sv)-Math.min.apply(null,sv):0),\n             municipios:ms.length, lideres:mv.leaders.length },\n      destinos:mv.dest.map(s=>({ s:s, base:baseOf(s,'cbs'), inc:c.inc[s]||0, orph:c.orph[s]||0, span:c.span[s]||0, gained:c.gained[s]||0 })),\n      municipios:ms.map(m=>(mv.level&&mv.level!=='setor')?{ nome:m, uf:'', cbs:mv.munis[m].cbs, destino:mv.assign[m]||null }:{ nome:mName(m), uf:mUf(m), cbs:mv.munis[m].cbs, destino:mv.assign[m]||null }),\n      excluidos:(mv.excludedMunis||[]).map(x=>({ muni:x.muni, cbs:x.cbs })),\n      orphanTotal:c.orphanTotal||0, orphanStranded:c.orphanStranded||0, noShapeCbs:mv.noShapeCbs||0,\n      lideres:c.leaders.map(L=>({ lider:(L.lider||'').split(' ').slice(0,2).join(' '), grupo:L.grupo,\n        total:L.total, home:L.home, desloc:L.desloc, orphan:L.orphan||0 })),\n      metricas:METRICS_DEF.map(md=>{ const k=md[0];\n        return { key:k, label:md[1], money:!!md[2],\n          rows:mv.dest.map(s=>({ s:s, antes:baseOf(s,k), depois:baseOf(s,k)+((incBy[s]&&incBy[s][k])||0) })),\n          sai:saiTot[k]||0 }; }),\n      geoFeat:mv.geoFeat, nbrFeat:mv.nbrFeat, excludedFeat:[]\n    };\n  });\n}\nfunction buildShareSummary(stages){\n  const world=foldWorldState(SESS.timeline,SESS.timeline.length);\n  const receivers=[];\n  SESS.timeline.forEach((mv,i)=>{\n    const own=mv.pureOwnMetrics||{};\n    receivers.push({ s:mv.sector, situacao:'fechado (etapa '+(i+1)+')', antes:+(own.cbs||0), depois:0 });\n  });\n  const seen={};\n  Object.values(world.muniOverride).forEach(s=>{\n    if(seen[s]) return; seen[s]=1;\n    const base=SESS.sectorBaseCache[s]||{}, infl=world.sectorInflow[s]||{};\n    receivers.push({ s:s, situacao:'recebeu território', antes:+(base.cbs||0), depois:(+(base.cbs||0))+(infl.cbs||0) });\n  });\n  return { stages:stages.length, sectors:SESS.timeline.map(mv=>mv.sector),\n    totalCbs:stages.reduce((a,s)=>a+(s.kpis.cbsRealocadas||0),0),\n    totalDesloc:stages.reduce((a,s)=>a+(s.kpis.desloc||0),0), receivers:receivers };\n}\nfunction renderShareBody(){\n  const el=$('#shareBody'); if(!el) return;\n  const go=$('#shareGo'), cp=$('#shareCopy'), op=$('#shareOpen'), cc=$('#shareCancel');\n  if(SHARE.url){\n    el.innerHTML=`<div class=\"opt-note\" style=\"margin-top:0\"><b style=\"color:var(--ink)\">Sessão compartilhada ✓</b><br>\n      Link de leitura desta simulação congelada. Quem abrir precisa ter login no simulador.\n      <div class=\"shareurl\">${esc(SHARE.url)}</div></div>`;\n    if(go) go.classList.add('hidden');\n    if(cp) cp.classList.remove('hidden');\n    if(op) op.classList.remove('hidden');\n    if(cc) cc.textContent='Fechar';\n    return;\n  }\n  if(go) go.classList.remove('hidden');\n  if(cp) cp.classList.add('hidden');\n  if(op) op.classList.add('hidden');\n  if(cc) cc.textContent='Cancelar';\n  const st={...DEFAULT_SETTINGS,...(SESS.settings||{})};\n  const desloc=SESS.timeline.reduce((a,mv)=>a+(mv.munis?computeDerived(mv).desloc:0),0);\n  const destTxt=st.destRule==='dominant'?('dominantes ≥'+fmt(st.destMinCbs)+' CBs'):'qualquer município';\n  el.innerHTML=`<div class=\"opt-lbl\">Confirmar compartilhamento</div>\n    <div class=\"opt-sub\">Publica uma <b>cópia congelada</b> desta sessão, exatamente no estado atual.</div>\n    <div class=\"opt-note\" style=\"margin-top:0\">\n      · <b>${fmt(SESS.timeline.length)}</b> etapa(s) — ${esc(SESS.timeline.map(mv=>mv.sector).join(' → '))}<br>\n      · snapshot atualizado em <b>${esc(fmtSyncedAt(SESS.snapshotSyncedAt))}</b><br>\n      · base: <b>municípios dominantes (CSV)</b> · destino: <b>${esc(destTxt)}</b> · span: <b>${esc(spanShort(st))}</b><br>\n      · <b>${fmt(desloc)}</b> CBs deslocadas somando a cadeia\n    </div>\n    <div class=\"opt-note\">A cópia <b>não</b> acompanha edições posteriores desta sessão — pra atualizar, compartilhe de novo e use o link novo. O link exige login no simulador; não é público.</div>\n    ${SHARE.last?`<div class=\"opt-note\"><b style=\"color:var(--ink)\">Último link gerado nesta sessão</b> — aponta pro estado de <b>antes</b> das edições feitas depois dele.<div class=\"shareurl\">${esc(SHARE.last)}</div></div>`:''}`;\n}\nasync function openShare(){\n  if(!SESS.timeline.length){ $('#ds').textContent='nada pra compartilhar — feche pelo menos um setor primeiro.'; $('#ds').classList.add('err'); return; }\n  await flushDirty();\n  SHARE.url=null;\n  const s=$('#shareStatus'); if(s){ s.textContent=''; s.classList.remove('err'); }\n  renderShareBody();\n  $('#shareBg').classList.remove('hidden');\n  const b=$('#shareCancel'); if(b) b.focus();\n}\nfunction closeShare(){ const b=$('#shareBg'); if(b) b.classList.add('hidden'); }\nasync function doShare(){\n  if(SHARE.busy) return;\n  const go=$('#shareGo'), stx=$('#shareStatus');\n  SHARE.busy=true;\n  if(go){ go.disabled=true; go.textContent='Compartilhando…'; }\n  if(stx){ stx.textContent=''; stx.classList.remove('err'); }\n  try{\n    // Resolved as a GLOBAL PROCESS, not a declared param — which only works because the block\n    // instance on the `main` artboard binds `sharedDataset: @timeline-shared-sessionsDataSet`.\n    // That binding is load-bearing: a Process is only define()d once something on the rendering\n    // tree references it, so without it this lookup returns null and sharing dies on the guard\n    // below. Do NOT remove the instance param because this file never reads d2.params.sharedDataset.\n    const ds=d2.data(SHARED_DS);\n    if(!ds) throw new Error('dataset de sessões compartilhadas indisponível');\n    await flushDirty();\n    const stages=buildShareStages();\n    const summary=buildShareSummary(stages);\n    let who='';\n    try{ const a=d2.auth(AUTH_REF); who=(a&&a.user&&(a.user.email||a.user.nome))||''; }catch(e){}\n    const created=await ds.create({\n      label:SESS.sessionLabel||('Sessão '+new Date().toLocaleString('pt-BR')),\n      snapshotRaw:SESS.snapshotRaw, snapshotSyncedAt:SESS.snapshotSyncedAt,\n      settings:{...DEFAULT_SETTINGS,...(SESS.settings||{})},\n      stages:stages, summary:summary, sharedBy:who, sharedAt:new Date().toISOString()\n    });\n    const id=(created&&created._id)||(created&&created.data&&created.data._id)||(ds.selected&&ds.selected()&&ds.selected()._id)||null;\n    if(!id) throw new Error('registro gravado, mas sem _id na resposta — não foi possível montar o link');\n    SHARE.url=window.location.origin+'/sessions/'+id;\n    SHARE.last=SHARE.url;\n    renderShareBody();\n  }catch(e){\n    if(stx){ stx.textContent='erro ao compartilhar: '+e.message; stx.classList.add('err'); }\n  }finally{\n    SHARE.busy=false;\n    if(go){ go.disabled=false; go.textContent='Compartilhar'; }\n  }\n}\n\n// ---------- rendering ----------\nfunction renderTimeline(){\n  const el=$('#movementChips'); if(!el) return;\n  if(!SESS.timeline.length){ el.innerHTML='<span class=\"empty\">Nenhuma etapa ainda — use \"Adicionar movimentação\" à direita.</span>'; return; }\n  el.innerHTML=SESS.timeline.map((mv,i)=>{\n    const ready=mv.dest!==undefined;\n    const c=ready?computeDerived(mv):null;\n    const stale=SESS.dirtyFrom!=null && i>=SESS.dirtyFrom;\n    return `<div class=\"tchip ${i===SESS.selected?'on':''} ${stale?'stale':''}\" data-i=\"${i}\">\n      <span class=\"tnum\">${i+1}</span><span class=\"tsec\">${LEVELS[mv.level||'setor'].label} ${mv.sector}</span>\n      <span class=\"tstat\">${ready?((mv.level||'setor')==='setor'?fmt(c.desloc)+' desloc.':fmt(closingCbsOf(mv))+' CBs'):'…'}</span>\n      ${stale?'<span class=\"tstale\" title=\"recalcula ao selecionar outra etapa\">⟳</span>':''}\n      <span class=\"trm\" data-rm=\"${i}\" title=\"remover esta etapa e as seguintes\">✕</span>\n    </div>`;\n  }).join('');\n  el.querySelectorAll('.tchip').forEach(ch=>{\n    ch.addEventListener('click',async (e)=>{\n      if(e.target.dataset.rm!=null && e.target.dataset.rm!==''){ removeFrom(+e.target.dataset.rm); return; }\n      const i=+ch.dataset.i;\n      if(i!==SESS.selected) await flushDirty();\n      SESS.selected=i; renderAll();\n    });\n  });\n}\nfunction renderRuleNote(){\n  const el=$('#ruleNote'); if(!el) return;\n  const st={...DEFAULT_SETTINGS,...(SESS.settings||{})};\n  const mv=SESS.timeline[SESS.selected];\n  const lvl=LEVELS[(mv&&mv.level)||'setor'];\n  let h='';\n  if(!mv || (mv.level||'setor')==='setor'){\n    h+=`<b style=\"color:var(--ink)\">Base de municípios dominantes:</b> só os municípios que a base (CSV) atribui ao setor entram no mapa e na alocação`;\n    if(mv&&mv.domCsvMunis) h+=` · <b>${fmt(mv.domCsvMunis)}</b> na base do setor ${mv.sector}`;\n    if(mv&&mv.excludedCbs) h+=` · <b style=\"color:var(--closing)\">${fmt(mv.excludedMunis.length)} município(s) / ${fmt(mv.excludedCbs)} CBs</b> fora da base nesta etapa — não aparecem no mapa e as CBs seguem suas líderes (quebra de vínculo)`;\n  } else {\n    // GV/mercado não têm spillover (todo setor pertence a exatamente uma GV/mercado na base), então\n    // não existe \"excluído\" pra reportar aqui — só o tamanho da base e em quantas unidades ela se agrupa.\n    h+=`<b style=\"color:var(--ink)\">Base de ${lc(lvl.childLabel)}s dominantes:</b> ${mv.domCsvMunis!=null?`<b>${fmt(mv.domCsvMunis)}</b> município(s) `:''}na base ${lvl.de} ${lc(lvl.label)} ${mv.sector}, agrupados em <b>${fmt(Object.keys(mv.unitMunis||{}).length)}</b> ${lc(lvl.childLabel)}(s)`;\n  }\n  if(DOM.error) h+=` · <b style=\"color:var(--closing)\">⚠ base indisponível: ${esc(DOM.error)}</b>`;\n  h+=`<br>`;\n  h+=`<b style=\"color:var(--ink)\">Regra de destino:</b> `;\n  h+= st.destRule==='dominant'\n    ? `só municípios com <b>≥${fmt(st.destMinCbs)} CBs</b> trazem ${lc(lvl.destLabel)} pra lista de destinos`\n    : `qualquer município ${lvl.de} ${lc(lvl.label)} fechad${lvl.a==='à'?'a':'o'} vale como ponte <span style=\"opacity:.7\">(padrão)</span>`;\n  if(mv&&st.destRule==='dominant'){\n    // A ponte é sempre por MUNICÍPIO, em qualquer nível — mv.ignoredBridges já é a lista definitiva\n    // que computeMovement calculou, então lê-la aqui em vez de recalcular contra mv.munis, que em\n    // GV/mercado está no grão de setor/GV e daria o número errado.\n    const ig=mv.ignoredBridges||[];\n    if(ig.length) h+=` · <b style=\"color:var(--closing)\">${fmt(ig.length)}</b> ignorado(s) como ponte (ainda redistribuído(s)): ${ig.slice(0,5).join(', ')}${ig.length>5?' +'+(ig.length-5):''}`;\n    if(mv.destRuleFallback) h+=`<br><b style=\"color:var(--closing)\">⚠ nenhum município dominante nesta etapa — regra relaxada pra \"qualquer município\".</b>`;\n  }\n  el.innerHTML=h;\n}\nfunction renderSpanRule(){\n  const el=$('#spanRule'); if(!el) return;\n  const mv=SESS.timeline[SESS.selected], lim=spanLimits(mv);\n  if(!mv||!mv.munis||mv.view==='asis'||!spanLimitsOn(lim)){ el.innerHTML=''; return; }\n  const sp=spanMapFor(mv,mv.assign||{}), v=spanViolationsOf(sp,lim);\n  const bits=[];\n  if(lim.target) bits.push(`alvo <b>${fmt(lim.target)}</b>`);\n  if(lim.max) bits.push(`máx <b>${fmt(lim.max)}</b>`);\n  if(lim.min) bits.push(`mín <b>${fmt(lim.min)}</b>`);\n  let h=`Pré-requisito de span: ${bits.join(' · ')} CBs — `;\n  if(v.over.length||v.under.length){\n    h+=`<b style=\"color:var(--closing)\">⚠ `;\n    if(v.over.length) h+=`acima do máximo: ${v.over.map(s=>s+' ('+fmt(sp[s])+')').join(', ')}`;\n    if(v.over.length&&v.under.length) h+=' · ';\n    if(v.under.length) h+=`abaixo do mínimo: ${v.under.map(s=>s+' ('+fmt(sp[s])+')').join(', ')}`;\n    h+=`</b>`;\n    if(mv.optTier===1) h+=`<br><span style=\"opacity:.85\">Nenhuma alocação conectada respeita o span mínimo nesta etapa — o modelo relaxou essa exigência.</span>`;\n    else if(mv.optTier===2) h+=`<br><span style=\"opacity:.85\">Nenhuma alocação conectada respeita os limites nesta etapa — o modelo relaxou essa exigência.</span>`;\n    else if(mv.optTier===-1) h+=`<br><span style=\"opacity:.85\">Etapa resolvida por heurística — os limites não são garantidos.</span>`;\n  } else h+=`<b style=\"color:var(--ok)\">✓ todos os setores receptores dentro dos limites</b>`;\n  el.innerHTML=`<div class=\"note\" style=\"margin:-2px 0 6px\">${h}</div>`;\n}\nfunction renderContig(){const mv=SESS.timeline[SESS.selected];const el=$('#contig');if(!el||!mv)return;\n  if(mv.view==='asis'){el.innerHTML='';return;}\n  const lvl=LEVELS[mv.level||'setor'];\n  // Indicador de conectividade geográfica só se aplica a fechamento de setor — ver contigBadFor.\n  if((mv.level||'setor')!=='setor'){ el.innerHTML=''; return; }\n  const bad=contigBadFor(mv,mv.assign);\n  el.innerHTML=bad.length\n    ?`<div class=\"note\" style=\"color:var(--closing);font-weight:600;margin:-2px 0 6px\">⚠ Território desconectado em ${bad.join(', ')} — ${lc(lvl.childLabel)}(s) desconectado(s) do território ${lvl.de} ${lc(lvl.label)}. Use ★ ÓTIMO ou reassocie no mapa.</div>`\n    :`<div class=\"note\" style=\"color:var(--ok);margin:-2px 0 6px\">✓ Sem quebras — cada ${lc(lvl.label)} forma uma região conectada.</div>`;\n}\nfunction closingCbsOf(mv){ return Object.entries(mv.munis).filter(([m])=>m!=='__OUTROS__').reduce((a,[,o])=>a+o.cbs,0); }\nfunction sectorTotalCbs(mv){ return Object.values(mv.munis).reduce((a,o)=>a+o.cbs,0); }\nfunction renderKpis(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const c=computeDerived(mv); const lvl=LEVELS[mv.level||'setor'];\n  const childPlural=lvl.childLabel==='Setor'?'Setores':(lvl.childLabel==='GV'?'GVs':'Municípios');\n  if(mv.view==='asis'){const mc=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__').length;\n    $('#kpis').innerHTML=[\n      {n:fmt(sectorTotalCbs(mv)),l:`CBs ${lvl.no} ${lc(lvl.label)} ${mv.sector} (antes desta etapa)`,t:`Total de CBs ${lvl.no} ${lc(lvl.label)} hoje — já considerando o que etapas anteriores da timeline mandaram pra cá.`},\n      {n:mv.csvMunisTotal?`${fmt(mc)}/${fmt(mv.csvMunisTotal)}`:fmt(mc),l:`${childPlural} ${lvl.de} ${lc(lvl.label)}`,t:`${lvl.childLabel}(s) desenhados nesta etapa${mv.csvMunisTotal?` de ${fmt(mv.csvMunisTotal)} que a base de dominantes atribui ${lvl.a} ${lc(lvl.label)}`:''}.${(mv.missingMunis||[]).length?' Fora do mapa: '+mv.missingMunis.map(x=>x.muni+' ('+x.reason+')').join(' · '):''}${Object.keys(mv.ufGuessed||{}).length?' UF inferida da UF dominante do setor (nome repetido em outra UF carregada): '+Object.entries(mv.ufGuessed).map(([nm,u])=>nm+'→'+u).join(', '):''}`},\n      {n:fmt(mv.leaders.length),l:'Líderes (grupos)',t:`Líderes presentes ${lvl.no} ${lc(lvl.label)} nesta etapa.`},\n      {n:fmt(mv.dest.length),l:`${lvl.destLabel}s adjacentes`,t:`${lvl.destLabel}s vizinh${lvl.destLabel==='GV'?'as':'os'} (ainda abertas)${lvl.parentPhrase?` ${lvl.parentPhrase}`:''}${mv.gv?` (${mv.gv})`:''} que poderiam receber os ${lc(lvl.childLabel)}s.${(mv.gvRejected||[]).length&&lvl.parentWord?' Fora do mapa, por serem de outr'+(lvl.parentWord==='gerência'?'a':'o')+' '+lvl.parentWord+': '+mv.gvRejected.join(', ')+'.':''}`},\n    ].map(k=>`<div class=\"kpi\" title=\"${k.t}\"><div class=\"n\">${k.n}</div><div class=\"l\">${k.l}</div></div>`).join('');\n    return;}\n  const sv=mv.dest.map(s=>c.span[s]);const spread=sv.length?Math.max(...sv)-Math.min(...sv):0;\n  const zero=mv.dest.filter(s=>c.gained[s]===0);const totCbs=closingCbsOf(mv);\n  $('#kpis').innerHTML=[\n    // \"CBs fora do X\" só faz sentido pra fechamento de setor — a mecânica de vínculo (CBs que\n    // seguem a líder pra fora do território) é uma coisa de setor/orphan, não de GV/mercado.\n    (mv.level||'setor')==='setor'?{n:fmt(c.desloc),l:mv.policy==='fora'?`CBs fora ${lvl.de} ${lc(lvl.destLabel)}`:'CBs c/ quebra de relação',cls:'warn',t:`CBs cuja líder acabou noutr${lvl.a==='à'?'a':'o'} ${lc(lvl.destLabel)} nesta etapa.`}:null,\n    {n:fmt(spread),l:'Desequilíbrio (máx−mín CBs)',cls:spread>800?'warn':'ok',t:`Diferença de tamanho entre ${lvl.destLabel==='GV'?'a maior e a menor':'o maior e o menor'} ${lc(lvl.destLabel)} depois desta etapa.`},\n    {n:fmt(totCbs),l:'CBs realocadas',cls:'',t:`Total de CBs ${lvl.de} ${lc(lvl.label)} ${mv.sector} sendo redistribuídas nesta etapa.`},\n    (mv.level||'setor')==='setor'?{n:zero.length?zero.join(', '):'nenhum',l:`${lvl.destLabel} sem líder herdada`,cls:zero.length?'warn':'ok',t:`${lvl.destLabel} que recebe ${lc(lvl.childLabel)}(s) mas nenhuma líder nesta etapa.`}:null,\n  ].filter(Boolean).concat(mv.excludedCbs?[{n:fmt(mv.excludedCbs),l:`CBs fora do setor · ${fmt(mv.excludedMunis.length)} município(s) fora da base`,cls:'warn',t:'CBs em municípios que a base de dominantes não atribui a este setor: ficam fora do mapa e da alocação geográfica e seguem a líder do seu grupo.'}]:[])\n   .concat((mv.missingMunis||[]).length?[{n:fmt(mv.missingMunis.length),l:`Município(s) da base fora do mapa · ${fmt(mv.csvMunisTotal)} na base`,cls:'warn',t:`A base de dominantes atribui ${fmt(mv.csvMunisTotal)} município(s) ao setor ${mv.sector} e ${fmt(mv.csvMunisTotal-mv.missingMunis.length)} chegaram ao mapa. Fora: ${mv.missingMunis.map(x=>x.muni+' — '+x.reason+(x.cbs?' ('+fmt(x.cbs)+' CBs)':'')).join(' · ')}`}]:[])\n   .map(k=>`<div class=\"kpi ${k.cls}\" title=\"${k.t}\"><div class=\"n\">${k.n}</div><div class=\"l\">${k.l}</div></div>`).join('');\n}\nfunction renderSpans(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const c=computeDerived(mv); const lvl=LEVELS[mv.level||'setor'];\n  if(mv.view==='asis'){const items=[{s:mv.sector,val:sectorTotalCbs(mv),color:CLOSE_COLOR}].concat(mv.dest.map(s=>({s,val:+(mv.baseMetrics[s]?.cbs||0),color:mv.color[s]})));\n    const max=Math.max(...items.map(x=>x.val),1);\n    $('#spans').innerHTML=items.map(x=>`<div class=\"bar-row\"><div class=\"tag\" style=\"color:${x.color}\">${x.s}</div><div class=\"bar-track\">\n      <div class=\"bar-inc\" style=\"width:${x.val/max*100}%;background:${x.color}\"></div></div>\n      <div class=\"bar-val\">${fmt(x.val)}</div></div>`).join('')\n      +`<div class=\"note\">Estrutura antes desta etapa — ${lvl.a} ${lc(lvl.label)} <b>${mv.sector}</b> ainda existe. Alterne pra <b>TOBE</b> pra ver a redistribuição.</div>`;\n    return;}\n  const lim=spanLimits(mv),on=spanLimitsOn(lim);\n  const rawMax=Math.max(...mv.dest.map(s=>c.span[s]),lim.target||0,lim.max||0,1);\n  const max=on?rawMax*1.04:rawMax;   // headroom so a marker sitting at the scale top stays visible\n  const marks='';\n  $('#spans').innerHTML=mv.dest.map(s=>{const base=+(mv.baseMetrics[s]?.cbs||0),i=c.inc[s];\n    const over=lim.max&&c.span[s]>lim.max,under=lim.min&&c.span[s]<lim.min;\n    return `<div class=\"bar-row\"><div class=\"tag\" style=\"color:${mv.color[s]}\">${s}</div><div class=\"bar-track\">\n      <div class=\"bar-base\" style=\"width:${base/max*100}%;background:${mv.color[s]}\"></div>\n      <div class=\"bar-inc\" style=\"width:${i/max*100}%;background:${mv.color[s]}\"></div>${marks}</div>\n      <div class=\"bar-val\" style=\"${over?'color:var(--closing);font-weight:700':(under?'color:#ff9500;font-weight:700':'')}\">${fmt(c.span[s])} <span style=\"opacity:.6\">(+${fmt(i)})</span>${over?' ▲':''}${under?' ▼':''}</div></div>`;}).join('')\n    +`<div class=\"note\">Claro = base (já incluindo etapas anteriores) · cheio = CBs entrantes ${lvl.de} ${mv.sector} nesta etapa.${c.orphanTotal?` Inclui <b>${fmt(c.orphanTotal-c.orphanStranded)}</b> CB(s) de municípios fora da base de dominantes que seguiram suas líderes.`:''}</div>`;\n}\n// Two very different reasons land rows in the __OUTROS__ bucket — no IBGE shape, or outside the\n// sector's dominance base. Same bucket computationally, but they must not read as the same thing.\nfunction outsideNote(mv){\n  const bits=[];\n  if(mv.noShapeCbs) bits.push(`<b>${fmt(mv.noShapeCbs)}</b> CBs em ${fmt(mv.noShapeMunis.length)} município(s) sem shape na UF`);\n  if(mv.excludedCbs) bits.push(`<b>${fmt(mv.excludedCbs)}</b> CBs em ${fmt(mv.excludedMunis.length)} município(s) <b>fora da base de dominantes</b> deste setor — <b style=\"color:var(--closing)\">quebra de vínculo</b>`);\n  if(!bits.length) return '';\n  let h=`<div class=\"note\">Fora do mapa e da alocação geográfica: ${bits.join(' · ')}.`;\n  if(mv.excludedCbs){\n    const c=computeDerived(mv);\n    h+=` As <b>${fmt(mv.excludedCbs)}</b> CBs em quebra de vínculo <b>seguem a líder do seu grupo</b>`;\n    const byS=mv.dest.filter(s=>c.orph[s]).map(s=>`<b style=\"color:${mv.color[s]}\">${s}</b> (${fmt(c.orph[s])})`);\n    h+=byS.length?`: ${byS.join(' · ')}.`:'.';\n    if(c.orphanStranded) h+=` <b style=\"color:var(--closing)\">${fmt(c.orphanStranded)} CB(s) sem destino</b> — a líder não ficou com nenhum município realocado, então não há setor pra seguir.`;\n  }\n  if(mv.noShapeCbs) h+=` As CBs sem shape na UF continuam fora de qualquer setor destino.`;\n  if(mv.excludedMunis&&mv.excludedMunis.length) h+=`<br><span style=\"opacity:.85\">${mv.excludedMunis.slice(0,8).map(x=>x.muni+' ('+fmt(x.cbs)+')').join(', ')}${mv.excludedMunis.length>8?' +'+(mv.excludedMunis.length-8):''}</span>`;\n  return h+`</div>`;\n}\nfunction renderMuni(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const lvl=LEVELS[mv.level||'setor'];\n  const plural=lvl.childLabel==='Setor'?'Setores':(lvl.childLabel==='GV'?'GVs':'Municípios');\n  const fem=lvl.childLabel==='GV';\n  const t=$('#muniListTitle'); if(t) t.textContent=`${plural} → ${lc(lvl.destLabel)} destino`;\n  const nt=$('#muniListNote'); if(nt) nt.innerHTML=`Clique no <b>código ${lvl.a} ${lc(lvl.destLabel)}</b> pra mandar ${lvl.a} ${lc(lvl.childLabel)} <b>inteir${fem?'a':'o'}</b> pra lá (regra de negócio). A cor acompanha o mapa.`;\n  const ms=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__').sort((a,b)=>mv.munis[b].cbs-mv.munis[a].cbs);\n  if(mv.view==='asis'){$('#muniList').innerHTML=ms.map(m=>`<div class=\"muni-item\"><div class=\"nm\">${m}</div><div class=\"ct\">${fmt(mv.munis[m].cbs)} CBs</div><span class=\"badge\" style=\"background:${CLOSE_COLOR};color:#fff;border-color:${CLOSE_COLOR}\">${lc(lvl.label)} ${mv.sector}</span></div>`).join('')\n      +`<div class=\"note\">Hoje tod${fem?'as':'os'} pertencem ${lvl.a} ${lc(lvl.label)} <b>${mv.sector}</b>. No <b>TOBE</b> cada um vira botões de destino.</div>`+outsideNote(mv);return;}\n  $('#muniList').innerHTML=ms.map(m=>`<div class=\"muni-item\"><div class=\"nm\">${m}</div><div class=\"ct\">${fmt(mv.munis[m].cbs)} CBs</div>\n    <div class=\"seg\" data-m=\"${m}\">${mv.dest.map(s=>`<button data-s=\"${s}\" class=\"${mv.assign[m]===s?'on':''}\" style=\"${mv.assign[m]===s?'background:'+mv.color[s]:''}\">${s}</button>`).join('')}</div></div>`).join('')\n    +outsideNote(mv);\n  $('#muniList').querySelectorAll('.seg button').forEach(b=>b.onclick=()=>{const m=b.parentElement.dataset.m,s=b.dataset.s;editSelected(m2=>{m2.assign[m]=s;});});\n}\nfunction renderLeaders(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const c=computeDerived(mv);\n  if(mv.view==='asis'){$('#leaders').innerHTML=`<thead><tr><th>Líder</th><th>Grupo</th><th>CBs</th><th>${LEVELS[mv.level||'setor'].label}</th></tr></thead><tbody>`\n    +mv.leaders.map(L=>`<tr><td>${(L.lider||'').split(' ').slice(0,2).join(' ')}</td><td>${L.grupo}</td><td>${fmt(L.total)}</td><td><span class=\"home\" style=\"background:${CLOSE_COLOR}\"></span>${mv.sector}</td></tr>`).join('')\n    +`<tr style=\"font-weight:700\"><td>TOTAL</td><td></td><td>${fmt(mv.leaders.reduce((a,L)=>a+L.total,0))}</td><td></td></tr></tbody>`;return;}\n  const showOrph=c.orphanTotal>0;\n  $('#leaders').innerHTML=`<thead><tr><th>Líder</th><th>CBs</th><th>Home</th>${mv.dest.map(s=>`<th>${s}</th>`).join('')}${showOrph?'<th title=\"CBs em municípios fora da base de dominantes que seguiram esta líder\">Fora do setor</th>':''}<th>Desloc.</th></tr></thead><tbody>`\n   +c.leaders.map(L=>`<tr><td>${(L.lider||'').split(' ').slice(0,2).join(' ')}</td><td>${fmt(L.total)}</td>\n     <td>${L.home?`<span class=\"home\" style=\"background:${mv.color[L.home]}\"></span>${L.home}`:'–'}</td>\n     ${mv.dest.map(s=>`<td class=\"cell\" style=\"${s===L.home?'color:'+mv.color[s]+';font-weight:700':''}\">${L.byS[s]||'·'}</td>`).join('')}\n     ${showOrph?`<td class=\"cell\" style=\"${L.orphan&&!L.orphanHome?'color:var(--closing);font-weight:700':''}\" title=\"${L.orphan?(L.orphanHome?'seguem a líder para o setor '+L.orphanHome:'sem home — CBs sem setor pra seguir'):''}\">${L.orphan?fmt(L.orphan)+(L.orphanHome?'':' ⚠'):'·'}</td>`:''}\n     <td style=\"color:${L.desloc?'var(--closing)':'var(--mut)'};font-weight:${L.desloc?700:400}\">${L.desloc||'0'}</td></tr>`).join('')\n   +`<tr style=\"font-weight:700\"><td>TOTAL</td><td>${fmt(c.leaders.reduce((a,L)=>a+L.total,0))}</td><td></td>${mv.dest.map(s=>`<td>${fmt(c.leaders.reduce((a,L)=>a+L.byS[s],0))}</td>`).join('')}${showOrph?`<td>${fmt(c.orphanTotal)}</td>`:''}<td style=\"color:var(--closing)\">${fmt(c.desloc)}</td></tr></tbody>`;\n}\nfunction renderMatrix(){const mv=SESS.timeline[SESS.selected]; if(!mv) return;\n  // Esta matriz cruza LINHAS DO CRM (município x grupo) — no fechamento de GV/mercado a unidade\n  // que troca de dono é setor/GV, não município, e reconstruir a matriz nesse grão é trabalho ainda\n  // não feito; mostrar a tabela como se fosse por município aqui daria linhas vazias sem avisar.\n  if((mv.level||'setor')!=='setor'){ $('#matrix').innerHTML=`<tr><td class=\"note\" style=\"padding:10px\">Matriz por município × grupo ainda não disponível pra fechamento de ${LEVELS[mv.level].label} — use os KPIs, líderes e plano de migração acima.</td></tr>`; return; }\n  const ms=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__').sort((a,b)=>mv.munis[b].cbs-mv.munis[a].cbs);\n  // `_out` is a flag stamped on the ROW, and rows are shared between etapas (absorbed + inherited\n  // orphans), so the last etapa to aggregate wins and reading it here can describe the wrong etapa.\n  // Derive the bucket from THIS mv instead. Summing rather than .find() because several out-municípios\n  // of the same group all collapse into __OUTROS__, and only the first was being counted.\n  const outOf=x=>!mv.geoFeat[mkey(x.municipio,x.uf)];\n  const cell=(m,g)=>mv.matrix.reduce((a,x)=>a+((((outOf(x)?'__OUTROS__':mkey(x.municipio,x.uf))===m)&&String(x.grupo)===g)?+x.cbs:0),0);\n  const mx=Math.max(...ms.flatMap(m=>mv.leaders.map(L=>cell(m,L.grupo))),1);\n  // No destination column here. This is the AS-IS matrix: every município in it still belongs to the\n  // closing sector, so showing where it is HEADED mixed the two states of the world in one table and\n  // made the ASIS view read like a plan. The destination lives on the map and in \"Municípios → setor\n  // destino\", which are about the to-be.\n  $('#matrix').innerHTML=`<thead><tr><th>Município</th>${mv.leaders.map(L=>`<th title=\"${L.lider}\">${L.grupo}</th>`).join('')}<th>Tot</th></tr></thead><tbody>`\n   +ms.map(m=>`<tr><td>${m}</td>`\n     +mv.leaders.map(L=>{const v=cell(m,L.grupo);return `<td class=\"cell\" style=\"${v?`background:rgba(229,181,63,${.08+v/mx*.5})`:''}\">${v||'·'}</td>`;}).join('')\n     +`<td style=\"font-weight:700\">${fmt(mv.munis[m].cbs)}</td></tr>`).join('')+`</tbody>`;\n}\n// TOBE counterpart of the AS-IS matrix: the same município × grupo grid plus the two columns the AS-IS\n// view deliberately refuses to carry — where the município ends up, and under which líder.\n// \"Líder resultante\" is the líder holding the most CBs in that município. A município is served by several\n// grupos at once and the data names no single owner, so the dominant one is the honest answer and its\n// share is printed beside it instead of being hidden behind a single name.\nfunction renderMatrixTobe(){const mv=SESS.timeline[SESS.selected]; const el=$('#matrixTobe'); const nt=$('#tobeNote');\n  if(!el) return;\n  if(!mv||!mv.munis){ el.innerHTML=''; if(nt) nt.innerHTML=''; return; }\n  if((mv.level||'setor')!=='setor'){ el.innerHTML=`<tr><td class=\"note\" style=\"padding:10px\">Matriz por município × grupo ainda não disponível pra fechamento de ${LEVELS[mv.level].label} — use os KPIs, líderes e plano de migração acima.</td></tr>`; if(nt) nt.innerHTML=''; return; }\n  const c=computeDerived(mv);\n  const homeOf={}; c.leaders.forEach(L=>{ homeOf[L.grupo]=L.home; });\n  const ms=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__').sort((a,b)=>mv.munis[b].cbs-mv.munis[a].cbs);\n  // One pass over the matrix instead of a scan per cell: the AS-IS table can afford the naive version\n  // on six municípios, but this one asks for the dominant líder too, which multiplies the lookups.\n  const outOf=x=>!mv.geoFeat[mkey(x.municipio,x.uf)];\n  const cellBy={}; mv.matrix.forEach(x=>{ const k=(outOf(x)?'__OUTROS__':mkey(x.municipio,x.uf))+'|'+String(x.grupo);\n    cellBy[k]=(cellBy[k]||0)+ +x.cbs; });\n  const cell=(m,g)=>cellBy[m+'|'+g]||0;\n  const mx=Math.max(...ms.flatMap(m=>mv.leaders.map(L=>cell(m,L.grupo))),1);\n  const domLeader=m=>{ let best=null,bc=0;\n    mv.leaders.forEach(L=>{ const v=cell(m,L.grupo); if(v>bc){ bc=v; best=L; } });\n    return best?{L:best,cbs:bc}:null; };\n  const short=L=>(L.lider||'').split(' ').slice(0,2).join(' ')||('grupo '+L.grupo);\n  // NOT named `rows` — that is the module-level Databricks response helper, and shadowing it inside a\n  // render function is a trap for whoever adds a query here later.\n  // Off-mismatch ainda calculado pra alimentar a nota abaixo da tabela — só não vira mais coluna: o\n  // destino agora é \"Setor destino\" por GRUPO no rodapé, não mais por município na grade.\n  const recs=ms.map(m=>{ const d=mv.assign[m]||null, dl=domLeader(m);\n    const home=dl?(homeOf[dl.L.grupo]||null):null;\n    return {m:m,off:!!(dl&&home&&d&&home!==d)}; });\n  el.innerHTML=`<thead><tr><th>Município</th>${mv.leaders.map(L=>`<th title=\"${esc(L.lider||'')}\">${L.grupo}<br><span style=\"font-weight:400;font-size:10px;color:var(--mut)\">${esc(short(L))}</span></th>`).join('')}<th>Tot</th></tr></thead><tbody>`\n   +ms.map(m=>`<tr><td>${m}</td>`\n     +mv.leaders.map(L=>{const v=cell(m,L.grupo);return `<td class=\"cell\" style=\"${v?`background:rgba(229,181,63,${.08+v/mx*.5})`:''}\">${v||'·'}</td>`;}).join('')\n     +`<td style=\"font-weight:700\">${fmt(mv.munis[m].cbs)}</td></tr>`).join('')\n   // Um rótulo de destino por GRUPO (coluna), não por município (linha) — cada grupo tem UM home\n   // fixo (computeDerived já calculou), então ele mora uma vez no rodapé, igual o nome já morava.\n   +`<tr class=\"lider-foot\"><td>Setor destino</td>`\n     +mv.leaders.map(L=>{const h=homeOf[L.grupo]; return `<td>${h?`<span class=\"home\" style=\"background:${mv.color[h]}\"></span>${h}`:'–'}</td>`;}).join('')\n     +`<td></td></tr>`\n   +`</tbody>`;\n  if(nt){\n    const offN=recs.filter(r=>r.off).length;\n    nt.innerHTML=(mv.policy!=='fora')\n      ? `Política <b>quebrar relação</b>: as CBs deixam a líder atual e passam à estrutura do setor destino — o rodapé mostra pra onde cada grupo vai.`\n      : `<b>Setor destino</b> = o setor que recebe a maior parte das CBs de cada líder (rodapé, uma vez por grupo). `\n        +(offN?`<span style=\"color:var(--closing)\">${fmt(offN)} município(s) ⚠</span> têm a líder dominante indo para um setor diferente do dela — as CBs seguem a líder (é disso que o KPI “CBs fora do setor” é feito).`\n          :`Em todos os municípios a líder dominante termina no mesmo setor que recebe o território.`);\n  }\n}\nfunction renderPolicy(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const c=computeDerived(mv); const lvl=LEVELS[mv.level||'setor'];\n  // O toggle fora-do-setor/quebra-de-relação é uma decisão de setor fechando — em GV/mercado a\n  // seção some inteira em vez de mostrar um controle que não corresponde a nada calculado.\n  const sec=$('#policySection'); if(sec) sec.classList.toggle('hidden',(mv.level||'setor')!=='setor');\n  if((mv.level||'setor')!=='setor') return;\n  $('#policyNote').innerHTML=mv.policy==='fora'\n    ?`<b style=\"color:var(--acc)\">Mantendo vínculo:</b> ${fmt(c.desloc)} CBs seguem com a líder mas ficam <b>fisicamente noutr${lvl.a==='à'?'a':'o'} ${lc(lvl.destLabel)}</b>. Preserva relação; suja geografia.`\n    :`<b style=\"color:var(--acc)\">Quebrando vínculo:</b> ${fmt(c.desloc)} CBs <b>re-vinculam a uma líder d${lvl.a==='à'?'a':'o'} ${lc(lvl.destLabel)} destino</b>. Geografia limpa; rompe relação.`;\n}\nfunction renderPlan(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const c=computeDerived(mv); const lvl=LEVELS[mv.level||'setor']; const ms=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__').sort((a,b)=>a.localeCompare(b));\n  // GV/mercado: a chave \"m\" aqui é um código de setor/GV, não uma chave município/UF — mName/mUf\n  // parseariam lixo, então o CSV de plano exporta o código cru nesses níveis.\n  mv._plan=ms.map(m=>(mv.level&&mv.level!=='setor')?{municipio:m,uf:'',cbs:mv.munis[m].cbs,destino:mv.assign[m]}:{municipio:mName(m),uf:mUf(m),cbs:mv.munis[m].cbs,destino:mv.assign[m]});\n  $('#plan').innerHTML=`Etapa ${SESS.selected+1} · ${lvl.label} <b>${mv.sector}</b> → ${ms.map(m=>`${m}→<b style=\"color:${mv.color[mv.assign[m]]}\">${mv.assign[m]||'–'}</b>`).join(' · ')}<br>\n   Política: <b>${mv.policy==='fora'?`manter vínculo (CBs fora ${lvl.de} ${lc(lvl.destLabel)})`:'quebrar relação'}</b> · ${fmt(c.desloc)} CBs impactadas nesta etapa.`\n   +(c.orphanTotal?`<br>Fora da base de dominantes: ${fmt(c.orphanTotal)} CB(s) seguem suas líderes — ${mv.dest.filter(s=>c.orph[s]).map(s=>`${s} (${fmt(c.orph[s])})`).join(' · ')||'–'}${c.orphanStranded?` · <b style=\"color:var(--closing)\">${fmt(c.orphanStranded)} sem líder com destino</b>`:''}. Não entram no CSV, que é por município.`:'');\n}\nfunction renderReport(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const c=computeDerived(mv);\n  mv.metric=mv.metric||'cbs';\n  const KEYS=METRICS_DEF.map(m=>m[0]);\n  const incBy={};mv.dest.forEach(s=>incBy[s]=Object.fromEntries(KEYS.map(k=>[k,0])));\n  Object.entries(mv.munis).forEach(([m,o])=>{if(m==='__OUTROS__')return;const s=mv.assign[m];if(!s||!incBy[s])return;KEYS.forEach(k=>incBy[s][k]+=o[k]||0);});\n  // orphan CBs land on their leader's home sector, not on a geographic destination\n  c.leaders.forEach(L=>{ const om=mv.orphanMetricsByGroup&&mv.orphanMetricsByGroup[L.grupo];\n    if(om&&L.home&&incBy[L.home]) KEYS.forEach(k=>incBy[L.home][k]+=om[k]||0); });\n  const closeTot={};KEYS.forEach(k=>closeTot[k]=Object.entries(mv.munis).filter(([m])=>m!=='__OUTROS__').reduce((a,[,o])=>a+(o[k]||0),0));\n  // they leave the closing sector too, so antes → depois still balances\n  c.leaders.forEach(L=>{ const om=mv.orphanMetricsByGroup&&mv.orphanMetricsByGroup[L.grupo];\n    if(om&&L.home) KEYS.forEach(k=>closeTot[k]+=om[k]||0); });\n  const trend=mv.trend.slice(-6);\n  const chartHTML=mk=>{\n    const isM=['receita','rec_nat','rec_avon'].includes(mk); const fN=isM?money:fmt;\n    const data=mv.dest.map(s=>({label:s,color:mv.color[s],antes:+(mv.baseMetrics[s]?.[mk]||0),depois:+(mv.baseMetrics[s]?.[mk]||0)+(incBy[s]?.[mk]||0)}));\n    data.push({label:mv.sector+'✕',color:'#ff3b30',antes:closeTot[mk]||0,depois:0});\n    const max=Math.max(...data.flatMap(d=>[d.antes,d.depois]),1);\n    const W=720,H=290,base=238,top=42,maxH=base-top,n=data.length,gw=(W-16)/n;\n    let g='';\n    data.forEach((d,i)=>{const cx=8+gw*i+gw/2,bw=Math.min(30,gw*0.30);\n      const ah=d.antes/max*maxH,dh=d.depois/max*maxH,ax=cx-bw-2,dx=cx+2;\n      g+=`<rect x=\"${ax.toFixed(1)}\" y=\"${(base-ah).toFixed(1)}\" width=\"${bw.toFixed(1)}\" height=\"${ah.toFixed(1)}\" rx=\"2.5\" fill=\"${d.color}\" opacity=\"0.35\"/>`;\n      g+=`<rect x=\"${dx.toFixed(1)}\" y=\"${(base-dh).toFixed(1)}\" width=\"${bw.toFixed(1)}\" height=\"${dh.toFixed(1)}\" rx=\"2.5\" fill=\"${d.color}\"/>`;\n      g+=`<text x=\"${(ax+bw/2).toFixed(1)}\" y=\"${(base-ah-4).toFixed(1)}\" text-anchor=\"middle\" font-size=\"9\" fill=\"#9a9aa8\">${fN(d.antes)}</text>`;\n      g+=`<text x=\"${(dx+bw/2).toFixed(1)}\" y=\"${(base-dh-4).toFixed(1)}\" text-anchor=\"middle\" font-size=\"9.5\" font-weight=\"700\" fill=\"${d.color}\">${fN(d.depois)}</text>`;\n      const dp=d.antes?((d.depois-d.antes)/d.antes*100):(d.depois?100:0);\n      g+=`<text x=\"${cx.toFixed(1)}\" y=\"16\" text-anchor=\"middle\" font-size=\"10.5\" font-weight=\"700\" fill=\"${dp>=0?'#34c759':'#ff3b30'}\">${dp>0?'+':''}${dp.toFixed(0)}%</text>`;\n      g+=`<text x=\"${cx.toFixed(1)}\" y=\"${base+16}\" text-anchor=\"middle\" font-size=\"10.5\" font-weight=\"700\" fill=\"#1c1c2b\">${d.label}</text>`;});\n    return `<svg viewBox=\"0 0 ${W} ${H}\" style=\"width:100%\"><line x1=\"8\" y1=\"${base}\" x2=\"${W-8}\" y2=\"${base}\" stroke=\"#e7e7ef\"/>${g}</svg>`;\n  };\n  let h=`<div style=\"display:flex;justify-content:space-between;align-items:center;gap:10px;flex-wrap:wrap\">\n      <h2 style=\"margin:0\">Impacto antes → depois desta etapa</h2>\n      <select id=\"metricSel\">${METRICS_DEF.map(m=>`<option value=\"${m[0]}\" ${m[0]===mv.metric?'selected':''}>${m[1]}</option>`).join('')}</select></div>\n    <div class=\"note\" style=\"margin:2px 0 4px\">Barra clara = <b>antes desta etapa</b> (já incluindo etapas anteriores) · barra cheia = <b>depois</b> · <b style=\"color:var(--acc)\">${mv.sector}✕</b> = ${lc(lvl.label)} fechad${lvl.a==='à'?'a':'o'} nesta etapa · % = variação</div>\n    ${chartHTML(mv.metric)}`;\n  h+=`<h2 style=\"margin-top:16px\">Antes → Depois por ${lc(lvl.destLabel)} receptor (snapshot congelado)</h2>\n    <div class=\"scroll\"><table><thead><tr><th>${lvl.destLabel}</th>${METRICS_DEF.map(m=>`<th>${m[1]}</th>`).join('')}</tr></thead><tbody>`;\n  mv.dest.forEach(s=>{const b=mv.baseMetrics[s]||{};const inc=incBy[s];\n    h+=`<tr><td><span class=\"home\" style=\"background:${mv.color[s]}\"></span>${s}</td>`+\n      METRICS_DEF.map(([k])=>{const bv=+b[k]||0,av=bv+(inc[k]||0);const d=bv?((av-bv)/bv*100):0;const f=METRICS_DEF.find(x=>x[0]===k)[2]==='$'?money:fmt;\n        return `<td>${f(av)}<div class=\"delta ${d>=0?'up':'dn'}\">${d>0?'+':''}${d.toFixed(0)}%</div></td>`;}).join('')+`</tr>`;});\n  h+=`<tr style=\"opacity:.8\"><td>${mv.sector} (sai)</td>`+METRICS_DEF.map(([k,,t])=>`<td>${(t==='$'?money:fmt)(closeTot[k]||0)}</td>`).join('')+`</tr>`;\n  h+=`</tbody></table></div>`;\n  const incLvl={};mv.dest.forEach(s=>incLvl[s]={});\n  Object.keys(mv.munis).forEach(m=>{if(m==='__OUTROS__')return;const s=mv.assign[m];if(!s||!incLvl[s])return;const lv=mv.levelByMuni[m]||{};for(const nv in lv)incLvl[s][nv]=(incLvl[s][nv]||0)+lv[nv];});\n  c.leaders.forEach(L=>{ const ol=mv.orphanLevelByGroup&&mv.orphanLevelByGroup[L.grupo];\n    if(ol&&L.home&&incLvl[L.home]) Object.entries(ol).forEach(([nv,n])=>incLvl[L.home][nv]=(incLvl[L.home][nv]||0)+n); });\n  h+=`<h2 style=\"margin-top:18px\">Consultoras por nível — antes → depois por ${lc(lvl.destLabel)} receptor</h2>\n    <div class=\"scroll\"><table><thead><tr><th>${lvl.destLabel}</th>${NIVEIS.map(n=>`<th>${n}</th>`).join('')}<th>Total</th></tr></thead><tbody>`;\n  mv.dest.forEach(s=>{const base=mv.baseLevel[s]||{},inc=incLvl[s]||{};let tb=0,ta=0;\n    h+=`<tr><td><span class=\"home\" style=\"background:${mv.color[s]}\"></span>${s}</td>`+\n      NIVEIS.map(nv=>{const b=base[nv]||0,i=inc[nv]||0,a=b+i;tb+=b;ta+=a;\n        return `<td>${a?fmt(a):'·'}${i?`<div class=\"delta up\">+${fmt(i)}</div>`:''}</td>`;}).join('')+\n      `<td style=\"font-weight:700\">${fmt(ta)}${ta-tb?`<div class=\"delta up\">+${fmt(ta-tb)}</div>`:''}</td></tr>`;});\n  h+=`</tbody></table></div><div class=\"note\">Número = CBs por nível <b>depois</b> desta etapa · <span style=\"color:var(--ok)\">+N</span> = entrantes do ${mv.sector}.</div>`;\n  const spk=(key)=>{const vals=trend.map(t=>+t[key]||0);const mx=Math.max(...vals,1);\n    return `<div class=\"spark\">${vals.map(v=>`<div class=\"b\" style=\"height:${(v/mx*100).toFixed(0)}%\" title=\"${fmt(v)}\"></div>`).join('')}</div>\n      <div class=\"note\">${trend.map(t=>String(t.ciclo).slice(-2)).join(' · ')}</div>`;};\n  h+=`<h2 style=\"margin-top:18px\">Setor ${mv.sector} — últimos ${trend.length} ciclos até o snapshot congelado</h2>\n    <div class=\"note\" style=\"margin:-4px 0 8px\">Tendência histórica <b>do próprio setor</b> — não ajustada pela absorção hipotética de etapas anteriores (limitação conhecida: tendência é por setor, não decomponível por município).</div>\n    <div style=\"display:grid;grid-template-columns:repeat(4,1fr);gap:10px\">\n    ${[['cbs','CBs'],['ativas','Ativas'],['receita','Receita'],['pontos','Pontos']].map(([k,l])=>`<div><div class=\"note\" style=\"margin:0 0 3px;font-weight:600;color:var(--ink)\">${l}</div>${spk(k)}</div>`).join('')}</div>`;\n  $('#tab-report').innerHTML=h;\n  const sel=$('#metricSel'); if(sel) sel.onchange=()=>{mv.metric=sel.value; renderReport();};\n}\nfunction renderCumulative(){\n  const el=$('#tab-cumulative'); if(!el) return;\n  // Esta view soma a cadeia inteira via foldWorldState().muniOverride/sectorBaseCache — hoje só\n  // populados pelo fechamento de setor. GV/mercado têm o rastro equivalente (secOverride/gvOverride),\n  // mas essa agregação ainda não foi refeita nesse grão; melhor avisar do que mostrar tabela vazia.\n  const lockLvl=SESS.timeline.length?(SESS.timeline[0].level||'setor'):'setor';\n  if(lockLvl!=='setor'){ el.innerHTML=`<div class=\"note\">Impacto acumulado da cadeia ainda não disponível pra sessões de ${lc(LEVELS[lockLvl].label)} — use o relatório da etapa (aba anterior) etapa a etapa.</div>`; return; }\n  if(!SESS.timeline.length){ el.innerHTML='<div class=\"note\">Nenhuma etapa na timeline ainda.</div>'; return; }\n  const ready=SESS.timeline.every(mv=>mv.munis);\n  if(!ready){ el.innerHTML='<div class=\"note\">Aguardando etapas terminarem de calcular…</div>'; return; }\n  const finalWorld=foldWorldState(SESS.timeline,SESS.timeline.length);\n  const openSectors=[...new Set(Object.values(finalWorld.muniOverride))];\n  let h=`<h2 style=\"margin:0 0 8px\">Linha do tempo — ${SESS.timeline.length} fechamento(s)</h2>\n    <div class=\"note\" style=\"margin:-2px 0 10px\">Setores fechados, em ordem: ${SESS.timeline.map(mv=>mv.sector).join(' → ')}. Cada linha abaixo soma o efeito de <b>toda a cadeia</b>, não apenas da última etapa.</div>`;\n  h+=`<div class=\"scroll\"><table><thead><tr><th>Setor</th><th>Situação</th>${METRICS_DEF.map(([,l])=>`<th>${l}</th>`).join('')}</tr></thead><tbody>`;\n  SESS.timeline.forEach((mv,i)=>{\n    h+=`<tr style=\"opacity:.75\"><td>${mv.sector}</td><td>fechado (etapa ${i+1})</td>`+METRICS_DEF.map(([k,,t])=>`<td>${(t==='$'?money:fmt)(mv.pureOwnMetrics?.[k]||0)}</td>`).join('')+`</tr>`;\n  });\n  openSectors.forEach(s=>{\n    const base=SESS.sectorBaseCache[s]||{};\n    const infl=finalWorld.sectorInflow[s]||{};\n    h+=`<tr><td>${s}</td><td>recebeu território</td>`+METRICS_DEF.map(([k,,t])=>{\n      const bv=+base[k]||0, av=bv+(infl[k]||0); const d=bv?((av-bv)/bv*100):0; const f=(t==='$'?money:fmt);\n      return `<td>${f(av)}<div class=\"delta ${d>=0?'up':'dn'}\">${d>0?'+':''}${d.toFixed(0)}%</div></td>`;\n    }).join('')+`</tr>`;\n  });\n  h+=`</tbody></table></div><div class=\"note\">\"Antes\" de um setor receptor é o snapshot congelado (sem nenhum fechamento aplicado); \"depois\" soma tudo que a cadeia inteira jogou pra ele.</div>`;\n  el.innerHTML=h;\n}\nfunction project(feats){let mnx=1/0,mny=1/0,mxx=-1/0,mxy=-1/0;\n  const each=cb=>feats.forEach(f=>{const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];ps.forEach(p=>p.forEach(r=>r.forEach(cb)));});\n  each(p=>{mnx=Math.min(mnx,p[0]);mxx=Math.max(mxx,p[0]);mny=Math.min(mny,p[1]);mxy=Math.max(mxy,p[1]);});\n  const mlat=(mny+mxy)/2,kx=Math.cos(mlat*Math.PI/180),W=700,H=500,pad=22;\n  const gw=(mxx-mnx)*kx,gh=(mxy-mny),sc=Math.min((W-2*pad)/gw,(H-2*pad)/gh);\n  const ox=(W-gw*sc)/2,oy=(H-gh*sc)/2;\n  return p=>[ox+(p[0]-mnx)*kx*sc, oy+(mxy-p[1])*sc];\n}\nfunction pathFor(f,pr){const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];\n  return ps.map(poly=>poly.map(r=>'M'+r.map(p=>{const q=pr(p);return q[0].toFixed(1)+','+q[1].toFixed(1);}).join('L')+'Z').join('')).join('');}\nfunction cxy(f,pr){let x=0,y=0,n=0;const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];ps.forEach(poly=>poly[0].forEach(p=>{const q=pr(p);x+=q[0];y+=q[1];n++;}));return[x/n,y/n];}\n// ---------- label placement ----------\n// Pole of inaccessibility: the interior point farthest from ANY boundary of the dissolved area. A\n// centroid is only a mean — on a concave sector, one split across a river, or a member whose vertex\n// average falls in a bay, it lands outside the very territory it is supposed to name, which is what\n// pushed the sector numbers off their own shapes. Even-odd across every ring of every member is a\n// correct union test here because municipalities tile rather than overlap.\n// The search box is clipped to the viewBox, so the result is inside the territory AND on screen.\n// Rings are decimated first — this is a label, not a measurement — which keeps a 20-município sector\n// to a few million ops, and the result is cached per stage: geometry never changes between renders,\n// only the fill does.\nfunction labelPointFor(fs,pr){\n  const rings=[];\n  (fs||[]).forEach(f=>{ if(!f||!f.geometry) return;\n    const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];\n    ps.forEach(poly=>poly.forEach(r=>{\n      if(!r||r.length<4) return;\n      const step=Math.max(1,Math.floor(r.length/120)),pts=[];\n      for(let i=0;i<r.length;i+=step) pts.push(pr(r[i]));\n      if(pts.length>3) rings.push(pts);\n    }));});\n  if(!rings.length) return null;\n  let mnx=1/0,mny=1/0,mxx=-1/0,mxy=-1/0;\n  rings.forEach(r=>r.forEach(p=>{ if(p[0]<mnx)mnx=p[0]; if(p[0]>mxx)mxx=p[0]; if(p[1]<mny)mny=p[1]; if(p[1]>mxy)mxy=p[1]; }));\n  mnx=Math.max(mnx,2); mny=Math.max(mny,2); mxx=Math.min(mxx,698); mxy=Math.min(mxy,498);\n  if(!(mxx>mnx&&mxy>mny)) return null;\n  const inside=(x,y)=>{ let c=false;\n    for(const r of rings) for(let i=0,j=r.length-1;i<r.length;j=i++){ const a=r[i],b=r[j];\n      if(((a[1]>y)!==(b[1]>y)) && (x<(b[0]-a[0])*(y-a[1])/(b[1]-a[1])+a[0])) c=!c; }\n    return c; };\n  const edgeDist=(x,y)=>{ let m=Infinity;\n    for(const r of rings) for(let i=0,j=r.length-1;i<r.length;j=i++){ const a=r[i],b=r[j];\n      const dx=b[0]-a[0],dy=b[1]-a[1],L=dx*dx+dy*dy;\n      let t=L?(((x-a[0])*dx+(y-a[1])*dy)/L):0; t=t<0?0:(t>1?1:t);\n      const ex=a[0]+t*dx-x,ey=a[1]+t*dy-y,d=ex*ex+ey*ey; if(d<m)m=d; }\n    return Math.sqrt(m); };\n  const W=mxx-mnx,H=mxy-mny,N=26;\n  let best=null,bd=-1;\n  for(let i=0;i<=N;i++) for(let j=0;j<=N;j++){\n    const x=mnx+W*i/N,y=mny+H*j/N;\n    if(!inside(x,y)) continue;\n    const d=edgeDist(x,y); if(d>bd){ bd=d; best=[x,y]; }\n  }\n  if(!best) return null;\n  // Hill-climb off the coarse grid: the grid only has to land somewhere in the right lobe, the\n  // refinement finds the deep point inside it — halving the step whenever no neighbour improves.\n  let step=Math.max(W,H)/N/2;\n  for(let k=0;k<7;k++){\n    let moved=false;\n    for(const o of [[1,0],[-1,0],[0,1],[0,-1],[1,1],[1,-1],[-1,1],[-1,-1]]){\n      const x=best[0]+o[0]*step,y=best[1]+o[1]*step;\n      if(x<mnx||x>mxx||y<mny||y>mxy||!inside(x,y)) continue;\n      const d=edgeDist(x,y); if(d>bd){ bd=d; best=[x,y]; moved=true; }\n    }\n    if(!moved) step/=2;\n  }\n  // The clearance travels with the point: it is the radius of the largest circle that fits inside the\n  // territory there, which is exactly the budget a caller needs to decide how much text will fit.\n  return {p:best,r:bd};\n}\nfunction labelPointOf(mv,key,fs,pr){\n  if(!mv._lbl) mv._lbl={};\n  if(!(key in mv._lbl)) mv._lbl[key]=labelPointFor(fs,pr);\n  return mv._lbl[key];\n}\n// ---------- map zoom/pan ----------\n// Zoom é feito manipulando o viewBox, nunca um transform CSS — assim rótulos e polígonos vivem no\n// MESMO sistema de coordenadas e escalam juntos automaticamente (texto tem font-size em unidades do\n// viewBox, então encolher o viewBox amplia tudo por igual, sem lógica extra pro tamanho da fonte).\nconst MAP_W=700, MAP_H=500, MAP_ZOOM_MAX=8;\nlet mapView={x:0,y:0,w:MAP_W,h:MAP_H};\nfunction applyMapView(){\n  const svg=$('#map'); if(!svg) return;\n  svg.setAttribute('viewBox', mapView.x.toFixed(2)+' '+mapView.y.toFixed(2)+' '+mapView.w.toFixed(2)+' '+mapView.h.toFixed(2));\n  // Rótulo tem font-size em unidades do viewBox, então sem isso ele cresceria junto com o zoom até\n  // virar um borrão — encolhendo o font-size na mesma proporção que o viewBox encolhe cancela\n  // exatamente o zoom, e o texto fica do MESMO tamanho na tela em qualquer nível de zoom.\n  const fsScale=mapView.w/MAP_W;\n  svg.querySelectorAll('text[data-fs]').forEach(t=>{\n    const base=+t.getAttribute('data-fs')||8;\n    t.setAttribute('font-size',(base*fsScale).toFixed(2));\n  });\n  // Mesmo raciocínio pro halo do texto e pro fio que liga um rótulo deslocado ao seu município —\n  // os dois têm largura de traço fixa em unidades do viewBox, então sem reescalar iam virar uma\n  // mancha grossa (halo) ou uma barra (fio) no zoom alto em vez de ficarem do mesmo tamanho na tela.\n  svg.querySelectorAll('[data-sw]').forEach(el=>{\n    const base=+el.getAttribute('data-sw')||1;\n    el.style.strokeWidth=(base*fsScale).toFixed(3)+'px';\n  });\n}\nfunction zoomMapBy(factor){\n  const cx=mapView.x+mapView.w/2, cy=mapView.y+mapView.h/2;\n  let w=mapView.w/factor, h=mapView.h/factor;\n  w=Math.min(MAP_W, Math.max(MAP_W/MAP_ZOOM_MAX, w));\n  h=Math.min(MAP_H, Math.max(MAP_H/MAP_ZOOM_MAX, h));\n  let x=cx-w/2, y=cy-h/2;\n  x=Math.min(MAP_W-w, Math.max(0,x));\n  y=Math.min(MAP_H-h, Math.max(0,y));\n  mapView={x,y,w,h};\n  applyMapView();\n}\n// Arrastar sempre fica DENTRO do canvas de 700x500 (clamp em [0, MAP_W-w] / [0, MAP_H-h]) — nunca\n// existe um x/y que deixa o viewBox parcialmente fora da área com conteúdo, então o mapa nunca\n// \"some\" da tela, só pode chegar até a borda do que existe pra ver.\nlet mapDrag=null, mapDidDrag=false;\nfunction mapPointerDown(e){\n  const svg=$('#map'); if(!svg) return;\n  mapDrag={x0:e.clientX,y0:e.clientY,vx0:mapView.x,vy0:mapView.y,rect:svg.getBoundingClientRect()};\n  mapDidDrag=false;\n  svg.classList.add('dragging');\n  // NÃO setPointerCapture aqui: capturar o ponteiro no <svg> reencaminha o click resultante pro\n  // próprio <svg> em vez do <path> do município embaixo do cursor — todo clique parava de chegar\n  // no onclick de reatribuição, não só depois de um arrasto de verdade. move/up escutam em `root`\n  // (nunca substituído por renderAll) em vez de no <svg>, então o arrasto continua funcionando\n  // mesmo se o ponteiro sair da área do mapa no meio do gesto.\n}\nfunction mapPointerMove(e){\n  if(!mapDrag) return;\n  const dxPix=e.clientX-mapDrag.x0, dyPix=e.clientY-mapDrag.y0;\n  if(!mapDidDrag && Math.hypot(dxPix,dyPix)>4) mapDidDrag=true;\n  if(!mapDrag.rect.width||!mapDrag.rect.height) return;\n  const sx=mapView.w/mapDrag.rect.width, sy=mapView.h/mapDrag.rect.height;\n  let x=mapDrag.vx0-dxPix*sx, y=mapDrag.vy0-dyPix*sy;\n  x=Math.min(MAP_W-mapView.w, Math.max(0,x));\n  y=Math.min(MAP_H-mapView.h, Math.max(0,y));\n  mapView={...mapView,x,y};\n  applyMapView();\n}\nfunction mapPointerUp(){\n  if(!mapDrag) return;\n  mapDrag=null;\n  const svg=$('#map'); if(svg) svg.classList.remove('dragging');\n}\nfunction drawMap(){\n  const mv=SESS.timeline[SESS.selected]; const svg=$('#map'); const ignNote=$('#mapIgnoredNote');\n  if(!mv){ svg.innerHTML=''; if(ignNote) ignNote.innerHTML=''; return; }\n  const level=mv.level||'setor';\n  // setor fecha: a unidade É o município. GV/mercado fecham: cada município herda a atribuição do\n  // setor/GV a que pertence — municípios do mesmo setor sempre têm a MESMA cor e giram JUNTOS no\n  // clique, porque é o setor inteiro (não o município) que troca de dono nesses níveis.\n  const unitAssign=m=>level==='setor'?mv.assign[m]:mv.assign[(mv.unitOfMuni||{})[m]];\n  const c=computeDerived(mv);const NS='http://www.w3.org/2000/svg'; svg.innerHTML='';\n  const feats=[...mv.nbrFeat,...Object.values(mv.geoFeat)]; if(!feats.length) return;\n  const pr=project(feats);\n  const world=foldWorldState(SESS.timeline,SESS.selected);\n  // The context layer is ONE area per SECTOR, not one shape per município. The unit of this decision\n  // is the destination sector; a scatter of individually outlined municipalities carrying their own\n  // names invited exactly the wrong reading of the map. Members of a sector are filled AND stroked in\n  // the same colour, so the shared borders vanish and the group reads as a single dissolved\n  // territory — the IBGE shapes do not share vertices precisely enough to extract a clean union\n  // outline, and carrying a real polygon-clipping union for a context layer is not worth it.\n  // Labels are COLLECTED here and drawn last, after every path. Drawn inline they were buried by the\n  // next sector's fill, and placement cannot avoid a collision it has not seen yet.\n  const labels=[],placed=[];\n  const textW=(s,fs)=>String(s).length*fs*0.56;\n  // WCAG relative luminance of the fill a label sits on, so ink and halo can invert per label. \"Would\n  // white be better?\" has no single answer on this map: white reads on #5856d6 (L≈0.14) and disappears\n  // on #ff9500 and #34c759 (both L≈0.43, where black wins ~9:1 against white's ~2.2:1) and on every\n  // context fill, which is .32 opacity over white. Decided per label, never globally.\n  const lum=col=>{let h=String(col||'').replace('#','');\n    if(h.length===3) h=h[0]+h[0]+h[1]+h[1]+h[2]+h[2];\n    if(h.length!==6) return 1;\n    const c=[0,2,4].map(i=>parseInt(h.slice(i,i+2),16)/255)\n      .map(v=>v<=0.03928?v/12.92:Math.pow((v+0.055)/1.055,2.4));\n    return 0.2126*c[0]+0.7152*c[1]+0.0722*c[2];};\n  // Centred on (x,y) in BOTH axes. The old box hung off the first line's baseline, so every two-line\n  // label sat half its own height below the point it was supposed to mark.\n  const rectOf=(x,y,lines)=>{const w=Math.max.apply(null,lines.map(l=>textW(l.t,l.size)));\n    const h=lines.reduce((a,l)=>a+l.size*1.2,0);\n    return {x1:x-w/2-2.5,x2:x+w/2+2.5,y1:y-h/2-1.5,y2:y+h/2+1.5};};\n  const nbrBySec={};\n  mv.nbrFeat.forEach(f=>{\n    const nm=mkey(f.properties.name||f.properties.NOME||f.properties.nome||'',f.__uf);\n    const s=String((mv.nbrCurrentSector&&mv.nbrCurrentSector[nm])||'');\n    (nbrBySec[s]=nbrBySec[s]||[]).push(f);\n  });\n  Object.keys(nbrBySec).forEach(s=>{\n    const fs=nbrBySec[s];\n    const isDest=!!s&&mv.dest.includes(s);\n    const closedCtx=!!s&&world.closedSectors.has(s);\n    const col=isDest?(mv.color[s]||null):null;\n    fs.forEach(f=>{\n      const p=document.createElementNS(NS,'path');\n      p.setAttribute('d',pathFor(f,pr));\n      p.setAttribute('class','sect'+(isDest?'':(closedCtx?' closed-ctx':' plain')));\n      if(col){ p.setAttribute('fill',col); p.setAttribute('stroke',col); }\n      svg.appendChild(p);\n    });\n    if(!s) return;\n    // One number per sector, at the pole of inaccessibility of its DISSOLVED area — the whole group\n    // of members at once, not a representative member, so the number sits in the visual middle of the\n    // territory the operator actually sees.\n    const lp=labelPointOf(mv,'s:'+s,fs,pr);\n    // Context areas always read LIGHT — .sect paints dest colours at fill-opacity .32 over white, and\n    // plain/closed-ctx are near-white greys — so a sector number never wants white ink, whatever colour\n    // the sector itself was assigned.\n    if(lp&&lp.p) labels.push({anchor:lp.p,big:true,dark:false,lines:[{t:s,size:11.5,weight:700}]});\n  });\n  const asis=mv.view==='asis';\n  // The UF prefix is information only when the stage actually straddles a border. On a single-UF setor\n  // it is the same three characters repeated on every label — a large share of the clutter and none of\n  // the meaning. The hover tooltip carries the UF either way.\n  const showUf=new Set(Object.keys(mv.geoFeat).map(k=>mUf(k)).filter(Boolean)).size>1;\n  if(level==='setor'){\n    // Setor fechando: a UNIDADE é o próprio município — cada um se comporta, colore e rotula\n    // individualmente, exatamente como sempre foi.\n    Object.entries(mv.geoFeat).forEach(([m,f])=>{const p=document.createElementNS(NS,'path');p.setAttribute('d',pathFor(f,pr));\n      const fillCol=asis?CLOSE_COLOR:(mv.color[unitAssign(m)]||'#444');\n      p.setAttribute('class','muni');p.setAttribute('fill',fillCol);\n      if(!asis) p.onclick=()=>{editSelected(m2=>{const i=m2.dest.indexOf(m2.assign[m]);if(m2.dest.length)m2.assign[m]=m2.dest[(i+1)%m2.dest.length];m2.selMuni=m;});};\n      p.style.cursor=asis?'default':'pointer';\n      p.onmousemove=e=>{const t=$('#tip');t.style.opacity=1;t.style.left=(e.clientX+12)+'px';t.style.top=(e.clientY+12)+'px';\n        t.innerHTML=asis?`<b>${mDisp(m)}</b><br>${fmt(mv.cbsByMuni[m]||0)} CBs · setor ${mv.sector}`:`<b>${mDisp(m)}</b><br>${fmt(mv.cbsByMuni[m]||0)} CBs → ${unitAssign(m)||'–'}<br><span style=\"color:var(--mut)\">clique p/ trocar</span>`;};\n      p.onmouseleave=()=>$('#tip').style.opacity=0;svg.appendChild(p);\n      const lp=labelPointOf(mv,'m:'+m,[f],pr);\n      const at=(lp&&lp.p)||cxy(f,pr);\n      const nmFull=(showUf&&mUf(m)?mUf(m)+'-':'')+mName(m);\n      const num=fmt(mv.cbsByMuni[m]||0)+(asis?'':'·'+(unitAssign(m)||'–'));\n      labels.push({anchor:at,cbs:+(mv.cbsByMuni[m]||0),dark:lum(fillCol)<0.18,\n        lines:[{t:nmFull,size:8.2,weight:700},{t:num,size:7,weight:500,mut:true}]});\n    });\n  } else {\n    // GV/mercado fechando: a UNIDADE é o setor (ou a GV) inteiro, nunca o município isolado —\n    // vários municípios do mesmo setor têm de ler como UMA área só, nunca como municípios separados\n    // que por acaso têm a mesma cor. Mesmo truque do contexto vizinho logo acima: stroke = fill via\n    // estilo inline (uma regra de classe como .muni{stroke:#fff} outrank­aria um atributo stroke\n    // comum, então a costura entre membros só some setando o style direto) — e UM rótulo só por\n    // unidade, no ponto de inacessibilidade da área dissolvida, nunca um rótulo por município.\n    Object.entries(mv.unitMunis||{}).forEach(([u,ms])=>{\n      const fillCol=asis?CLOSE_COLOR:(mv.color[mv.assign[u]]||'#444');\n      const feats=ms.map(m=>mv.geoFeat[m]).filter(Boolean);\n      // Todo município deste u é UMA unidade só na tela — passar o mouse sobre qualquer pedaço tem\n      // que acender o grupo inteiro, não só o pedaço que o cursor está tocando. :hover no CSS só\n      // sabe acender o próprio <path>; o grupo inteiro precisa de JS guardando os irmãos.\n      const els=[];\n      ms.forEach(m=>{\n        const f=mv.geoFeat[m]; if(!f) return;\n        const p=document.createElementNS(NS,'path');p.setAttribute('d',pathFor(f,pr));\n        p.setAttribute('class','muni');p.setAttribute('fill',fillCol);p.style.stroke=fillCol;\n        els.push(p);\n        if(!asis) p.onclick=()=>{editSelected(m2=>{const i=m2.dest.indexOf(m2.assign[u]);if(m2.dest.length)m2.assign[u]=m2.dest[(i+1)%m2.dest.length];m2.selMuni=u;});};\n        p.style.cursor=asis?'default':'pointer';\n        p.onmouseenter=()=>{ els.forEach(e=>e.classList.add('munihl')); };\n        p.onmousemove=e=>{const t=$('#tip');t.style.opacity=1;t.style.left=(e.clientX+12)+'px';t.style.top=(e.clientY+12)+'px';\n          t.innerHTML=asis?`<b>${LEVELS[level].childLabel} ${u}</b><br>${fmt(mv.munis[u]?.cbs||0)} CBs · ${LEVELS[level].label} ${mv.sector}`:`<b>${LEVELS[level].childLabel} ${u}</b><br>${fmt(mv.munis[u]?.cbs||0)} CBs → ${mv.assign[u]||'–'}<br><span style=\"color:var(--mut)\">clique p/ trocar</span>`;};\n        p.onmouseleave=()=>{ els.forEach(e=>e.classList.remove('munihl')); $('#tip').style.opacity=0; };svg.appendChild(p);\n      });\n      const lp=labelPointOf(mv,'u:'+u,feats,pr);\n      const at=(lp&&lp.p)||(feats[0]&&cxy(feats[0],pr));\n      if(at){\n        const num=fmt(mv.munis[u]?.cbs||0)+(asis?'':'·'+(mv.assign[u]||'–'));\n        labels.push({anchor:at,big:true,cbs:+(mv.munis[u]?.cbs||0),dark:lum(fillCol)<0.18,\n          lines:[{t:`${LEVELS[level].childLabel} ${u}`,size:9,weight:700},{t:num,size:7.5,weight:500,mut:true}]});\n      }\n    });\n  }\n  // Placement, not de-cluttering. Every label IS drawn: it starts at its anchor and, if the text does\n  // not fit the territory or the slot is already taken, walks outward ring by ring until it finds\n  // clear canvas, trailing a hairline leader back to the shape it names. The previous pass dropped the\n  // loser of every collision outright, which is why municípios silently had no name at all.\n  // Order still matters — sector numbers first, then municípios by CB weight — because the earlier a\n  // label is placed the closer to home it lands.\n  const CW=700,CH=500,CPAD=2;\n  const inBounds=r=>r.x1>=CPAD&&r.x2<=CW-CPAD&&r.y1>=CPAD&&r.y2<=CH-CPAD;\n  const hits=r=>placed.reduce((a,q)=>a+((r.x2<q.x1||r.x1>q.x2||r.y2<q.y1||r.y1>q.y2)?0:1),0);\n  // Ring 0 is the anchor itself. Rings step 9u out over 16 directions, stretched horizontally because\n  // a label is wider than it is tall and sideways room is the room it actually needs.\n  const CAND=[[0,0]];\n  for(let ring=1;ring<=7;ring++){ const d=ring*9;\n    for(let a=0;a<16;a++){ const th=a*Math.PI/8; CAND.push([Math.cos(th)*d*1.35,Math.sin(th)*d]); } }\n  labels.sort((a,b)=>(b.big?1:0)-(a.big?1:0)||((b.cbs||0)-(a.cbs||0)));\n  labels.forEach(L=>{\n    let chosen=null,best=null,bestN=Infinity;\n    // Centred on the anchor is ALWAYS the first choice. An earlier cut here refused the anchor whenever\n    // the text was wider than the município's inscribed circle — true of almost every real name at this\n    // scale (BA-SAO SEBASTIAO DO PASSE is ~140u against ~80u of clearance), so every single label got\n    // nudged outside and nothing ended up centred on anything. Spilling past a border is normal on a\n    // choropleth and the halo keeps it readable; only a genuine COLLISION earns a move.\n    for(const off of CAND){\n      const x=L.anchor[0]+off[0], y=L.anchor[1]+off[1];\n      const r=rectOf(x,y,L.lines);\n      if(!inBounds(r)) continue;\n      const n=hits(r);\n      if(!n){ chosen={x,y,r,off}; break; }\n      // No clear slot yet — remember the LEAST crowded one. Falling back to the first in-bounds\n      // candidate meant falling back to the anchor every time, so a crowded map piled every loser onto\n      // the same point. CAND is ordered nearest-first and the compare is strict, so ties keep the\n      // closest slot.\n      if(n<bestN){ bestN=n; best={x,y,r,off}; }\n    }\n    // Canvas genuinely full: take the nearest in-bounds slot and accept the overlap. A label sitting\n    // on top of another is recoverable by eye; a name that was never drawn is not.\n    if(!chosen) chosen=best||{x:L.anchor[0],y:L.anchor[1],r:rectOf(L.anchor[0],L.anchor[1],L.lines),off:[0,0]};\n    placed.push(chosen.r);\n    const g=document.createElementNS(NS,'g'); g.setAttribute('class','lbl'+(L.big?' big':''));\n    if(Math.abs(chosen.off[0])>0.5||Math.abs(chosen.off[1])>0.5){\n      // The leader stops at the label's edge rather than its centre, so it never runs under the glyphs.\n      const cx=(chosen.r.x1+chosen.r.x2)/2, cy=(chosen.r.y1+chosen.r.y2)/2;\n      const hw=(chosen.r.x2-chosen.r.x1)/2, hh=(chosen.r.y2-chosen.r.y1)/2;\n      const dx=L.anchor[0]-cx, dy=L.anchor[1]-cy;\n      const tt=Math.min(dx?hw/Math.abs(dx):Infinity, dy?hh/Math.abs(dy):Infinity);\n      const ln=document.createElementNS(NS,'line'); ln.setAttribute('class','lead');\n      ln.style.stroke=L.dark?'#fff':'#1c1c1e';\n      // A largura do fio também é fixa em unidades do viewBox, igual o halo do texto — sem\n      // reescalar junto, no zoom alto ela vira uma barra grossa em vez de um fio fino.\n      ln.setAttribute('data-sw','0.8'); ln.style.strokeWidth='0.8px';\n      ln.setAttribute('x1',L.anchor[0].toFixed(1)); ln.setAttribute('y1',L.anchor[1].toFixed(1));\n      ln.setAttribute('x2',(cx+dx*tt).toFixed(1)); ln.setAttribute('y2',(cy+dy*tt).toFixed(1));\n      g.appendChild(ln);\n    }\n    const hTot=L.lines.reduce((a,l)=>a+l.size*1.2,0);\n    let ty=chosen.y-hTot/2+L.lines[0].size*0.86;\n    // Inline style rather than a class: a stylesheet rule would outrank a presentation attribute and\n    // undo the per-label contrast decision made above.\n    const ink=L.dark?'#fff':'#1c1c1e', inkMut=L.dark?'rgba(255,255,255,.85)':'#48484d';\n    const halo=L.dark?'rgba(0,0,0,.6)':'#fff';\n    // Halo do texto (o \"contorno\" que garante legibilidade sobre qualquer cor de fundo) também é\n    // fixo em unidades do viewBox via .lbl text{stroke-width}/.lbl.big text{stroke-width} — sem\n    // reescalar junto com o font-size, no zoom alto ele vira uma mancha escura cobrindo a letra\n    // inteira em vez de um contorno fino, exatamente o \"Setor 3570\" ilegível reportado.\n    const swBase=L.big?2.9:2.2;\n    L.lines.forEach(l=>{ const t=document.createElementNS(NS,'text');\n      t.setAttribute('x',chosen.x.toFixed(1)); t.setAttribute('y',ty.toFixed(1));\n      t.setAttribute('font-size',l.size); t.setAttribute('data-fs',l.size); t.setAttribute('font-weight',l.weight||600);\n      t.setAttribute('data-sw',swBase); t.style.strokeWidth=swBase+'px';\n      t.style.fill=l.mut?inkMut:ink; t.style.stroke=halo;\n      t.textContent=l.t; g.appendChild(t); ty+=l.size*1.2; });\n    svg.appendChild(g);\n  });\n  $('#legend').innerHTML=asis\n    ?`<span><b style=\"background:${CLOSE_COLOR}\"></b>${LEVELS[level].label} ${mv.sector} (estrutura antes desta etapa — ${level==='setor'?Object.keys(mv.geoFeat).length+' municípios':Object.keys(mv.unitMunis||{}).length+' '+LEVELS[level].childLabel.toLowerCase()+'(s)'})</span>`\n    // No \"vizinhos (contexto)\" or \"setor já fechado antes\" entry any more: every feature still drawn\n    // belongs to a destination sector, so .sect.plain and .sect.closed-ctx can no longer be produced\n    // and a legend key for them would point at nothing on the map.\n    :mv.dest.map(s=>`<span><b style=\"background:${mv.color[s]}\"></b>${LEVELS[level].destLabel} ${s} — ${c.gained[s]} líder(es)</span>`).join('');\n  // Municipalities outside the dominance base are deliberately NOT drawn — no shape, no hover, no\n  // legend entry. They are reported in the panel instead, so the map only ever shows territory that\n  // is actually being reallocated.\n  if(ignNote) ignNote.innerHTML=(mv.excludedMunis&&mv.excludedMunis.length)\n    ? `<b style=\"color:var(--closing)\">${fmt(mv.excludedMunis.length)} município(s) / ${fmt(mv.excludedCbs||0)} CBs</b> fora da base de dominantes deste setor não são desenhados no mapa — as CBs seguem a líder do seu grupo (detalhe em “Municípios → setor destino”).`\n    : '';\n  applyMapView();\n}\nasync function runSql(){const sql=$('#sqlIn').value.trim();$('#sqlStatus').textContent='rodando…';$('#sqlStatus').classList.remove('err');\n  try{ await ensurePinned(); const resp=await q(sql);const rs=rows(resp);const cols=(resp.manifest?.schema?.columns||[]).map(c=>c.name);\n    $('#sqlOut').innerHTML=`<thead><tr>${cols.map(c=>`<th>${c}</th>`).join('')}</tr></thead><tbody>`+rs.slice(0,200).map(r=>`<tr>${cols.map(c=>`<td>${r[c]??'·'}</td>`).join('')}</tr>`).join('')+`</tbody>`;\n    $('#sqlStatus').textContent=rs.length+' linha(s)';}\n  catch(e){$('#sqlStatus').textContent='bloqueado/erro: '+e.message;$('#sqlStatus').classList.add('err');}\n}\nfunction renderAll(){\n  renderStage();\n  renderTimeline(); renderSectorPicker();\n  const shb=$('#openShare'); if(shb) shb.disabled=!SESS.timeline.length;\n  const dpb=$('#dupSession'); if(dpb) dpb.disabled=!SESS.timeline.length;\n  const mv=SESS.timeline[SESS.selected];\n  // resolveSnapshotPin falls back to a live sub-select when it cannot pin a literal; saying\n  // \"congelado\" in that case would be a lie, so the pill reports what is actually in the SQL.\n  const pinned=SESS.snapLiteral && !/^\\(SELECT/i.test(SESS.snapLiteral);\n  $('#liveState').textContent = SESS.snapshotRaw\n    ? (pinned?'● snapshot congelado · ':'◍ snapshot ao vivo (não fixado) · ')+'atualizado em '+fmtSyncedAt(SESS.snapshotSyncedAt)+' · ↻'\n    : '● iniciando';\n  const mp=$('#basePill');\n  if(mp){\n    const warn=[];\n    if(DOM.bySetor&&!DOM.hasUf) warn.push('⚠ sem coluna UF');\n    if(DOM.badUf) warn.push('⚠ '+fmt(DOM.badUf)+' UF não reconhecida(s)');\n    if(DOM.clashes) warn.push('⚠ '+fmt(DOM.clashes)+' homônimo(s) no mesmo setor');\n    mp.textContent=DOM.bySetor?('◇ base dominantes: '+fmt(DOM.setores)+' setores · '+fmt(DOM.rows)+' municípios'+(warn.length?' · '+warn.join(' · '):'')):(DOM.error?'◇ base dominantes: indisponível':'◇ base dominantes: carregando…');\n    mp.title=DOM.error||(DOM.bySetor?((DOM.hasUf\n        ?('Coluna de UF usada: \"'+DOM.ufCol+'\".')\n        :('SEM coluna de UF. Colunas lidas: '+((DOM.headers||[]).join(' | ')||'?')+'. A UF de cada município vem desta base — sem ela, homônimos voltam a ser casados só pelo nome.'))\n      +(DOM.badUf?('\\n'+DOM.badUf+' linha(s) com UF irreconhecível — tratadas como desconhecida.'):'')\n      +(DOM.clashes?('\\n'+DOM.clashes+' município(s) aparecem no mesmo setor com UFs diferentes. O SQL agrupa só por DS_MUNICIPIO, então esses chegam somados numa linha única e não há como separá-los.'):'')\n      ):'')||DOM.url||''; }\n  const rp=$('#rulePill'); if(rp) rp.textContent='◈ destino: '+ruleShort(SESS.settings);\n  const sp=$('#spanPill'); if(sp) sp.textContent='◎ span: '+spanShort(SESS.settings);\n  renderRuleNote(); renderSpanRule();\n  if(!mv){ ['#map','#matrix','#matrixTobe','#tobeNote','#leaders'].forEach(s=>{const el=$(s);if(el)el.innerHTML='';}); $('#kpis').innerHTML=''; $('#spans').innerHTML=''; $('#muniList').innerHTML=''; $('#plan').innerHTML=''; return; }\n  $('#mapTitle').textContent=`Etapa ${SESS.selected+1}/${SESS.timeline.length} — fechando ${lc(LEVELS[mv.level||'setor'].label)} ${mv.sector}`;\n  $('#viewToggle').querySelectorAll('button').forEach(b=>b.classList.toggle('on',b.dataset.v===mv.view));\n  $('#policy').querySelectorAll('button').forEach(b=>b.classList.toggle('on',b.dataset.p===mv.policy));\n  $('#optBadge').textContent=mv.optBadge||'';\n  drawMap(); renderContig(); renderSpanRule(); renderKpis(); renderSpans(); renderMuni(); renderLeaders(); renderMatrix(); renderMatrixTobe(); renderPolicy(); renderPlan(); renderReport(); renderCumulative();\n}\n\n// ---------- event wiring ----------\n$('#confirmSnap').onclick=()=>{ SESS.stage='main'; renderAll(); };\n$('#openMove').onclick=openMove;\n$('#moveClose').onclick=closeMove;\n$('#moveCancel').onclick=closeMove;\n$('#moveBg').addEventListener('click',e=>{ if(e.target.id==='moveBg') closeMove(); });\nroot.querySelectorAll('input[name=\"moveLevel\"]').forEach(r=>r.addEventListener('change',renderMoveForm));\n$('#moveRand').onclick=moveRandPick;\n$('#moveGo').onclick=submitMove;\n$('#moveCode').addEventListener('keydown',e=>{ if(e.key==='Enter') submitMove(); });\n$('#confirmSessionPick').onchange=()=>loadSession($('#confirmSessionPick').value);\n$('#optim').onclick=()=>editSelected(mv=>{ mv.assign=optimizeFor(mv); });\n$('#autoTobe').onclick=()=>editSelected(mv=>{ mv.assign=autoAssignFor(mv); mv.optBadge='TOBE por adjacência'; });\n$('#viewToggle').querySelectorAll('button').forEach(b=>b.onclick=()=>{const mv=SESS.timeline[SESS.selected];if(!mv)return;mv.view=b.dataset.v;renderAll();});\n$('#mapZoomIn').onclick=()=>zoomMapBy(1.4);\n$('#mapZoomOut').onclick=()=>zoomMapBy(1/1.4);\n$('#map').addEventListener('pointerdown',mapPointerDown);\nroot.addEventListener('pointermove',mapPointerMove);\nroot.addEventListener('pointerup',mapPointerUp);\nroot.addEventListener('pointerleave',mapPointerUp);\n// Arrastar não pode virar \"cliquei num município e troquei o destino sem querer\": se o ponteiro se\n// moveu além do limiar de arrasto, este clique (capture, antes de chegar no <path>) é engolido.\n$('#map').addEventListener('click',e=>{ if(mapDidDrag){ e.stopPropagation(); e.preventDefault(); mapDidDrag=false; } },true);\n$('#policy').querySelectorAll('button').forEach(b=>b.onclick=()=>{const mv=SESS.timeline[SESS.selected];if(!mv)return;mv.policy=b.dataset.p;renderKpis();renderPolicy();renderPlan();});\nroot.querySelectorAll('.tabs button').forEach(b=>b.onclick=()=>{root.querySelectorAll('.tabs button').forEach(x=>x.classList.toggle('on',x===b));\n  ['matrix','tobe','report','cumulative','sql'].forEach(t=>$('#tab-'+t).classList.toggle('hidden',t!==b.dataset.tab));});\n$('#runSql').onclick=runSql;\n$('#copyPlan').onclick=()=>{const mv=SESS.timeline[SESS.selected];if(!mv)return;navigator.clipboard.writeText(JSON.stringify({setor:mv.sector,politica:mv.policy,plano:mv._plan},null,2));$('#copyPlan').textContent='copiado ✓';setTimeout(()=>$('#copyPlan').textContent='Copiar',1500);};\n$('#csvPlan').onclick=()=>{const mv=SESS.timeline[SESS.selected];if(!mv)return;const csv='municipio,uf,cbs,setor_destino\\n'+mv._plan.map(p=>`${p.municipio},${p.uf||''},${p.cbs},${p.destino}`).join('\\n');\n  const a=document.createElement('a');a.href=URL.createObjectURL(new Blob([csv],{type:'text/csv'}));a.download=`plano_migracao_setor_${mv.sector}.csv`;a.click();};\n$('#saveSession').onclick=saveSession;\n$('#dupSession').onclick=duplicateSession;\n$('#sessionPick').onchange=()=>loadSession($('#sessionPick').value);\n$('#liveState').onclick=refreshSnapshot;\n$('#liveState').addEventListener('keydown',e=>{ if(e.key==='Enter'||e.key===' '){ e.preventDefault(); refreshSnapshot(); } });\n$('#openOptions').onclick=openOptions;\n$('#optClose').onclick=closeOptions;\n$('#optCancel').onclick=closeOptions;\n$('#optApply').onclick=applyOptions;\n$('#optMinCbs').addEventListener('input',renderOptPreview);\n['#optTargetSpan','#optMaxSpan','#optMinSpan'].forEach(id=>$(id).addEventListener('input',renderOptPreview));\nroot.querySelectorAll('input[name=\"destRule\"]').forEach(r=>r.addEventListener('change',renderOptPreview));\n$('#optionsBg').addEventListener('click',e=>{ if(e.target.id==='optionsBg') closeOptions(); });\nroot.addEventListener('keydown',e=>{ if(e.key==='Escape'){ closeOptions(); closeShare(); closeMove(); } });\n\n$('#openShare').onclick=openShare;\n$('#shareX').onclick=closeShare;\n$('#shareCancel').onclick=closeShare;\n$('#shareGo').onclick=doShare;\n$('#shareCopy').onclick=()=>{ if(!SHARE.url) return; navigator.clipboard.writeText(SHARE.url);\n  const b=$('#shareCopy'); if(b){ b.textContent='copiado ✓'; setTimeout(()=>{ const x=$('#shareCopy'); if(x) x.textContent='Copiar link'; },1500); } };\n$('#shareOpen').onclick=()=>{ if(SHARE.url) window.open(SHARE.url,'_blank'); };\n$('#shareBg').addEventListener('click',e=>{ if(e.target.id==='shareBg') closeShare(); });\n\n// ---------- init ----------\n(async()=>{\n  loader(true,'congelando snapshot da sessão…');\n  try{\n    await Promise.all([ensurePinned(), loadSectors(), refreshSessionPicker()]);\n    SESS.stage='confirm';\n  }catch(e){ setError('erro init: '+e.message); }\n  finally{ loader(false); renderAll(); const rd=$('#ready'); if(rd) rd.setAttribute('data-loaded','1'); }\n})();\n\n  }\n}\n"}},"sessionsDataset":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"sessionsDataset"}}}},"dominantesCsvUrl":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"dominantesCsvUrl"}}}}}}}},"__d2PrevCode":{"code":"const T='product.perfil_cb.crm_perfil_cb_diaria_historico';\nconst ELO='product.elo_modelo_combinado.commercial_consultant_index';\nconst PALETTE=['#5856d6','#ff9500','#34c759','#af52de','#ff2d55','#a2845e'];\nconst CLOSE_COLOR='#8e8e93';\nconst UF_CODE={RO:'11',AC:'12',AM:'13',RR:'14',PA:'15',AP:'16',TO:'17',MA:'21',PI:'22',CE:'23',RN:'24',PB:'25',PE:'26',AL:'27',SE:'28',BA:'29',MG:'31',ES:'32',RJ:'33',SP:'35',PR:'41',SC:'42',RS:'43',MS:'50',MT:'51',GO:'52',DF:'53'};\nconst UF_BORDERS={AC:['AM','RO'],AL:['BA','PE','SE'],AM:['AC','RO','RR','PA','MT'],AP:['PA'],\n BA:['AL','SE','PE','PI','TO','GO','MG','ES'],CE:['PI','PB','PE','RN'],DF:['GO','MG'],\n ES:['BA','MG','RJ'],GO:['DF','MT','MS','MG','BA','TO'],MA:['PA','TO','PI'],\n MG:['BA','GO','DF','MS','SP','RJ','ES'],MS:['MT','GO','MG','SP','PR'],MT:['RO','AM','PA','TO','GO','MS'],\n PA:['AP','AM','MT','TO','MA','RR'],PB:['RN','CE','PE'],PE:['PB','CE','PI','BA','AL'],\n PI:['MA','TO','BA','PE','CE'],PR:['SP','MS','SC'],RJ:['ES','MG','SP'],RN:['CE','PB'],\n RO:['AC','AM','MT'],RR:['AM','PA'],RS:['SC'],SC:['PR','RS'],SE:['BA','AL'],\n SP:['MG','RJ','PR','MS'],TO:['PA','MA','PI','BA','GO','MT']};\nconst NIVEIS=['Bronze','Cristal','Prata','Ouro','Diamante','Diamante+'];\nconst METRICS_DEF=[['cbs','CBs'],['ativas','Ativas'],['pedidos','Pedidos'],['pontos','Pontos'],['receita','Receita','$'],['rec_nat','Rec. Natura','$'],['rec_avon','Rec. Avon','$']];\nconst OPT_K=1.5;\nconst SESSIONS_DS='timeline-shared-sessionsDataSet';   // same table as SHARED_DS — see notes at listSessions()\n// Span defaults are the real operating band for a setor receptor, not placeholders: 2200 ≤ span ≤ 3500\n// with 2700 as the target. null meant \"sem limite\", so every new session started with the optimiser\n// balancing against nothing. Existing sessions are NOT touched — their persisted settings carry explicit\n// values that spread OVER these in openOptions/applyOptions, which is deliberate: their etapas were\n// computed under the old band and changing it silently would leave the stored result and the rule that\n// produced it out of sync.\nconst DEFAULT_SETTINGS={destRule:'any',destMinCbs:9,targetSpan:2700,maxSpan:3500,minSpan:2200};\nconst DOM_MEDIA_BASE='https://natura-geomarketing.data2.media/file/';\nconst DOM_CSV_FALLBACK=DOM_MEDIA_BASE+'yw_TQdp0QXEk6JsrliAqP'; \nconst numOrNull=v=>{const n=Math.round(+v);return (isFinite(n)&&n>0)?n:null;};\nconst spanShort=st=>{const p=[];if(st&&st.targetSpan)p.push('alvo '+st.targetSpan);if(st&&st.maxSpan)p.push('máx '+st.maxSpan);if(st&&st.minSpan)p.push('mín '+st.minSpan);return p.length?p.join(' · '):'livre';};\nconst ruleShort=st=>((st&&st.destRule)==='dominant')?('dominantes ≥'+((st&&st.destMinCbs)||DEFAULT_SETTINGS.destMinCbs)+' CBs'):'qualquer municipio';\n\nexport default {\n  css: `\n  :host{display:block;height:100%;--bg:#f5f5f7;--panel:#ffffff;--panel2:#f2f2f7;--line:#e5e5ea;--ink:#1c1c1e;--mut:#6e6e73;--acc:#007aff;--acc2:#0060df;--closing:#ff3b30;--ok:#34c759}\n  *{box-sizing:border-box}\n  .simroot{position:relative;height:100%;overflow:auto;font:13px/1.45 -apple-system,BlinkMacSystemFont,\"SF Pro Text\",\"Segoe UI\",Roboto,sans-serif;background:var(--bg);color:var(--ink);-webkit-font-smoothing:antialiased}\n  header{padding:10px 16px;background:rgba(246,246,248,.85);backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);border-bottom:1px solid var(--line);display:flex;align-items:center;gap:10px;flex-wrap:wrap}\n  header h1{font-size:14.5px;margin:0;font-weight:600;letter-spacing:-.1px;color:var(--ink)}\n  .mac-spacer{flex:1}\n  .howto{padding:8px 16px;background:var(--panel);border-bottom:1px solid var(--line);display:flex;gap:16px;flex-wrap:wrap;font-size:11.5px;color:var(--mut);align-items:center}\n  .howto b{color:var(--ink)} .howto span{max-width:340px}\n  .pill{font-size:10.5px;padding:2.5px 9px;border-radius:99px;border:1px solid var(--line);color:var(--mut);background:var(--panel2)}\n  .pill.live{color:var(--ink);cursor:pointer;user-select:none;transition:border-color .1s,color .1s,background .1s}\n  .pill.live:hover{border-color:var(--acc);color:var(--acc);background:#eaf3ff}\n  .pill.live:focus-visible{outline:2px solid rgba(0,122,255,.35);outline-offset:1px}\n  .pill.live.busy{border-color:var(--acc);color:var(--acc);cursor:progress}\n  .status{font-size:11px;color:var(--mut)}.status.err{color:var(--closing)}\n  select,input,textarea,button{font:inherit}\n  select,input{background:var(--panel);border:1px solid var(--line);color:var(--ink);border-radius:7px;padding:5.5px 9px}\n  select:focus,input:focus{outline:2px solid rgba(0,122,255,.35);outline-offset:0;border-color:var(--acc)}\n  button.act{background:var(--acc);color:#fff;border:1px solid transparent;border-radius:7px;padding:6px 13px;font-weight:600;cursor:pointer;box-shadow:0 1px 1px rgba(0,0,0,.08)}\n  button.act:hover{background:var(--acc2)}\n  button.ghost{background:var(--panel);color:var(--ink);border:1px solid var(--line);border-radius:7px;padding:5.5px 12px;cursor:pointer}\n  button.ghost:hover{background:var(--panel2)}\n  button.ghost.on{border-color:var(--acc);color:var(--acc);background:#eaf3ff}\n  button.ghost:disabled,button.act:disabled{opacity:.4;cursor:not-allowed}\n  .sessbar{padding:9px 20px;background:var(--panel2);border-bottom:1px solid var(--line);display:flex;gap:8px;flex-wrap:wrap;align-items:center}\n  .rail{padding:9px 16px;background:var(--panel);border-bottom:1px solid var(--line);display:flex;gap:8px;align-items:center;overflow-x:auto}\n  #movementChips{display:flex;gap:8px;flex:0 0 auto}\n  #addMovementGroup{display:flex;gap:8px;align-items:center;flex:0 0 auto;margin-left:auto;padding-left:12px;border-left:1px solid var(--line)}\n  #addMovementGroup input{min-width:150px}\n  .tchip{display:flex;align-items:center;gap:7px;background:var(--panel2);border:1px solid var(--line);border-radius:8px;padding:6px 10px;cursor:pointer;font-size:12px;flex:0 0 auto}\n  .tchip.on{border-color:var(--acc);background:#eaf3ff}\n  .tchip.stale{border-style:dashed;opacity:.85}\n  .tchip .tstale{color:#ff9500;font-weight:700}\n  .tchip .tnum{background:var(--ink);color:#fff;border-radius:99px;width:16px;height:16px;font-size:9.5px;display:flex;align-items:center;justify-content:center;font-weight:700}\n  .tchip .tsec{font-weight:600}\n  .tchip .tstat{color:var(--mut)}\n  .tchip .trm{color:var(--mut);font-weight:700;padding:0 3px}\n  .tchip .trm:hover{color:var(--closing)}\n  .rail .empty{color:var(--mut);font-size:12px}\n  .wrap{display:grid;grid-template-columns:minmax(360px,1fr) 430px;gap:14px;padding:14px 16px;align-items:start}\n  @media(max-width:1150px){.wrap{grid-template-columns:1fr}}\n  .card{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:14px 16px;margin-bottom:14px;box-shadow:0 1px 2px rgba(0,0,0,.04)}\n  .card h2{font-size:11px;text-transform:uppercase;letter-spacing:.4px;color:var(--mut);margin:0 0 9px;font-weight:600}\n  /* user-select, not pointer-events. .lbl already sets pointer-events:none, which stops the text from\n     RECEIVING clicks but does not exclude it from the browser's selection range — so cycling a\n     município's destination with repeated clicks kept dragging a double-click selection across the\n     labels. Nothing drawn in an svg here is text anyone needs to copy. */\n  svg{width:100%;height:auto;display:block;user-select:none;-webkit-user-select:none}\n  .map-wrap{position:relative}\n  #map{cursor:grab;touch-action:none}\n  #map.dragging{cursor:grabbing}\n  .zoom-pill{position:absolute;left:10px;bottom:10px;display:flex;align-items:stretch;background:var(--panel);border:1px solid var(--line);border-radius:99px;box-shadow:0 2px 8px rgba(0,0,0,.14);overflow:hidden;z-index:3}\n  .zoom-pill button{width:30px;height:30px;border:0;background:transparent;color:var(--ink);font:16px/1 -apple-system,BlinkMacSystemFont,sans-serif;font-weight:600;cursor:pointer;display:flex;align-items:center;justify-content:center}\n  .zoom-pill button:hover{background:var(--panel2)}\n  .zoom-pill button:active{background:#e5e5ea}\n  .zoom-pill .zoom-div{width:1px;background:var(--line)}\n  /* White hairlines inside the closing sector: the municipios read as one territory cut into parts\n     rather than as separate outlined units, and the saturated fills carry the grouping instead of the\n     ink. Neighbour sectors keep their own coloured strokes (.sect) — that contrast is what separates\n     what is being reallocated from what is only context. Selection no longer draws an outline; the\n     white border was the click affordance AND the default is now white, so it had nothing left to say. */\n  .muni{stroke:#fff;stroke-width:1.1;cursor:pointer;transition:filter .1s}.muni:hover{filter:brightness(1.15)}.muni.munihl{filter:brightness(1.15)}\n  .sect{stroke-width:1;fill-opacity:.32;stroke-opacity:.6}\n  .sect.plain{fill:#e8e8ec;stroke:#d4d4d9;fill-opacity:1;stroke-opacity:1}\n  .sect.closed-ctx{fill:#e2e2e7;stroke:#aeaeb2;stroke-dasharray:3 2;fill-opacity:1;stroke-opacity:1}\n  .lbl{pointer-events:none}\n  /* No plate behind the text: a halo painted UNDER the glyphs (paint-order) keeps a name legible on any\n     fill without stamping an opaque box over the territory it names. Ink and halo are chosen per label\n     from the luminance of the fill underneath, so they are deliberately NOT declared here — a\n     stylesheet rule outranks a presentation attribute and would silently override that choice. */\n  .lbl text{text-anchor:middle;paint-order:stroke fill;stroke-width:2.2px;stroke-linejoin:round;stroke-linecap:round}\n  .lbl.big text{stroke-width:2.9px}\n  .lbl line.lead{stroke-opacity:.5;stroke-width:.8}\n  .legend{display:flex;gap:12px;flex-wrap:wrap;margin-top:8px;font-size:12px}\n  .legend b{display:inline-block;width:11px;height:11px;border-radius:3px;margin-right:5px;vertical-align:-1px}\n  .kpis{display:grid;grid-template-columns:1fr 1fr;gap:9px;margin-bottom:12px}\n  .kpi{background:var(--panel2);border:1px solid var(--line);border-radius:10px;padding:9px 11px}\n  .kpi .n{font-size:19px;font-weight:700}.kpi .l{font-size:10.5px;color:var(--mut);margin-top:2px}\n  .kpi.warn{border-color:#ffd1cc}.kpi.warn .n{color:var(--closing)}.kpi.ok{border-color:#bdeecb}.kpi.ok .n{color:var(--ok)}\n  .bar-row{display:flex;align-items:center;gap:8px;margin:6px 0}\n  .bar-row .tag{width:42px;font-weight:600;font-size:12px}\n  .bar-track{flex:1;height:18px;background:var(--panel2);border-radius:5px;overflow:hidden;display:flex;position:relative}\n  .bar-mark{position:absolute;top:0;bottom:0;width:2px;opacity:.9;z-index:2}\n  .bar-base{height:100%;opacity:.4}.bar-inc{height:100%}\n  .bar-val{width:132px;text-align:right;font-size:11px;color:var(--mut);font-variant-numeric:tabular-nums}\n  table{border-collapse:collapse;width:100%;font-size:11.5px}\n  th,td{padding:5px 6px;text-align:right;border-bottom:1px solid var(--line);font-variant-numeric:tabular-nums}\n  th:first-child,td:first-child{text-align:left}\n  thead th{color:var(--mut);font-weight:600;font-size:10.5px;position:sticky;top:0;background:var(--panel)}\n  .home{display:inline-block;width:9px;height:9px;border-radius:2px;margin-right:4px}\n  .muni-item{display:flex;align-items:center;gap:8px;background:var(--panel2);border:1px solid var(--line);border-radius:8px;padding:5px 8px;margin-bottom:6px}\n  .muni-item .nm{flex:1;font-weight:600;font-size:12px}.muni-item .ct{color:var(--mut);font-size:11px}\n  .seg{display:flex;border:1px solid var(--line);border-radius:7px;overflow:hidden}\n  .seg button{border:0;background:transparent;color:var(--mut);padding:4px 8px;font-size:11px;font-weight:600;cursor:pointer}\n  .seg button.on{color:#fff}\n  .toolbar{display:flex;gap:8px;align-items:center;flex-wrap:wrap}\n  .toggle{display:flex;border:1px solid var(--line);border-radius:8px;overflow:hidden;font-size:12px}\n  .toggle button{background:transparent;border:0;color:var(--mut);padding:6px 10px;cursor:pointer;font-weight:600}\n  .toggle button.on{background:var(--panel2);color:var(--ink)}\n  .note{color:var(--mut);font-size:10.5px;margin-top:7px;line-height:1.5}\n  .cell{font-variant-numeric:tabular-nums}\n  .lider-foot td{background:var(--panel2);font-weight:600;font-size:11px;color:var(--ink);border-bottom:2px solid var(--line);padding:5px 6px;text-align:left}\n  .scroll{max-height:240px;overflow:auto}\n  /* Tables meant to be READ in full rather than sampled. Only the vertical cap is dropped — overflow\n     stays auto so the wide grupo grid can still scroll sideways inside its card, which is the one axis\n     that genuinely cannot fit. */\n  .scroll.grow{max-height:none}\n  .tip{position:fixed;pointer-events:none;background:#1c1c1e;color:#fff;border-radius:8px;padding:7px 9px;font-size:11px;opacity:0;transition:opacity .1s;z-index:9;max-width:230px}\n  .spark{display:flex;align-items:flex-end;gap:3px;height:44px}\n  .spark .b{flex:1;background:var(--acc);border-radius:2px 2px 0 0;min-height:2px;opacity:.85}\n  .delta{font-size:10px}.delta.up{color:var(--ok)}.delta.dn{color:var(--closing)}\n  .tabs{display:flex;gap:6px;margin-bottom:10px;flex-wrap:wrap}\n  .tabs button{background:transparent;border:1px solid var(--line);border-radius:8px;color:var(--mut);padding:6px 12px;cursor:pointer;font-weight:600}\n  .tabs button.on{background:var(--panel2);color:var(--ink);border-color:var(--acc)}\n  .hidden{display:none}\n  .sqlbox{width:100%;height:60px;font-family:ui-monospace,Menlo,monospace;font-size:11px;resize:vertical}\n  .load{position:absolute;inset:0;background:rgba(245,245,247,.85);backdrop-filter:blur(4px);display:flex;align-items:center;justify-content:center;z-index:20;font-size:13px;color:var(--acc);font-weight:600;text-align:center;padding:20px}\n  .load.hidden{display:none}\n  .badge{font-size:10px;padding:1px 6px;border-radius:5px;background:var(--panel2);border:1px solid var(--line);color:var(--mut)}\n  .sheet-bg{position:fixed;inset:0;background:rgba(28,28,30,.34);backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);display:flex;align-items:center;justify-content:center;z-index:40;padding:24px}\n  .sheet-bg.hidden{display:none}\n  .sheet{background:var(--panel);border:1px solid var(--line);border-radius:14px;box-shadow:0 24px 60px rgba(0,0,0,.22);width:min(580px,100%);max-height:100%;display:flex;flex-direction:column;overflow:hidden}\n  .sheet-hd{display:flex;align-items:center;gap:9px;padding:12px 16px;border-bottom:1px solid var(--line)}\n  .sheet-hd h3{margin:0;font-size:14px;font-weight:600;letter-spacing:-.1px}\n  .sheet-x{background:transparent;border:0;color:var(--mut);font-size:13px;cursor:pointer;padding:3px 7px;border-radius:6px}\n  .sheet-x:hover{background:var(--panel2);color:var(--ink)}\n  .sheet-bd{padding:14px 16px;overflow:auto}\n  .sheet-ft{display:flex;align-items:center;gap:8px;padding:11px 16px;border-top:1px solid var(--line);background:var(--panel2)}\n  .opt-lbl{font-size:11px;text-transform:uppercase;letter-spacing:.4px;color:var(--mut);font-weight:600}\n  .opt-sub{font-size:11.5px;color:var(--mut);margin:4px 0 10px;line-height:1.5}\n  .opt-row{display:flex;gap:10px;align-items:flex-start;border:1px solid var(--line);border-radius:10px;padding:10px 12px;margin-bottom:8px;cursor:pointer;background:var(--panel)}\n  .opt-row:hover{background:var(--panel2)}\n  .opt-row.on{border-color:var(--acc);background:#eaf3ff}\n  .opt-row:has(input:disabled){opacity:.5;cursor:not-allowed}\n  .opt-row input[type=radio]{margin:2px 0 0;accent-color:var(--acc);flex:0 0 auto}\n  .opt-t{font-size:12.5px;font-weight:600;display:flex;align-items:center;gap:6px;flex-wrap:wrap}\n  .opt-d{font-size:11.5px;color:var(--mut);margin-top:3px;line-height:1.55}\n  .opt-inline{font-size:11.5px;color:var(--mut);margin-top:9px;display:flex;align-items:center;gap:7px;flex-wrap:wrap}\n  .opt-inline.off{opacity:.4;pointer-events:none}\n  .opt-note{border:1px solid var(--line);background:var(--panel2);border-radius:10px;padding:9px 11px;font-size:11.5px;color:var(--mut);line-height:1.6;margin-top:12px}\n  .opt-grid{display:grid;grid-template-columns:1fr 1fr 1fr;gap:8px;margin-top:2px}\n  .opt-fld{display:flex;flex-direction:column;gap:5px;border:1px solid var(--line);border-radius:9px;padding:8px 10px;background:var(--panel2)}\n  .opt-fld span{font-size:11px;color:var(--mut);font-weight:600;line-height:1.35}\n  .opt-fld i{font-style:normal;font-weight:400;opacity:.72}\n  .opt-fld input{width:100%;background:var(--panel)}\n  .opt-err{margin-top:9px;font-size:11.5px;color:var(--closing);font-weight:600}\n  .opt-hr{height:1px;background:var(--line);margin:17px 0 0}\n  .shareurl{margin-top:9px;padding:9px 10px;border-radius:8px;background:var(--panel);border:1px solid var(--acc);\n    font-family:ui-monospace,Menlo,monospace;font-size:11px;color:var(--ink);word-break:break-all;user-select:all}\n`,\n  render(d2){\n    return `<div class=\"simroot\"><header id=\"topHeader\" class=\"hidden\">\n  <h1>Simulador de Timeline de Fechamentos</h1>\n  <span class=\"pill live\" id=\"liveState\" role=\"button\" tabindex=\"0\" title=\"Clique pra buscar o snapshot mais recente e recalcular a timeline inteira\">● iniciando</span>\n  <span class=\"pill ro\">read-only · nunca escreve</span>\n  <span class=\"pill\" id=\"basePill\"></span>\n  <span class=\"pill\" id=\"rulePill\"></span>\n  <span class=\"pill\" id=\"spanPill\"></span>\n  <span class=\"status\" id=\"ds\"></span>\n  <div class=\"mac-spacer\"></div>\n  <select id=\"sessionPick\" style=\"min-width:200px\"></select>\n  <button class=\"ghost\" id=\"openOptions\" title=\"Configurações desta sessão\">⚙ Opções</button>\n  <button class=\"act\" id=\"saveSession\">Salvar sessão</button>\n  <button class=\"ghost\" id=\"dupSession\" title=\"Cria uma cópia independente desta sessão — a original fica intacta e a cópia passa a ser a sessão ativa\">⧉ Duplicar</button>\n  <button class=\"ghost\" id=\"openShare\" title=\"Publicar uma cópia congelada desta sessão em modo leitura\">⇪ Compartilhar</button>\n  <span class=\"status\" id=\"sessStatus\"></span>\n</header>\n\n<div class=\"rail hidden\" id=\"timelineRail\">\n  <div id=\"movementChips\"></div>\n  <div id=\"addMovementGroup\">\n    <button class=\"act\" id=\"openMove\">Adicionar movimentação</button>\n  </div>\n</div>\n\n<div class=\"card\" id=\"confirmCard\" style=\"margin:14px 20px\">\n  <h2 style=\"margin:0 0 9px\">Confirmar snapshot antes de simular</h2>\n  <div class=\"note\" id=\"confirmBody\">congelando snapshot…</div>\n  <button class=\"act\" id=\"confirmSnap\" style=\"margin-top:12px\">Confirmar snapshot ▶ ir pra simulação</button>\n  <div class=\"note\" style=\"margin-top:16px\">ou continue uma sessão salva:</div>\n  <select id=\"confirmSessionPick\" style=\"min-width:260px;margin-top:4px\"></select>\n  <div class=\"status\" id=\"confirmStatus\" style=\"margin-top:8px\"></div>\n</div>\n\n<div class=\"wrap hidden\" id=\"mainWrap\">\n  <div>\n    <div class=\"card\">\n      <div style=\"display:flex;justify-content:space-between;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:9px\">\n        <h2 id=\"mapTitle\" style=\"margin:0\">Mapa — clique num município p/ trocar o setor destino</h2>\n        <div class=\"toggle\" id=\"viewToggle\" title=\"ASIS = estrutura do setor antes desta etapa (já considerando etapas anteriores) · TOBE = após a redistribuição desta etapa\">\n          <button data-v=\"asis\">◧ ASIS (antes desta etapa)</button>\n          <button data-v=\"tobe\" class=\"on\">◨ TOBE (simulação)</button>\n        </div>\n      </div>\n      <div class=\"map-wrap\">\n        <svg id=\"map\" viewBox=\"0 0 700 500\" preserveAspectRatio=\"xMidYMid meet\"></svg>\n        <div class=\"zoom-pill\" id=\"mapZoom\">\n          <button type=\"button\" id=\"mapZoomOut\" title=\"Diminuir zoom\">−</button>\n          <span class=\"zoom-div\"></span>\n          <button type=\"button\" id=\"mapZoomIn\" title=\"Aumentar zoom\">+</button>\n        </div>\n      </div>\n      <div class=\"legend\" id=\"legend\"></div>\n      <div class=\"note\">Coloridos = municípios do setor fechado nesta etapa (cor = destino). Ao redor, cada área é um <b>setor vizinho inteiro</b> com o código no meio — não municípios soltos: cor = setor destino, cinza = contexto, cinza tracejado = setor já fechado numa etapa anterior. Shapes reais IBGE/tbrugz.</div>\n      <div class=\"note\" id=\"mapIgnoredNote\"></div>\n    </div>\n\n    <div class=\"card\">\n      <h2>Líderes — destino e CBs deslocadas (nesta etapa)</h2>\n      <div class=\"note\" style=\"margin:-4px 0 9px\"><b>Home</b> = setor que ficou com a maioria das CBs da líder. <b style=\"color:var(--closing)\">Deslocadas</b> = CBs dela que caíram noutro setor.</div>\n      <div class=\"scroll grow\"><table id=\"leaders\"></table></div>\n    </div>\n\n    <div class=\"card\">\n      <div class=\"tabs\">\n        <button data-tab=\"matrix\" class=\"on\">Matriz ASIS</button>\n        <button data-tab=\"tobe\">Matriz TOBE</button>\n        <button data-tab=\"report\">Relatório de impacto (etapa)</button>\n        <button data-tab=\"cumulative\">Impacto acumulado (timeline)</button>\n        <button data-tab=\"sql\">Console SQL</button>\n      </div>\n      <div id=\"tab-matrix\"><div class=\"scroll grow\"><table id=\"matrix\"></table></div></div>\n      <div id=\"tab-tobe\" class=\"hidden\"><div class=\"scroll grow\"><table id=\"matrixTobe\"></table></div>\n        <div class=\"note\" id=\"tobeNote\"></div></div>\n      <div id=\"tab-report\" class=\"hidden\"></div>\n      <div id=\"tab-cumulative\" class=\"hidden\"></div>\n      <div id=\"tab-sql\" class=\"hidden\">\n        <textarea class=\"sqlbox\" id=\"sqlIn\">SELECT DS_MUNICIPIO, COUNT(DISTINCT CD_CONSULTORA) qtd FROM product.perfil_cb.crm_perfil_cb_diaria_historico WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR=3504 GROUP BY DS_MUNICIPIO ORDER BY qtd DESC</textarea>\n        <div class=\"toolbar\" style=\"margin:8px 0\"><button class=\"act\" id=\"runSql\">▶ Rodar</button><span class=\"status\" id=\"sqlStatus\"></span></div>\n        <div class=\"note\" style=\"margin:-4px 0 8px\">Roda contra o snapshot congelado desta sessão (não \"ao vivo\") — mesma coerência da timeline.</div>\n        <div class=\"scroll\"><table id=\"sqlOut\"></table></div>\n      </div>\n    </div>\n  </div>\n\n  <div>\n    <div class=\"card\">\n      <div class=\"toolbar\" style=\"margin-bottom:11px\">\n        <button class=\"ghost\" id=\"optim\" title=\"testa alocações que mantêm cada setor conectado e escolhe a que equilibra a carga entre setores + minimiza a quebra (evita empilhar tudo num setor)\">★ Modelo ÓTIMO (equilíbrio + quebra)</button>\n        <button class=\"ghost\" id=\"autoTobe\" title=\"preenche cada município pelo setor vizinho mais próximo (geografia)\">TOBE por adjacência</button>\n        <span class=\"badge\" id=\"optBadge\"></span>\n      </div>\n      <div class=\"note\" style=\"margin:-4px 0 10px\"><b style=\"color:var(--ink)\">★ ÓTIMO</b> = equilibra a carga entre os setores <b>e</b> minimiza a quebra (mantém o território conectado; não empilha tudo num setor). <b style=\"color:var(--ink)\">TOBE</b> = sugestão por vizinhança. Editar esta etapa recalcula automaticamente as etapas seguintes da timeline.</div>\n      <div class=\"note\" id=\"ruleNote\" style=\"margin:-6px 0 11px;padding:7px 9px;background:var(--panel2);border:1px solid var(--line);border-radius:8px\"></div>\n      <div class=\"kpis\" id=\"kpis\"></div>\n      <div id=\"contig\"></div>\n      <div id=\"spanRule\"></div>\n      <h2>Span por setor (CBs) — base + entrantes</h2>\n      <div id=\"spans\"></div>\n      <div id=\"policySection\">\n      <div style=\"display:flex;justify-content:space-between;align-items:center;margin:14px 0 7px\">\n        <h2 style=\"margin:0\">CBs deslocadas</h2>\n        <div class=\"toggle\" id=\"policy\">\n          <button data-p=\"fora\" class=\"on\">= fora do setor</button>\n          <button data-p=\"quebra\">= quebra de relação</button>\n        </div>\n      </div>\n      <div class=\"note\" id=\"policyNote\"></div>\n      </div>\n    </div>\n\n    <div class=\"card\">\n      <h2 id=\"muniListTitle\">Municípios → setor destino</h2>\n      <div class=\"note\" id=\"muniListNote\" style=\"margin:-4px 0 9px\">Clique no <b>código do setor</b> pra mandar o município <b>inteiro</b> pra lá (regra de negócio). A cor acompanha o mapa.</div>\n      <div id=\"muniList\"></div>\n    </div>\n\n    <div class=\"card\">\n      <div class=\"toolbar\" style=\"justify-content:space-between\">\n        <h2 style=\"margin:0\">Plano de migração (etapa selecionada)</h2>\n        <div><button class=\"ghost\" id=\"copyPlan\">Copiar</button> <button class=\"ghost\" id=\"csvPlan\">CSV</button></div>\n      </div>\n      <div id=\"plan\" class=\"note\"></div>\n    </div>\n  </div>\n</div>\n\n<div class=\"sheet-bg hidden\" id=\"shareBg\">\n  <div class=\"sheet\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"shareTitle\">\n    <div class=\"sheet-hd\"><h3 id=\"shareTitle\">Compartilhar sessão</h3><div class=\"mac-spacer\"></div><button class=\"sheet-x\" id=\"shareX\" title=\"Fechar\">✕</button></div>\n    <div class=\"sheet-bd\" id=\"shareBody\"></div>\n    <div class=\"sheet-ft\">\n      <span class=\"status\" id=\"shareStatus\"></span>\n      <div class=\"mac-spacer\"></div>\n      <button class=\"ghost hidden\" id=\"shareCopy\">Copiar link</button>\n      <button class=\"ghost hidden\" id=\"shareOpen\">Abrir</button>\n      <button class=\"ghost\" id=\"shareCancel\">Cancelar</button>\n      <button class=\"act\" id=\"shareGo\">Compartilhar</button>\n    </div>\n  </div>\n</div>\n\n<div class=\"sheet-bg hidden\" id=\"optionsBg\">\n  <div class=\"sheet\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"optTitle\">\n    <div class=\"sheet-hd\"><h3 id=\"optTitle\">Opções da sessão</h3><span class=\"badge\" id=\"optSessName\"></span><div class=\"mac-spacer\"></div><button class=\"sheet-x\" id=\"optClose\" title=\"Fechar\">✕</button></div>\n    <div class=\"sheet-bd\">\n      <div class=\"opt-lbl\">Regra rígida — seleção dos setores destino</div>\n      <div class=\"opt-sub\">Define quais setores vizinhos podem entrar na lista de destinos de cada etapa. Vale pra toda a timeline desta sessão.</div>\n      <label class=\"opt-row\" data-r=\"any\">\n        <input type=\"radio\" name=\"destRule\" value=\"any\">\n        <div>\n          <div class=\"opt-t\">Adjacente a qualquer município <span class=\"badge\">padrão</span></div>\n          <div class=\"opt-d\">Um setor entra na lista de destinos se tiver município vizinho a <b>qualquer</b> município do setor fechado — inclusive os menores. É o comportamento de hoje.</div>\n        </div>\n      </label>\n      <label class=\"opt-row\" data-r=\"dominant\">\n        <input type=\"radio\" name=\"destRule\" value=\"dominant\">\n        <div>\n          <div class=\"opt-t\">Adjacente a municípios dominantes</div>\n          <div class=\"opt-d\">Só os municípios do setor fechado com <b>CBs suficientes</b> valem como ponte. Os pequenos continuam sendo redistribuídos normalmente — só não trazem setor novo pra lista de destinos.</div>\n          <div class=\"opt-inline\" id=\"optMinCbsWrap\">Ignorar municípios com menos de <input type=\"number\" id=\"optMinCbs\" min=\"1\" max=\"9999\" step=\"1\" style=\"width:74px\"> CBs</div>\n        </div>\n      </label>\n      <div class=\"opt-hr\"></div>\n      <div class=\"opt-lbl\" style=\"margin-top:15px\">Pré-requisitos do setor destino — tamanho em CBs</div>\n      <div class=\"opt-sub\">Vale pro tamanho de cada setor receptor <b>depois</b> da redistribuição (base + entrantes). Em branco = desligado.</div>\n      <div class=\"opt-grid\">\n        <label class=\"opt-fld\"><span>Span alvo <i>(tamanho ideal)</i></span><input type=\"number\" id=\"optTargetSpan\" min=\"1\" max=\"99999\" step=\"1\" placeholder=\"livre\"></label>\n        <label class=\"opt-fld\"><span>Span máximo <i>(nenhum setor acima)</i></span><input type=\"number\" id=\"optMaxSpan\" min=\"1\" max=\"99999\" step=\"1\" placeholder=\"sem limite\"></label>\n        <label class=\"opt-fld\"><span>Span mínimo <i>(nenhum setor abaixo)</i></span><input type=\"number\" id=\"optMinSpan\" min=\"1\" max=\"99999\" step=\"1\" placeholder=\"sem limite\"></label>\n      </div>\n      <div class=\"opt-err hidden\" id=\"optSpanErr\"></div>\n      <div class=\"opt-note\" id=\"optPreview\"></div>\n    </div>\n    <div class=\"sheet-ft\"><span class=\"status\" id=\"optStatus\"></span><div class=\"mac-spacer\"></div><button class=\"ghost\" id=\"optCancel\">Cancelar</button><button class=\"act\" id=\"optApply\">Aplicar</button></div>\n  </div>\n</div>\n\n<div class=\"sheet-bg hidden\" id=\"moveBg\">\n  <div class=\"sheet\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"moveTitle\">\n    <div class=\"sheet-hd\"><h3 id=\"moveTitle\">Adicionar movimentação</h3><div class=\"mac-spacer\"></div><button class=\"sheet-x\" id=\"moveClose\" title=\"Fechar\">✕</button></div>\n    <div class=\"sheet-bd\">\n      <div class=\"opt-lbl\">Tipo de movimentação</div>\n      <div class=\"opt-sub\" id=\"moveLockNote\">Escolha o nível a fechar. Você pode fechar setores à vontade até fechar uma GV; aí só GV (ou mercado) daqui pra frente. Fechar um mercado trava a sessão em mercado.</div>\n      <label class=\"opt-row\" data-lvl=\"setor\"><input type=\"radio\" name=\"moveLevel\" value=\"setor\"><div><div class=\"opt-t\">Fechar Setor</div><div class=\"opt-d\">Redistribui os municípios do setor entre setores vizinhos da mesma GV.</div></div></label>\n      <label class=\"opt-row\" data-lvl=\"gv\"><input type=\"radio\" name=\"moveLevel\" value=\"gv\"><div><div class=\"opt-t\">Fechar GV</div><div class=\"opt-d\">Redistribui os setores (com municípios e CBs) da GV entre GVs vizinhas do mesmo mercado.</div></div></label>\n      <label class=\"opt-row\" data-lvl=\"mercado\"><input type=\"radio\" name=\"moveLevel\" value=\"mercado\"><div><div class=\"opt-t\">Fechar Mercado</div><div class=\"opt-d\">Redistribui as GVs (com setores, municípios e CBs) do mercado entre mercados vizinhos.</div></div></label>\n      <div class=\"opt-hr\"></div>\n      <div class=\"opt-lbl\" style=\"margin-top:15px\" id=\"moveCodeLbl\">Setor a fechar</div>\n      <div class=\"opt-inline\" id=\"moveCodeRow\">\n        <input id=\"moveCode\" list=\"moveCodeList\" placeholder=\"código\" style=\"min-width:150px\">\n        <datalist id=\"moveCodeList\"></datalist>\n        <button class=\"ghost\" id=\"moveRand\" title=\"Aleatório\">🎲</button>\n      </div>\n      <div class=\"opt-err hidden\" id=\"moveErr\"></div>\n    </div>\n    <div class=\"sheet-ft\"><span class=\"status\" id=\"moveStatus\"></span><div class=\"mac-spacer\"></div><button class=\"ghost\" id=\"moveCancel\">Cancelar</button><button class=\"act\" id=\"moveGo\">Fechar ▶ (nova etapa)</button></div>\n  </div>\n</div>\n\n<div class=\"tip\" id=\"tip\"></div>\n<div class=\"load hidden\" id=\"loader\">carregando…</div>\n<span id=\"ready\" style=\"display:none\"></span></div>`;\n  },\n  mounted(d2, root){\n\nconst $=s=>root.querySelector(s);\nconst fmt=n=>n==null?'–':Math.round(+n).toLocaleString('pt-BR');\nconst money=n=>{n=+n||0;return n>=1e6?'R$'+(n/1e6).toFixed(1)+'M':n>=1e3?'R$'+(n/1e3).toFixed(0)+'k':'R$'+Math.round(n)};\nconst norm=s=>(s||'').normalize('NFKD').replace(/[̀-ͯ]/g,'').toUpperCase().replace(/[^A-Z0-9]+/g,' ').trim();\nconst esc=s=>(s==null?'':String(s)).replace(/[&<>]/g,c=>({'&':'&amp;','<':'&lt;','>':'&gt;'}[c]));\nconst blankM=()=>({cbs:0,receita:0,rec_nat:0,rec_avon:0,pontos:0,pedidos:0,ativas:0});\n// ---------- município identity ----------\n// Brazil has many municipalities sharing a name (Bom Jesus alone exists in PI, RN, RS, SC, PB, GO).\n// A stage loads the dominant UF PLUS every bordering UF, so those collisions land in the SAME\n// feature set routinely: keyed by name alone the last shape loaded won, the map could draw a\n// município from the wrong state, buildAdj merged two unrelated municipalities into one node, and\n// GROUP BY DS_MUNICIPIO summed two real municipalities into one row. The key is NAME/UF everywhere\n// — SQL rows, GeoJSON features, the dominantes base, assignments, persisted sessions. norm() maps\n// every non-alphanumeric to a space, so '/' can never occur inside a name and the split is exact.\n// A missing UF degrades to a bare NAME key rather than inventing one.\nconst mkey=(name,uf)=>{const n=norm(name),u=String(uf==null?'':uf).trim().toUpperCase();return u?n+'/'+u:n;};\nconst mName=k=>{const s=String(k==null?'':k),i=s.lastIndexOf('/');return i<0?s:s.slice(0,i);};\nconst mUf=k=>{const s=String(k==null?'':k),i=s.lastIndexOf('/');return i<0?'':s.slice(i+1);};\nconst mDisp=k=>{const u=mUf(k);return u?mName(k)+' ('+u+')':mName(k);};\n// The base CSV is the ONLY source of a município's UF now, so its column is accepted in whatever\n// shape the base is maintained in: sigla, IBGE numeric code, or full state name. Anything that does\n// not resolve to a real sigla is treated as UNKNOWN rather than passed through — a bogus UF would key\n// a município to a shape that does not exist and drop it off the map without a word.\nconst UF_OF_CODE={}; Object.keys(UF_CODE).forEach(k=>{ UF_OF_CODE[UF_CODE[k]]=k; });\nconst UF_OF_NAME={ACRE:'AC',ALAGOAS:'AL',AMAPA:'AP',AMAZONAS:'AM',BAHIA:'BA',CEARA:'CE','DISTRITO FEDERAL':'DF','ESPIRITO SANTO':'ES',GOIAS:'GO',MARANHAO:'MA','MATO GROSSO':'MT','MATO GROSSO DO SUL':'MS','MINAS GERAIS':'MG',PARA:'PA',PARAIBA:'PB',PARANA:'PR',PERNAMBUCO:'PE',PIAUI:'PI','RIO DE JANEIRO':'RJ','RIO GRANDE DO NORTE':'RN','RIO GRANDE DO SUL':'RS',RONDONIA:'RO',RORAIMA:'RR','SANTA CATARINA':'SC','SAO PAULO':'SP',SERGIPE:'SE',TOCANTINS:'TO'};\nconst ufNorm=v=>{const s=norm(v); if(!s) return '';\n  if(UF_CODE[s]) return s;\n  if(UF_OF_CODE[s]) return UF_OF_CODE[s];\n  return UF_OF_NAME[s]||'';};\nconst loader=(on,t)=>{const l=$('#loader');l.classList.toggle('hidden',!on);if(t)l.textContent=t;};\nconst setError=(msg)=>{ const t=$('#ds'); if(t){t.textContent=msg;t.classList.add('err');} const c=$('#confirmStatus'); if(c){c.textContent=msg;c.classList.add('err');} };\n\n// ---------- base de municípios dominantes (CSV) ----------\n// WHICH municipalities belong to a sector is a business fact, not something to infer from CB volume:\n// it comes from a maintained CSV (one row per setor x município) linked through the `dominantesCsvUrl`\n// param. Anything the closing sector has CBs in but that the base does NOT assign to it is spillover:\n// not realocated, not drawn on the map, and its CBs follow their leader. Loaded once per URL and\n// cached for the whole session; a failure is thrown, never swallowed — a silent fallback here would\n// quietly change every number on the screen.\nconst DOM={url:null,promise:null,bySetor:null,ufBySetorMuni:null,rows:0,setores:0,hasUf:false,ufCol:null,badUf:0,clashes:0,headers:null,error:null};\nfunction parseCsv(text){\n  const out=[]; let row=[],cur='',q=false;\n  const push=()=>{ row.push(cur); cur=''; };\n  const endRow=()=>{ push(); if(row.length>1||row[0]!=='') out.push(row); row=[]; };\n  for(let i=0;i<text.length;i++){ const ch=text[i];\n    if(q){ if(ch==='\"'){ if(text[i+1]==='\"'){ cur+='\"'; i++; } else q=false; } else cur+=ch; }\n    else if(ch==='\"') q=true;\n    else if(ch===',') push();\n    else if(ch==='\\n') endRow();\n    else if(ch!=='\\r') cur+=ch;\n  }\n  if(cur!==''||row.length) endRow();\n  return out;\n}\n// `dominantesCsvUrl` is declared as a FileComponentUrlReference, so the instance points at the Drive\n// FILE, not at a URL literal — the Drive is policy-gated behind the app's auth strategy and a baked\n// string would be both stale and unauthorised. What the resolver hands back varies by where it is\n// resolved (URL string / file record / bare reference), so accept every shape instead of silently\n// reading undefined and falling through to the fallback.\n// The Drive is gated by the app's AuthenticationStrategy, so this read has to travel as the LOGGED-IN\n// USER — an anonymous CDN GET is exactly what the policy is there to refuse. `<system>.data2.media` is\n// only a cache in front of the SSP: on a cache miss it 302s to `<system>.data2apis.com`, which is where\n// the policy is actually evaluated.\n// COOKIES CANNOT CARRY THAT SESSION, which is why the previous `credentials:'include'` attempt could\n// never have worked: the app runs on <app>.<system>.data2.app and the SSP on <system>.data2apis.com —\n// cross-site — and the SSP answers `Access-Control-Allow-Origin: *` with no `Allow-Credentials`, so the\n// browser rejects a credentialed CORS read before it ever leaves the page. What the SSP actually reads\n// is `Authorization: Bearer <token>`: the runtime keeps that token in localStorage under\n// `__data2-session-<systemDomain>` (`__data2-session-data2` inside the builder preview) and replays it\n// on every dataset and rush call — same token, same header, same session, so the Drive policy sees the\n// logged-in user. Preflight passes because the SSP echoes whatever header the request asks for.\nfunction d2SessionToken(sysDomain){\n  const read=k=>{ try{ return (k&&window.localStorage.getItem(k))||''; }catch(e){ return ''; } };\n  return read(sysDomain?('__data2-session-'+sysDomain):'')||read('__data2-session-data2')||'';\n}\nfunction domCsvSystemDomain(url){\n  const m=/^https?:\\/\\/([^.\\/]+)\\.data2\\.(?:media|app)\\//i.exec(url)||/^https?:\\/\\/([^.\\/]+)\\.data2apis\\.com\\//i.exec(url);\n  return m?m[1]:'';\n}\nfunction domCsvCandidates(url){\n  const out=[];\n  const isMedia=/^https?:\\/\\/[^.\\/]+\\.data2\\.media\\//i.test(url);\n  const api=isMedia?url.replace(/^(https?:\\/\\/[^.\\/]+)\\.data2\\.media\\//i,'$1.data2apis.com/'):null;\n  const tok=d2SessionToken(domCsvSystemDomain(url));\n  const auth=tok?{authorization:'Bearer '+tok}:null;\n  // Authenticated origin read first — the only candidate a GATED Drive can actually answer.\n  if(api&&auth) out.push({url:api,headers:auth,label:'api+sessão'});\n  if(!api&&auth) out.push({url:url,headers:auth,label:'origem+sessão'});\n  // Anonymous last: only ever succeeds on an UNGATED Drive — or on a stale CDN cache hit, which is NOT\n  // proof the file is public (the origin keeps answering 401 once the edge entry expires).\n  if(api) out.push({url:api,headers:null,label:'api anônimo'});\n  out.push({url:url,headers:null,label:'origem anônima'});\n  return out;\n}\nfunction domCsvUrl(){\n  const pick=v=>{\n    if(!v) return '';\n    if(typeof v==='string') return v;\n    const q=v.params||{};\n    const ref=q.reference||v.reference;\n    return q.fileUrl||q.url||v.fileUrl||v.url||(ref?DOM_MEDIA_BASE+ref:'');\n  };\n  return String(pick(d2.param('dominantesCsvUrl'))||DOM_CSV_FALLBACK||'').trim();\n}\nasync function ensureDominantes(){\n  const url=domCsvUrl();\n  if(!url) throw new Error('base de municípios dominantes não configurada — ligue o arquivo CSV no parâmetro dominantesCsvUrl da instância do componente');\n  if(DOM.url===url && DOM.bySetor) return DOM.bySetor;\n  if(DOM.url===url && DOM.promise) return DOM.promise;\n  DOM.url=url; DOM.error=null;\n  DOM.promise=(async()=>{\n    // Self-diagnosing on purpose: every candidate reports its own outcome and the message names the\n    // session it was carrying. \"Unauthorized\" alone cannot distinguish \"not logged into THIS strategy\"\n    // from \"cookie not sent cross-site\" from \"param never bound, so it tried the fallback URL\" — and\n    // guessing between those from the outside costs a round trip each time.\n    let r=null; const tried=[];\n    for(const c of domCsvCandidates(url)){\n      let res=null;\n      try{ res=await fetch(c.url,{cache:'no-store',credentials:'omit',headers:c.headers||undefined}); }\n      catch(e){ tried.push(c.label+' → rede/CORS'); continue; }\n      if(res.ok){ r=res; break; }\n      tried.push(c.label+' → '+res.status);\n    }\n    if(!r){\n      let sess='sessão desconhecida';\n      try{\n        const a=d2.auth(AUTH_REF);\n        sess=(a&&a.isAuthed)?('logado como '+((a.user&&(a.user.email||a.user.nome))||'?')):('NÃO logado na estratégia '+AUTH_REF);\n      }catch(e){ sess='estratégia '+AUTH_REF+' não resolvida'; }\n      const tk=d2SessionToken(domCsvSystemDomain(url));\n      throw new Error('base de municípios dominantes: não foi possível ler o arquivo — '+sess+' · token de sessão '+(tk?'presente':'AUSENTE no localStorage')+'. Tentativas: '+tried.join(' · '));\n    }\n    const table=parseCsv(await r.text());\n    if(table.length<2) throw new Error('base de municípios dominantes vazia');\n    const head=table[0].map(h=>norm(h));\n    const iS=head.indexOf('CD SETOR'), iM=head.indexOf('MUNICIPIO');\n    if(iS<0||iM<0) throw new Error('base de municípios dominantes sem as colunas CD_SETOR / MUNICIPIO');\n    // CD_GV is the gerência de vendas the setor answers to, and it is the authority for the hard rule\n    // that a closing sector only ever hands territory to sectors of its OWN gerência. Its absence is\n    // fatal rather than a warning: with no GV there is no way to PROVE two sectors share one, and\n    // falling through unchecked is exactly the leak this column exists to close.\n    const iG=['CD GV','CDGV','GV','CD GERENCIA','CD GERENCIA VENDAS','CD GERENCIA DE VENDAS','GERENCIA DE VENDAS','GERENCIA'].map(h=>head.indexOf(h)).find(i=>i>=0);\n    if(iG==null) throw new Error('base de municípios dominantes sem a coluna CD_GV — a regra de gerência de vendas não pode ser aplicada. Colunas lidas: '+head.slice(0,40).join(', '));\n    // MERCADO fica ACIMA de GV na hierarquia (mercado > GV > setor) — fechamento de Mercado e a regra\n    // \"GV só fecha pra GV do mesmo mercado\" dependem dela do mesmo jeito que a regra de GV depende\n    // de CD_GV, então a ausência é fatal pelo mesmo motivo.\n    const iK=['MERCADO','MERCADO REGIONAL','MKT','MARKET'].map(h=>head.indexOf(h)).find(i=>i>=0);\n    if(iK==null) throw new Error('base de municípios dominantes sem a coluna MERCADO — fechamento de GV/Mercado precisa dela. Colunas lidas: '+head.slice(0,40).join(', '));\n    // Nomes de exibição — opcionais: a hierarquia funciona só com os códigos, mas o código sozinho\n    // não diz nada pro operador escolhendo o que fechar.\n    const iDS=['DC SETOR','NOME SETOR','DESCRICAO SETOR','NM SETOR'].map(h=>head.indexOf(h)).find(i=>i>=0);\n    const iDG=['DC GV','NOME GV','DESCRICAO GV','NM GV','GV NOME'].map(h=>head.indexOf(h)).find(i=>i>=0);\n    // The UF column is what the whole keying now rests on — SQL no longer carries DS_ESTADO — so its\n    // absence is a first-class finding, not a footnote. The header actually matched is reported on the\n    // base pill, and when nothing matches the pill lists every column read, because guessing a header\n    // name from the outside costs a round trip each time.\n    const iU=['UF','SIGLA UF','SG UF','CD UF','ESTADO','DS ESTADO','SIGLA','ESTADO SIGLA','UF MUNICIPIO'].map(h=>head.indexOf(h)).find(i=>i>=0);\n    const by={},ufBy={},gvBy={},mkBySetor={},setorLabel={},gvLabel={}; let n=0,bad=0; const clash={},gvClash={},mkClash={};\n    for(let i=1;i<table.length;i++){\n      const line=table[i]; if(!line) continue;\n      const s=String(line[iS]==null?'':line[iS]).trim(), m=norm(line[iM]);\n      if(!s||!m) continue;\n      // One setor spans many rows (one per município) and every one of them repeats its CD_GV. Two\n      // DIFFERENT values for the same setor means the base itself disagrees about which gerência owns\n      // it — counted and reported, never keyed to whichever row happened to be read last.\n      const gvv=String(line[iG]==null?'':line[iG]).trim();\n      if(gvv){ if(gvBy[s]!==undefined && gvBy[s]!==gvv) gvClash[s]=true; else gvBy[s]=gvv; }\n      const mkv=String(line[iK]==null?'':line[iK]).trim();\n      if(mkv){ if(mkBySetor[s]!==undefined && mkBySetor[s]!==mkv) mkClash[s]=true; else mkBySetor[s]=mkv; }\n      if(iDS!=null){ const lbl=String(line[iDS]==null?'':line[iDS]).trim(); if(lbl && !setorLabel[s]) setorLabel[s]=lbl; }\n      if(iDG!=null && gvv){ const lbl=String(line[iDG]==null?'':line[iDG]).trim(); if(lbl && !gvLabel[gvv]) gvLabel[gvv]=lbl; }\n      const raw=(iU==null)?'':line[iU];\n      const u=(iU==null)?'':ufNorm(raw);\n      if(iU!=null && String(raw==null?'':raw).trim() && !u) bad++;\n      // The same name twice in ONE setor under two UFs is the single case the reverted SQL cannot\n      // survive: mSQL groups by DS_MUNICIPIO alone, so both municipalities arrive summed into one row\n      // and no lookup can split them again. Counted and reported — never quietly keyed to whichever\n      // UF happened to be read last.\n      const kk=s+'|'+m;\n      // An UNRESOLVED uf must never outrank a resolved one. Reading a blank/bogus UF row first wrote ''\n      // here, and the next row carrying the real sigla was then rejected as a clash — so the key stayed\n      // falsy for good, ufFor() fell through, and the município degraded to a bare NAME key that matches\n      // no shape and no dominance entry. With DISTRITO/ZONA in the base a município spans several rows,\n      // so which row lands first is pure luck. A clash is only two RESOLVED siglas that disagree.\n      if(!u){ if(ufBy[kk]===undefined) ufBy[kk]=''; }\n      else if(!ufBy[kk]) ufBy[kk]=u;\n      else if(ufBy[kk]!==u) clash[kk]=true;\n      (by[s]=by[s]||new Set()).add(u?m+'/'+u:m); n++;\n    }\n    if(!n) throw new Error('base de municípios dominantes sem linhas válidas');\n    DOM.bySetor=by; DOM.ufBySetorMuni=ufBy; DOM.rows=n; DOM.setores=Object.keys(by).length;\n    DOM.gvBySetor=gvBy; DOM.gvClashes=Object.keys(gvClash).length; DOM.gvCol=String(table[0][iG]||'').trim();\n    DOM.gvSetores=Object.keys(gvBy).length;\n    DOM.hasUf=(iU!=null); DOM.ufCol=(iU==null?null:String(table[0][iU]||'').trim());\n    DOM.badUf=bad; DOM.clashes=Object.keys(clash).length; DOM.headers=head.slice(0,40); DOM.error=null;\n    // ---- hierarquia: setor ⊂ GV ⊂ mercado, tudo derivado do MESMO csv que a regra de setor já\n    // confia — fechamento de GV/Mercado lê a mesma fonte, nunca uma segunda base paralela.\n    DOM.mercadoBySetor=mkBySetor; DOM.mercadoClashes=Object.keys(mkClash).length; DOM.mercadoCol=String(table[0][iK]||'').trim();\n    DOM.setorLabel=setorLabel; DOM.gvLabel=gvLabel;\n    const sectorsByGv={},sectorsByMercado={},gvsByMercado={},mercadoByGv={},gvMercClash={};\n    Object.keys(by).forEach(s=>{\n      const gv=gvBy[s], mk=mkBySetor[s];\n      if(gv) (sectorsByGv[gv]=sectorsByGv[gv]||new Set()).add(s);\n      if(mk) (sectorsByMercado[mk]=sectorsByMercado[mk]||new Set()).add(s);\n      if(gv&&mk){ if(mercadoByGv[gv]!==undefined && mercadoByGv[gv]!==mk) gvMercClash[gv]=true; else mercadoByGv[gv]=mk; }\n    });\n    Object.entries(mercadoByGv).forEach(([gv,mk])=>(gvsByMercado[mk]=gvsByMercado[mk]||new Set()).add(gv));\n    DOM.sectorsByGv=sectorsByGv; DOM.sectorsByMercado=sectorsByMercado; DOM.gvsByMercado=gvsByMercado;\n    DOM.mercadoByGv=mercadoByGv; DOM.gvMercadoClashes=Object.keys(gvMercClash).length;\n    return by;\n  })();\n  DOM.promise.catch(e=>{ DOM.promise=null; DOM.bySetor=null; DOM.error=e.message; renderAll(); });\n  return DOM.promise;\n}\n\nlet SESS={ snapshotRaw:null, snapshotSyncedAt:null, snapLiteral:null, eloMaxCycle:null, timeline:[], selected:0,\n           sessionId:null, sessionLabel:null, sessionsList:[], sectorsList:[], sectorBaseCache:{}, stage:'loading', dirtyFrom:null,\n           snapBusy:false, settings:{...DEFAULT_SETTINGS} };\n\nasync function q(sql){\n  let dbx,res;\n  try{\n    res=await d2.rush('AwW_11Nkg-dKksP7ic8V8').invoke({sql});\n  }catch(e){\n    throw new Error('Databricks indisponível (rush AwW_11Nkg-dKksP7ic8V8): '+e.message);\n  }\n  // The listener answers 200 with {sql} and NO `result` when its upstream probe times out: the\n  // handler builds `result: $result.data`, so an empty upstream simply drops the key rather than\n  // failing. Reading straight through to res.data.result.data reported \"Cannot read properties of\n  // undefined (reading 'data')\" — which reads like a bug in THIS component and sent a debugging\n  // session after the wrong thing. Name the layer that actually failed instead.\n  const payload=res&&res.data;\n  if(!payload) throw new Error('rush AwW_11Nkg-dKksP7ic8V8 não devolveu corpo — listener fora do ar?');\n  if(!payload.result) throw new Error('a sonda Databricks não respondeu: o listener AwW_11Nkg-dKksP7ic8V8 devolveu 200 sem `result`, o que normalmente é timeout do upstream (natura-x-app). O SQL não chegou a rodar.');\n  dbx=payload.result.data;\n  if(!dbx) throw new Error('sonda Databricks respondeu sem dados (result.data vazio).');\n  if(dbx.state && dbx.state!=='SUCCEEDED') throw new Error('Databricks '+dbx.state+': '+(dbx.error?.message||JSON.stringify(dbx.error)||'erro desconhecido'));\n  return dbx;\n}\nfunction rows(resp){const c=(resp.columns||[]).map(x=>x.name);\n  return (resp.rows||[]).map(a=>Object.fromEntries(c.map((k,i)=>[k,a[i]])));}\n// Stamps the UF onto every feature at load: the fetch is per-UF, so this is the ONLY point where a\n// shape's state is known for certain. Downstream the features are flattened into one array and the\n// origin would be unrecoverable. Persisted with the feature in saved sessions.\nasync function geoUF(uf){const code=UF_CODE[uf]||uf;const r=await fetch('https://raw.githubusercontent.com/tbrugz/geodata-br/master/geojson/geojs-'+code+'-mun.json');if(!r.ok)throw new Error('geo '+uf);\n  const g=await r.json(); const U=String(uf).toUpperCase();\n  (g.features||[]).forEach(f=>{ f.__uf=U; });\n  return g;}\n\nfunction buildAdj(features){\n  const pts=f=>{const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates],s=new Set();\n    ps.forEach(poly=>poly.forEach(ring=>ring.forEach(p=>s.add(Math.round(p[0]*1000)/1000+','+Math.round(p[1]*1000)/1000))));return s;};\n  const feat={},idx={};\n  features.forEach(f=>{const nm=mkey(f.properties.name||f.properties.NOME||f.properties.nome,f.__uf);feat[nm]={f,pts:pts(f)};});\n  for(const nm in feat) feat[nm].pts.forEach(p=>(idx[p]=idx[p]||[]).push(nm));\n  const nbrs=nm=>{const c={};feat[nm].pts.forEach(p=>idx[p].forEach(o=>{if(o!==nm)c[o]=(c[o]||0)+1;}));\n    return Object.entries(c).filter(([,n])=>n>=2).map(([o,n])=>({o,w:n}));};\n  return {feat,nbrs};\n}\nfunction centroidLL(f){let x=0,y=0,n=0;const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];\n  ps.forEach(poly=>poly[0].forEach(p=>{x+=p[0];y+=p[1];n++;}));return[x/n,y/n];}\n\n// ---------- snapshot pinning ----------\nasync function resolveSnapshotPin(){\n  const [rawR,liveCountR,eloR]=await Promise.all([\n    q(`SELECT MAX(DT_HISTORICO) snap FROM ${T} WHERE CD_PAIS=1`).then(rows),\n    q(`SELECT COUNT(*) n FROM ${T} WHERE CD_PAIS=1 AND DT_HISTORICO=(SELECT MAX(DT_HISTORICO) FROM ${T} WHERE CD_PAIS=1)`).then(rows),\n    q(`SELECT MAX(operational_cycle) mx FROM ${ELO} WHERE country_code=1`).then(rows).catch(()=>[]),\n  ]);\n  const raw=rawR[0]&&rawR[0].snap;\n  const liveCount=+((liveCountR[0]||{}).n||0);\n  const eloMax=+((eloR[0]||{}).mx||0);\n  const LIVE_SUBQ=`(SELECT MAX(DT_HISTORICO) FROM ${T} WHERE CD_PAIS=1)`;\n  const dbTs=(raw||'').replace('T',' ').replace(/Z$/,'');\n  const candidates=[`TIMESTAMP'${dbTs}'`,`'${dbTs}'`,`DATE'${dbTs}'`];\n  const tests=await Promise.all(candidates.map(c=>\n    q(`SELECT COUNT(*) n FROM ${T} WHERE CD_PAIS=1 AND DT_HISTORICO=${c}`).then(rows).then(r=>+((r[0]||{}).n||0)).catch(()=>-1)\n  ));\n  let chosen=LIVE_SUBQ;\n  for(let i=0;i<candidates.length;i++){ if(liveCount>0 && tests[i]===liveCount){ chosen=candidates[i]; break; } }\n  return {snapshotRaw:raw, snapLiteral:chosen, eloMaxCycle:eloMax, syncedAt:new Date().toISOString()};\n}\n// DISPLAY CONTRACT: the UI never prints the snapshot's own DT_HISTORICO (snapshotRaw). What the user\n// sees is `snapshotSyncedAt` — the date AND hour at which THIS instance last pulled/pinned the\n// snapshot it is querying. snapshotRaw is still resolved, still drives every SQL literal, and is\n// still persisted by saveSession/doShare; it is only kept off the screen.\nfunction fmtSyncedAt(iso){\n  if(!iso) return '—';\n  const d=new Date(iso);\n  if(isNaN(d.getTime())) return String(iso);\n  return d.toLocaleString('pt-BR',{day:'2-digit',month:'2-digit',year:'numeric',hour:'2-digit',minute:'2-digit'});\n}\nasync function ensurePinned(){\n  if(SESS.snapLiteral) return;\n  const p=await resolveSnapshotPin();\n  SESS.snapshotRaw=p.snapshotRaw; SESS.snapLiteral=p.snapLiteral; SESS.eloMaxCycle=p.eloMaxCycle;\n  SESS.snapshotSyncedAt=p.syncedAt;\n}\n\n// ---------- world-state fold ----------\nfunction accMetrics(base,add){\n  const out=base?{...base}:blankM();\n  Object.keys(blankM()).forEach(k=>{ out[k]=(out[k]||0)+((add&&add[k])||0); });\n  return out;\n}\nfunction foldWorldState(timeline,uptoIdx){\n  const closedSectors=new Set(),muniOverride={},muniGeo={},muniRow={},muniLevel={},sectorInflow={},sectorInflowLevel={},sectorOrphanRows={};\n  // GV/mercado: setores e GVs não se dissolvem quando o dono deles fecha — eles só passam a\n  // responder a um destino novo. Por isso o rastro do cascade mora numa camada PRÓPRIA\n  // (secOverride/gvOverride), separada da camada de município do fechamento de setor — a\n  // hierarquia trava a sessão num nível só, então nunca as duas camadas têm conteúdo ao mesmo tempo.\n  const closedGvs=new Set(),secOverride={},gvInflow={};\n  const closedMercados=new Set(),gvOverride={},mercadoInflow={};\n  for(let k=0;k<uptoIdx;k++){\n    const mv=timeline[k]; if(!mv||!mv.sector||!mv.munis) continue;\n    const level=mv.level||'setor';\n    if(level==='gv'){\n      closedGvs.add(String(mv.sector));\n      Object.keys(mv.munis).forEach(u=>{\n        if(u==='__OUTROS__') return;\n        const dest=mv.assign[u]; if(!dest) return;\n        secOverride[u]=String(dest);\n        gvInflow[dest]=accMetrics(gvInflow[dest],mv.munis[u]);\n      });\n      continue;\n    }\n    if(level==='mercado'){\n      closedMercados.add(String(mv.sector));\n      Object.keys(mv.munis).forEach(u=>{\n        if(u==='__OUTROS__') return;\n        const dest=mv.assign[u]; if(!dest) return;\n        gvOverride[u]=String(dest);\n        mercadoInflow[dest]=accMetrics(mercadoInflow[dest],mv.munis[u]);\n      });\n      continue;\n    }\n    closedSectors.add(String(mv.sector));\n    Object.keys(mv.munis).forEach(m=>{\n      if(m==='__OUTROS__') return;\n      const dest=mv.assign[m]; if(!dest) return;\n      muniOverride[m]=String(dest);\n      if(mv.geoFeat&&mv.geoFeat[m]) muniGeo[m]=mv.geoFeat[m];\n      const rws=(mv.matrix||[]).filter(r=>mkey(r.municipio,r.uf)===m);\n      muniRow[m]=(muniRow[m]||[]).concat(rws);\n      if(mv.levelByMuni&&mv.levelByMuni[m]) muniLevel[m]={...(muniLevel[m]||{}),...mv.levelByMuni[m]};\n      sectorInflow[dest]=accMetrics(sectorInflow[dest],mv.munis[m]);\n      const lv=(mv.levelByMuni&&mv.levelByMuni[m])||{};\n      sectorInflowLevel[dest]=sectorInflowLevel[dest]||{};\n      Object.entries(lv).forEach(([nv,c])=>{ sectorInflowLevel[dest][nv]=(sectorInflowLevel[dest][nv]||0)+c; });\n    });\n    // Orphan CBs follow their leader's home sector, so later etapas must inherit them the same way\n    // the allocated municipalities are inherited — otherwise a stage's span would not match the\n    // base carried into the next one.\n    if(mv.orphanMetricsByGroup && Object.keys(mv.orphanMetricsByGroup).length){\n      const d=computeDerived(mv);\n      d.leaders.forEach(L=>{\n        if(!L.home) return;\n        const om=mv.orphanMetricsByGroup[L.grupo];\n        if(om) sectorInflow[L.home]=accMetrics(sectorInflow[L.home],om);\n        // sectorInflow only reaches a sector while it is a DESTINATION (it lands in baseMetrics).\n        // Keep the rows as well, so the sector still carries these CBs on the day it is the one\n        // being closed — that read goes through mv.matrix, which baseMetrics never touches.\n        const orws=mv.orphanRowsByGroup&&mv.orphanRowsByGroup[L.grupo];\n        if(orws&&orws.length) sectorOrphanRows[L.home]=(sectorOrphanRows[L.home]||[]).concat(orws);\n        const ol=mv.orphanLevelByGroup&&mv.orphanLevelByGroup[L.grupo];\n        if(ol){ sectorInflowLevel[L.home]=sectorInflowLevel[L.home]||{};\n          Object.entries(ol).forEach(([nv,c])=>{ sectorInflowLevel[L.home][nv]=(sectorInflowLevel[L.home][nv]||0)+c; }); }\n      });\n    }\n  }\n  return {closedSectors,muniOverride,muniGeo,muniRow,muniLevel,sectorInflow,sectorInflowLevel,sectorOrphanRows,\n          closedGvs,secOverride,gvInflow,closedMercados,gvOverride,mercadoInflow};\n}\n\n// ---------- per-movement compute ----------\nfunction aggregateMovement(mv){\n  const level=mv.level||'setor';\n  const munis={},leaders={};\n  const exSet=new Set((mv.excludedMunis||[]).map(x=>x.muni));\n  const acc=(o,r)=>{o.cbs+=+r.cbs;o.receita+=+r.receita||0;o.rec_nat+=+r.rec_nat||0;o.rec_avon+=+r.rec_avon||0;o.pontos+=+r.pontos||0;o.pedidos+=+r.pedidos||0;o.ativas+=+r.ativas||0;};\n  // Orphans = CBs in municipalities outside the sector's dominance base. They are NOT allocated\n  // geographically; they follow their own leader's home sector. Kept per leader group so every\n  // consumer (span, cascade, impact report) can route them the same way. Só existe no nível setor —\n  // GV/mercado não têm spillover (todo setor pertence a exatamente uma GV/mercado na base).\n  mv.orphanByGroup={}; mv.orphanMetricsByGroup={}; mv.orphanRowsByGroup={};\n  // unidade que este nível redistribui: a própria município (setor fecha), o setor da linha (GV\n  // fecha), a GV do setor da linha (mercado fecha).\n  const unitOf=r=>level==='setor'?null:(level==='gv'?String(r.setor):(DOM.gvBySetor[String(r.setor)]||''));\n  mv.matrix.forEach(r=>{\n    const m=mkey(r.municipio,r.uf);\n    r._out=!mv.geoFeat[m];   // assign, never just set: absorbed rows are reused across etapas\n    const mm=level==='setor'?(r._out?'__OUTROS__':m):(unitOf(r)||'__OUTROS__');\n    munis[mm]=munis[mm]||{...blankM(),name:mm}; acc(munis[mm],r);\n    const g=String(r.grupo); leaders[g]=leaders[g]||{grupo:g,lider:r.lider,total:0,byMuni:{}};\n    leaders[g].total+=+r.cbs; leaders[g].byMuni[mm]=(leaders[g].byMuni[mm]||0)+ +r.cbs;\n    if(level==='setor' && r._out && exSet.has(m)){\n      mv.orphanByGroup[g]=(mv.orphanByGroup[g]||0)+ +r.cbs;\n      // The ROW too, not just the totals: when the leader's home sector is itself closed in a later\n      // etapa, that etapa rebuilds its matrix from SQL + absorbed municípios, and these CBs are in\n      // neither (their município never moved). Without the row they silently vanish from the sector\n      // they were just credited to — see sectorOrphanRows in foldWorldState.\n      (mv.orphanRowsByGroup[g]=mv.orphanRowsByGroup[g]||[]).push(r);\n      mv.orphanMetricsByGroup[g]=accMetrics(mv.orphanMetricsByGroup[g],\n        {cbs:+r.cbs,receita:+r.receita||0,rec_nat:+r.rec_nat||0,rec_avon:+r.rec_avon||0,pontos:+r.pontos||0,pedidos:+r.pedidos||0,ativas:+r.ativas||0});\n    }\n  });\n  // Level counts only exist per municipality, never per leader, so an excluded municipality's level\n  // mix is credited to the group holding most of its CBs (sub-threshold by definition, so usually one).\n  mv.orphanLevelByGroup={};\n  (mv.excludedMunis||[]).forEach(({muni})=>{\n    const lv=(mv.levelByMuni&&mv.levelByMuni[muni])||{}; if(!Object.keys(lv).length) return;\n    let bg=null,bc=-1;\n    mv.matrix.forEach(r=>{ if(mkey(r.municipio,r.uf)!==muni) return; const cc=+r.cbs; if(cc>bc){bc=cc;bg=String(r.grupo);} });\n    if(!bg) return;\n    mv.orphanLevelByGroup[bg]=mv.orphanLevelByGroup[bg]||{};\n    Object.entries(lv).forEach(([nv,cc])=>{ mv.orphanLevelByGroup[bg][nv]=(mv.orphanLevelByGroup[bg][nv]||0)+cc; });\n  });\n  mv.munis=munis; mv.leaders=Object.values(leaders).sort((a,b)=>b.total-a.total);\n}\nfunction autoAssignFor(mv){\n  const a={};\n  Object.keys(mv.munis).forEach(m=>{ if(m==='__OUTROS__')return;\n    const v=mv.allowed[m]||{}; const votes=Object.keys(v);\n    if(votes.length){ let best=votes[0],bw=-1; for(const s of votes) if(v[s]>bw){bw=v[s];best=s;} a[m]=best; }\n    else if(mv.dest.length){ const c=mv.muniCentroid[m]; let best=mv.dest[0],bd=Infinity;\n      for(const s of mv.dest){ const sc=mv.secCentroid[s]; if(!sc||!c)continue; const d=(c[0]-sc[0])**2+(c[1]-sc[1])**2; if(d<bd){bd=d;best=s;} }\n      a[m]=best; }\n  });\n  return a;\n}\nfunction deslocFor(mv,assign){\n  let d=0;\n  mv.leaders.forEach(L=>{const byS={};let tot=0;\n    for(const [m,c] of Object.entries(L.byMuni)){if(m==='__OUTROS__')continue;const s=assign[m];if(s){byS[s]=(byS[s]||0)+c;tot+=c;}}\n    const home=mv.dest.reduce((a,s)=>(byS[s]||0)>(byS[a]||0)?s:a,mv.dest[0]);\n    d+=tot-(byS[home]||0);});\n  return d;\n}\nfunction spanMapFor(mv,a){const inc={};mv.dest.forEach(s=>inc[s]=0);\n  Object.entries(mv.munis).forEach(([m,o])=>{if(m==='__OUTROS__')return;const s=a[m];if(s&&inc[s]!=null)inc[s]+=o.cbs;});\n  // Orphan CBs follow their leader's home sector, and that home depends on THIS candidate\n  // assignment — so they have to be counted here, or the optimizer would score and constrain a\n  // span that differs from the one the UI shows. Skipped entirely when there are no orphans.\n  if(mv.orphanByGroup&&Object.keys(mv.orphanByGroup).length){\n    mv.leaders.forEach(L=>{\n      const orphan=mv.orphanByGroup[L.grupo]||0; if(!orphan) return;\n      const byS={}; let tot=0;\n      for(const [m,c] of Object.entries(L.byMuni)){ if(m==='__OUTROS__') continue; const s=a[m]; if(s&&inc[s]!=null){ byS[s]=(byS[s]||0)+c; tot+=c; } }\n      if(!tot) return;   // no home to follow -> stranded, counted nowhere\n      const home=mv.dest.reduce((x,s)=>(byS[s]||0)>(byS[x]||0)?s:x,mv.dest[0]);\n      if(inc[home]!=null) inc[home]+=orphan;\n    });\n  }\n  const sp={};mv.dest.forEach(s=>sp[s]=(+(mv.baseMetrics[s]?.cbs||0))+inc[s]);return sp;}\nfunction maxSpanOfFor(mv,a){return Math.max(...Object.values(spanMapFor(mv,a)),0);}\nfunction spanLimits(mv){\n  // Span alvo/máximo/mínimo é uma regra de fechamento de SETOR (tamanho ideal de território) —\n  // GV/mercado não têm essa noção e ignoram qualquer valor configurado nas opções da sessão.\n  if(mv && (mv.level||'setor')!=='setor') return {target:null,max:null,min:null};\n  const st={...DEFAULT_SETTINGS,...(SESS.settings||{})};\n  return {target:numOrNull(st.targetSpan),max:numOrNull(st.maxSpan),min:numOrNull(st.minSpan)};}\nfunction spanLimitsOn(lim){return !!(lim.target||lim.max||lim.min);}\nfunction spanViolationsOf(sp,lim){const over=[],under=[];\n  Object.entries(sp).forEach(([s,v])=>{ if(lim.max&&v>lim.max)over.push(s); if(lim.min&&v<lim.min)under.push(s); });\n  return {over,under};}\nfunction spanViolationsFor(mv,a){return spanViolationsOf(spanMapFor(mv,a),spanLimits(mv));}\n// With a target span the objective becomes RMS distance from the ideal size (punishes too big AND\n// too small). With no target we keep the legacy objective: shave the biggest sector.\nfunction spanCostFor(mv,a){const lim=spanLimits(mv),vals=Object.values(spanMapFor(mv,a));\n  if(!vals.length) return 0;\n  if(lim.target) return Math.sqrt(vals.reduce((s,v)=>s+(v-lim.target)**2,0)/vals.length);\n  return Math.max(...vals);}\n// ---------- ÓTIMO: objetivo multi-critério ----------\n// Three normalised objectives, each 0..1, so the weights below are directly comparable. The old\n// score added a span cost measured in CBs to a desloc measured in CBs, so on a large sector the\n// balance term was numerically ~100x the desloc term and silently decided everything on its own.\n//   balance — RMS spread of the resulting spans (against the target span when one is set,\n//             otherwise against their own mean), over that reference. 0 = every destination\n//             sector ends up the same size.\n//   dist    — how far each município travels, CB-weighted: half from the share of its outer\n//             border that faces the sector it was given to, half from centroid distance. 0 =\n//             every município went to a sector it physically touches. Adjacency used to be a\n//             pure yes/no constraint (contiguity); this is what makes it a preference too.\n//   orphan  — stranded orphan CBs (leader left without a home sector, so they land nowhere at\n//             all) plus CBs split away from their leader's home, over the CBs at stake.\n//             Stranded ones count OPT_STRAND_K times: a stranded CB leaves the model entirely,\n//             a deslocated one merely changes hands.\nconst OPT_W={balance:1, dist:0.85, orphan:1};\nconst OPT_STRAND_K=3;\nconst OPT_SIMS=24;             // simultaneous simulations per run, scaled down on big stages\nconst OPT_PASSES=14;           // local-search sweeps inside one simulation\nconst OPT_EVAL_BUDGET=120000;  // total candidate evaluations across the whole portfolio\nconst OPT_EXHAUSTIVE_MAX=60000;\nfunction optDistPrep(mv){\n  let mx=0;\n  Object.keys(mv.munis).forEach(m=>{ if(m==='__OUTROS__') return; const c=mv.muniCentroid[m]; if(!c) return;\n    mv.dest.forEach(s=>{ const sc=mv.secCentroid[s]; if(!sc) return;\n      const d=Math.hypot(c[0]-sc[0],c[1]-sc[1]); if(d>mx) mx=d; }); });\n  return mx||1;\n}\nfunction optDistCost(mv,m,s,dmax){\n  const v=mv.allowed[m]||{}; let tot=0; for(const k in v) tot+=v[k];\n  const share=tot?((v[s]||0)/tot):0;\n  const c=mv.muniCentroid[m], sc=mv.secCentroid[s];\n  // Missing centroid on either side is neutral (0.5), never 0 — an unmeasurable move must not\n  // score as the cheapest one on the board.\n  const geo=(c&&sc)?Math.min(1,Math.hypot(c[0]-sc[0],c[1]-sc[1])/dmax):0.5;\n  return 0.5*(1-share)+0.5*geo;\n}\nfunction optEval(mv,a,dmax){\n  const lim=spanLimits(mv);\n  const sp=spanMapFor(mv,a), vals=Object.values(sp);\n  let balance=0;\n  if(vals.length){\n    const ref=lim.target||(vals.reduce((x,y)=>x+y,0)/vals.length);\n    if(ref) balance=Math.min(1,Math.sqrt(vals.reduce((s,v)=>s+(v-ref)**2,0)/vals.length)/ref);\n  }\n  let cbs=0,dist=0;\n  for(const m in a){ const o=mv.munis[m]; if(!o) continue; const w=+o.cbs||0; cbs+=w; dist+=w*optDistCost(mv,m,a[m],dmax); }\n  dist=cbs?(dist/cbs):0;\n  let stranded=0,desloc=0,tot=0;\n  mv.leaders.forEach(L=>{\n    const byS={}; let t=0;\n    for(const [m,c] of Object.entries(L.byMuni)){ if(m==='__OUTROS__') continue; const s=a[m]; if(s){ byS[s]=(byS[s]||0)+c; t+=c; } }\n    const orphan=(mv.orphanByGroup&&mv.orphanByGroup[L.grupo])||0;\n    tot+=t+orphan;\n    if(!t){ stranded+=orphan; return; }   // no allocated CBs -> no home -> these orphans land nowhere\n    const home=mv.dest.reduce((x,s)=>(byS[s]||0)>(byS[x]||0)?s:x,mv.dest[0]);\n    desloc+=t-(byS[home]||0);\n  });\n  const orphanTerm=tot?Math.min(1,(desloc+OPT_STRAND_K*stranded)/tot):0;\n  return { cost:OPT_W.balance*balance+OPT_W.dist*dist+OPT_W.orphan*orphanTerm,\n           balance, dist, desloc, stranded, sp, viol:spanViolationsOf(sp,lim) };\n}\nfunction optScoreFor(mv,a){ return optEval(mv,a,mv.__optDmax||optDistPrep(mv)).cost; }\n// Seeded PRNG on purpose. computeMovement runs the optimizer for EVERY stage and recomputeFrom\n// re-runs every stage downstream of an edit, so a Math.random() portfolio would hand back a\n// different allocation on each pass and a saved timeline would never reproduce.\nfunction optRng(seed){ let a=seed>>>0;\n  return ()=>{ a=(a+0x6D2B79F5)>>>0; let t=Math.imul(a^(a>>>15),1|a);\n    t=(t+Math.imul(t^(t>>>7),61|t))^t; return ((t^(t>>>14))>>>0)/4294967296; }; }\nfunction optSeed(mv,ms){ let h=2166136261>>>0;\n  const s=String(mv.sector)+'|'+ms.join(',')+'|'+mv.dest.join(',');\n  for(let i=0;i<s.length;i++) h=Math.imul(h^s.charCodeAt(i),16777619);\n  return h>>>0; }\nfunction contigBadFor(mv,assign){\n  // Contiguidade geográfica só faz sentido no grão de município (setor fechando): setores e GVs\n  // não precisam formar uma mancha contínua quando GV/mercado fecha — cada setor/GV vai pro destino\n  // que faz sentido pra ele, sem exigir que o conjunto redistribuído continue \"grudado\".\n  if((mv.level||'setor')!=='setor') return [];\n  const bySec={}; for(const m in assign){(bySec[assign[m]]=bySec[assign[m]]||[]).push(m);}\n  const bad=[];\n  for(const s in bySec){const grp=bySec[s],inGrp=new Set(grp);\n    const seeds=grp.filter(m=>(mv.allowed[m]||{})[s]);\n    if(!seeds.length){bad.push(s);continue;}\n    const seen=new Set(seeds),st=[...seeds];\n    while(st.length){const m=st.pop();(mv.closeAdj[m]||[]).forEach(o=>{if(inGrp.has(o)&&!seen.has(o)){seen.add(o);st.push(o);}});}\n    if(seen.size!==grp.length)bad.push(s);}\n  return bad;\n}\nfunction greedyFor(mv,ms,opts){const lim=spanLimits(mv);const a={};\n  ms.forEach((m,i)=>{let best=opts[i][0],bd=Infinity;\n    for(const s of opts[i]){a[m]=s;\n      // over-max only grows as we keep assigning, so it is safe to penalise mid-build;\n      // under-min shrinks, so penalising it here would just chase noise.\n      const over=lim.max?spanViolationsOf(spanMapFor(mv,a),{max:lim.max,min:null}).over.length:0;\n      const d=optScoreFor(mv,a)+(contigBadFor(mv,a).length?1e9:0)+over*1e6;\n      if(d<bd){bd=d;best=s;}}\n    a[m]=best;});\n  return a;}\nfunction optimizeFor(mv){\n  const ms=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__');\n  if(!ms.length||!mv.dest.length){ mv.optBadge=mv.dest.length?'':'sem setor destino identificado'; return {}; }\n  const opts=ms.map(m=>{const al=(mv.reachable[m]&&mv.reachable[m].length)?mv.reachable[m]:mv.dest.slice();return al.length?al:mv.dest.slice();});\n  const combos=opts.reduce((a,o)=>a*o.length,1);\n  const lim=spanLimits(mv);\n  const dmax=optDistPrep(mv); mv.__optDmax=dmax;\n\n  // Feasibility ladder — same meaning as before, because renderSpanRule and the saved sessions\n  // both read mv.optTier: 0 = contíguo + max + min span, 1 = contíguo + max span, 2 = contíguo\n  // only. Every candidate any simulation produces is offered to all three tiers; we ship the\n  // strictest tier that got a solution, so an unreachable min/max relaxes loudly instead of\n  // stranding the stage with nothing.\n  const tier=[null,null,null],tSc=[Infinity,Infinity,Infinity],tEv=[null,null,null];\n  let feasible=0,evals=0;\n  const offer=(a,ev)=>{\n    if(contigBadFor(mv,a).length) return false;\n    feasible++;\n    const put=t=>{ if(ev.cost<tSc[t]){ tSc[t]=ev.cost; tier[t]={...a}; tEv[t]=ev; } };\n    put(2);\n    if(!ev.viol.over.length){ put(1); if(!ev.viol.under.length) put(0); }\n    return true;\n  };\n  const evalOf=a=>{ evals++; return optEval(mv,a,dmax); };\n\n  // Small enough to settle the question outright: enumerate every contiguous allocation and the\n  // winner is provably the best one under this objective. No search needed, so none is run.\n  const exhaustive=combos<=OPT_EXHAUSTIVE_MAX;\n  let sims=0;\n  if(exhaustive){\n    const cur={};\n    const rec=i=>{ if(i===ms.length){ offer(cur,evalOf(cur)); return; }\n      for(const s of opts[i]){ cur[ms[i]]=s; rec(i+1); } };\n    rec(0);\n  } else {\n    // Too big to enumerate, so run a portfolio of independent simulations instead. Each one is a\n    // seed assignment, then hill-climbing on single-município reassignments, then one perturbation\n    // and another climb to escape whatever local optimum it settled into. Different seeds land in\n    // different basins; the ladder above keeps the best across all of them.\n    const improve=a=>{\n      let ev=evalOf(a); offer(a,ev);\n      for(let pass=0;pass<OPT_PASSES;pass++){\n        let moved=false;\n        for(let i=0;i<ms.length;i++){\n          const m=ms[i],cur=a[m]; let best=cur,bev=ev;\n          for(const s of opts[i]){\n            if(s===cur) continue;\n            a[m]=s;\n            const e=evalOf(a);\n            // contiguity is a hard constraint, and the cheaper test runs first on purpose\n            if(e.cost<bev.cost-1e-12 && !contigBadFor(mv,a).length){ best=s; bev=e; }\n          }\n          a[m]=best;\n          if(best!==cur){ ev=bev; moved=true; offer(a,ev); }\n        }\n        if(!moved) break;\n      }\n    };\n    const rng=optRng(optSeed(mv,ms));\n    const perSim=Math.max(1,ms.length*Math.max(1,mv.dest.length)*OPT_PASSES);\n    const budget=Math.max(4,Math.min(OPT_SIMS,Math.floor(OPT_EVAL_BUDGET/perSim)||4));\n    const seeds=[];\n    if(mv.assign&&ms.every(m=>mv.assign[m])) seeds.push({...mv.assign});   // never regress on what is already on screen\n    seeds.push(autoAssignFor(mv));                                        // adjacency-first seed\n    seeds.push(greedyFor(mv,ms,opts));                                    // balance-first seed\n    while(seeds.length<budget){\n      // randomised construction biased toward nearby sectors — the bias keeps each seed sane, the\n      // randomness is what sends the runs into different basins\n      const a={};\n      ms.forEach((m,i)=>{ let bs=opts[i][0],bw=-Infinity;\n        for(const s of opts[i]){ const w=(1-optDistCost(mv,m,s,dmax))+rng()*0.9; if(w>bw){bw=w;bs=s;} }\n        a[m]=bs; });\n      seeds.push(a);\n    }\n    seeds.forEach(seed=>{\n      const a={...seed};\n      // a restored or legacy assign can still name a sector this stage no longer offers\n      ms.forEach((m,i)=>{ if(!opts[i].includes(a[m])) a[m]=opts[i][0]; });\n      improve(a);\n      const kick=Math.max(1,Math.round(ms.length*0.25));\n      for(let k=0;k<kick;k++){ const i=Math.floor(rng()*ms.length); a[ms[i]]=opts[i][Math.floor(rng()*opts[i].length)]; }\n      improve(a);\n    });\n    sims=seeds.length;\n  }\n\n  const t=tier.findIndex(x=>x);\n  if(t<0){ mv.optTier=-1; mv.optBadge='sem solução conectada — heurística'; return greedyFor(mv,ms,opts); }\n  const best=tier[t], ev=tEv[t]; mv.optTier=t;\n  const relax=[];\n  if(t>0 && lim.min) relax.push('span mínimo '+fmt(lim.min));\n  if(t>1 && lim.max) relax.push('span máximo '+fmt(lim.max));\n  mv.optStats={balance:ev.balance,dist:ev.dist,desloc:ev.desloc,stranded:ev.stranded,sims,evals,feasible,combos,exhaustive};\n  mv.optBadge=`ótimo · ${exhaustive?`espaço completo (${fmt(combos)})`:`${fmt(sims)} simulações`}`\n    +` · equilíbrio ±${Math.round(ev.balance*100)}% · adjacência ${Math.round((1-ev.dist)*100)}%`\n    +` · quebra ${fmt(ev.desloc)} CBs · ${fmt(ev.stranded)} fora do setor sem destino`\n    +` · pico ${fmt(maxSpanOfFor(mv,best))} CBs`\n    +(lim.target?` · alvo ${fmt(lim.target)}`:'')\n    +(relax.length?` · ⚠ inatingível: ${relax.join(' + ')}`:(spanLimitsOn(lim)?' · limites ok':''));\n  return best;\n}\nfunction computeDerived(mv){\n  const inc={},gained={},orph={};mv.dest.forEach(s=>{inc[s]=0;gained[s]=0;orph[s]=0;});\n  Object.entries(mv.munis).forEach(([m,o])=>{if(m==='__OUTROS__')return;const s=mv.assign[m];if(s&&inc[s]!=null)inc[s]+=o.cbs;});\n  let desloc=0,orphanTotal=0,orphanStranded=0;\n  const L2=mv.leaders.map(L=>{const byS={};mv.dest.forEach(s=>byS[s]=0);let tot=0;\n    for(const [m,c] of Object.entries(L.byMuni)){if(m==='__OUTROS__')continue;const s=mv.assign[m];if(s&&byS[s]!=null){byS[s]+=c;tot+=c;}}\n    // no allocated CBs => no home. Picking dest[0] by default would silently dump this leader's\n    // orphan CBs into an arbitrary sector, so we leave it null and report them as stranded.\n    const home=(tot>0&&mv.dest.length)?mv.dest.reduce((a,s)=>byS[s]>byS[a]?s:a,mv.dest[0]):null;\n    const dl=tot-(home?byS[home]:0);desloc+=dl;if(home)gained[home]++;\n    const orphan=(mv.orphanByGroup&&mv.orphanByGroup[L.grupo])||0;\n    orphanTotal+=orphan;\n    if(orphan){ if(home&&orph[home]!=null) orph[home]+=orphan; else orphanStranded+=orphan; }\n    return {...L,byS,home,desloc:dl,assignedTotal:tot,orphan,orphanHome:(orphan&&home)?home:null};});\n  const span={};mv.dest.forEach(s=>span[s]=(+(mv.baseMetrics[s]?.cbs||0))+inc[s]+orph[s]);\n  return {inc,gained,desloc,leaders:L2,span,orph,orphanTotal,orphanStranded};\n}\n\nasync function computeMovement(code,level,world){\n  level=level||'setor';\n  code=String(code);\n  const mv={sector:code,level,policy:'fora',view:'tobe',selMuni:null,optBadge:''};\n  const SNAP=SESS.snapLiteral;\n  // GV/mercado precisam da base ANTES de montar a query (pra saber quais CD_SETOR entram no IN);\n  // setor não precisa — mantém o timing original (a query dispara sem esperar o CSV).\n  let domBase=level==='setor'?null:await ensureDominantes();\n  const memberSectors=level==='setor'?[code]:memberSectorsOf(level,code,world);\n  if(!memberSectors.length) throw new Error(`${LEVELS[level].label} ${code} não existe na base de municípios dominantes (CSV) — atualize a base antes de fechar`);\n  const secList=memberSectors.join(',');\n\n  const mSQL=`SELECT DS_MUNICIPIO municipio, CD_SETOR setor, CD_GRUPO grupo, MAX(DS_LEADER_NAME) lider,\n     COUNT(DISTINCT CD_CONSULTORA) cbs, ROUND(SUM(VL_PEDIDOS_CICLO),0) receita,\n     ROUND(SUM(VL_PEDIDOS_NATURA_CICLO),0) rec_nat, ROUND(SUM(VL_PEDIDOS_AVON_CICLO),0) rec_avon,\n     ROUND(SUM(QT_PONTOS_CICLO),0) pontos, ROUND(SUM(QT_PEDIDOS_CICLO),0) pedidos,\n     SUM(CASE WHEN ST_FEZ_PED_CICLO_ATUAL THEN 1 ELSE 0 END) ativas\n    FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR IN (${secList}) AND DT_HISTORICO=${SNAP}\n    GROUP BY DS_MUNICIPIO, CD_SETOR, CD_GRUPO`;\n  const ufSQL=`SELECT DS_ESTADO uf, COUNT(*) n FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR IN (${secList}) AND DT_HISTORICO=${SNAP} GROUP BY DS_ESTADO ORDER BY n DESC`;\n  const trendSQL=`SELECT operational_cycle ciclo, COUNT(DISTINCT person_code) cbs,\n     COUNT(DISTINCT CASE WHEN registered_bc_ind=1 THEN person_code END) ativas,\n     ROUND(SUM(revenue_nat_ss_amt),0) receita, ROUND(SUM(points_nat_ss_amt),0) pontos\n    FROM ${ELO} WHERE country_code=1 AND sector_code IN (${secList}) AND operational_cycle<=${SESS.eloMaxCycle||999999} GROUP BY operational_cycle ORDER BY operational_cycle DESC LIMIT 8`;\n  const lvlSQL=`SELECT DS_NVL_PLAN_CRESC nivel, COUNT(DISTINCT CD_CONSULTORA) cbs,\n     ROUND(SUM(VL_PEDIDOS_NATURA_CICLO),0) rec_nat, ROUND(SUM(VL_PEDIDOS_AVON_CICLO),0) rec_avon\n    FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR IN (${secList}) AND DS_NVL_PLAN_CRESC IS NOT NULL AND DT_HISTORICO=${SNAP} GROUP BY DS_NVL_PLAN_CRESC ORDER BY cbs DESC`;\n  const lvlMuniSQL=`SELECT DS_MUNICIPIO municipio, CD_SETOR setor, DS_NVL_PLAN_CRESC nivel, COUNT(DISTINCT CD_CONSULTORA) cbs\n    FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR IN (${secList}) AND DS_NVL_PLAN_CRESC IS NOT NULL AND DT_HISTORICO=${SNAP} GROUP BY DS_MUNICIPIO, CD_SETOR, DS_NVL_PLAN_CRESC`;\n  const [mR,ufR,tR,lR,lmR]=await Promise.all([q(mSQL),q(ufSQL),q(trendSQL),q(lvlSQL),q(lvlMuniSQL)]);\n\n  const ownMatrix=rows(mR).filter(r=>+r.cbs>0);\n  mv.pureOwnMetrics=blankM();\n  ownMatrix.forEach(r=>{ mv.pureOwnMetrics.cbs+=+r.cbs; mv.pureOwnMetrics.receita+=+r.receita||0; mv.pureOwnMetrics.rec_nat+=+r.rec_nat||0; mv.pureOwnMetrics.rec_avon+=+r.rec_avon||0; mv.pureOwnMetrics.pontos+=+r.pontos||0; mv.pureOwnMetrics.pedidos+=+r.pedidos||0; mv.pureOwnMetrics.ativas+=+r.ativas||0; });\n\n  mv.levelByMuni={};\n  if(level==='setor') Object.entries(world.muniLevel||{}).forEach(([m,lv])=>{ if(world.muniOverride[m]===code) mv.levelByMuni[m]={...lv}; });\n\n  mv.trend=rows(tR).map(r=>({...r,cbs:+r.cbs,ativas:+r.ativas,receita:+r.receita,pontos:+r.pontos})).filter(r=>r.cbs>10).reverse();\n  mv.levels=rows(lR);\n\n  let absorbedRows=[],inheritedOrphanRows=[];\n  if(level==='setor'){\n    Object.entries(world.muniOverride).forEach(([m,destSec])=>{ if(destSec===code && world.muniRow[m]) absorbedRows.push(...world.muniRow[m]); });\n    inheritedOrphanRows=(world.sectorOrphanRows&&world.sectorOrphanRows[code])||[];\n  }\n  mv.matrix=ownMatrix.concat(absorbedRows,inheritedOrphanRows);\n\n  const ufList=rows(ufR).map(r=>r.uf).filter(Boolean);\n  const domUF=ufList[0]||'PR';\n  mv.domUF=domUF;\n  domBase=domBase||await ensureDominantes();\n  // Uma GV ou mercado pode espalhar por mais UFs do que \"a UF dominante + suas vizinhas\" cobre —\n  // toda UF que aparece na base de dominantes de QUALQUER setor-membro entra na janela de shapes.\n  const memberUFs=new Set([domUF]);\n  memberSectors.forEach(s=>{ (domBase[String(s)]||new Set()).forEach(entry=>{ const u=mUf(entry); if(u) memberUFs.add(u); }); });\n  const ufSet=new Set(memberUFs);\n  memberUFs.forEach(u=>(UF_BORDERS[u]||[]).forEach(b=>ufSet.add(b)));\n  const geos=await Promise.all([...ufSet].map(u=>geoUF(u).catch(()=>null)));\n  const allFeat=geos.filter(Boolean).flatMap(g=>g.features);\n  const adj=buildAdj(allFeat);\n\n  // A UF só vem da base de dominantes (setor real da linha × município), nunca de \"esse nome só\n  // apareceu numa UF carregada\" ou de um chute pra UF dominante do fechamento inteiro. Os dois\n  // eram seguros quando só 1-3 UFs entravam na janela (fechamento de setor); GV e principalmente\n  // mercado carregam dezenas de UFs de uma vez, então \"único entre as UFs carregadas\" deixa de\n  // significar \"único no Brasil\" — era exatamente esse chute que colocava um homônimo de outra UF\n  // espalhado longe do resto do mapa. Sem entrada na base, o município fica sem UF (mesmo\n  // tratamento de \"sem shape\" que já existe) em vez de arriscar aparecer no lugar errado.\n  const ufGuessed={};\n  const ufFor=(setorOf,muni)=>{const nm=norm(muni);\n    return (DOM.ufBySetorMuni&&DOM.ufBySetorMuni[String(setorOf)+'|'+nm])||'';};\n  mv.matrix.forEach(r=>{ if(!r.uf) r.uf=ufFor(r.setor,r.municipio); });\n  rows(lmR).forEach(r=>{ const k=mkey(r.municipio,ufFor(r.setor,r.municipio)); (mv.levelByMuni[k]=mv.levelByMuni[k]||{})[r.nivel]=+r.cbs; });\n\n  const totBy={}; mv.matrix.forEach(r=>{const n=mkey(r.municipio,r.uf); totBy[n]=(totBy[n]||0)+ +r.cbs;});\n  const footprint=new Set(Object.entries(totBy).filter(([,c])=>c>0).map(([m])=>m));\n  const withShape=[...footprint].filter(n=>adj.feat[n]||world.muniGeo[n]);\n  mv.cbsByMuni={...totBy}; mv.shapeMunis=withShape.slice();\n  mv.noShapeMunis=[...footprint].filter(n=>!(adj.feat[n]||world.muniGeo[n])).map(n=>({muni:n,cbs:totBy[n]||0})).sort((a,b)=>b.cbs-a.cbs);\n  mv.noShapeCbs=mv.noShapeMunis.reduce((a,x)=>a+x.cbs,0);\n\n  // ---- RULE: quais municípios pertencem a este fechamento ----\n  // setor: exatamente a regra de hoje. GV/mercado: união da base de TODOS os setores-membro — a\n  // base já garante que um setor pertence a uma única GV/mercado, então não existe aqui o spillover\n  // fuzzy que município tem contra setor (por isso o orphan-handling abaixo é pulado nesses níveis).\n  let domOwn;\n  if(level==='setor'){\n    domOwn=domBase[code]||new Set();\n  } else {\n    domOwn=new Set();\n    memberSectors.forEach(s=>(domBase[String(s)]||new Set()).forEach(n=>domOwn.add(n)));\n  }\n  const inherited=level==='setor'?new Set(Object.keys(world.muniOverride||{}).filter(m=>world.muniOverride[m]===code)):new Set();\n  if(!domOwn.size && !inherited.size) throw new Error(`${LEVELS[level].label} ${code} não existe na base de municípios dominantes (CSV) — atualize a base antes de fechar`);\n  const belongs=n=>domOwn.has(n)||(!DOM.hasUf&&domOwn.has(mName(n)))||inherited.has(n);\n  mv.domCsvMunis=domOwn.size;\n  const dropped=level==='setor'?withShape.filter(n=>!belongs(n)):[];\n  if(withShape.length && dropped.length===withShape.length) throw new Error(`${LEVELS[level].label} ${code}: nenhum dos municípios com CBs está na base de dominantes — nada pra realocar`);\n  const droppedSet=new Set(dropped);\n  mv.excludedMunis=dropped.map(n=>({muni:n,cbs:totBy[n]||0})).sort((a,b)=>b.cbs-a.cbs);\n  mv.excludedCbs=dropped.reduce((a,n)=>a+(totBy[n]||0),0);\n\n  const closingNames=withShape.filter(n=>!droppedSet.has(n));\n  const closingSet=new Set(closingNames);\n  mv.geoFeat={}; closingNames.forEach(n=>{ mv.geoFeat[n]=(adj.feat[n]&&adj.feat[n].f)||world.muniGeo[n]; });\n\n  // ---- unidade de realocação: a geometria é sempre município; a UNIDADE que troca de dono é o\n  // próprio município (setor fecha), o setor inteiro (GV fecha) ou a GV inteira (mercado fecha).\n  const municipioSetor={}; mv.matrix.forEach(r=>{ const n=mkey(r.municipio,r.uf); if(!municipioSetor[n]) municipioSetor[n]=String(r.setor); });\n  const resolveUnit=n=>{\n    if(level==='setor') return n;\n    const sOf=municipioSetor[n]; if(!sOf) return '';\n    return level==='gv'?sOf:(DOM.gvBySetor[sOf]||'');\n  };\n  mv.unitOfMuni={}; closingNames.forEach(n=>{ mv.unitOfMuni[n]=resolveUnit(n); });\n  mv.unitMunis={}; closingNames.forEach(n=>{ const u=mv.unitOfMuni[n]; if(!u) return; (mv.unitMunis[u]=mv.unitMunis[u]||[]).push(n); });\n  const units=level==='setor'?closingNames:Object.keys(mv.unitMunis);\n\n  const drawnCsv=new Set(closingNames.map(n=>DOM.hasUf?n:mName(n)));\n  const footKeyOf=k=>DOM.hasUf?(footprint.has(k)?k:null):([...footprint].find(x=>mName(x)===k)||null);\n  mv.csvMunisTotal=domOwn.size;\n  mv.ufGuessed={...ufGuessed};\n  if(level==='setor'){\n    mv.missingMunis=[...domOwn].filter(k=>!drawnCsv.has(k)).map(k=>{\n      const fk=footKeyOf(k);\n      const hasShape=!!(adj.feat[fk||k]||world.muniGeo[fk||k]);\n      const alias=[...footprint].filter(x=>x!==k&&mName(x)===mName(k));\n      let reason;\n      if(!fk&&alias.length) reason=`UF divergente — as CBs entraram na chave ${alias.join(' / ')} e a base diz ${k}`;\n      else if(!fk) reason=hasShape?'sem CBs neste setor no snapshot — desenhado como vizinho':'sem CBs neste setor no snapshot';\n      else if(!hasShape) reason='sem shape nas UFs carregadas';\n      else reason='chave não casou com a base de dominantes';\n      return {muni:k,cbs:(fk?totBy[fk]:alias.reduce((a,x)=>a+(totBy[x]||0),0))||0,reason:reason};\n    });\n  } else {\n    mv.missingMunis=[];\n  }\n\n  // ---- HARD RULE: destino tem de compartilhar a fronteira certa acima do que está fechando ----\n  // setor → mesma GV; GV → mesmo mercado; mercado → nada acima, qualquer vizinho vale.\n  const ownParent=parentOf(level,code);\n  if(level!=='mercado' && !ownParent) throw new Error(`${LEVELS[level].label} ${code} não tem ${level==='setor'?'CD_GV':'MERCADO'} na base de municípios dominantes — sem essa fronteira não há como garantir que os destinos ficam do lado certo da hierarquia`);\n  const sameParent=destCode=>!ownParent||parentOf(level,destCode)===ownParent;\n  mv.gv=ownParent;\n  const alreadyClosed=destCode=>level==='setor'?world.closedSectors.has(destCode):(level==='gv'?(world.closedGvs||new Set()).has(destCode):(world.closedMercados||new Set()).has(destCode));\n\n  const destRule=(SESS.settings&&SESS.settings.destRule)||DEFAULT_SETTINGS.destRule;\n  const destMinCbs=Math.max(1,Math.round(+((SESS.settings||{}).destMinCbs)||DEFAULT_SETTINGS.destMinCbs));\n  mv.destRule=destRule; mv.destMinCbs=destMinCbs; mv.destRuleFallback=false;\n  mv.allowed={}; mv.allowedRaw={};\n  units.forEach(u=>{ mv.allowed[u]={}; mv.allowedRaw[u]={}; });\n\n  const extVotes={}; const nbrNames=new Set(); let domSecOf={};\n  if(level==='setor'){\n    // setor: destino descoberto por ADJACÊNCIA GEOGRÁFICA de município — uma query ao vivo por\n    // vizinho, mas o perímetro de UM setor é pequeno o bastante pra valer a pena.\n    closingNames.forEach(n=>{\n      if(!adj.feat[n]) return;\n      adj.nbrs(n).forEach(({o,w})=>{ if(!closingSet.has(o) && !droppedSet.has(o)){ nbrNames.add(o); (extVotes[n]=extVotes[n]||[]).push({o,w}); } });\n    });\n    let neigh=[];\n    if(nbrNames.size){\n      const inList=[...new Set([...nbrNames].map(n=>mName(n)))].map(n=>`'${n.replace(/'/g,\"''\")}'`).join(',');\n      const nSQL=`SELECT DS_MUNICIPIO municipio, CD_SETOR setor, COUNT(DISTINCT CD_CONSULTORA) cbs\n        FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR NOT IN (${secList}) AND CD_SETOR>0 AND DT_HISTORICO=${SNAP} AND DS_MUNICIPIO IN (${inList}) GROUP BY DS_MUNICIPIO, CD_SETOR`;\n      neigh=rows(await q(nSQL));\n    }\n    neigh.forEach(r=>{ if(!r.uf) r.uf=ufFor(r.setor,r.municipio); });\n    const byM={}; neigh.forEach(r=>{const m=mkey(r.municipio,r.uf); if(!nbrNames.has(m)) return; (byM[m]=byM[m]||[]).push(r);});\n    Object.entries(byM).forEach(([m,rs])=>{ rs.sort((a,b)=>+b.cbs-+a.cbs); domSecOf[m]=String(rs[0].setor); });\n    nbrNames.forEach(n=>{ if(world.muniOverride && world.muniOverride[n]) domSecOf[n]=world.muniOverride[n]; });\n\n    mv.nbrCurrentSector={};\n    mv.gvRejected=[];\n    const gvHidden=new Set();\n    nbrNames.forEach(n=>{\n      const destCode=destUnitOfSector(level,domSecOf[n],world);\n      if(destCode && !sameParent(destCode)){ gvHidden.add(n); if(mv.gvRejected.indexOf(destCode)<0) mv.gvRejected.push(destCode); return; }\n      if(domSecOf[n]) mv.nbrCurrentSector[n]=destCode;\n    });\n    gvHidden.forEach(n=>{ nbrNames.delete(n); delete domSecOf[n]; delete mv.nbrCurrentSector[n]; });\n    Object.keys(extVotes).forEach(n=>{ extVotes[n]=extVotes[n].filter(v=>!gvHidden.has(v.o)); });\n\n    const isBridge=n=>destRule!=='dominant'||(totBy[n]||0)>=destMinCbs;\n    mv.bridgeMunis=closingNames.filter(isBridge);\n    mv.ignoredBridges=closingNames.filter(n=>!isBridge(n));\n\n    const wAny={}, wDom={};\n    closingNames.forEach(n=>{\n      const u=n;\n      if(!mv.allowed[u]) return;\n      const bridge=isBridge(n);\n      (extVotes[n]||[]).forEach(({o,w})=>{\n        const destCode=mv.nbrCurrentSector[o];\n        if(!destCode || destCode===code || alreadyClosed(destCode)) return;\n        mv.allowed[u][destCode]=(mv.allowed[u][destCode]||0)+w;\n        mv.allowedRaw[u][destCode]=(mv.allowedRaw[u][destCode]||0)+w;\n        wAny[destCode]=(wAny[destCode]||0)+w;\n        if(bridge) wDom[destCode]=(wDom[destCode]||0)+w;\n      });\n    });\n    let secWeight=wAny;\n    if(destRule==='dominant'){\n      if(Object.keys(wDom).length) secWeight=wDom;\n      else { secWeight=wAny; mv.destRuleFallback=true; }\n    }\n    mv.dest=Object.keys(secWeight).sort((a,b)=>secWeight[b]-secWeight[a]).slice(0,6);\n    if(!mv.dest.length){\n      mv.dest=[...new Set(Object.values(mv.nbrCurrentSector))].filter(destCode=>destCode&&destCode!==code&&!alreadyClosed(destCode)&&sameParent(destCode)).slice(0,6);\n      units.forEach(u=>{ if(mv.allowed[u]&&!Object.keys(mv.allowed[u]).length){ mv.dest.forEach(destCode=>mv.allowed[u][destCode]=1); } });\n    }\n  } else {\n    // GV/mercado: destino é SEMPRE todo irmão válido na hierarquia — NUNCA descoberto por\n    // adjacência geográfica de município. Uma GV/mercado pode ter território espalhado por\n    // dezenas de UFs sem qualquer conexão física entre as partes (a hierarquia aqui é\n    // organizacional, não geográfica) — \"vizinho por fronteira de município\" não é só caro (a\n    // query ao vivo vira um IN-list de centenas de municípios e estoura timeout: foi exatamente\n    // isso que quebrou o fechamento de um mercado espalhado) — é a pergunta errada. A fronteira que\n    // já importa (mesma GV / mesmo mercado) é imposta pela regra de parentesco logo acima; dentro\n    // dela QUALQUER irmão é candidato, e o otimizador decide pelo equilíbrio de span e continuidade\n    // de líder, nunca por proximidade física — geografia não pesa aqui.\n    mv.nbrCurrentSector={};\n    mv.gvRejected=[];\n    mv.bridgeMunis=closingNames.slice();\n    mv.ignoredBridges=[];\n    const siblings=level==='gv'\n      ? [...(DOM.gvsByMercado[ownParent]||[])]\n      : Object.keys(DOM.sectorsByMercado||{});\n    mv.dest=siblings.filter(destCode=>destCode!==code && !alreadyClosed(destCode) && sameParent(destCode));\n    units.forEach(u=>{ mv.dest.forEach(destCode=>{ mv.allowed[u][destCode]=1; mv.allowedRaw[u][destCode]=1; }); });\n  }\n  mv.dest=mv.dest.filter(sameParent);\n\n  // ---- O QUE É DESENHADO: território COMPLETO de cada destino (não só a borda), sempre lido da\n  // mesma base de dominantes já usada pro lado que fecha.\n  const territoryOf=destCode=>{\n    const secs=memberSectorsOf(level,destCode,world);\n    const out=new Set();\n    secs.forEach(s=>(domBase[String(s)]||new Set()).forEach(n=>out.add(n)));\n    return out;\n  };\n  const drawSet=new Set(mv.dest);\n  mv.dest.forEach(destCode=>{\n    territoryOf(destCode).forEach(n=>{\n      if(nbrNames.has(n)) return;\n      nbrNames.add(n);\n      mv.nbrCurrentSector[n]=(level==='setor'&&world.muniOverride&&world.muniOverride[n])?world.muniOverride[n]:destCode;\n    });\n  });\n  mv.nbrFeat=[...nbrNames].filter(n=>drawSet.has(mv.nbrCurrentSector[n])).map(n=>adj.feat[n]&&adj.feat[n].f).filter(Boolean);\n  units.forEach(u=>{ Object.keys(mv.allowed[u]||{}).forEach(destCode=>{ if(!mv.dest.includes(destCode)) delete mv.allowed[u][destCode]; }); });\n  mv.color={}; mv.dest.forEach((destCode,i)=>mv.color[destCode]=PALETTE[i%PALETTE.length]);\n\n  const accC={}; Object.entries(mv.nbrCurrentSector).forEach(([nb,destCode])=>{ if(!mv.dest.includes(destCode))return; const f=(adj.feat[nb]&&adj.feat[nb].f)||world.muniGeo[nb]; if(!f)return; const c=centroidLL(f); accC[destCode]=accC[destCode]||[0,0,0]; accC[destCode][0]+=c[0]; accC[destCode][1]+=c[1]; accC[destCode][2]++; });\n  mv.secCentroid={}; mv.dest.forEach(destCode=>{ if(accC[destCode]) mv.secCentroid[destCode]=[accC[destCode][0]/accC[destCode][2],accC[destCode][1]/accC[destCode][2]]; });\n\n  if(level==='setor'){\n    mv.muniCentroid={}; closingNames.forEach(n=>{ if(mv.geoFeat[n]) mv.muniCentroid[n]=centroidLL(mv.geoFeat[n]); });\n    mv.closeAdj={}; closingNames.forEach(n=>{ mv.closeAdj[n]=adj.feat[n]?adj.nbrs(n).filter(({o})=>closingSet.has(o)).map(({o})=>o):[]; });\n  } else {\n    mv.muniCentroid={};\n    Object.entries(mv.unitMunis).forEach(([u,ms])=>{\n      const cs=ms.map(n=>mv.geoFeat[n]&&centroidLL(mv.geoFeat[n])).filter(Boolean);\n      if(cs.length) mv.muniCentroid[u]=[cs.reduce((a,c)=>a+c[0],0)/cs.length,cs.reduce((a,c)=>a+c[1],0)/cs.length];\n    });\n    mv.closeAdj={};\n    const unitSet=new Set(units);\n    Object.entries(mv.unitMunis).forEach(([u,ms])=>{\n      const touch=new Set();\n      ms.forEach(n=>{ if(!adj.feat[n]) return; adj.nbrs(n).forEach(({o})=>{ const ou=mv.unitOfMuni[o]; if(ou&&ou!==u&&unitSet.has(ou)) touch.add(ou); }); });\n      mv.closeAdj[u]=[...touch];\n    });\n  }\n  const comp={}; let ci=0; units.forEach(n=>{ if(comp[n]!=null)return; const st=[n]; comp[n]=ci; while(st.length){ const x=st.pop(); (mv.closeAdj[x]||[]).forEach(o=>{ if(comp[o]==null){ comp[o]=ci; st.push(o); } }); } ci++; });\n  const compAllowed={}; units.forEach(n=>{ const cid=comp[n]; (compAllowed[cid]=compAllowed[cid]||new Set()); Object.keys(mv.allowed[n]||{}).forEach(s=>compAllowed[cid].add(s)); });\n  mv.reachable={}; units.forEach(n=>{ mv.reachable[n]=[...(compAllowed[comp[n]]||[])].filter(s=>mv.dest.includes(s)); });\n\n  if(mv.dest.length){\n    const destSectorMap={}; mv.dest.forEach(destCode=>{ destSectorMap[destCode]=memberSectorsOf(level,destCode,world); });\n    const allDestSecs=[...new Set(Object.values(destSectorMap).flat())];\n    const rList=allDestSecs.join(',');\n    const bSQL=`SELECT CD_SETOR setor, COUNT(DISTINCT CD_CONSULTORA) cbs,\n       SUM(CASE WHEN ST_FEZ_PED_CICLO_ATUAL THEN 1 ELSE 0 END) ativas,\n       ROUND(SUM(VL_PEDIDOS_CICLO),0) receita, ROUND(SUM(VL_PEDIDOS_NATURA_CICLO),0) rec_nat,\n       ROUND(SUM(VL_PEDIDOS_AVON_CICLO),0) rec_avon, ROUND(SUM(QT_PONTOS_CICLO),0) pontos, ROUND(SUM(QT_PEDIDOS_CICLO),0) pedidos\n      FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR IN (${rList}) AND DT_HISTORICO=${SNAP} GROUP BY CD_SETOR`;\n    const blSQL=`SELECT CD_SETOR setor, DS_NVL_PLAN_CRESC nivel, COUNT(DISTINCT CD_CONSULTORA) cbs\n      FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR IN (${rList}) AND DS_NVL_PLAN_CRESC IS NOT NULL AND DT_HISTORICO=${SNAP} GROUP BY CD_SETOR, DS_NVL_PLAN_CRESC`;\n    const [bR,blR]=await Promise.all([q(bSQL),q(blSQL)]);\n    const secMetrics={}; rows(bR).forEach(r=>{ secMetrics[String(r.setor)]=r; if(!SESS.sectorBaseCache[String(r.setor)]) SESS.sectorBaseCache[String(r.setor)]=r; });\n    const secLevel={}; rows(blR).forEach(r=>{ const s=String(r.setor); (secLevel[s]=secLevel[s]||{})[r.nivel]=+r.cbs; });\n    mv.baseMetrics={}; mv.baseLevel={};\n    mv.dest.forEach(destCode=>{\n      const secs=destSectorMap[destCode];\n      const acc=blankM(); acc.setor=destCode;\n      secs.forEach(s=>{ const r=secMetrics[String(s)]; if(!r) return; Object.keys(blankM()).forEach(k=>{ acc[k]=(+acc[k]||0)+(+r[k]||0); }); });\n      mv.baseMetrics[destCode]=acc;\n      const lv={}; secs.forEach(s=>{ const l=secLevel[String(s)]; if(!l) return; Object.entries(l).forEach(([nv,c])=>{ lv[nv]=(lv[nv]||0)+c; }); });\n      mv.baseLevel[destCode]=lv;\n    });\n  } else { mv.baseMetrics={}; mv.baseLevel={}; }\n\n  mv.dest.forEach(destCode=>{\n    if(!mv.baseMetrics[destCode]) mv.baseMetrics[destCode]={setor:destCode,cbs:0,ativas:0,receita:0,rec_nat:0,rec_avon:0,pontos:0,pedidos:0};\n    const inflowSrc=level==='setor'?world.sectorInflow:(level==='gv'?world.gvInflow:world.mercadoInflow);\n    const infl=inflowSrc&&inflowSrc[destCode];\n    if(infl) Object.keys(blankM()).forEach(k=>{ mv.baseMetrics[destCode][k]=(+mv.baseMetrics[destCode][k]||0)+(infl[k]||0); });\n    if(level==='setor'){\n      const inflLv=world.sectorInflowLevel&&world.sectorInflowLevel[destCode];\n      if(inflLv){ mv.baseLevel[destCode]=mv.baseLevel[destCode]||{}; Object.entries(inflLv).forEach(([nv,c])=>{ mv.baseLevel[destCode][nv]=(mv.baseLevel[destCode][nv]||0)+c; }); }\n    }\n  });\n\n  aggregateMovement(mv);\n  mv.assign=optimizeFor(mv);\n  return mv;\n}\n\n// ---------- cascade engine ----------\nasync function computeAt(i){\n  await ensurePinned();\n  const world=foldWorldState(SESS.timeline,i);\n  const sec=SESS.timeline[i].sector;\n  const level=SESS.timeline[i].level||'setor';\n  const mv=await computeMovement(sec,level,world);\n  SESS.timeline[i]=mv;\n}\nasync function recomputeFrom(i){\n  for(let k=i;k<SESS.timeline.length;k++){\n    loader(true,`recalculando etapa ${k+1} de ${SESS.timeline.length}…`);\n    try{ await computeAt(k); }\n    catch(e){\n      // A stage that failed to recompute still holds its PREVIOUS result, so the timeline would\n      // silently mix pre- and post-change etapas. Flag this stage and everything after it as stale\n      // (dashed chip + ⟳) so the state is visible and flushDirty retries from here.\n      SESS.dirtyFrom = SESS.dirtyFrom==null ? k : Math.min(SESS.dirtyFrom,k);\n      throw e;\n    }\n  }\n}\nasync function flushDirty(){\n  if(SESS.dirtyFrom==null) return;\n  const from=SESS.dirtyFrom; SESS.dirtyFrom=null;\n  loader(true,'recalculando etapas seguintes…');\n  try{ await recomputeFrom(from); }\n  catch(e){ $('#ds').textContent='erro ao recalcular cadeia: '+e.message; $('#ds').classList.add('err'); }\n  finally{ loader(false); }\n}\nasync function addMovement(level,sec){\n  level=level||'setor';\n  sec=(sec==null?'':String(sec)).trim();\n  if(!sec) return;\n  if(!movementAvailable(level)){ $('#ds').textContent=`Fechar ${LEVELS[level].label} ainda não está disponível.`; $('#ds').classList.add('err'); return; }\n  if(!hierarchyAllows(level)){ const minLabel=LEVELS[Object.keys(LEVEL_RANK).find(k=>LEVEL_RANK[k]===sessionMinRank())].label; $('#ds').textContent=`esta sessão já fechou um nível mais alto — só \"${minLabel}\" (ou acima) fica disponível.`; $('#ds').classList.add('err'); return; }\n  const closedNow=new Set(SESS.timeline.filter(mv=>(mv.level||'setor')===level).map(mv=>mv.sector));\n  if(closedNow.has(sec)){ $('#ds').textContent=LEVELS[level].label+' '+sec+' já fechado(a) nesta timeline.'; $('#ds').classList.add('err'); return; }\n  if(level==='setor' && !SESS.sectorsList.some(s=>s.setor===sec)){ $('#ds').textContent='setor \"'+sec+'\" não existe no snapshot congelado.'; $('#ds').classList.add('err'); return; }\n  await flushDirty();\n  loader(true,`fechando ${lc(LEVELS[level].label)} `+sec+' — puxando dado do snapshot congelado…');\n  $('#liveState').classList.remove('err');\n  try{\n    SESS.timeline.push({sector:String(sec),level:level});\n    await computeAt(SESS.timeline.length-1);\n    SESS.selected=SESS.timeline.length-1;\n    $('#ds').classList.remove('err'); $('#ds').textContent='';\n  }catch(e){\n    SESS.timeline.pop();\n    $('#ds').textContent=`erro ao fechar ${lc(LEVELS[level].label)} `+sec+': '+e.message; $('#ds').classList.add('err');\n  } finally { loader(false); renderAll(); }\n}\nfunction removeFrom(i){\n  SESS.timeline.length=i;\n  SESS.selected=Math.min(SESS.selected,Math.max(0,SESS.timeline.length-1));\n  if(SESS.dirtyFrom!=null && SESS.dirtyFrom>=SESS.timeline.length) SESS.dirtyFrom=null;\n  renderAll();\n}\nasync function editSelected(mutator){\n  const mv=SESS.timeline[SESS.selected]; if(!mv) return;\n  mutator(mv);\n  if(SESS.selected<SESS.timeline.length-1){\n    SESS.dirtyFrom = SESS.dirtyFrom==null ? SESS.selected+1 : Math.min(SESS.dirtyFrom, SESS.selected+1);\n  }\n  renderAll();\n}\n\n// ---------- sectors list / picker ----------\nasync function loadSectors(){\n  const sql=`SELECT CD_SETOR setor, MAX(DS_ESTADO) uf, COUNT(DISTINCT CD_CONSULTORA) cbs, COUNT(DISTINCT DS_MUNICIPIO) munis\n    FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR>0 AND DT_HISTORICO=(SELECT MAX(DT_HISTORICO) FROM ${T} WHERE CD_PAIS=1) GROUP BY CD_SETOR ORDER BY CD_SETOR`;\n  SESS.sectorsList=rows(await q(sql)).map(r=>({setor:String(r.setor),uf:r.uf,cbs:+r.cbs,munis:+r.munis}));\n}\nfunction renderSectorPicker(){\n  const ready=SESS.stage==='main';\n  const ob=$('#openMove'); if(ob) ob.disabled=!ready;\n}\n\n// ---------- movement modal (setor / GV / mercado) ----------\n// Hierarquia mercado > GV > setor: a sessão trava no nível da primeira movimentação. Misturar\n// níveis quebraria a leitura de \"antes/depois\" da cadeia — fechar uma GV já redistribui setores\n// inteiros pra outras GVs; fechar um setor isolado depois não bate mais com o mundo que sobrou.\n// de/a/no: contrações de \"de\"/\"a\"/\"em\" com o artigo de cada nível — GV é feminina (a Gerência de\n// Vendas), setor e mercado são masculinos. Errar o gênero aqui é o tipo de coisa que grita \"isto foi\n// feito pra setor e só remendado pros outros níveis\", exatamente o que este objeto existe pra evitar.\nconst LEVELS={\n  setor:{label:'Setor',codeLbl:'Setor a fechar',placeholder:'código do setor',childLabel:'Município',destLabel:'Setor',de:'do',a:'ao',no:'no',parentLabel:'GV',parentPhrase:'da mesma GV',parentWord:'gerência'},\n  gv:{label:'GV',codeLbl:'GV a fechar',placeholder:'código da GV',childLabel:'Setor',destLabel:'GV',de:'da',a:'à',no:'na',parentLabel:'Mercado',parentPhrase:'do mesmo mercado',parentWord:'mercado'},\n  mercado:{label:'Mercado',codeLbl:'Mercado a fechar',placeholder:'nome do mercado',childLabel:'GV',destLabel:'Mercado',de:'do',a:'ao',no:'no',parentLabel:null,parentPhrase:null,parentWord:null},\n};\n// GV é sigla — .toLowerCase() a transformaria em \"gv\", errado em qualquer posição da frase. Palavras\n// normais (Setor/Mercado/Município) minúsculam à vontade no meio de uma frase; GV nunca.\nconst LOWER={Setor:'setor',Mercado:'mercado',Município:'município',GV:'GV'};\nconst lc=w=>LOWER[w]||w.toLowerCase();\n// Hierarquia é uma catraca, não um cadeado: mercado(0) > GV(1) > setor(2). Fechar um nível mais\n// alto (número menor) trava PRA SEMPRE nesta sessão qualquer nível mais baixo (número maior) —\n// mas o próprio nível, ou um ainda mais alto, continua liberado. É assim que \"posso fechar setores\n// até fechar uma GV; posso fechar GVs até fechar um mercado\" funciona: nunca destrava de volta.\nconst LEVEL_RANK={mercado:0,gv:1,setor:2};\nfunction sessionMinRank(){\n  let r=LEVEL_RANK.setor;\n  SESS.timeline.forEach(mv=>{ const rk=LEVEL_RANK[mv.level||'setor']; if(rk<r) r=rk; });\n  return r;\n}\nfunction hierarchyAllows(lvl){ return LEVEL_RANK[lvl]<=sessionMinRank(); }\nfunction movementAvailable(lvl){ return lvl==='setor'||lvl==='gv'||lvl==='mercado'; }\n// ---------- hierarquia: setor ⊂ GV ⊂ mercado — tudo derivado da base de dominantes (DOM) ----------\n// memberSectors: o escopo de CD_SETOR que a query no CRM precisa cobrir pra fechar este código, em\n// qualquer nível — um setor é ele mesmo; uma GV é todo setor que a base lhe atribui; um mercado é\n// todo setor de toda GV que a base atribui a ele.\n// membros ATUAIS de um GV/mercado, um nível abaixo (setores de uma GV; GVs de um mercado) — nunca\n// só a foto estática do CSV: uma etapa anterior NESTA MESMA sessão pode já ter movido um filho pra\n// dentro ou pra fora deste código, e um fechamento seguinte tem de enxergar o mundo como ele está\n// agora, não como o CSV descreveu antes de qualquer movimentação.\nfunction currentMembersOf(level,code,world){\n  code=String(code);\n  // \"gv\": setores da GV (DOM.sectorsByGv). \"mercado\": GVs do mercado (DOM.gvsByMercado) — NUNCA\n  // sectorsByMercado, que pula a camada de GV inteira e faz memberSectorsOf tratar códigos de\n  // setor como se fossem códigos de GV (não batem em DOM.sectorsByGv, e o fechamento morre com\n  // \"não existe na base\" mesmo quando o mercado está lá).\n  const staticMembers=level==='gv'?(DOM.sectorsByGv[code]||new Set()):(DOM.gvsByMercado[code]||new Set());\n  const overrideMap=level==='gv'?(world&&world.secOverride):(world&&world.gvOverride);\n  const out=new Set(staticMembers);\n  if(overrideMap){\n    Object.entries(overrideMap).forEach(([child,dest])=>{\n      if(dest===code) out.add(child);\n      else if(staticMembers.has(child)) out.delete(child);\n    });\n  }\n  return [...out];\n}\n// setores que a query no CRM precisa cobrir pra fechar este código, em qualquer nível — setor é\n// ele mesmo; GV é seus setores ATUAIS; mercado é todo setor de toda GV ATUALMENTE sua (setor não\n// troca de GV sozinho numa sessão de mercado — só GV inteira troca de mercado).\nfunction memberSectorsOf(level,code,world){\n  code=String(code);\n  if(level==='setor') return [code];\n  if(level==='gv') return currentMembersOf('gv',code,world);\n  const gvs=currentMembersOf('mercado',code,world);\n  const out=new Set();\n  gvs.forEach(gv=>(DOM.sectorsByGv[gv]||new Set()).forEach(s=>out.add(s)));\n  return [...out];\n}\n// fronteira que um destino tem de respeitar: GV do setor que fecha, mercado da GV que fecha —\n// mercado não tem nada acima, então não existe regra pra ele. Estática de propósito: um setor não\n// troca de GV nem uma GV troca de mercado só por existirem etapas anteriores nesta sessão — quem\n// muda de dono é o NÍVEL ABAIXO do que está fechando, nunca o próprio código sendo avaliado aqui.\nfunction parentOf(level,code){\n  code=String(code);\n  if(level==='setor') return DOM.gvBySetor[code]||'';\n  if(level==='gv') return DOM.mercadoByGv[code]||'';\n  return '';\n}\n// dado o setor que uma município vizinha atualmente pertence (fato ao vivo do CRM, nunca muda de\n// verdade), a que CANDIDATO A DESTINO isso corresponde neste nível — considerando que uma etapa\n// anterior desta sessão pode já ter movido esse setor (GV fechando) ou essa GV (mercado fechando)\n// pra outro dono, o que a foto estática do CSV sozinha não enxergaria.\nfunction destUnitOfSector(level,setorCode,world){\n  setorCode=String(setorCode);\n  if(level==='setor') return setorCode;\n  if(level==='gv'){ const ov=world&&world.secOverride&&world.secOverride[setorCode]; return ov||DOM.gvBySetor[setorCode]||''; }\n  const gv=DOM.gvBySetor[setorCode]||'';\n  const ov=world&&world.gvOverride&&world.gvOverride[gv];\n  return ov||DOM.mercadoBySetor[setorCode]||'';\n}\nfunction currentMoveLevel(){ const r=root.querySelector('input[name=\"moveLevel\"]:checked'); return (r&&r.value)||'setor'; }\nfunction openMove(){\n  const minRank=sessionMinRank();\n  const lastLevel=SESS.timeline.length?(SESS.timeline[SESS.timeline.length-1].level||'setor'):'setor';\n  root.querySelectorAll('input[name=\"moveLevel\"]').forEach(r=>{\n    const lvl=r.value;\n    r.disabled=!movementAvailable(lvl)||!hierarchyAllows(lvl);\n    r.checked=hierarchyAllows(lastLevel)?lvl===lastLevel:lvl===Object.keys(LEVEL_RANK).find(k=>LEVEL_RANK[k]===minRank);\n  });\n  const note=$('#moveLockNote');\n  const minLabel=LEVELS[Object.keys(LEVEL_RANK).find(k=>LEVEL_RANK[k]===minRank)].label;\n  if(note) note.textContent=minRank<LEVEL_RANK.setor\n    ? `Esta sessão já fechou um nível mais alto na hierarquia — só \"${minLabel}\" (ou acima) continua disponível daqui pra frente.`\n    : 'Escolha o nível a fechar. Você pode fechar setores à vontade até fechar uma GV; aí só GV (ou mercado) daqui pra frente. Fechar um mercado trava a sessão em mercado.';\n  $('#moveCode').value='';\n  const err=$('#moveErr'); if(err){ err.textContent=''; err.classList.add('hidden'); }\n  const st=$('#moveStatus'); if(st) st.textContent='';\n  $('#moveBg').classList.remove('hidden');\n  renderMoveForm();\n  const c=$('#moveCancel'); if(c) c.focus();\n}\nfunction closeMove(){ const b=$('#moveBg'); if(b) b.classList.add('hidden'); }\nfunction renderMoveForm(){\n  root.querySelectorAll('#moveBg .opt-row').forEach(r=>r.classList.toggle('on',r.dataset.lvl===currentMoveLevel()));\n  const lvl=LEVELS[currentMoveLevel()];\n  $('#moveCodeLbl').textContent=lvl.codeLbl;\n  $('#moveCode').placeholder=lvl.placeholder;\n  loadMoveOptions();\n}\nasync function loadMoveOptions(){\n  const lvl=currentMoveLevel();\n  const dl=$('#moveCodeList'); if(!dl) return;\n  const closedSet=new Set(SESS.timeline.filter(mv=>(mv.level||'setor')===lvl).map(mv=>mv.sector));\n  if(lvl==='setor'){\n    dl.innerHTML=SESS.sectorsList.filter(s=>!closedSet.has(s.setor))\n      .map(s=>`<option value=\"${s.setor}\">${s.setor} · ${s.uf||'?'} · ${fmt(s.cbs)} CBs · ${s.munis} munic.</option>`).join('');\n    return;\n  }\n  dl.innerHTML='';\n  try{ await ensureDominantes(); }catch(e){ return; }\n  if(lvl==='gv'){\n    const gvs=Object.keys(DOM.sectorsByGv||{}).filter(g=>!closedSet.has(g)).sort();\n    dl.innerHTML=gvs.map(g=>`<option value=\"${g}\">${g}${DOM.gvLabel[g]?' · '+esc(DOM.gvLabel[g]):''} · ${DOM.sectorsByGv[g].size} setor(es)</option>`).join('');\n  } else if(lvl==='mercado'){\n    const mks=Object.keys(DOM.sectorsByMercado||{}).filter(m=>!closedSet.has(m)).sort();\n    dl.innerHTML=mks.map(m=>`<option value=\"${m}\">${m} · ${(DOM.gvsByMercado[m]||new Set()).size} GV(s) · ${DOM.sectorsByMercado[m].size} setor(es)</option>`).join('');\n  }\n}\nfunction moveRandPick(){\n  const opts=[...($('#moveCodeList').options||[])].map(o=>o.value);\n  if(!opts.length) return;\n  $('#moveCode').value=opts[Math.floor(Math.random()*opts.length)];\n}\nasync function submitMove(){\n  const lvl=currentMoveLevel();\n  const code=($('#moveCode').value||'').trim();\n  const err=$('#moveErr');\n  const fail=msg=>{ if(err){ err.textContent=msg; err.classList.remove('hidden'); } };\n  if(err){ err.textContent=''; err.classList.add('hidden'); }\n  if(!movementAvailable(lvl)) return fail(`Fechar ${LEVELS[lvl].label} ainda não está disponível.`);\n  if(!hierarchyAllows(lvl)){ const minLabel=LEVELS[Object.keys(LEVEL_RANK).find(k=>LEVEL_RANK[k]===sessionMinRank())].label; return fail(`Esta sessão já fechou um nível mais alto — só \"${minLabel}\" (ou acima) fica disponível.`); }\n  if(!code) return fail('Informe um código.');\n  closeMove();\n  await addMovement(lvl,code);\n}\nfunction renderStage(){\n  const isMain=SESS.stage==='main';\n  const cc=$('#confirmCard'), mw=$('#mainWrap');\n  const hdr=$('#topHeader'), rl=$('#timelineRail');\n  if(hdr) hdr.classList.toggle('hidden', !isMain);\n  if(rl) rl.classList.toggle('hidden', !isMain);\n  if(cc) cc.classList.toggle('hidden', isMain);\n  if(mw) mw.classList.toggle('hidden', !isMain);\n  const cb=$('#confirmBody');\n  if(cb && !isMain) cb.innerHTML = SESS.snapshotRaw\n    ? `Snapshot congelado · atualizado em <b>${fmtSyncedAt(SESS.snapshotSyncedAt)}</b> · <b>${SESS.sectorsList.length}</b> setor(es) disponível(eis) pra fechar. Nenhuma consulta de detalhe roda até você confirmar e escolher o primeiro setor.`\n    : 'congelando snapshot…';\n}\n\n// ---------- session persistence ----------\n// ONE table (`timeline-shared-sessions`) holds BOTH kinds of row, so SESSIONS_DS and SHARED_DS\n// deliberately resolve to the SAME DataSet — the two names mark intent, not two stores:\n//   · working session  — carries `movements`; saveSession updates it in place\n//   · shared snapshot  — carries `sharedAt` + `stages`; doShare CREATES it and nothing updates it\n// listSessions MUST exclude the shared rows. They are write-once by contract, and if one showed\n// up in the picker, loading it and pressing Salvar would fire ds.update() straight at a frozen\n// snapshot. Filtering here is what keeps that unreachable — it is the guard, not a cosmetic.\n// Both lookups stay because a policy-gated DataSet's Process resolves late; same race the reader\n// component polls for. SESSIONS_DS lives at module scope so no call site can hit it in the TDZ.\nasync function listSessions(){\n  const ds=(d2.data('sessionsDataset')||d2.data(SESSIONS_DS)); if(!ds) return [];\n  await ds.refresh();\n  const recs=ds.records()||[];\n  return [...recs].filter(r=>!r.sharedAt).sort((a,b)=>new Date(b.updatedAt||0)-new Date(a.updatedAt||0));\n}\nasync function refreshSessionPicker(){\n  const list=await listSessions().catch(()=>[]);\n  SESS.sessionsList=list;\n  const opts=list.map(s=>`<option value=\"${s._id}\">${esc(s.label||'sem nome')} · ${fmt((s.movements||[]).length)} etapa(s)</option>`).join('')+`<option value=\"\">+ Nova sessão</option>`;\n  const sel=$('#sessionPick'); if(sel){ sel.innerHTML=opts; sel.value=SESS.sessionId||''; }\n  const csel=$('#confirmSessionPick'); if(csel){ csel.innerHTML=opts; csel.value=SESS.sessionId||''; }\n}\nasync function saveSession(){\n  const ds=(d2.data('sessionsDataset')||d2.data(SESSIONS_DS));\n  if(!ds){ $('#sessStatus').textContent='dataset de sessões indisponível'; return; }\n  if(!SESS.timeline.length){ $('#sessStatus').textContent='nada pra salvar ainda'; return; }\n  await flushDirty();\n  const label=SESS.sessionLabel||('Sessão '+new Date().toLocaleString('pt-BR'));\n  const nowIso=new Date().toISOString();\n  const payload={\n    label,\n    settings:{...DEFAULT_SETTINGS,...(SESS.settings||{})},\n    snapshotRaw:SESS.snapshotRaw, snapshotSyncedAt:SESS.snapshotSyncedAt, snapLiteral:SESS.snapLiteral, eloMaxCycle:SESS.eloMaxCycle,\n    movements:SESS.timeline.map(mv=>({\n      sector:mv.sector, level:mv.level||'setor', assign:mv.assign, policy:mv.policy,\n      matrix:mv.matrix, trend:mv.trend, levels:mv.levels, levelByMuni:mv.levelByMuni,\n      pureOwnMetrics:mv.pureOwnMetrics, domUF:mv.domUF, dest:mv.dest, color:mv.color,\n      gv:mv.gv, gvRejected:mv.gvRejected,\n      missingMunis:mv.missingMunis, csvMunisTotal:mv.csvMunisTotal, ufGuessed:mv.ufGuessed,\n      baseMetrics:mv.baseMetrics, baseLevel:mv.baseLevel, geoFeat:mv.geoFeat, nbrFeat:mv.nbrFeat,\n      nbrCurrentSector:mv.nbrCurrentSector, allowed:mv.allowed, allowedRaw:mv.allowedRaw, reachable:mv.reachable,\n      destRule:mv.destRule, destMinCbs:mv.destMinCbs, destRuleFallback:mv.destRuleFallback, optTier:mv.optTier,\n      cbsByMuni:mv.cbsByMuni, shapeMunis:mv.shapeMunis, excludedMunis:mv.excludedMunis, domCsvMunis:mv.domCsvMunis,\n      excludedCbs:mv.excludedCbs, noShapeMunis:mv.noShapeMunis, noShapeCbs:mv.noShapeCbs,\n      secCentroid:mv.secCentroid, muniCentroid:mv.muniCentroid, closeAdj:mv.closeAdj, optBadge:mv.optBadge,\n    })),\n    updatedAt:nowIso,\n  };\n  $('#sessStatus').textContent='salvando…';\n  try{\n    if(SESS.sessionId){\n      await ds.update({_id:SESS.sessionId,...payload});\n    } else {\n      payload.createdAt=nowIso;\n      const created=await ds.create(payload);\n      SESS.sessionId=(created&&created._id)||(created&&created.data&&created.data._id)||(ds.selected&&ds.selected()&&ds.selected()._id)||null;\n    }\n    SESS.sessionLabel=label;\n    await refreshSessionPicker();\n    $('#sessStatus').textContent='salvo ✓';\n  }catch(e){ $('#sessStatus').textContent='erro ao salvar: '+e.message; }\n  setTimeout(()=>{ if($('#sessStatus')) $('#sessStatus').textContent=''; },2200);\n}\n// Duplicate = drop sessionId so saveSession takes its CREATE branch instead of its update branch.\n// The source record is never written to, the copy gets a fresh _id and its own createdAt, and the\n// copy becomes the active session (so the next Salvar edits the copy, not the original).\nasync function duplicateSession(){\n  if(!SESS.timeline.length){ $('#sessStatus').textContent='nada pra duplicar ainda'; return; }\n  const prevId=SESS.sessionId, prevLabel=SESS.sessionLabel;\n  SESS.sessionId=null;\n  SESS.sessionLabel=(SESS.sessionLabel||'Sessão')+' (cópia)';\n  await saveSession();\n  if(!SESS.sessionId){\n    // saveSession swallows its own errors into #sessStatus, so a still-null id after the await is\n    // the only failure signal we get. Put the original identity back — otherwise a failed copy\n    // silently leaves the session detached, and the next Salvar would fork a new record instead\n    // of updating the one the user thought they were editing.\n    SESS.sessionId=prevId; SESS.sessionLabel=prevLabel;\n    await refreshSessionPicker().catch(()=>{});\n    return;\n  }\n  if($('#sessStatus')) $('#sessStatus').textContent='duplicado ✓';\n}\nasync function loadSession(id){\n  if(!id) return newSession();\n  const list=(SESS.sessionsList&&SESS.sessionsList.length)?SESS.sessionsList:await listSessions().catch(()=>[]);\n  const rec=list.find(s=>String(s._id)===String(id));\n  if(!rec) return newSession();\n  loader(true,'carregando sessão…');\n  SESS.sessionId=rec._id; SESS.sessionLabel=rec.label;\n  SESS.snapshotRaw=rec.snapshotRaw; SESS.snapshotSyncedAt=rec.snapshotSyncedAt||null; SESS.snapLiteral=rec.snapLiteral; SESS.eloMaxCycle=rec.eloMaxCycle;\n  SESS.settings={...DEFAULT_SETTINGS,...(rec.settings||{})};\n  SESS.timeline=(rec.movements||[]).map(m=>({sector:String(m.sector),level:m.level||'setor'}));\n  SESS.selected=0; SESS.sectorBaseCache={}; SESS.stage='main'; SESS.dirtyFrom=null;\n  try{\n    for(let i=0;i<SESS.timeline.length;i++){\n      const saved=(rec.movements||[])[i]||{};\n      // Sessions saved before the UF became part of the key hold bare-name keys in matrix rows,\n      // assign, geoFeat and closeAdj alike. Restoring that cache would mix key shapes the moment the\n      // stage is recomputed — and it would preserve the very collision this fixes — so those stages\n      // are replayed against the pinned snapshot and the manual assignment is remapped by name.\n      const legacyKeys=!!(saved.matrix&&saved.matrix.length&&saved.matrix.every(r=>r&&r.uf==null));\n      // Sessões salvas antes da regra de gerência podem carregar um destino de outra GV no cache.\n      // Restaurar esse cache manteria o setor proibido na tela para sempre, então essas etapas são\n      // reprocessadas contra o snapshot fixado — igual ao tratamento das chaves legadas.\n      const crossGv=await savedCrossesGv(saved);\n      if(saved.matrix&&!legacyKeys&&!crossGv){\n        loader(true,`restaurando etapa ${i+1}/${SESS.timeline.length} — setor ${SESS.timeline[i].sector} (cache, sem consulta)…`);\n        const mv={sector:String(saved.sector), level:saved.level||'setor', policy:saved.policy||'fora', view:'tobe', selMuni:null, optBadge:saved.optBadge||''};\n        mv.matrix=saved.matrix; mv.trend=saved.trend||[]; mv.levels=saved.levels||[]; mv.levelByMuni=saved.levelByMuni||{};\n        mv.pureOwnMetrics=saved.pureOwnMetrics||blankM(); mv.domUF=saved.domUF; mv.dest=saved.dest||[]; mv.color=saved.color||{};\n        mv.baseMetrics=saved.baseMetrics||{}; mv.baseLevel=saved.baseLevel||{}; mv.geoFeat=saved.geoFeat||{}; mv.nbrFeat=saved.nbrFeat||[];\n        mv.nbrCurrentSector=saved.nbrCurrentSector||{}; mv.allowed=saved.allowed||{}; mv.reachable=saved.reachable||{};\n        mv.allowedRaw=saved.allowedRaw||saved.allowed||{};\n        mv.destRule=saved.destRule||SESS.settings.destRule; mv.destMinCbs=saved.destMinCbs||SESS.settings.destMinCbs; mv.destRuleFallback=!!saved.destRuleFallback;\n        mv.optTier=(saved.optTier==null?0:saved.optTier);\n        mv.gv=saved.gv||''; mv.gvRejected=saved.gvRejected||[];\n        mv.missingMunis=saved.missingMunis||[]; mv.csvMunisTotal=saved.csvMunisTotal||0;\n        mv.ufGuessed=saved.ufGuessed||{};\n        mv.cbsByMuni=saved.cbsByMuni||{}; mv.shapeMunis=saved.shapeMunis||[];\n        mv.excludedMunis=saved.excludedMunis||[]; mv.excludedCbs=saved.excludedCbs||0; mv.domCsvMunis=saved.domCsvMunis||0;\n        mv.noShapeMunis=saved.noShapeMunis||[]; mv.noShapeCbs=saved.noShapeCbs||0;\n        mv.secCentroid=saved.secCentroid||{}; mv.muniCentroid=saved.muniCentroid||{}; mv.closeAdj=saved.closeAdj||{};\n        aggregateMovement(mv);\n        mv.assign=saved.assign||{};\n        if((mv.level||'setor')==='setor') mv.dest.forEach(s=>{ if(!SESS.sectorBaseCache[s]) SESS.sectorBaseCache[s]=mv.baseMetrics[s]; });\n        SESS.timeline[i]=mv;\n      } else {\n        loader(true,`replay ${i+1}/${SESS.timeline.length} — setor ${SESS.timeline[i].sector}…`);\n        await computeAt(i);\n        if(saved.assign) SESS.timeline[i].assign=legacyKeys?remapAssign(SESS.timeline[i],saved.assign):saved.assign;\n        if(saved.policy) SESS.timeline[i].policy=saved.policy;\n      }\n    }\n    await loadSectors();\n  }catch(e){ $('#ds').textContent='erro ao carregar sessão: '+e.message; $('#ds').classList.add('err'); }\n  finally{ loader(false); }\n  renderAll();\n}\n// Re-points a legacy bare-name assignment at the NAME/UF key it can only mean. When a name resolves\n// to more than one município in the recomputed stage the manual choice is genuinely ambiguous —\n// dropping it lets the optimizer allocate instead of guessing on the operator's behalf.\n// True when a cached stage names a destination outside the closing sector's gerência de vendas.\n// Judges the cache by TODAY's rule, reading the (memoised) dominantes base rather than trusting what\n// the session was saved with. Unknown GV on the closing sector answers false: the stage then loads\n// from cache instead of being replayed into the hard throw in computeMovement, which would leave the\n// operator staring at a broken session with no way back.\nasync function savedCrossesGv(saved){\n  if(!saved||!saved.sector||!(saved.dest||[]).length) return false;\n  let gvBy={};\n  try{ await ensureDominantes(); gvBy=DOM.gvBySetor||{}; }catch(e){ return false; }\n  const own=gvBy[String(saved.sector)]||'';\n  if(!own) return false;\n  if(saved.dest.some(s=>(gvBy[String(s)]||'')!==own)) return true;\n  // A stage saved before foreign-GV neighbours stopped being drawn can hold a perfectly clean dest and\n  // STILL carry their shapes in nbrFeat/nbrCurrentSector — it would repaint the old map straight from\n  // cache. An unknown gerência is not evidence of a foreign one, so only a known, differing GV replays.\n  return Object.values(saved.nbrCurrentSector||{}).some(s=>{ const g=gvBy[String(s)]||''; return g&&g!==own; });\n}\nfunction remapAssign(mv,savedAssign){\n  const keys=Object.keys(mv.munis||{}).filter(k=>k!=='__OUTROS__');\n  const out={};\n  Object.entries(savedAssign||{}).forEach(([k,v])=>{\n    if(keys.indexOf(k)>=0){ out[k]=v; return; }\n    const cand=keys.filter(x=>mName(x)===mName(k));\n    if(cand.length===1) out[cand[0]]=v;\n  });\n  return out;\n}\nfunction newSession(){\n  SESS.sessionId=null; SESS.sessionLabel=null; SESS.timeline=[]; SESS.selected=0; SESS.sectorBaseCache={};\n  SESS.settings={...DEFAULT_SETTINGS};\n  SESS.snapshotRaw=null; SESS.snapshotSyncedAt=null; SESS.snapLiteral=null; SESS.eloMaxCycle=null; SESS.stage='loading'; SESS.dirtyFrom=null;\n  (async()=>{\n    loader(true,'iniciando nova sessão…');\n    try{ await Promise.all([ensurePinned(), loadSectors()]); SESS.stage='confirm'; }\n    catch(e){ setError('erro init: '+e.message); }\n    finally{ loader(false); renderAll(); }\n  })();\n}\n\n// ---------- snapshot refresh ----------\n// Deliberately breaks the frozen-snapshot guarantee, on demand: re-resolves DT_HISTORICO and\n// replays the whole timeline against the new one. Skips the replay when the snapshot has not\n// actually moved, so a stray click on a long timeline costs one cheap probe instead of ~8 queries\n// per etapa.\nasync function refreshSnapshot(){\n  if(SESS.stage!=='main' || SESS.snapBusy) return;\n  SESS.snapBusy=true;\n  const prevRaw=SESS.snapshotRaw;\n  const pill=$('#liveState'); if(pill){ pill.classList.add('busy'); pill.textContent='◌ atualizando snapshot…'; }\n  loader(true,'buscando o snapshot mais recente…');\n  let ok=false;\n  try{\n    const p=await resolveSnapshotPin();\n    if(!p.snapshotRaw) throw new Error('não foi possível resolver DT_HISTORICO');\n    const same=String(p.snapshotRaw)===String(prevRaw);\n    SESS.snapshotRaw=p.snapshotRaw; SESS.snapshotSyncedAt=p.syncedAt; SESS.snapLiteral=p.snapLiteral; SESS.eloMaxCycle=p.eloMaxCycle;\n    await loadSectors();   // the sector list follows the live max, so it can have moved too\n    if(same){\n      $('#ds').textContent=`snapshot já era o mais recente · atualizado em ${fmtSyncedAt(p.syncedAt)} — nada recalculado`;\n    } else if(SESS.timeline.length){\n      SESS.dirtyFrom=null;\n      SESS.sectorBaseCache={};   // baselines come from the snapshot, so every one of them changed\n      loader(true,'snapshot novo — recalculando a timeline…');\n      await recomputeFrom(0);\n      $('#ds').textContent=`snapshot atualizado em ${fmtSyncedAt(p.syncedAt)} · ${fmt(SESS.timeline.length)} etapa(s) recalculada(s)`;\n    } else {\n      $('#ds').textContent=`snapshot atualizado em ${fmtSyncedAt(p.syncedAt)}`;\n    }\n    $('#ds').classList.remove('err');\n    ok=true;\n  }catch(e){\n    const at=(SESS.dirtyFrom==null?null:SESS.dirtyFrom+1);\n    $('#ds').textContent='erro ao atualizar o snapshot'+(at?` na etapa ${at} — etapa ${at} em diante ficou desatualizada (⟳)`:'')+': '+e.message;\n    $('#ds').classList.add('err');\n  }finally{\n    SESS.snapBusy=false;\n    if(pill) pill.classList.remove('busy');\n    loader(false); renderAll();\n    if(ok) setTimeout(()=>{ const d=$('#ds'); if(d&&!d.classList.contains('err')) d.textContent=''; },7000);\n  }\n}\n\n// ---------- session options ----------\nfunction previewDest(mv,rule,minCbs){\n  if(!mv||!mv.allowedRaw||!mv.munis) return null;\n  const w={}; let relaxed=false;\n  const cbsOf=m=>(mv.cbsByMuni&&mv.cbsByMuni[m]!=null)?mv.cbsByMuni[m]:((mv.munis[m]&&mv.munis[m].cbs)||0);\n  const add=m=>Object.entries(mv.allowedRaw[m]||{}).forEach(([s,v])=>{ w[s]=(w[s]||0)+v; });\n  // allowedRaw only carries municipalities already inside the sector's dominance base, so there is\n  // nothing left to filter out here beyond the destination rule itself.\n  Object.keys(mv.allowedRaw).forEach(m=>{ const cbs=cbsOf(m);\n    if(rule==='dominant'&&cbs<minCbs) return; add(m); });\n  if(rule==='dominant'&&!Object.keys(w).length){ Object.keys(mv.allowedRaw).forEach(add); relaxed=true; }\n  return {dest:Object.keys(w).sort((a,b)=>w[b]-w[a]).slice(0,6),relaxed};\n}\nfunction readOptForm(){\n  const r=root.querySelector('input[name=\"destRule\"]:checked');\n  let n=Math.round(+$('#optMinCbs').value);\n  if(!(n>0)) n=DEFAULT_SETTINGS.destMinCbs;\n  return {destRule:(r&&r.value)||DEFAULT_SETTINGS.destRule, destMinCbs:n,\n          targetSpan:numOrNull($('#optTargetSpan').value),\n          maxSpan:numOrNull($('#optMaxSpan').value),\n          minSpan:numOrNull($('#optMinSpan').value)};\n}\nfunction spanFormError(f){\n  if(f.minSpan&&f.maxSpan&&f.minSpan>f.maxSpan) return `Span mínimo (${fmt(f.minSpan)}) não pode ser maior que o máximo (${fmt(f.maxSpan)}).`;\n  if(f.targetSpan&&f.maxSpan&&f.targetSpan>f.maxSpan) return `Span alvo (${fmt(f.targetSpan)}) não pode passar do máximo (${fmt(f.maxSpan)}).`;\n  if(f.targetSpan&&f.minSpan&&f.targetSpan<f.minSpan) return `Span alvo (${fmt(f.targetSpan)}) não pode ficar abaixo do mínimo (${fmt(f.minSpan)}).`;\n  return '';\n}\nfunction renderOptPreview(){\n  const el=$('#optPreview'); if(!el) return;\n  const f=readOptForm();\n  root.querySelectorAll('.opt-row').forEach(r=>{\n    if(r.dataset.r!=null) r.classList.toggle('on',r.dataset.r===f.destRule);\n  });\n  const wrap=$('#optMinCbsWrap'); if(wrap) wrap.classList.toggle('off',f.destRule!=='dominant');\n  const err=spanFormError(f), ee=$('#optSpanErr');\n  if(ee){ ee.textContent=err; ee.classList.toggle('hidden',!err); }\n  const ap=$('#optApply'); if(ap) ap.disabled=!!err;\n  const mv=SESS.timeline[SESS.selected];\n  // Prévia inteira é sobre conceitos de setor (ponte por município, span alvo/máx/mín) que não\n  // existem em GV/mercado — mostrar aqui só confundiria com números que não valem nada.\n  if(mv && (mv.level||'setor')!=='setor'){ el.innerHTML=''; return; }\n  if(!mv||!mv.munis){ el.innerHTML='Nenhuma etapa calculada ainda — as regras passam a valer no próximo fechamento.'; return; }\n  const cbsOf=m=>(mv.cbsByMuni&&mv.cbsByMuni[m]!=null)?mv.cbsByMuni[m]:((mv.munis[m]&&mv.munis[m].cbs)||0);\n  const ms=Object.keys(mv.geoFeat||{});\n  const ig=f.destRule==='dominant'?ms.filter(m=>cbsOf(m)<f.destMinCbs):[];\n  const pv=previewDest(mv,f.destRule,f.destMinCbs);\n  let h=`<b style=\"color:var(--ink)\">Prévia — etapa ${SESS.selected+1}, setor ${mv.sector}</b><br>`;\n  const exN=(mv.excludedMunis||[]).length;\n  if(exN) h+=`Base de dominantes: <b>${fmt(ms.length)}</b> município(s) no mapa · <span style=\"color:var(--closing)\">${fmt(exN)} fora da base — ${fmt(mv.excludedCbs||0)} CBs seguem suas líderes</span><br>`;\n  h+=`${fmt(ms.length-ig.length)} de ${fmt(ms.length)} município(s) valem como ponte`;\n  if(ig.length) h+=` · <span style=\"color:var(--closing)\">ignorados:</span> ${ig.slice(0,8).join(', ')}${ig.length>8?' +'+(ig.length-8):''}`;\n  if(pv){\n    h+=`<br>Setores destino com esta regra: <b style=\"color:var(--ink)\">${pv.dest.join(', ')||'–'}</b>`;\n    const cur=(mv.dest||[]).join(', ');\n    if(pv.dest.join(',')!==(mv.dest||[]).join(',')) h+=` <span style=\"color:var(--closing)\">(hoje: ${cur||'–'})</span>`;\n    if(pv.relaxed) h+=`<br><b style=\"color:var(--closing)\">⚠ nenhum município dominante nesta etapa — a regra relaxa pra \"qualquer município\" pra não deixar a etapa sem destino.</b>`;\n  }\n  if(f.targetSpan||f.maxSpan||f.minSpan){\n    const sp=spanMapFor(mv,mv.assign||{}), v=spanViolationsOf(sp,{target:f.targetSpan,max:f.maxSpan,min:f.minSpan});\n    h+=`<br><br>Span dos destinos como está hoje: ${mv.dest.map(s=>s+' <b>'+fmt(sp[s])+'</b>').join(' · ')||'–'}`;\n    if(v.over.length||v.under.length) h+=`<br><span style=\"color:var(--closing)\">Fora dos limites: ${[...v.over.map(s=>s+' ▲ acima do máx'),...v.under.map(s=>s+' ▼ abaixo do mín')].join(', ')}</span> — o modelo ÓTIMO tenta corrigir no recálculo.`;\n    else h+=` <span style=\"color:var(--ok)\">— já dentro dos limites</span>`;\n  }\n  if(SESS.timeline.length) h+=`<br><span style=\"margin-top:4px;display:inline-block\">Aplicar <b>recalcula as ${fmt(SESS.timeline.length)} etapa(s)</b> contra o snapshot congelado — os destinos ajustados à mão serão refeitos pelo modelo ÓTIMO.</span>`;\n  el.innerHTML=h;\n}\nfunction openOptions(){\n  const st={...DEFAULT_SETTINGS,...(SESS.settings||{})};\n  root.querySelectorAll('input[name=\"destRule\"]').forEach(r=>{ r.checked=(r.value===st.destRule); });\n  $('#optMinCbs').value=st.destMinCbs;\n  $('#optTargetSpan').value=st.targetSpan||'';\n  $('#optMaxSpan').value=st.maxSpan||'';\n  $('#optMinSpan').value=st.minSpan||'';\n  $('#optApply').disabled=false;\n  $('#optSessName').textContent=SESS.sessionLabel||'sessão não salva';\n  $('#optStatus').textContent='';\n  $('#optionsBg').classList.remove('hidden');\n  renderOptPreview();\n  const c=$('#optCancel'); if(c) c.focus();\n}\nfunction closeOptions(){ const b=$('#optionsBg'); if(b) b.classList.add('hidden'); }\nasync function applyOptions(){\n  const f=readOptForm();\n  if(spanFormError(f)) return;\n  const prev={...DEFAULT_SETTINGS,...(SESS.settings||{})};\n  const changed = prev.destRule!==f.destRule\n    || (f.destRule==='dominant' && prev.destMinCbs!==f.destMinCbs)\n    || numOrNull(prev.targetSpan)!==f.targetSpan\n    || numOrNull(prev.maxSpan)!==f.maxSpan\n    || numOrNull(prev.minSpan)!==f.minSpan;\n  SESS.settings={...prev,...f};\n  closeOptions();\n  if(!changed || !SESS.timeline.length){ renderAll(); return; }\n  SESS.dirtyFrom=null;\n  SESS.sectorBaseCache={};   // the recompute re-derives every baseline; keeping the old ones would\n                             // leave \"Impacto acumulado\" comparing against pre-change numbers\n  loader(true,'aplicando nova regra de destino — recalculando timeline…');\n  try{\n    await recomputeFrom(0);\n    $('#ds').textContent=''; $('#ds').classList.remove('err');\n  }catch(e){\n    const at=(SESS.dirtyFrom==null?0:SESS.dirtyFrom)+1;\n    $('#ds').textContent=`erro ao aplicar a regra na etapa ${at}: ${e.message} — etapa ${at} em diante ficou desatualizada (⟳)`;\n    $('#ds').classList.add('err');\n  }finally{ loader(false); renderAll(); }\n}\n\nconst SHARED_DS='timeline-shared-sessionsDataSet';\nconst AUTH_REF='timelineSimAuthFinal';   // single source of truth for the auth strategy reference\nlet SHARE={busy:false,url:null,last:null};\n// Serialise a PRESENTATION model, not the raw session, so the reader stays purely presentational\n// and never re-derives spans/desloc/orphans — no second copy of this engine to keep in sync.\n// NOTE: METRICS_DEF[2] is the money marker; read it as !!md[2] (a literal dollar sign in this\n// position trips the upsert's parse check).\nfunction buildShareStages(){\n  return SESS.timeline.map((mv,i)=>{\n    const c=computeDerived(mv);\n    const incBy={};\n    mv.dest.forEach(s=>{ incBy[s]=Object.fromEntries(METRICS_DEF.map(md=>[md[0],0])); });\n    Object.entries(mv.munis).forEach(([m,o])=>{\n      if(m==='__OUTROS__') return;\n      const s=mv.assign[m]; if(!s||!incBy[s]) return;\n      METRICS_DEF.forEach(md=>{ incBy[s][md[0]]+=o[md[0]]||0; });\n    });\n    const saiTot={};\n    METRICS_DEF.forEach(md=>{\n      const k=md[0];\n      saiTot[k]=Object.entries(mv.munis).filter(([m])=>m!=='__OUTROS__').reduce((a,p)=>a+((p[1][k])||0),0);\n    });\n    // orphans follow their leader's home: they enter that sector AND leave the closing one\n    c.leaders.forEach(L=>{\n      const om=mv.orphanMetricsByGroup&&mv.orphanMetricsByGroup[L.grupo];\n      if(!om||!L.home) return;\n      METRICS_DEF.forEach(md=>{ const k=md[0];\n        if(incBy[L.home]) incBy[L.home][k]+=om[k]||0;\n        saiTot[k]+=om[k]||0; });\n    });\n    const ms=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__').sort((a,b)=>mv.munis[b].cbs-mv.munis[a].cbs);\n    const sv=mv.dest.map(s=>c.span[s]);\n    const baseOf=(s,k)=>{ const b=mv.baseMetrics[s]||{}; return +(b[k]||0); };\n    return {\n      i:i, sector:mv.sector, level:mv.level||'setor', unitOfMuni:mv.unitOfMuni||{}, policy:mv.policy, domUF:mv.domUF,\n      optTier:(mv.optTier==null?0:mv.optTier),\n      destRuleFallback:!!mv.destRuleFallback,\n      dest:mv.dest.slice(), color:Object.assign({},mv.color), assign:Object.assign({},mv.assign),\n      kpis:{ cbsRealocadas:closingCbsOf(mv), desloc:c.desloc,\n             spread:(sv.length?Math.max.apply(null,sv)-Math.min.apply(null,sv):0),\n             municipios:ms.length, lideres:mv.leaders.length },\n      destinos:mv.dest.map(s=>({ s:s, base:baseOf(s,'cbs'), inc:c.inc[s]||0, orph:c.orph[s]||0, span:c.span[s]||0, gained:c.gained[s]||0 })),\n      municipios:ms.map(m=>(mv.level&&mv.level!=='setor')?{ nome:m, uf:'', cbs:mv.munis[m].cbs, destino:mv.assign[m]||null }:{ nome:mName(m), uf:mUf(m), cbs:mv.munis[m].cbs, destino:mv.assign[m]||null }),\n      excluidos:(mv.excludedMunis||[]).map(x=>({ muni:x.muni, cbs:x.cbs })),\n      orphanTotal:c.orphanTotal||0, orphanStranded:c.orphanStranded||0, noShapeCbs:mv.noShapeCbs||0,\n      lideres:c.leaders.map(L=>({ lider:(L.lider||'').split(' ').slice(0,2).join(' '), grupo:L.grupo,\n        total:L.total, home:L.home, desloc:L.desloc, orphan:L.orphan||0 })),\n      metricas:METRICS_DEF.map(md=>{ const k=md[0];\n        return { key:k, label:md[1], money:!!md[2],\n          rows:mv.dest.map(s=>({ s:s, antes:baseOf(s,k), depois:baseOf(s,k)+((incBy[s]&&incBy[s][k])||0) })),\n          sai:saiTot[k]||0 }; }),\n      geoFeat:mv.geoFeat, nbrFeat:mv.nbrFeat, excludedFeat:[]\n    };\n  });\n}\nfunction buildShareSummary(stages){\n  const world=foldWorldState(SESS.timeline,SESS.timeline.length);\n  const receivers=[];\n  SESS.timeline.forEach((mv,i)=>{\n    const own=mv.pureOwnMetrics||{};\n    receivers.push({ s:mv.sector, situacao:'fechado (etapa '+(i+1)+')', antes:+(own.cbs||0), depois:0 });\n  });\n  const seen={};\n  Object.values(world.muniOverride).forEach(s=>{\n    if(seen[s]) return; seen[s]=1;\n    const base=SESS.sectorBaseCache[s]||{}, infl=world.sectorInflow[s]||{};\n    receivers.push({ s:s, situacao:'recebeu território', antes:+(base.cbs||0), depois:(+(base.cbs||0))+(infl.cbs||0) });\n  });\n  return { stages:stages.length, sectors:SESS.timeline.map(mv=>mv.sector),\n    totalCbs:stages.reduce((a,s)=>a+(s.kpis.cbsRealocadas||0),0),\n    totalDesloc:stages.reduce((a,s)=>a+(s.kpis.desloc||0),0), receivers:receivers };\n}\nfunction renderShareBody(){\n  const el=$('#shareBody'); if(!el) return;\n  const go=$('#shareGo'), cp=$('#shareCopy'), op=$('#shareOpen'), cc=$('#shareCancel');\n  if(SHARE.url){\n    el.innerHTML=`<div class=\"opt-note\" style=\"margin-top:0\"><b style=\"color:var(--ink)\">Sessão compartilhada ✓</b><br>\n      Link de leitura desta simulação congelada. Quem abrir precisa ter login no simulador.\n      <div class=\"shareurl\">${esc(SHARE.url)}</div></div>`;\n    if(go) go.classList.add('hidden');\n    if(cp) cp.classList.remove('hidden');\n    if(op) op.classList.remove('hidden');\n    if(cc) cc.textContent='Fechar';\n    return;\n  }\n  if(go) go.classList.remove('hidden');\n  if(cp) cp.classList.add('hidden');\n  if(op) op.classList.add('hidden');\n  if(cc) cc.textContent='Cancelar';\n  const st={...DEFAULT_SETTINGS,...(SESS.settings||{})};\n  const desloc=SESS.timeline.reduce((a,mv)=>a+(mv.munis?computeDerived(mv).desloc:0),0);\n  const destTxt=st.destRule==='dominant'?('dominantes ≥'+fmt(st.destMinCbs)+' CBs'):'qualquer município';\n  el.innerHTML=`<div class=\"opt-lbl\">Confirmar compartilhamento</div>\n    <div class=\"opt-sub\">Publica uma <b>cópia congelada</b> desta sessão, exatamente no estado atual.</div>\n    <div class=\"opt-note\" style=\"margin-top:0\">\n      · <b>${fmt(SESS.timeline.length)}</b> etapa(s) — ${esc(SESS.timeline.map(mv=>mv.sector).join(' → '))}<br>\n      · snapshot atualizado em <b>${esc(fmtSyncedAt(SESS.snapshotSyncedAt))}</b><br>\n      · base: <b>municípios dominantes (CSV)</b> · destino: <b>${esc(destTxt)}</b> · span: <b>${esc(spanShort(st))}</b><br>\n      · <b>${fmt(desloc)}</b> CBs deslocadas somando a cadeia\n    </div>\n    <div class=\"opt-note\">A cópia <b>não</b> acompanha edições posteriores desta sessão — pra atualizar, compartilhe de novo e use o link novo. O link exige login no simulador; não é público.</div>\n    ${SHARE.last?`<div class=\"opt-note\"><b style=\"color:var(--ink)\">Último link gerado nesta sessão</b> — aponta pro estado de <b>antes</b> das edições feitas depois dele.<div class=\"shareurl\">${esc(SHARE.last)}</div></div>`:''}`;\n}\nasync function openShare(){\n  if(!SESS.timeline.length){ $('#ds').textContent='nada pra compartilhar — feche pelo menos um setor primeiro.'; $('#ds').classList.add('err'); return; }\n  await flushDirty();\n  SHARE.url=null;\n  const s=$('#shareStatus'); if(s){ s.textContent=''; s.classList.remove('err'); }\n  renderShareBody();\n  $('#shareBg').classList.remove('hidden');\n  const b=$('#shareCancel'); if(b) b.focus();\n}\nfunction closeShare(){ const b=$('#shareBg'); if(b) b.classList.add('hidden'); }\nasync function doShare(){\n  if(SHARE.busy) return;\n  const go=$('#shareGo'), stx=$('#shareStatus');\n  SHARE.busy=true;\n  if(go){ go.disabled=true; go.textContent='Compartilhando…'; }\n  if(stx){ stx.textContent=''; stx.classList.remove('err'); }\n  try{\n    // Resolved as a GLOBAL PROCESS, not a declared param — which only works because the block\n    // instance on the `main` artboard binds `sharedDataset: @timeline-shared-sessionsDataSet`.\n    // That binding is load-bearing: a Process is only define()d once something on the rendering\n    // tree references it, so without it this lookup returns null and sharing dies on the guard\n    // below. Do NOT remove the instance param because this file never reads d2.params.sharedDataset.\n    const ds=d2.data(SHARED_DS);\n    if(!ds) throw new Error('dataset de sessões compartilhadas indisponível');\n    await flushDirty();\n    const stages=buildShareStages();\n    const summary=buildShareSummary(stages);\n    let who='';\n    try{ const a=d2.auth(AUTH_REF); who=(a&&a.user&&(a.user.email||a.user.nome))||''; }catch(e){}\n    const created=await ds.create({\n      label:SESS.sessionLabel||('Sessão '+new Date().toLocaleString('pt-BR')),\n      snapshotRaw:SESS.snapshotRaw, snapshotSyncedAt:SESS.snapshotSyncedAt,\n      settings:{...DEFAULT_SETTINGS,...(SESS.settings||{})},\n      stages:stages, summary:summary, sharedBy:who, sharedAt:new Date().toISOString()\n    });\n    const id=(created&&created._id)||(created&&created.data&&created.data._id)||(ds.selected&&ds.selected()&&ds.selected()._id)||null;\n    if(!id) throw new Error('registro gravado, mas sem _id na resposta — não foi possível montar o link');\n    SHARE.url=window.location.origin+'/sessions/'+id;\n    SHARE.last=SHARE.url;\n    renderShareBody();\n  }catch(e){\n    if(stx){ stx.textContent='erro ao compartilhar: '+e.message; stx.classList.add('err'); }\n  }finally{\n    SHARE.busy=false;\n    if(go){ go.disabled=false; go.textContent='Compartilhar'; }\n  }\n}\n\n// ---------- rendering ----------\nfunction renderTimeline(){\n  const el=$('#movementChips'); if(!el) return;\n  if(!SESS.timeline.length){ el.innerHTML='<span class=\"empty\">Nenhuma etapa ainda — use \"Adicionar movimentação\" à direita.</span>'; return; }\n  el.innerHTML=SESS.timeline.map((mv,i)=>{\n    const ready=mv.dest!==undefined;\n    const c=ready?computeDerived(mv):null;\n    const stale=SESS.dirtyFrom!=null && i>=SESS.dirtyFrom;\n    return `<div class=\"tchip ${i===SESS.selected?'on':''} ${stale?'stale':''}\" data-i=\"${i}\">\n      <span class=\"tnum\">${i+1}</span><span class=\"tsec\">${LEVELS[mv.level||'setor'].label} ${mv.sector}</span>\n      <span class=\"tstat\">${ready?((mv.level||'setor')==='setor'?fmt(c.desloc)+' desloc.':fmt(closingCbsOf(mv))+' CBs'):'…'}</span>\n      ${stale?'<span class=\"tstale\" title=\"recalcula ao selecionar outra etapa\">⟳</span>':''}\n      <span class=\"trm\" data-rm=\"${i}\" title=\"remover esta etapa e as seguintes\">✕</span>\n    </div>`;\n  }).join('');\n  el.querySelectorAll('.tchip').forEach(ch=>{\n    ch.addEventListener('click',async (e)=>{\n      if(e.target.dataset.rm!=null && e.target.dataset.rm!==''){ removeFrom(+e.target.dataset.rm); return; }\n      const i=+ch.dataset.i;\n      if(i!==SESS.selected) await flushDirty();\n      SESS.selected=i; renderAll();\n    });\n  });\n}\nfunction renderRuleNote(){\n  const el=$('#ruleNote'); if(!el) return;\n  const st={...DEFAULT_SETTINGS,...(SESS.settings||{})};\n  const mv=SESS.timeline[SESS.selected];\n  const lvl=LEVELS[(mv&&mv.level)||'setor'];\n  let h='';\n  if(!mv || (mv.level||'setor')==='setor'){\n    h+=`<b style=\"color:var(--ink)\">Base de municípios dominantes:</b> só os municípios que a base (CSV) atribui ao setor entram no mapa e na alocação`;\n    if(mv&&mv.domCsvMunis) h+=` · <b>${fmt(mv.domCsvMunis)}</b> na base do setor ${mv.sector}`;\n    if(mv&&mv.excludedCbs) h+=` · <b style=\"color:var(--closing)\">${fmt(mv.excludedMunis.length)} município(s) / ${fmt(mv.excludedCbs)} CBs</b> fora da base nesta etapa — não aparecem no mapa e as CBs seguem suas líderes (quebra de vínculo)`;\n  } else {\n    // GV/mercado não têm spillover (todo setor pertence a exatamente uma GV/mercado na base), então\n    // não existe \"excluído\" pra reportar aqui — só o tamanho da base e em quantas unidades ela se agrupa.\n    h+=`<b style=\"color:var(--ink)\">Base de ${lc(lvl.childLabel)}s dominantes:</b> ${mv.domCsvMunis!=null?`<b>${fmt(mv.domCsvMunis)}</b> município(s) `:''}na base ${lvl.de} ${lc(lvl.label)} ${mv.sector}, agrupados em <b>${fmt(Object.keys(mv.unitMunis||{}).length)}</b> ${lc(lvl.childLabel)}(s)`;\n  }\n  if(DOM.error) h+=` · <b style=\"color:var(--closing)\">⚠ base indisponível: ${esc(DOM.error)}</b>`;\n  h+=`<br>`;\n  h+=`<b style=\"color:var(--ink)\">Regra de destino:</b> `;\n  h+= st.destRule==='dominant'\n    ? `só municípios com <b>≥${fmt(st.destMinCbs)} CBs</b> trazem ${lc(lvl.destLabel)} pra lista de destinos`\n    : `qualquer município ${lvl.de} ${lc(lvl.label)} fechad${lvl.a==='à'?'a':'o'} vale como ponte <span style=\"opacity:.7\">(padrão)</span>`;\n  if(mv&&st.destRule==='dominant'){\n    // A ponte é sempre por MUNICÍPIO, em qualquer nível — mv.ignoredBridges já é a lista definitiva\n    // que computeMovement calculou, então lê-la aqui em vez de recalcular contra mv.munis, que em\n    // GV/mercado está no grão de setor/GV e daria o número errado.\n    const ig=mv.ignoredBridges||[];\n    if(ig.length) h+=` · <b style=\"color:var(--closing)\">${fmt(ig.length)}</b> ignorado(s) como ponte (ainda redistribuído(s)): ${ig.slice(0,5).join(', ')}${ig.length>5?' +'+(ig.length-5):''}`;\n    if(mv.destRuleFallback) h+=`<br><b style=\"color:var(--closing)\">⚠ nenhum município dominante nesta etapa — regra relaxada pra \"qualquer município\".</b>`;\n  }\n  el.innerHTML=h;\n}\nfunction renderSpanRule(){\n  const el=$('#spanRule'); if(!el) return;\n  const mv=SESS.timeline[SESS.selected], lim=spanLimits(mv);\n  if(!mv||!mv.munis||mv.view==='asis'||!spanLimitsOn(lim)){ el.innerHTML=''; return; }\n  const sp=spanMapFor(mv,mv.assign||{}), v=spanViolationsOf(sp,lim);\n  const bits=[];\n  if(lim.target) bits.push(`alvo <b>${fmt(lim.target)}</b>`);\n  if(lim.max) bits.push(`máx <b>${fmt(lim.max)}</b>`);\n  if(lim.min) bits.push(`mín <b>${fmt(lim.min)}</b>`);\n  let h=`Pré-requisito de span: ${bits.join(' · ')} CBs — `;\n  if(v.over.length||v.under.length){\n    h+=`<b style=\"color:var(--closing)\">⚠ `;\n    if(v.over.length) h+=`acima do máximo: ${v.over.map(s=>s+' ('+fmt(sp[s])+')').join(', ')}`;\n    if(v.over.length&&v.under.length) h+=' · ';\n    if(v.under.length) h+=`abaixo do mínimo: ${v.under.map(s=>s+' ('+fmt(sp[s])+')').join(', ')}`;\n    h+=`</b>`;\n    if(mv.optTier===1) h+=`<br><span style=\"opacity:.85\">Nenhuma alocação conectada respeita o span mínimo nesta etapa — o modelo relaxou essa exigência.</span>`;\n    else if(mv.optTier===2) h+=`<br><span style=\"opacity:.85\">Nenhuma alocação conectada respeita os limites nesta etapa — o modelo relaxou essa exigência.</span>`;\n    else if(mv.optTier===-1) h+=`<br><span style=\"opacity:.85\">Etapa resolvida por heurística — os limites não são garantidos.</span>`;\n  } else h+=`<b style=\"color:var(--ok)\">✓ todos os setores receptores dentro dos limites</b>`;\n  el.innerHTML=`<div class=\"note\" style=\"margin:-2px 0 6px\">${h}</div>`;\n}\nfunction renderContig(){const mv=SESS.timeline[SESS.selected];const el=$('#contig');if(!el||!mv)return;\n  if(mv.view==='asis'){el.innerHTML='';return;}\n  const lvl=LEVELS[mv.level||'setor'];\n  // Indicador de conectividade geográfica só se aplica a fechamento de setor — ver contigBadFor.\n  if((mv.level||'setor')!=='setor'){ el.innerHTML=''; return; }\n  const bad=contigBadFor(mv,mv.assign);\n  el.innerHTML=bad.length\n    ?`<div class=\"note\" style=\"color:var(--closing);font-weight:600;margin:-2px 0 6px\">⚠ Território desconectado em ${bad.join(', ')} — ${lc(lvl.childLabel)}(s) desconectado(s) do território ${lvl.de} ${lc(lvl.label)}. Use ★ ÓTIMO ou reassocie no mapa.</div>`\n    :`<div class=\"note\" style=\"color:var(--ok);margin:-2px 0 6px\">✓ Sem quebras — cada ${lc(lvl.label)} forma uma região conectada.</div>`;\n}\nfunction closingCbsOf(mv){ return Object.entries(mv.munis).filter(([m])=>m!=='__OUTROS__').reduce((a,[,o])=>a+o.cbs,0); }\nfunction sectorTotalCbs(mv){ return Object.values(mv.munis).reduce((a,o)=>a+o.cbs,0); }\nfunction renderKpis(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const c=computeDerived(mv); const lvl=LEVELS[mv.level||'setor'];\n  const childPlural=lvl.childLabel==='Setor'?'Setores':(lvl.childLabel==='GV'?'GVs':'Municípios');\n  if(mv.view==='asis'){const mc=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__').length;\n    $('#kpis').innerHTML=[\n      {n:fmt(sectorTotalCbs(mv)),l:`CBs ${lvl.no} ${lc(lvl.label)} ${mv.sector} (antes desta etapa)`,t:`Total de CBs ${lvl.no} ${lc(lvl.label)} hoje — já considerando o que etapas anteriores da timeline mandaram pra cá.`},\n      {n:mv.csvMunisTotal?`${fmt(mc)}/${fmt(mv.csvMunisTotal)}`:fmt(mc),l:`${childPlural} ${lvl.de} ${lc(lvl.label)}`,t:`${lvl.childLabel}(s) desenhados nesta etapa${mv.csvMunisTotal?` de ${fmt(mv.csvMunisTotal)} que a base de dominantes atribui ${lvl.a} ${lc(lvl.label)}`:''}.${(mv.missingMunis||[]).length?' Fora do mapa: '+mv.missingMunis.map(x=>x.muni+' ('+x.reason+')').join(' · '):''}${Object.keys(mv.ufGuessed||{}).length?' UF inferida da UF dominante do setor (nome repetido em outra UF carregada): '+Object.entries(mv.ufGuessed).map(([nm,u])=>nm+'→'+u).join(', '):''}`},\n      {n:fmt(mv.leaders.length),l:'Líderes (grupos)',t:`Líderes presentes ${lvl.no} ${lc(lvl.label)} nesta etapa.`},\n      {n:fmt(mv.dest.length),l:`${lvl.destLabel}s adjacentes`,t:`${lvl.destLabel}s vizinh${lvl.destLabel==='GV'?'as':'os'} (ainda abertas)${lvl.parentPhrase?` ${lvl.parentPhrase}`:''}${mv.gv?` (${mv.gv})`:''} que poderiam receber os ${lc(lvl.childLabel)}s.${(mv.gvRejected||[]).length&&lvl.parentWord?' Fora do mapa, por serem de outr'+(lvl.parentWord==='gerência'?'a':'o')+' '+lvl.parentWord+': '+mv.gvRejected.join(', ')+'.':''}`},\n    ].map(k=>`<div class=\"kpi\" title=\"${k.t}\"><div class=\"n\">${k.n}</div><div class=\"l\">${k.l}</div></div>`).join('');\n    return;}\n  const sv=mv.dest.map(s=>c.span[s]);const spread=sv.length?Math.max(...sv)-Math.min(...sv):0;\n  const zero=mv.dest.filter(s=>c.gained[s]===0);const totCbs=closingCbsOf(mv);\n  $('#kpis').innerHTML=[\n    // \"CBs fora do X\" só faz sentido pra fechamento de setor — a mecânica de vínculo (CBs que\n    // seguem a líder pra fora do território) é uma coisa de setor/orphan, não de GV/mercado.\n    (mv.level||'setor')==='setor'?{n:fmt(c.desloc),l:mv.policy==='fora'?`CBs fora ${lvl.de} ${lc(lvl.destLabel)}`:'CBs c/ quebra de relação',cls:'warn',t:`CBs cuja líder acabou noutr${lvl.a==='à'?'a':'o'} ${lc(lvl.destLabel)} nesta etapa.`}:null,\n    {n:fmt(spread),l:'Desequilíbrio (máx−mín CBs)',cls:spread>800?'warn':'ok',t:`Diferença de tamanho entre ${lvl.destLabel==='GV'?'a maior e a menor':'o maior e o menor'} ${lc(lvl.destLabel)} depois desta etapa.`},\n    {n:fmt(totCbs),l:'CBs realocadas',cls:'',t:`Total de CBs ${lvl.de} ${lc(lvl.label)} ${mv.sector} sendo redistribuídas nesta etapa.`},\n    (mv.level||'setor')==='setor'?{n:zero.length?zero.join(', '):'nenhum',l:`${lvl.destLabel} sem líder herdada`,cls:zero.length?'warn':'ok',t:`${lvl.destLabel} que recebe ${lc(lvl.childLabel)}(s) mas nenhuma líder nesta etapa.`}:null,\n  ].filter(Boolean).concat(mv.excludedCbs?[{n:fmt(mv.excludedCbs),l:`CBs fora do setor · ${fmt(mv.excludedMunis.length)} município(s) fora da base`,cls:'warn',t:'CBs em municípios que a base de dominantes não atribui a este setor: ficam fora do mapa e da alocação geográfica e seguem a líder do seu grupo.'}]:[])\n   .concat((mv.missingMunis||[]).length?[{n:fmt(mv.missingMunis.length),l:`Município(s) da base fora do mapa · ${fmt(mv.csvMunisTotal)} na base`,cls:'warn',t:`A base de dominantes atribui ${fmt(mv.csvMunisTotal)} município(s) ao setor ${mv.sector} e ${fmt(mv.csvMunisTotal-mv.missingMunis.length)} chegaram ao mapa. Fora: ${mv.missingMunis.map(x=>x.muni+' — '+x.reason+(x.cbs?' ('+fmt(x.cbs)+' CBs)':'')).join(' · ')}`}]:[])\n   .map(k=>`<div class=\"kpi ${k.cls}\" title=\"${k.t}\"><div class=\"n\">${k.n}</div><div class=\"l\">${k.l}</div></div>`).join('');\n}\nfunction renderSpans(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const c=computeDerived(mv); const lvl=LEVELS[mv.level||'setor'];\n  if(mv.view==='asis'){const items=[{s:mv.sector,val:sectorTotalCbs(mv),color:CLOSE_COLOR}].concat(mv.dest.map(s=>({s,val:+(mv.baseMetrics[s]?.cbs||0),color:mv.color[s]})));\n    const max=Math.max(...items.map(x=>x.val),1);\n    $('#spans').innerHTML=items.map(x=>`<div class=\"bar-row\"><div class=\"tag\" style=\"color:${x.color}\">${x.s}</div><div class=\"bar-track\">\n      <div class=\"bar-inc\" style=\"width:${x.val/max*100}%;background:${x.color}\"></div></div>\n      <div class=\"bar-val\">${fmt(x.val)}</div></div>`).join('')\n      +`<div class=\"note\">Estrutura antes desta etapa — ${lvl.a} ${lc(lvl.label)} <b>${mv.sector}</b> ainda existe. Alterne pra <b>TOBE</b> pra ver a redistribuição.</div>`;\n    return;}\n  const lim=spanLimits(mv),on=spanLimitsOn(lim);\n  const rawMax=Math.max(...mv.dest.map(s=>c.span[s]),lim.target||0,lim.max||0,1);\n  const max=on?rawMax*1.04:rawMax;   // headroom so a marker sitting at the scale top stays visible\n  const marks='';\n  $('#spans').innerHTML=mv.dest.map(s=>{const base=+(mv.baseMetrics[s]?.cbs||0),i=c.inc[s];\n    const over=lim.max&&c.span[s]>lim.max,under=lim.min&&c.span[s]<lim.min;\n    return `<div class=\"bar-row\"><div class=\"tag\" style=\"color:${mv.color[s]}\">${s}</div><div class=\"bar-track\">\n      <div class=\"bar-base\" style=\"width:${base/max*100}%;background:${mv.color[s]}\"></div>\n      <div class=\"bar-inc\" style=\"width:${i/max*100}%;background:${mv.color[s]}\"></div>${marks}</div>\n      <div class=\"bar-val\" style=\"${over?'color:var(--closing);font-weight:700':(under?'color:#ff9500;font-weight:700':'')}\">${fmt(c.span[s])} <span style=\"opacity:.6\">(+${fmt(i)})</span>${over?' ▲':''}${under?' ▼':''}</div></div>`;}).join('')\n    +`<div class=\"note\">Claro = base (já incluindo etapas anteriores) · cheio = CBs entrantes ${lvl.de} ${mv.sector} nesta etapa.${c.orphanTotal?` Inclui <b>${fmt(c.orphanTotal-c.orphanStranded)}</b> CB(s) de municípios fora da base de dominantes que seguiram suas líderes.`:''}</div>`;\n}\n// Two very different reasons land rows in the __OUTROS__ bucket — no IBGE shape, or outside the\n// sector's dominance base. Same bucket computationally, but they must not read as the same thing.\nfunction outsideNote(mv){\n  const bits=[];\n  if(mv.noShapeCbs) bits.push(`<b>${fmt(mv.noShapeCbs)}</b> CBs em ${fmt(mv.noShapeMunis.length)} município(s) sem shape na UF`);\n  if(mv.excludedCbs) bits.push(`<b>${fmt(mv.excludedCbs)}</b> CBs em ${fmt(mv.excludedMunis.length)} município(s) <b>fora da base de dominantes</b> deste setor — <b style=\"color:var(--closing)\">quebra de vínculo</b>`);\n  if(!bits.length) return '';\n  let h=`<div class=\"note\">Fora do mapa e da alocação geográfica: ${bits.join(' · ')}.`;\n  if(mv.excludedCbs){\n    const c=computeDerived(mv);\n    h+=` As <b>${fmt(mv.excludedCbs)}</b> CBs em quebra de vínculo <b>seguem a líder do seu grupo</b>`;\n    const byS=mv.dest.filter(s=>c.orph[s]).map(s=>`<b style=\"color:${mv.color[s]}\">${s}</b> (${fmt(c.orph[s])})`);\n    h+=byS.length?`: ${byS.join(' · ')}.`:'.';\n    if(c.orphanStranded) h+=` <b style=\"color:var(--closing)\">${fmt(c.orphanStranded)} CB(s) sem destino</b> — a líder não ficou com nenhum município realocado, então não há setor pra seguir.`;\n  }\n  if(mv.noShapeCbs) h+=` As CBs sem shape na UF continuam fora de qualquer setor destino.`;\n  if(mv.excludedMunis&&mv.excludedMunis.length) h+=`<br><span style=\"opacity:.85\">${mv.excludedMunis.slice(0,8).map(x=>x.muni+' ('+fmt(x.cbs)+')').join(', ')}${mv.excludedMunis.length>8?' +'+(mv.excludedMunis.length-8):''}</span>`;\n  return h+`</div>`;\n}\nfunction renderMuni(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const lvl=LEVELS[mv.level||'setor'];\n  const plural=lvl.childLabel==='Setor'?'Setores':(lvl.childLabel==='GV'?'GVs':'Municípios');\n  const fem=lvl.childLabel==='GV';\n  const t=$('#muniListTitle'); if(t) t.textContent=`${plural} → ${lc(lvl.destLabel)} destino`;\n  const nt=$('#muniListNote'); if(nt) nt.innerHTML=`Clique no <b>código ${lvl.a} ${lc(lvl.destLabel)}</b> pra mandar ${lvl.a} ${lc(lvl.childLabel)} <b>inteir${fem?'a':'o'}</b> pra lá (regra de negócio). A cor acompanha o mapa.`;\n  const ms=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__').sort((a,b)=>mv.munis[b].cbs-mv.munis[a].cbs);\n  if(mv.view==='asis'){$('#muniList').innerHTML=ms.map(m=>`<div class=\"muni-item\"><div class=\"nm\">${m}</div><div class=\"ct\">${fmt(mv.munis[m].cbs)} CBs</div><span class=\"badge\" style=\"background:${CLOSE_COLOR};color:#fff;border-color:${CLOSE_COLOR}\">${lc(lvl.label)} ${mv.sector}</span></div>`).join('')\n      +`<div class=\"note\">Hoje tod${fem?'as':'os'} pertencem ${lvl.a} ${lc(lvl.label)} <b>${mv.sector}</b>. No <b>TOBE</b> cada um vira botões de destino.</div>`+outsideNote(mv);return;}\n  $('#muniList').innerHTML=ms.map(m=>`<div class=\"muni-item\"><div class=\"nm\">${m}</div><div class=\"ct\">${fmt(mv.munis[m].cbs)} CBs</div>\n    <div class=\"seg\" data-m=\"${m}\">${mv.dest.map(s=>`<button data-s=\"${s}\" class=\"${mv.assign[m]===s?'on':''}\" style=\"${mv.assign[m]===s?'background:'+mv.color[s]:''}\">${s}</button>`).join('')}</div></div>`).join('')\n    +outsideNote(mv);\n  $('#muniList').querySelectorAll('.seg button').forEach(b=>b.onclick=()=>{const m=b.parentElement.dataset.m,s=b.dataset.s;editSelected(m2=>{m2.assign[m]=s;});});\n}\nfunction renderLeaders(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const c=computeDerived(mv);\n  if(mv.view==='asis'){$('#leaders').innerHTML=`<thead><tr><th>Líder</th><th>Grupo</th><th>CBs</th><th>${LEVELS[mv.level||'setor'].label}</th></tr></thead><tbody>`\n    +mv.leaders.map(L=>`<tr><td>${(L.lider||'').split(' ').slice(0,2).join(' ')}</td><td>${L.grupo}</td><td>${fmt(L.total)}</td><td><span class=\"home\" style=\"background:${CLOSE_COLOR}\"></span>${mv.sector}</td></tr>`).join('')\n    +`<tr style=\"font-weight:700\"><td>TOTAL</td><td></td><td>${fmt(mv.leaders.reduce((a,L)=>a+L.total,0))}</td><td></td></tr></tbody>`;return;}\n  const showOrph=c.orphanTotal>0;\n  $('#leaders').innerHTML=`<thead><tr><th>Líder</th><th>CBs</th><th>Home</th>${mv.dest.map(s=>`<th>${s}</th>`).join('')}${showOrph?'<th title=\"CBs em municípios fora da base de dominantes que seguiram esta líder\">Fora do setor</th>':''}<th>Desloc.</th></tr></thead><tbody>`\n   +c.leaders.map(L=>`<tr><td>${(L.lider||'').split(' ').slice(0,2).join(' ')}</td><td>${fmt(L.total)}</td>\n     <td>${L.home?`<span class=\"home\" style=\"background:${mv.color[L.home]}\"></span>${L.home}`:'–'}</td>\n     ${mv.dest.map(s=>`<td class=\"cell\" style=\"${s===L.home?'color:'+mv.color[s]+';font-weight:700':''}\">${L.byS[s]||'·'}</td>`).join('')}\n     ${showOrph?`<td class=\"cell\" style=\"${L.orphan&&!L.orphanHome?'color:var(--closing);font-weight:700':''}\" title=\"${L.orphan?(L.orphanHome?'seguem a líder para o setor '+L.orphanHome:'sem home — CBs sem setor pra seguir'):''}\">${L.orphan?fmt(L.orphan)+(L.orphanHome?'':' ⚠'):'·'}</td>`:''}\n     <td style=\"color:${L.desloc?'var(--closing)':'var(--mut)'};font-weight:${L.desloc?700:400}\">${L.desloc||'0'}</td></tr>`).join('')\n   +`<tr style=\"font-weight:700\"><td>TOTAL</td><td>${fmt(c.leaders.reduce((a,L)=>a+L.total,0))}</td><td></td>${mv.dest.map(s=>`<td>${fmt(c.leaders.reduce((a,L)=>a+L.byS[s],0))}</td>`).join('')}${showOrph?`<td>${fmt(c.orphanTotal)}</td>`:''}<td style=\"color:var(--closing)\">${fmt(c.desloc)}</td></tr></tbody>`;\n}\nfunction renderMatrix(){const mv=SESS.timeline[SESS.selected]; if(!mv) return;\n  // Esta matriz cruza LINHAS DO CRM (município x grupo) — no fechamento de GV/mercado a unidade\n  // que troca de dono é setor/GV, não município, e reconstruir a matriz nesse grão é trabalho ainda\n  // não feito; mostrar a tabela como se fosse por município aqui daria linhas vazias sem avisar.\n  if((mv.level||'setor')!=='setor'){ $('#matrix').innerHTML=`<tr><td class=\"note\" style=\"padding:10px\">Matriz por município × grupo ainda não disponível pra fechamento de ${LEVELS[mv.level].label} — use os KPIs, líderes e plano de migração acima.</td></tr>`; return; }\n  const ms=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__').sort((a,b)=>mv.munis[b].cbs-mv.munis[a].cbs);\n  // `_out` is a flag stamped on the ROW, and rows are shared between etapas (absorbed + inherited\n  // orphans), so the last etapa to aggregate wins and reading it here can describe the wrong etapa.\n  // Derive the bucket from THIS mv instead. Summing rather than .find() because several out-municípios\n  // of the same group all collapse into __OUTROS__, and only the first was being counted.\n  const outOf=x=>!mv.geoFeat[mkey(x.municipio,x.uf)];\n  const cell=(m,g)=>mv.matrix.reduce((a,x)=>a+((((outOf(x)?'__OUTROS__':mkey(x.municipio,x.uf))===m)&&String(x.grupo)===g)?+x.cbs:0),0);\n  const mx=Math.max(...ms.flatMap(m=>mv.leaders.map(L=>cell(m,L.grupo))),1);\n  // No destination column here. This is the AS-IS matrix: every município in it still belongs to the\n  // closing sector, so showing where it is HEADED mixed the two states of the world in one table and\n  // made the ASIS view read like a plan. The destination lives on the map and in \"Municípios → setor\n  // destino\", which are about the to-be.\n  $('#matrix').innerHTML=`<thead><tr><th>Município</th>${mv.leaders.map(L=>`<th title=\"${L.lider}\">${L.grupo}</th>`).join('')}<th>Tot</th></tr></thead><tbody>`\n   +ms.map(m=>`<tr><td>${m}</td>`\n     +mv.leaders.map(L=>{const v=cell(m,L.grupo);return `<td class=\"cell\" style=\"${v?`background:rgba(229,181,63,${.08+v/mx*.5})`:''}\">${v||'·'}</td>`;}).join('')\n     +`<td style=\"font-weight:700\">${fmt(mv.munis[m].cbs)}</td></tr>`).join('')+`</tbody>`;\n}\n// TOBE counterpart of the AS-IS matrix: the same município × grupo grid plus the two columns the AS-IS\n// view deliberately refuses to carry — where the município ends up, and under which líder.\n// \"Líder resultante\" is the líder holding the most CBs in that município. A município is served by several\n// grupos at once and the data names no single owner, so the dominant one is the honest answer and its\n// share is printed beside it instead of being hidden behind a single name.\nfunction renderMatrixTobe(){const mv=SESS.timeline[SESS.selected]; const el=$('#matrixTobe'); const nt=$('#tobeNote');\n  if(!el) return;\n  if(!mv||!mv.munis){ el.innerHTML=''; if(nt) nt.innerHTML=''; return; }\n  if((mv.level||'setor')!=='setor'){ el.innerHTML=`<tr><td class=\"note\" style=\"padding:10px\">Matriz por município × grupo ainda não disponível pra fechamento de ${LEVELS[mv.level].label} — use os KPIs, líderes e plano de migração acima.</td></tr>`; if(nt) nt.innerHTML=''; return; }\n  const c=computeDerived(mv);\n  const homeOf={}; c.leaders.forEach(L=>{ homeOf[L.grupo]=L.home; });\n  const ms=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__').sort((a,b)=>mv.munis[b].cbs-mv.munis[a].cbs);\n  // One pass over the matrix instead of a scan per cell: the AS-IS table can afford the naive version\n  // on six municípios, but this one asks for the dominant líder too, which multiplies the lookups.\n  const outOf=x=>!mv.geoFeat[mkey(x.municipio,x.uf)];\n  const cellBy={}; mv.matrix.forEach(x=>{ const k=(outOf(x)?'__OUTROS__':mkey(x.municipio,x.uf))+'|'+String(x.grupo);\n    cellBy[k]=(cellBy[k]||0)+ +x.cbs; });\n  const cell=(m,g)=>cellBy[m+'|'+g]||0;\n  const mx=Math.max(...ms.flatMap(m=>mv.leaders.map(L=>cell(m,L.grupo))),1);\n  const domLeader=m=>{ let best=null,bc=0;\n    mv.leaders.forEach(L=>{ const v=cell(m,L.grupo); if(v>bc){ bc=v; best=L; } });\n    return best?{L:best,cbs:bc}:null; };\n  const short=L=>(L.lider||'').split(' ').slice(0,2).join(' ')||('grupo '+L.grupo);\n  // NOT named `rows` — that is the module-level Databricks response helper, and shadowing it inside a\n  // render function is a trap for whoever adds a query here later.\n  // Off-mismatch ainda calculado pra alimentar a nota abaixo da tabela — só não vira mais coluna: o\n  // destino agora é \"Setor destino\" por GRUPO no rodapé, não mais por município na grade.\n  const recs=ms.map(m=>{ const d=mv.assign[m]||null, dl=domLeader(m);\n    const home=dl?(homeOf[dl.L.grupo]||null):null;\n    return {m:m,off:!!(dl&&home&&d&&home!==d)}; });\n  el.innerHTML=`<thead><tr><th>Município</th>${mv.leaders.map(L=>`<th title=\"${esc(L.lider||'')}\">${L.grupo}<br><span style=\"font-weight:400;font-size:10px;color:var(--mut)\">${esc(short(L))}</span></th>`).join('')}<th>Tot</th></tr></thead><tbody>`\n   +ms.map(m=>`<tr><td>${m}</td>`\n     +mv.leaders.map(L=>{const v=cell(m,L.grupo);return `<td class=\"cell\" style=\"${v?`background:rgba(229,181,63,${.08+v/mx*.5})`:''}\">${v||'·'}</td>`;}).join('')\n     +`<td style=\"font-weight:700\">${fmt(mv.munis[m].cbs)}</td></tr>`).join('')\n   // Um rótulo de destino por GRUPO (coluna), não por município (linha) — cada grupo tem UM home\n   // fixo (computeDerived já calculou), então ele mora uma vez no rodapé, igual o nome já morava.\n   +`<tr class=\"lider-foot\"><td>Setor destino</td>`\n     +mv.leaders.map(L=>{const h=homeOf[L.grupo]; return `<td>${h?`<span class=\"home\" style=\"background:${mv.color[h]}\"></span>${h}`:'–'}</td>`;}).join('')\n     +`<td></td></tr>`\n   +`</tbody>`;\n  if(nt){\n    const offN=recs.filter(r=>r.off).length;\n    nt.innerHTML=(mv.policy!=='fora')\n      ? `Política <b>quebrar relação</b>: as CBs deixam a líder atual e passam à estrutura do setor destino — o rodapé mostra pra onde cada grupo vai.`\n      : `<b>Setor destino</b> = o setor que recebe a maior parte das CBs de cada líder (rodapé, uma vez por grupo). `\n        +(offN?`<span style=\"color:var(--closing)\">${fmt(offN)} município(s) ⚠</span> têm a líder dominante indo para um setor diferente do dela — as CBs seguem a líder (é disso que o KPI “CBs fora do setor” é feito).`\n          :`Em todos os municípios a líder dominante termina no mesmo setor que recebe o território.`);\n  }\n}\nfunction renderPolicy(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const c=computeDerived(mv); const lvl=LEVELS[mv.level||'setor'];\n  // O toggle fora-do-setor/quebra-de-relação é uma decisão de setor fechando — em GV/mercado a\n  // seção some inteira em vez de mostrar um controle que não corresponde a nada calculado.\n  const sec=$('#policySection'); if(sec) sec.classList.toggle('hidden',(mv.level||'setor')!=='setor');\n  if((mv.level||'setor')!=='setor') return;\n  $('#policyNote').innerHTML=mv.policy==='fora'\n    ?`<b style=\"color:var(--acc)\">Mantendo vínculo:</b> ${fmt(c.desloc)} CBs seguem com a líder mas ficam <b>fisicamente noutr${lvl.a==='à'?'a':'o'} ${lc(lvl.destLabel)}</b>. Preserva relação; suja geografia.`\n    :`<b style=\"color:var(--acc)\">Quebrando vínculo:</b> ${fmt(c.desloc)} CBs <b>re-vinculam a uma líder d${lvl.a==='à'?'a':'o'} ${lc(lvl.destLabel)} destino</b>. Geografia limpa; rompe relação.`;\n}\nfunction renderPlan(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const c=computeDerived(mv); const lvl=LEVELS[mv.level||'setor']; const ms=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__').sort((a,b)=>a.localeCompare(b));\n  // GV/mercado: a chave \"m\" aqui é um código de setor/GV, não uma chave município/UF — mName/mUf\n  // parseariam lixo, então o CSV de plano exporta o código cru nesses níveis.\n  mv._plan=ms.map(m=>(mv.level&&mv.level!=='setor')?{municipio:m,uf:'',cbs:mv.munis[m].cbs,destino:mv.assign[m]}:{municipio:mName(m),uf:mUf(m),cbs:mv.munis[m].cbs,destino:mv.assign[m]});\n  $('#plan').innerHTML=`Etapa ${SESS.selected+1} · ${lvl.label} <b>${mv.sector}</b> → ${ms.map(m=>`${m}→<b style=\"color:${mv.color[mv.assign[m]]}\">${mv.assign[m]||'–'}</b>`).join(' · ')}<br>\n   Política: <b>${mv.policy==='fora'?`manter vínculo (CBs fora ${lvl.de} ${lc(lvl.destLabel)})`:'quebrar relação'}</b> · ${fmt(c.desloc)} CBs impactadas nesta etapa.`\n   +(c.orphanTotal?`<br>Fora da base de dominantes: ${fmt(c.orphanTotal)} CB(s) seguem suas líderes — ${mv.dest.filter(s=>c.orph[s]).map(s=>`${s} (${fmt(c.orph[s])})`).join(' · ')||'–'}${c.orphanStranded?` · <b style=\"color:var(--closing)\">${fmt(c.orphanStranded)} sem líder com destino</b>`:''}. Não entram no CSV, que é por município.`:'');\n}\nfunction renderReport(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const c=computeDerived(mv);\n  mv.metric=mv.metric||'cbs';\n  const KEYS=METRICS_DEF.map(m=>m[0]);\n  const incBy={};mv.dest.forEach(s=>incBy[s]=Object.fromEntries(KEYS.map(k=>[k,0])));\n  Object.entries(mv.munis).forEach(([m,o])=>{if(m==='__OUTROS__')return;const s=mv.assign[m];if(!s||!incBy[s])return;KEYS.forEach(k=>incBy[s][k]+=o[k]||0);});\n  // orphan CBs land on their leader's home sector, not on a geographic destination\n  c.leaders.forEach(L=>{ const om=mv.orphanMetricsByGroup&&mv.orphanMetricsByGroup[L.grupo];\n    if(om&&L.home&&incBy[L.home]) KEYS.forEach(k=>incBy[L.home][k]+=om[k]||0); });\n  const closeTot={};KEYS.forEach(k=>closeTot[k]=Object.entries(mv.munis).filter(([m])=>m!=='__OUTROS__').reduce((a,[,o])=>a+(o[k]||0),0));\n  // they leave the closing sector too, so antes → depois still balances\n  c.leaders.forEach(L=>{ const om=mv.orphanMetricsByGroup&&mv.orphanMetricsByGroup[L.grupo];\n    if(om&&L.home) KEYS.forEach(k=>closeTot[k]+=om[k]||0); });\n  const trend=mv.trend.slice(-6);\n  const chartHTML=mk=>{\n    const isM=['receita','rec_nat','rec_avon'].includes(mk); const fN=isM?money:fmt;\n    const data=mv.dest.map(s=>({label:s,color:mv.color[s],antes:+(mv.baseMetrics[s]?.[mk]||0),depois:+(mv.baseMetrics[s]?.[mk]||0)+(incBy[s]?.[mk]||0)}));\n    data.push({label:mv.sector+'✕',color:'#ff3b30',antes:closeTot[mk]||0,depois:0});\n    const max=Math.max(...data.flatMap(d=>[d.antes,d.depois]),1);\n    const W=720,H=290,base=238,top=42,maxH=base-top,n=data.length,gw=(W-16)/n;\n    let g='';\n    data.forEach((d,i)=>{const cx=8+gw*i+gw/2,bw=Math.min(30,gw*0.30);\n      const ah=d.antes/max*maxH,dh=d.depois/max*maxH,ax=cx-bw-2,dx=cx+2;\n      g+=`<rect x=\"${ax.toFixed(1)}\" y=\"${(base-ah).toFixed(1)}\" width=\"${bw.toFixed(1)}\" height=\"${ah.toFixed(1)}\" rx=\"2.5\" fill=\"${d.color}\" opacity=\"0.35\"/>`;\n      g+=`<rect x=\"${dx.toFixed(1)}\" y=\"${(base-dh).toFixed(1)}\" width=\"${bw.toFixed(1)}\" height=\"${dh.toFixed(1)}\" rx=\"2.5\" fill=\"${d.color}\"/>`;\n      g+=`<text x=\"${(ax+bw/2).toFixed(1)}\" y=\"${(base-ah-4).toFixed(1)}\" text-anchor=\"middle\" font-size=\"9\" fill=\"#9a9aa8\">${fN(d.antes)}</text>`;\n      g+=`<text x=\"${(dx+bw/2).toFixed(1)}\" y=\"${(base-dh-4).toFixed(1)}\" text-anchor=\"middle\" font-size=\"9.5\" font-weight=\"700\" fill=\"${d.color}\">${fN(d.depois)}</text>`;\n      const dp=d.antes?((d.depois-d.antes)/d.antes*100):(d.depois?100:0);\n      g+=`<text x=\"${cx.toFixed(1)}\" y=\"16\" text-anchor=\"middle\" font-size=\"10.5\" font-weight=\"700\" fill=\"${dp>=0?'#34c759':'#ff3b30'}\">${dp>0?'+':''}${dp.toFixed(0)}%</text>`;\n      g+=`<text x=\"${cx.toFixed(1)}\" y=\"${base+16}\" text-anchor=\"middle\" font-size=\"10.5\" font-weight=\"700\" fill=\"#1c1c2b\">${d.label}</text>`;});\n    return `<svg viewBox=\"0 0 ${W} ${H}\" style=\"width:100%\"><line x1=\"8\" y1=\"${base}\" x2=\"${W-8}\" y2=\"${base}\" stroke=\"#e7e7ef\"/>${g}</svg>`;\n  };\n  let h=`<div style=\"display:flex;justify-content:space-between;align-items:center;gap:10px;flex-wrap:wrap\">\n      <h2 style=\"margin:0\">Impacto antes → depois desta etapa</h2>\n      <select id=\"metricSel\">${METRICS_DEF.map(m=>`<option value=\"${m[0]}\" ${m[0]===mv.metric?'selected':''}>${m[1]}</option>`).join('')}</select></div>\n    <div class=\"note\" style=\"margin:2px 0 4px\">Barra clara = <b>antes desta etapa</b> (já incluindo etapas anteriores) · barra cheia = <b>depois</b> · <b style=\"color:var(--acc)\">${mv.sector}✕</b> = ${lc(lvl.label)} fechad${lvl.a==='à'?'a':'o'} nesta etapa · % = variação</div>\n    ${chartHTML(mv.metric)}`;\n  h+=`<h2 style=\"margin-top:16px\">Antes → Depois por ${lc(lvl.destLabel)} receptor (snapshot congelado)</h2>\n    <div class=\"scroll\"><table><thead><tr><th>${lvl.destLabel}</th>${METRICS_DEF.map(m=>`<th>${m[1]}</th>`).join('')}</tr></thead><tbody>`;\n  mv.dest.forEach(s=>{const b=mv.baseMetrics[s]||{};const inc=incBy[s];\n    h+=`<tr><td><span class=\"home\" style=\"background:${mv.color[s]}\"></span>${s}</td>`+\n      METRICS_DEF.map(([k])=>{const bv=+b[k]||0,av=bv+(inc[k]||0);const d=bv?((av-bv)/bv*100):0;const f=METRICS_DEF.find(x=>x[0]===k)[2]==='$'?money:fmt;\n        return `<td>${f(av)}<div class=\"delta ${d>=0?'up':'dn'}\">${d>0?'+':''}${d.toFixed(0)}%</div></td>`;}).join('')+`</tr>`;});\n  h+=`<tr style=\"opacity:.8\"><td>${mv.sector} (sai)</td>`+METRICS_DEF.map(([k,,t])=>`<td>${(t==='$'?money:fmt)(closeTot[k]||0)}</td>`).join('')+`</tr>`;\n  h+=`</tbody></table></div>`;\n  const incLvl={};mv.dest.forEach(s=>incLvl[s]={});\n  Object.keys(mv.munis).forEach(m=>{if(m==='__OUTROS__')return;const s=mv.assign[m];if(!s||!incLvl[s])return;const lv=mv.levelByMuni[m]||{};for(const nv in lv)incLvl[s][nv]=(incLvl[s][nv]||0)+lv[nv];});\n  c.leaders.forEach(L=>{ const ol=mv.orphanLevelByGroup&&mv.orphanLevelByGroup[L.grupo];\n    if(ol&&L.home&&incLvl[L.home]) Object.entries(ol).forEach(([nv,n])=>incLvl[L.home][nv]=(incLvl[L.home][nv]||0)+n); });\n  h+=`<h2 style=\"margin-top:18px\">Consultoras por nível — antes → depois por ${lc(lvl.destLabel)} receptor</h2>\n    <div class=\"scroll\"><table><thead><tr><th>${lvl.destLabel}</th>${NIVEIS.map(n=>`<th>${n}</th>`).join('')}<th>Total</th></tr></thead><tbody>`;\n  mv.dest.forEach(s=>{const base=mv.baseLevel[s]||{},inc=incLvl[s]||{};let tb=0,ta=0;\n    h+=`<tr><td><span class=\"home\" style=\"background:${mv.color[s]}\"></span>${s}</td>`+\n      NIVEIS.map(nv=>{const b=base[nv]||0,i=inc[nv]||0,a=b+i;tb+=b;ta+=a;\n        return `<td>${a?fmt(a):'·'}${i?`<div class=\"delta up\">+${fmt(i)}</div>`:''}</td>`;}).join('')+\n      `<td style=\"font-weight:700\">${fmt(ta)}${ta-tb?`<div class=\"delta up\">+${fmt(ta-tb)}</div>`:''}</td></tr>`;});\n  h+=`</tbody></table></div><div class=\"note\">Número = CBs por nível <b>depois</b> desta etapa · <span style=\"color:var(--ok)\">+N</span> = entrantes do ${mv.sector}.</div>`;\n  const spk=(key)=>{const vals=trend.map(t=>+t[key]||0);const mx=Math.max(...vals,1);\n    return `<div class=\"spark\">${vals.map(v=>`<div class=\"b\" style=\"height:${(v/mx*100).toFixed(0)}%\" title=\"${fmt(v)}\"></div>`).join('')}</div>\n      <div class=\"note\">${trend.map(t=>String(t.ciclo).slice(-2)).join(' · ')}</div>`;};\n  h+=`<h2 style=\"margin-top:18px\">Setor ${mv.sector} — últimos ${trend.length} ciclos até o snapshot congelado</h2>\n    <div class=\"note\" style=\"margin:-4px 0 8px\">Tendência histórica <b>do próprio setor</b> — não ajustada pela absorção hipotética de etapas anteriores (limitação conhecida: tendência é por setor, não decomponível por município).</div>\n    <div style=\"display:grid;grid-template-columns:repeat(4,1fr);gap:10px\">\n    ${[['cbs','CBs'],['ativas','Ativas'],['receita','Receita'],['pontos','Pontos']].map(([k,l])=>`<div><div class=\"note\" style=\"margin:0 0 3px;font-weight:600;color:var(--ink)\">${l}</div>${spk(k)}</div>`).join('')}</div>`;\n  $('#tab-report').innerHTML=h;\n  const sel=$('#metricSel'); if(sel) sel.onchange=()=>{mv.metric=sel.value; renderReport();};\n}\nfunction renderCumulative(){\n  const el=$('#tab-cumulative'); if(!el) return;\n  // Esta view soma a cadeia inteira via foldWorldState().muniOverride/sectorBaseCache — hoje só\n  // populados pelo fechamento de setor. GV/mercado têm o rastro equivalente (secOverride/gvOverride),\n  // mas essa agregação ainda não foi refeita nesse grão; melhor avisar do que mostrar tabela vazia.\n  const lockLvl=SESS.timeline.length?(SESS.timeline[0].level||'setor'):'setor';\n  if(lockLvl!=='setor'){ el.innerHTML=`<div class=\"note\">Impacto acumulado da cadeia ainda não disponível pra sessões de ${lc(LEVELS[lockLvl].label)} — use o relatório da etapa (aba anterior) etapa a etapa.</div>`; return; }\n  if(!SESS.timeline.length){ el.innerHTML='<div class=\"note\">Nenhuma etapa na timeline ainda.</div>'; return; }\n  const ready=SESS.timeline.every(mv=>mv.munis);\n  if(!ready){ el.innerHTML='<div class=\"note\">Aguardando etapas terminarem de calcular…</div>'; return; }\n  const finalWorld=foldWorldState(SESS.timeline,SESS.timeline.length);\n  const openSectors=[...new Set(Object.values(finalWorld.muniOverride))];\n  let h=`<h2 style=\"margin:0 0 8px\">Linha do tempo — ${SESS.timeline.length} fechamento(s)</h2>\n    <div class=\"note\" style=\"margin:-2px 0 10px\">Setores fechados, em ordem: ${SESS.timeline.map(mv=>mv.sector).join(' → ')}. Cada linha abaixo soma o efeito de <b>toda a cadeia</b>, não apenas da última etapa.</div>`;\n  h+=`<div class=\"scroll\"><table><thead><tr><th>Setor</th><th>Situação</th>${METRICS_DEF.map(([,l])=>`<th>${l}</th>`).join('')}</tr></thead><tbody>`;\n  SESS.timeline.forEach((mv,i)=>{\n    h+=`<tr style=\"opacity:.75\"><td>${mv.sector}</td><td>fechado (etapa ${i+1})</td>`+METRICS_DEF.map(([k,,t])=>`<td>${(t==='$'?money:fmt)(mv.pureOwnMetrics?.[k]||0)}</td>`).join('')+`</tr>`;\n  });\n  openSectors.forEach(s=>{\n    const base=SESS.sectorBaseCache[s]||{};\n    const infl=finalWorld.sectorInflow[s]||{};\n    h+=`<tr><td>${s}</td><td>recebeu território</td>`+METRICS_DEF.map(([k,,t])=>{\n      const bv=+base[k]||0, av=bv+(infl[k]||0); const d=bv?((av-bv)/bv*100):0; const f=(t==='$'?money:fmt);\n      return `<td>${f(av)}<div class=\"delta ${d>=0?'up':'dn'}\">${d>0?'+':''}${d.toFixed(0)}%</div></td>`;\n    }).join('')+`</tr>`;\n  });\n  h+=`</tbody></table></div><div class=\"note\">\"Antes\" de um setor receptor é o snapshot congelado (sem nenhum fechamento aplicado); \"depois\" soma tudo que a cadeia inteira jogou pra ele.</div>`;\n  el.innerHTML=h;\n}\nfunction project(feats){let mnx=1/0,mny=1/0,mxx=-1/0,mxy=-1/0;\n  const each=cb=>feats.forEach(f=>{const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];ps.forEach(p=>p.forEach(r=>r.forEach(cb)));});\n  each(p=>{mnx=Math.min(mnx,p[0]);mxx=Math.max(mxx,p[0]);mny=Math.min(mny,p[1]);mxy=Math.max(mxy,p[1]);});\n  const mlat=(mny+mxy)/2,kx=Math.cos(mlat*Math.PI/180),W=700,H=500,pad=22;\n  const gw=(mxx-mnx)*kx,gh=(mxy-mny),sc=Math.min((W-2*pad)/gw,(H-2*pad)/gh);\n  const ox=(W-gw*sc)/2,oy=(H-gh*sc)/2;\n  return p=>[ox+(p[0]-mnx)*kx*sc, oy+(mxy-p[1])*sc];\n}\nfunction pathFor(f,pr){const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];\n  return ps.map(poly=>poly.map(r=>'M'+r.map(p=>{const q=pr(p);return q[0].toFixed(1)+','+q[1].toFixed(1);}).join('L')+'Z').join('')).join('');}\nfunction cxy(f,pr){let x=0,y=0,n=0;const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];ps.forEach(poly=>poly[0].forEach(p=>{const q=pr(p);x+=q[0];y+=q[1];n++;}));return[x/n,y/n];}\n// ---------- label placement ----------\n// Pole of inaccessibility: the interior point farthest from ANY boundary of the dissolved area. A\n// centroid is only a mean — on a concave sector, one split across a river, or a member whose vertex\n// average falls in a bay, it lands outside the very territory it is supposed to name, which is what\n// pushed the sector numbers off their own shapes. Even-odd across every ring of every member is a\n// correct union test here because municipalities tile rather than overlap.\n// The search box is clipped to the viewBox, so the result is inside the territory AND on screen.\n// Rings are decimated first — this is a label, not a measurement — which keeps a 20-município sector\n// to a few million ops, and the result is cached per stage: geometry never changes between renders,\n// only the fill does.\nfunction labelPointFor(fs,pr){\n  const rings=[];\n  (fs||[]).forEach(f=>{ if(!f||!f.geometry) return;\n    const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];\n    ps.forEach(poly=>poly.forEach(r=>{\n      if(!r||r.length<4) return;\n      const step=Math.max(1,Math.floor(r.length/120)),pts=[];\n      for(let i=0;i<r.length;i+=step) pts.push(pr(r[i]));\n      if(pts.length>3) rings.push(pts);\n    }));});\n  if(!rings.length) return null;\n  let mnx=1/0,mny=1/0,mxx=-1/0,mxy=-1/0;\n  rings.forEach(r=>r.forEach(p=>{ if(p[0]<mnx)mnx=p[0]; if(p[0]>mxx)mxx=p[0]; if(p[1]<mny)mny=p[1]; if(p[1]>mxy)mxy=p[1]; }));\n  mnx=Math.max(mnx,2); mny=Math.max(mny,2); mxx=Math.min(mxx,698); mxy=Math.min(mxy,498);\n  if(!(mxx>mnx&&mxy>mny)) return null;\n  const inside=(x,y)=>{ let c=false;\n    for(const r of rings) for(let i=0,j=r.length-1;i<r.length;j=i++){ const a=r[i],b=r[j];\n      if(((a[1]>y)!==(b[1]>y)) && (x<(b[0]-a[0])*(y-a[1])/(b[1]-a[1])+a[0])) c=!c; }\n    return c; };\n  const edgeDist=(x,y)=>{ let m=Infinity;\n    for(const r of rings) for(let i=0,j=r.length-1;i<r.length;j=i++){ const a=r[i],b=r[j];\n      const dx=b[0]-a[0],dy=b[1]-a[1],L=dx*dx+dy*dy;\n      let t=L?(((x-a[0])*dx+(y-a[1])*dy)/L):0; t=t<0?0:(t>1?1:t);\n      const ex=a[0]+t*dx-x,ey=a[1]+t*dy-y,d=ex*ex+ey*ey; if(d<m)m=d; }\n    return Math.sqrt(m); };\n  const W=mxx-mnx,H=mxy-mny,N=26;\n  let best=null,bd=-1;\n  for(let i=0;i<=N;i++) for(let j=0;j<=N;j++){\n    const x=mnx+W*i/N,y=mny+H*j/N;\n    if(!inside(x,y)) continue;\n    const d=edgeDist(x,y); if(d>bd){ bd=d; best=[x,y]; }\n  }\n  if(!best) return null;\n  // Hill-climb off the coarse grid: the grid only has to land somewhere in the right lobe, the\n  // refinement finds the deep point inside it — halving the step whenever no neighbour improves.\n  let step=Math.max(W,H)/N/2;\n  for(let k=0;k<7;k++){\n    let moved=false;\n    for(const o of [[1,0],[-1,0],[0,1],[0,-1],[1,1],[1,-1],[-1,1],[-1,-1]]){\n      const x=best[0]+o[0]*step,y=best[1]+o[1]*step;\n      if(x<mnx||x>mxx||y<mny||y>mxy||!inside(x,y)) continue;\n      const d=edgeDist(x,y); if(d>bd){ bd=d; best=[x,y]; moved=true; }\n    }\n    if(!moved) step/=2;\n  }\n  // The clearance travels with the point: it is the radius of the largest circle that fits inside the\n  // territory there, which is exactly the budget a caller needs to decide how much text will fit.\n  return {p:best,r:bd};\n}\nfunction labelPointOf(mv,key,fs,pr){\n  if(!mv._lbl) mv._lbl={};\n  if(!(key in mv._lbl)) mv._lbl[key]=labelPointFor(fs,pr);\n  return mv._lbl[key];\n}\n// ---------- map zoom/pan ----------\n// Zoom é feito manipulando o viewBox, nunca um transform CSS — assim rótulos e polígonos vivem no\n// MESMO sistema de coordenadas e escalam juntos automaticamente (texto tem font-size em unidades do\n// viewBox, então encolher o viewBox amplia tudo por igual, sem lógica extra pro tamanho da fonte).\nconst MAP_W=700, MAP_H=500, MAP_ZOOM_MAX=8;\nlet mapView={x:0,y:0,w:MAP_W,h:MAP_H};\nfunction applyMapView(){\n  const svg=$('#map'); if(!svg) return;\n  svg.setAttribute('viewBox', mapView.x.toFixed(2)+' '+mapView.y.toFixed(2)+' '+mapView.w.toFixed(2)+' '+mapView.h.toFixed(2));\n  // Rótulo tem font-size em unidades do viewBox, então sem isso ele cresceria junto com o zoom até\n  // virar um borrão — encolhendo o font-size na mesma proporção que o viewBox encolhe cancela\n  // exatamente o zoom, e o texto fica do MESMO tamanho na tela em qualquer nível de zoom.\n  const fsScale=mapView.w/MAP_W;\n  svg.querySelectorAll('text[data-fs]').forEach(t=>{\n    const base=+t.getAttribute('data-fs')||8;\n    t.setAttribute('font-size',(base*fsScale).toFixed(2));\n  });\n}\nfunction zoomMapBy(factor){\n  const cx=mapView.x+mapView.w/2, cy=mapView.y+mapView.h/2;\n  let w=mapView.w/factor, h=mapView.h/factor;\n  w=Math.min(MAP_W, Math.max(MAP_W/MAP_ZOOM_MAX, w));\n  h=Math.min(MAP_H, Math.max(MAP_H/MAP_ZOOM_MAX, h));\n  let x=cx-w/2, y=cy-h/2;\n  x=Math.min(MAP_W-w, Math.max(0,x));\n  y=Math.min(MAP_H-h, Math.max(0,y));\n  mapView={x,y,w,h};\n  applyMapView();\n}\n// Arrastar sempre fica DENTRO do canvas de 700x500 (clamp em [0, MAP_W-w] / [0, MAP_H-h]) — nunca\n// existe um x/y que deixa o viewBox parcialmente fora da área com conteúdo, então o mapa nunca\n// \"some\" da tela, só pode chegar até a borda do que existe pra ver.\nlet mapDrag=null, mapDidDrag=false;\nfunction mapPointerDown(e){\n  const svg=$('#map'); if(!svg) return;\n  mapDrag={x0:e.clientX,y0:e.clientY,vx0:mapView.x,vy0:mapView.y,rect:svg.getBoundingClientRect()};\n  mapDidDrag=false;\n  svg.classList.add('dragging');\n  // NÃO setPointerCapture aqui: capturar o ponteiro no <svg> reencaminha o click resultante pro\n  // próprio <svg> em vez do <path> do município embaixo do cursor — todo clique parava de chegar\n  // no onclick de reatribuição, não só depois de um arrasto de verdade. move/up escutam em `root`\n  // (nunca substituído por renderAll) em vez de no <svg>, então o arrasto continua funcionando\n  // mesmo se o ponteiro sair da área do mapa no meio do gesto.\n}\nfunction mapPointerMove(e){\n  if(!mapDrag) return;\n  const dxPix=e.clientX-mapDrag.x0, dyPix=e.clientY-mapDrag.y0;\n  if(!mapDidDrag && Math.hypot(dxPix,dyPix)>4) mapDidDrag=true;\n  if(!mapDrag.rect.width||!mapDrag.rect.height) return;\n  const sx=mapView.w/mapDrag.rect.width, sy=mapView.h/mapDrag.rect.height;\n  let x=mapDrag.vx0-dxPix*sx, y=mapDrag.vy0-dyPix*sy;\n  x=Math.min(MAP_W-mapView.w, Math.max(0,x));\n  y=Math.min(MAP_H-mapView.h, Math.max(0,y));\n  mapView={...mapView,x,y};\n  applyMapView();\n}\nfunction mapPointerUp(){\n  if(!mapDrag) return;\n  mapDrag=null;\n  const svg=$('#map'); if(svg) svg.classList.remove('dragging');\n}\nfunction drawMap(){\n  const mv=SESS.timeline[SESS.selected]; const svg=$('#map'); const ignNote=$('#mapIgnoredNote');\n  if(!mv){ svg.innerHTML=''; if(ignNote) ignNote.innerHTML=''; return; }\n  const level=mv.level||'setor';\n  // setor fecha: a unidade É o município. GV/mercado fecham: cada município herda a atribuição do\n  // setor/GV a que pertence — municípios do mesmo setor sempre têm a MESMA cor e giram JUNTOS no\n  // clique, porque é o setor inteiro (não o município) que troca de dono nesses níveis.\n  const unitAssign=m=>level==='setor'?mv.assign[m]:mv.assign[(mv.unitOfMuni||{})[m]];\n  const c=computeDerived(mv);const NS='http://www.w3.org/2000/svg'; svg.innerHTML='';\n  const feats=[...mv.nbrFeat,...Object.values(mv.geoFeat)]; if(!feats.length) return;\n  const pr=project(feats);\n  const world=foldWorldState(SESS.timeline,SESS.selected);\n  // The context layer is ONE area per SECTOR, not one shape per município. The unit of this decision\n  // is the destination sector; a scatter of individually outlined municipalities carrying their own\n  // names invited exactly the wrong reading of the map. Members of a sector are filled AND stroked in\n  // the same colour, so the shared borders vanish and the group reads as a single dissolved\n  // territory — the IBGE shapes do not share vertices precisely enough to extract a clean union\n  // outline, and carrying a real polygon-clipping union for a context layer is not worth it.\n  // Labels are COLLECTED here and drawn last, after every path. Drawn inline they were buried by the\n  // next sector's fill, and placement cannot avoid a collision it has not seen yet.\n  const labels=[],placed=[];\n  const textW=(s,fs)=>String(s).length*fs*0.56;\n  // WCAG relative luminance of the fill a label sits on, so ink and halo can invert per label. \"Would\n  // white be better?\" has no single answer on this map: white reads on #5856d6 (L≈0.14) and disappears\n  // on #ff9500 and #34c759 (both L≈0.43, where black wins ~9:1 against white's ~2.2:1) and on every\n  // context fill, which is .32 opacity over white. Decided per label, never globally.\n  const lum=col=>{let h=String(col||'').replace('#','');\n    if(h.length===3) h=h[0]+h[0]+h[1]+h[1]+h[2]+h[2];\n    if(h.length!==6) return 1;\n    const c=[0,2,4].map(i=>parseInt(h.slice(i,i+2),16)/255)\n      .map(v=>v<=0.03928?v/12.92:Math.pow((v+0.055)/1.055,2.4));\n    return 0.2126*c[0]+0.7152*c[1]+0.0722*c[2];};\n  // Centred on (x,y) in BOTH axes. The old box hung off the first line's baseline, so every two-line\n  // label sat half its own height below the point it was supposed to mark.\n  const rectOf=(x,y,lines)=>{const w=Math.max.apply(null,lines.map(l=>textW(l.t,l.size)));\n    const h=lines.reduce((a,l)=>a+l.size*1.2,0);\n    return {x1:x-w/2-2.5,x2:x+w/2+2.5,y1:y-h/2-1.5,y2:y+h/2+1.5};};\n  const nbrBySec={};\n  mv.nbrFeat.forEach(f=>{\n    const nm=mkey(f.properties.name||f.properties.NOME||f.properties.nome||'',f.__uf);\n    const s=String((mv.nbrCurrentSector&&mv.nbrCurrentSector[nm])||'');\n    (nbrBySec[s]=nbrBySec[s]||[]).push(f);\n  });\n  Object.keys(nbrBySec).forEach(s=>{\n    const fs=nbrBySec[s];\n    const isDest=!!s&&mv.dest.includes(s);\n    const closedCtx=!!s&&world.closedSectors.has(s);\n    const col=isDest?(mv.color[s]||null):null;\n    fs.forEach(f=>{\n      const p=document.createElementNS(NS,'path');\n      p.setAttribute('d',pathFor(f,pr));\n      p.setAttribute('class','sect'+(isDest?'':(closedCtx?' closed-ctx':' plain')));\n      if(col){ p.setAttribute('fill',col); p.setAttribute('stroke',col); }\n      svg.appendChild(p);\n    });\n    if(!s) return;\n    // One number per sector, at the pole of inaccessibility of its DISSOLVED area — the whole group\n    // of members at once, not a representative member, so the number sits in the visual middle of the\n    // territory the operator actually sees.\n    const lp=labelPointOf(mv,'s:'+s,fs,pr);\n    // Context areas always read LIGHT — .sect paints dest colours at fill-opacity .32 over white, and\n    // plain/closed-ctx are near-white greys — so a sector number never wants white ink, whatever colour\n    // the sector itself was assigned.\n    if(lp&&lp.p) labels.push({anchor:lp.p,big:true,dark:false,lines:[{t:s,size:11.5,weight:700}]});\n  });\n  const asis=mv.view==='asis';\n  // The UF prefix is information only when the stage actually straddles a border. On a single-UF setor\n  // it is the same three characters repeated on every label — a large share of the clutter and none of\n  // the meaning. The hover tooltip carries the UF either way.\n  const showUf=new Set(Object.keys(mv.geoFeat).map(k=>mUf(k)).filter(Boolean)).size>1;\n  if(level==='setor'){\n    // Setor fechando: a UNIDADE é o próprio município — cada um se comporta, colore e rotula\n    // individualmente, exatamente como sempre foi.\n    Object.entries(mv.geoFeat).forEach(([m,f])=>{const p=document.createElementNS(NS,'path');p.setAttribute('d',pathFor(f,pr));\n      const fillCol=asis?CLOSE_COLOR:(mv.color[unitAssign(m)]||'#444');\n      p.setAttribute('class','muni');p.setAttribute('fill',fillCol);\n      if(!asis) p.onclick=()=>{editSelected(m2=>{const i=m2.dest.indexOf(m2.assign[m]);if(m2.dest.length)m2.assign[m]=m2.dest[(i+1)%m2.dest.length];m2.selMuni=m;});};\n      p.style.cursor=asis?'default':'pointer';\n      p.onmousemove=e=>{const t=$('#tip');t.style.opacity=1;t.style.left=(e.clientX+12)+'px';t.style.top=(e.clientY+12)+'px';\n        t.innerHTML=asis?`<b>${mDisp(m)}</b><br>${fmt(mv.cbsByMuni[m]||0)} CBs · setor ${mv.sector}`:`<b>${mDisp(m)}</b><br>${fmt(mv.cbsByMuni[m]||0)} CBs → ${unitAssign(m)||'–'}<br><span style=\"color:var(--mut)\">clique p/ trocar</span>`;};\n      p.onmouseleave=()=>$('#tip').style.opacity=0;svg.appendChild(p);\n      const lp=labelPointOf(mv,'m:'+m,[f],pr);\n      const at=(lp&&lp.p)||cxy(f,pr);\n      const nmFull=(showUf&&mUf(m)?mUf(m)+'-':'')+mName(m);\n      const num=fmt(mv.cbsByMuni[m]||0)+(asis?'':'·'+(unitAssign(m)||'–'));\n      labels.push({anchor:at,cbs:+(mv.cbsByMuni[m]||0),dark:lum(fillCol)<0.18,\n        lines:[{t:nmFull,size:8.2,weight:700},{t:num,size:7,weight:500,mut:true}]});\n    });\n  } else {\n    // GV/mercado fechando: a UNIDADE é o setor (ou a GV) inteiro, nunca o município isolado —\n    // vários municípios do mesmo setor têm de ler como UMA área só, nunca como municípios separados\n    // que por acaso têm a mesma cor. Mesmo truque do contexto vizinho logo acima: stroke = fill via\n    // estilo inline (uma regra de classe como .muni{stroke:#fff} outrank­aria um atributo stroke\n    // comum, então a costura entre membros só some setando o style direto) — e UM rótulo só por\n    // unidade, no ponto de inacessibilidade da área dissolvida, nunca um rótulo por município.\n    Object.entries(mv.unitMunis||{}).forEach(([u,ms])=>{\n      const fillCol=asis?CLOSE_COLOR:(mv.color[mv.assign[u]]||'#444');\n      const feats=ms.map(m=>mv.geoFeat[m]).filter(Boolean);\n      // Todo município deste u é UMA unidade só na tela — passar o mouse sobre qualquer pedaço tem\n      // que acender o grupo inteiro, não só o pedaço que o cursor está tocando. :hover no CSS só\n      // sabe acender o próprio <path>; o grupo inteiro precisa de JS guardando os irmãos.\n      const els=[];\n      ms.forEach(m=>{\n        const f=mv.geoFeat[m]; if(!f) return;\n        const p=document.createElementNS(NS,'path');p.setAttribute('d',pathFor(f,pr));\n        p.setAttribute('class','muni');p.setAttribute('fill',fillCol);p.style.stroke=fillCol;\n        els.push(p);\n        if(!asis) p.onclick=()=>{editSelected(m2=>{const i=m2.dest.indexOf(m2.assign[u]);if(m2.dest.length)m2.assign[u]=m2.dest[(i+1)%m2.dest.length];m2.selMuni=u;});};\n        p.style.cursor=asis?'default':'pointer';\n        p.onmouseenter=()=>{ els.forEach(e=>e.classList.add('munihl')); };\n        p.onmousemove=e=>{const t=$('#tip');t.style.opacity=1;t.style.left=(e.clientX+12)+'px';t.style.top=(e.clientY+12)+'px';\n          t.innerHTML=asis?`<b>${LEVELS[level].childLabel} ${u}</b><br>${fmt(mv.munis[u]?.cbs||0)} CBs · ${LEVELS[level].label} ${mv.sector}`:`<b>${LEVELS[level].childLabel} ${u}</b><br>${fmt(mv.munis[u]?.cbs||0)} CBs → ${mv.assign[u]||'–'}<br><span style=\"color:var(--mut)\">clique p/ trocar</span>`;};\n        p.onmouseleave=()=>{ els.forEach(e=>e.classList.remove('munihl')); $('#tip').style.opacity=0; };svg.appendChild(p);\n      });\n      const lp=labelPointOf(mv,'u:'+u,feats,pr);\n      const at=(lp&&lp.p)||(feats[0]&&cxy(feats[0],pr));\n      if(at){\n        const num=fmt(mv.munis[u]?.cbs||0)+(asis?'':'·'+(mv.assign[u]||'–'));\n        labels.push({anchor:at,big:true,cbs:+(mv.munis[u]?.cbs||0),dark:lum(fillCol)<0.18,\n          lines:[{t:`${LEVELS[level].childLabel} ${u}`,size:9,weight:700},{t:num,size:7.5,weight:500,mut:true}]});\n      }\n    });\n  }\n  // Placement, not de-cluttering. Every label IS drawn: it starts at its anchor and, if the text does\n  // not fit the territory or the slot is already taken, walks outward ring by ring until it finds\n  // clear canvas, trailing a hairline leader back to the shape it names. The previous pass dropped the\n  // loser of every collision outright, which is why municípios silently had no name at all.\n  // Order still matters — sector numbers first, then municípios by CB weight — because the earlier a\n  // label is placed the closer to home it lands.\n  const CW=700,CH=500,CPAD=2;\n  const inBounds=r=>r.x1>=CPAD&&r.x2<=CW-CPAD&&r.y1>=CPAD&&r.y2<=CH-CPAD;\n  const hits=r=>placed.reduce((a,q)=>a+((r.x2<q.x1||r.x1>q.x2||r.y2<q.y1||r.y1>q.y2)?0:1),0);\n  // Ring 0 is the anchor itself. Rings step 9u out over 16 directions, stretched horizontally because\n  // a label is wider than it is tall and sideways room is the room it actually needs.\n  const CAND=[[0,0]];\n  for(let ring=1;ring<=7;ring++){ const d=ring*9;\n    for(let a=0;a<16;a++){ const th=a*Math.PI/8; CAND.push([Math.cos(th)*d*1.35,Math.sin(th)*d]); } }\n  labels.sort((a,b)=>(b.big?1:0)-(a.big?1:0)||((b.cbs||0)-(a.cbs||0)));\n  labels.forEach(L=>{\n    let chosen=null,best=null,bestN=Infinity;\n    // Centred on the anchor is ALWAYS the first choice. An earlier cut here refused the anchor whenever\n    // the text was wider than the município's inscribed circle — true of almost every real name at this\n    // scale (BA-SAO SEBASTIAO DO PASSE is ~140u against ~80u of clearance), so every single label got\n    // nudged outside and nothing ended up centred on anything. Spilling past a border is normal on a\n    // choropleth and the halo keeps it readable; only a genuine COLLISION earns a move.\n    for(const off of CAND){\n      const x=L.anchor[0]+off[0], y=L.anchor[1]+off[1];\n      const r=rectOf(x,y,L.lines);\n      if(!inBounds(r)) continue;\n      const n=hits(r);\n      if(!n){ chosen={x,y,r,off}; break; }\n      // No clear slot yet — remember the LEAST crowded one. Falling back to the first in-bounds\n      // candidate meant falling back to the anchor every time, so a crowded map piled every loser onto\n      // the same point. CAND is ordered nearest-first and the compare is strict, so ties keep the\n      // closest slot.\n      if(n<bestN){ bestN=n; best={x,y,r,off}; }\n    }\n    // Canvas genuinely full: take the nearest in-bounds slot and accept the overlap. A label sitting\n    // on top of another is recoverable by eye; a name that was never drawn is not.\n    if(!chosen) chosen=best||{x:L.anchor[0],y:L.anchor[1],r:rectOf(L.anchor[0],L.anchor[1],L.lines),off:[0,0]};\n    placed.push(chosen.r);\n    const g=document.createElementNS(NS,'g'); g.setAttribute('class','lbl'+(L.big?' big':''));\n    if(Math.abs(chosen.off[0])>0.5||Math.abs(chosen.off[1])>0.5){\n      // The leader stops at the label's edge rather than its centre, so it never runs under the glyphs.\n      const cx=(chosen.r.x1+chosen.r.x2)/2, cy=(chosen.r.y1+chosen.r.y2)/2;\n      const hw=(chosen.r.x2-chosen.r.x1)/2, hh=(chosen.r.y2-chosen.r.y1)/2;\n      const dx=L.anchor[0]-cx, dy=L.anchor[1]-cy;\n      const tt=Math.min(dx?hw/Math.abs(dx):Infinity, dy?hh/Math.abs(dy):Infinity);\n      const ln=document.createElementNS(NS,'line'); ln.setAttribute('class','lead');\n      ln.style.stroke=L.dark?'#fff':'#1c1c1e';\n      // A largura do fio também é fixa em unidades do viewBox, igual o halo do texto — sem\n      // reescalar junto, no zoom alto ela vira uma barra grossa em vez de um fio fino.\n      ln.setAttribute('data-sw','0.8'); ln.style.strokeWidth='0.8px';\n      ln.setAttribute('x1',L.anchor[0].toFixed(1)); ln.setAttribute('y1',L.anchor[1].toFixed(1));\n      ln.setAttribute('x2',(cx+dx*tt).toFixed(1)); ln.setAttribute('y2',(cy+dy*tt).toFixed(1));\n      g.appendChild(ln);\n    }\n    const hTot=L.lines.reduce((a,l)=>a+l.size*1.2,0);\n    let ty=chosen.y-hTot/2+L.lines[0].size*0.86;\n    // Inline style rather than a class: a stylesheet rule would outrank a presentation attribute and\n    // undo the per-label contrast decision made above.\n    const ink=L.dark?'#fff':'#1c1c1e', inkMut=L.dark?'rgba(255,255,255,.85)':'#48484d';\n    const halo=L.dark?'rgba(0,0,0,.6)':'#fff';\n    // Halo do texto (o \"contorno\" que garante legibilidade sobre qualquer cor de fundo) também é\n    // fixo em unidades do viewBox via .lbl text{stroke-width}/.lbl.big text{stroke-width} — sem\n    // reescalar junto com o font-size, no zoom alto ele vira uma mancha escura cobrindo a letra\n    // inteira em vez de um contorno fino, exatamente o \"Setor 3570\" ilegível reportado.\n    const swBase=L.big?2.9:2.2;\n    L.lines.forEach(l=>{ const t=document.createElementNS(NS,'text');\n      t.setAttribute('x',chosen.x.toFixed(1)); t.setAttribute('y',ty.toFixed(1));\n      t.setAttribute('font-size',l.size); t.setAttribute('data-fs',l.size); t.setAttribute('font-weight',l.weight||600);\n      t.setAttribute('data-sw',swBase); t.style.strokeWidth=swBase+'px';\n      t.style.fill=l.mut?inkMut:ink; t.style.stroke=halo;\n      t.textContent=l.t; g.appendChild(t); ty+=l.size*1.2; });\n    svg.appendChild(g);\n  });\n  $('#legend').innerHTML=asis\n    ?`<span><b style=\"background:${CLOSE_COLOR}\"></b>${LEVELS[level].label} ${mv.sector} (estrutura antes desta etapa — ${level==='setor'?Object.keys(mv.geoFeat).length+' municípios':Object.keys(mv.unitMunis||{}).length+' '+LEVELS[level].childLabel.toLowerCase()+'(s)'})</span>`\n    // No \"vizinhos (contexto)\" or \"setor já fechado antes\" entry any more: every feature still drawn\n    // belongs to a destination sector, so .sect.plain and .sect.closed-ctx can no longer be produced\n    // and a legend key for them would point at nothing on the map.\n    :mv.dest.map(s=>`<span><b style=\"background:${mv.color[s]}\"></b>${LEVELS[level].destLabel} ${s} — ${c.gained[s]} líder(es)</span>`).join('');\n  // Municipalities outside the dominance base are deliberately NOT drawn — no shape, no hover, no\n  // legend entry. They are reported in the panel instead, so the map only ever shows territory that\n  // is actually being reallocated.\n  if(ignNote) ignNote.innerHTML=(mv.excludedMunis&&mv.excludedMunis.length)\n    ? `<b style=\"color:var(--closing)\">${fmt(mv.excludedMunis.length)} município(s) / ${fmt(mv.excludedCbs||0)} CBs</b> fora da base de dominantes deste setor não são desenhados no mapa — as CBs seguem a líder do seu grupo (detalhe em “Municípios → setor destino”).`\n    : '';\n  applyMapView();\n}\nasync function runSql(){const sql=$('#sqlIn').value.trim();$('#sqlStatus').textContent='rodando…';$('#sqlStatus').classList.remove('err');\n  try{ await ensurePinned(); const resp=await q(sql);const rs=rows(resp);const cols=(resp.manifest?.schema?.columns||[]).map(c=>c.name);\n    $('#sqlOut').innerHTML=`<thead><tr>${cols.map(c=>`<th>${c}</th>`).join('')}</tr></thead><tbody>`+rs.slice(0,200).map(r=>`<tr>${cols.map(c=>`<td>${r[c]??'·'}</td>`).join('')}</tr>`).join('')+`</tbody>`;\n    $('#sqlStatus').textContent=rs.length+' linha(s)';}\n  catch(e){$('#sqlStatus').textContent='bloqueado/erro: '+e.message;$('#sqlStatus').classList.add('err');}\n}\nfunction renderAll(){\n  renderStage();\n  renderTimeline(); renderSectorPicker();\n  const shb=$('#openShare'); if(shb) shb.disabled=!SESS.timeline.length;\n  const dpb=$('#dupSession'); if(dpb) dpb.disabled=!SESS.timeline.length;\n  const mv=SESS.timeline[SESS.selected];\n  // resolveSnapshotPin falls back to a live sub-select when it cannot pin a literal; saying\n  // \"congelado\" in that case would be a lie, so the pill reports what is actually in the SQL.\n  const pinned=SESS.snapLiteral && !/^\\(SELECT/i.test(SESS.snapLiteral);\n  $('#liveState').textContent = SESS.snapshotRaw\n    ? (pinned?'● snapshot congelado · ':'◍ snapshot ao vivo (não fixado) · ')+'atualizado em '+fmtSyncedAt(SESS.snapshotSyncedAt)+' · ↻'\n    : '● iniciando';\n  const mp=$('#basePill');\n  if(mp){\n    const warn=[];\n    if(DOM.bySetor&&!DOM.hasUf) warn.push('⚠ sem coluna UF');\n    if(DOM.badUf) warn.push('⚠ '+fmt(DOM.badUf)+' UF não reconhecida(s)');\n    if(DOM.clashes) warn.push('⚠ '+fmt(DOM.clashes)+' homônimo(s) no mesmo setor');\n    mp.textContent=DOM.bySetor?('◇ base dominantes: '+fmt(DOM.setores)+' setores · '+fmt(DOM.rows)+' municípios'+(warn.length?' · '+warn.join(' · '):'')):(DOM.error?'◇ base dominantes: indisponível':'◇ base dominantes: carregando…');\n    mp.title=DOM.error||(DOM.bySetor?((DOM.hasUf\n        ?('Coluna de UF usada: \"'+DOM.ufCol+'\".')\n        :('SEM coluna de UF. Colunas lidas: '+((DOM.headers||[]).join(' | ')||'?')+'. A UF de cada município vem desta base — sem ela, homônimos voltam a ser casados só pelo nome.'))\n      +(DOM.badUf?('\\n'+DOM.badUf+' linha(s) com UF irreconhecível — tratadas como desconhecida.'):'')\n      +(DOM.clashes?('\\n'+DOM.clashes+' município(s) aparecem no mesmo setor com UFs diferentes. O SQL agrupa só por DS_MUNICIPIO, então esses chegam somados numa linha única e não há como separá-los.'):'')\n      ):'')||DOM.url||''; }\n  const rp=$('#rulePill'); if(rp) rp.textContent='◈ destino: '+ruleShort(SESS.settings);\n  const sp=$('#spanPill'); if(sp) sp.textContent='◎ span: '+spanShort(SESS.settings);\n  renderRuleNote(); renderSpanRule();\n  if(!mv){ ['#map','#matrix','#matrixTobe','#tobeNote','#leaders'].forEach(s=>{const el=$(s);if(el)el.innerHTML='';}); $('#kpis').innerHTML=''; $('#spans').innerHTML=''; $('#muniList').innerHTML=''; $('#plan').innerHTML=''; return; }\n  $('#mapTitle').textContent=`Etapa ${SESS.selected+1}/${SESS.timeline.length} — fechando ${lc(LEVELS[mv.level||'setor'].label)} ${mv.sector}`;\n  $('#viewToggle').querySelectorAll('button').forEach(b=>b.classList.toggle('on',b.dataset.v===mv.view));\n  $('#policy').querySelectorAll('button').forEach(b=>b.classList.toggle('on',b.dataset.p===mv.policy));\n  $('#optBadge').textContent=mv.optBadge||'';\n  drawMap(); renderContig(); renderSpanRule(); renderKpis(); renderSpans(); renderMuni(); renderLeaders(); renderMatrix(); renderMatrixTobe(); renderPolicy(); renderPlan(); renderReport(); renderCumulative();\n}\n\n// ---------- event wiring ----------\n$('#confirmSnap').onclick=()=>{ SESS.stage='main'; renderAll(); };\n$('#openMove').onclick=openMove;\n$('#moveClose').onclick=closeMove;\n$('#moveCancel').onclick=closeMove;\n$('#moveBg').addEventListener('click',e=>{ if(e.target.id==='moveBg') closeMove(); });\nroot.querySelectorAll('input[name=\"moveLevel\"]').forEach(r=>r.addEventListener('change',renderMoveForm));\n$('#moveRand').onclick=moveRandPick;\n$('#moveGo').onclick=submitMove;\n$('#moveCode').addEventListener('keydown',e=>{ if(e.key==='Enter') submitMove(); });\n$('#confirmSessionPick').onchange=()=>loadSession($('#confirmSessionPick').value);\n$('#optim').onclick=()=>editSelected(mv=>{ mv.assign=optimizeFor(mv); });\n$('#autoTobe').onclick=()=>editSelected(mv=>{ mv.assign=autoAssignFor(mv); mv.optBadge='TOBE por adjacência'; });\n$('#viewToggle').querySelectorAll('button').forEach(b=>b.onclick=()=>{const mv=SESS.timeline[SESS.selected];if(!mv)return;mv.view=b.dataset.v;renderAll();});\n$('#mapZoomIn').onclick=()=>zoomMapBy(1.4);\n$('#mapZoomOut').onclick=()=>zoomMapBy(1/1.4);\n$('#map').addEventListener('pointerdown',mapPointerDown);\nroot.addEventListener('pointermove',mapPointerMove);\nroot.addEventListener('pointerup',mapPointerUp);\nroot.addEventListener('pointerleave',mapPointerUp);\n// Arrastar não pode virar \"cliquei num município e troquei o destino sem querer\": se o ponteiro se\n// moveu além do limiar de arrasto, este clique (capture, antes de chegar no <path>) é engolido.\n$('#map').addEventListener('click',e=>{ if(mapDidDrag){ e.stopPropagation(); e.preventDefault(); mapDidDrag=false; } },true);\n$('#policy').querySelectorAll('button').forEach(b=>b.onclick=()=>{const mv=SESS.timeline[SESS.selected];if(!mv)return;mv.policy=b.dataset.p;renderKpis();renderPolicy();renderPlan();});\nroot.querySelectorAll('.tabs button').forEach(b=>b.onclick=()=>{root.querySelectorAll('.tabs button').forEach(x=>x.classList.toggle('on',x===b));\n  ['matrix','tobe','report','cumulative','sql'].forEach(t=>$('#tab-'+t).classList.toggle('hidden',t!==b.dataset.tab));});\n$('#runSql').onclick=runSql;\n$('#copyPlan').onclick=()=>{const mv=SESS.timeline[SESS.selected];if(!mv)return;navigator.clipboard.writeText(JSON.stringify({setor:mv.sector,politica:mv.policy,plano:mv._plan},null,2));$('#copyPlan').textContent='copiado ✓';setTimeout(()=>$('#copyPlan').textContent='Copiar',1500);};\n$('#csvPlan').onclick=()=>{const mv=SESS.timeline[SESS.selected];if(!mv)return;const csv='municipio,uf,cbs,setor_destino\\n'+mv._plan.map(p=>`${p.municipio},${p.uf||''},${p.cbs},${p.destino}`).join('\\n');\n  const a=document.createElement('a');a.href=URL.createObjectURL(new Blob([csv],{type:'text/csv'}));a.download=`plano_migracao_setor_${mv.sector}.csv`;a.click();};\n$('#saveSession').onclick=saveSession;\n$('#dupSession').onclick=duplicateSession;\n$('#sessionPick').onchange=()=>loadSession($('#sessionPick').value);\n$('#liveState').onclick=refreshSnapshot;\n$('#liveState').addEventListener('keydown',e=>{ if(e.key==='Enter'||e.key===' '){ e.preventDefault(); refreshSnapshot(); } });\n$('#openOptions').onclick=openOptions;\n$('#optClose').onclick=closeOptions;\n$('#optCancel').onclick=closeOptions;\n$('#optApply').onclick=applyOptions;\n$('#optMinCbs').addEventListener('input',renderOptPreview);\n['#optTargetSpan','#optMaxSpan','#optMinSpan'].forEach(id=>$(id).addEventListener('input',renderOptPreview));\nroot.querySelectorAll('input[name=\"destRule\"]').forEach(r=>r.addEventListener('change',renderOptPreview));\n$('#optionsBg').addEventListener('click',e=>{ if(e.target.id==='optionsBg') closeOptions(); });\nroot.addEventListener('keydown',e=>{ if(e.key==='Escape'){ closeOptions(); closeShare(); closeMove(); } });\n\n$('#openShare').onclick=openShare;\n$('#shareX').onclick=closeShare;\n$('#shareCancel').onclick=closeShare;\n$('#shareGo').onclick=doShare;\n$('#shareCopy').onclick=()=>{ if(!SHARE.url) return; navigator.clipboard.writeText(SHARE.url);\n  const b=$('#shareCopy'); if(b){ b.textContent='copiado ✓'; setTimeout(()=>{ const x=$('#shareCopy'); if(x) x.textContent='Copiar link'; },1500); } };\n$('#shareOpen').onclick=()=>{ if(SHARE.url) window.open(SHARE.url,'_blank'); };\n$('#shareBg').addEventListener('click',e=>{ if(e.target.id==='shareBg') closeShare(); });\n\n// ---------- init ----------\n(async()=>{\n  loader(true,'congelando snapshot da sessão…');\n  try{\n    await Promise.all([ensurePinned(), loadSectors(), refreshSessionPicker()]);\n    SESS.stage='confirm';\n  }catch(e){ setError('erro init: '+e.message); }\n  finally{ loader(false); renderAll(); const rd=$('#ready'); if(rd) rd.setAttribute('data-loaded','1'); }\n})();\n\n  }\n}\n","at":"2026-08-13T14:21:29.778Z"}},"updatedAt":"2026-08-14T15:07:33.349Z","createdAt":"2026-08-14T15:06:57.088Z"},{"_id":"6a7f2f3de811f18f500dca71","component":"data2-core-types@Component","system":"6a57cfe9673eb7e3c5e57784","params":{"component":"pS1W650RpCdVhLm9IkwFi","package":"natura-geomarketing","title":"Ventura DEV — Simulador","extends":"data2-core-primitives@Block","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"sessionsDataset":{"component":"data2-core-types@InteractiveModuleReference"},"dominantesCsvUrl":{"component":"data2-core-types@FileComponentUrlReference"}}}},"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"const T='product.perfil_cb.crm_perfil_cb_diaria_historico';\nconst ELO='product.elo_modelo_combinado.commercial_consultant_index';\nconst PALETTE=['#5856d6','#ff9500','#34c759','#af52de','#ff2d55','#a2845e'];\nconst CLOSE_COLOR='#8e8e93';\nconst UF_CODE={RO:'11',AC:'12',AM:'13',RR:'14',PA:'15',AP:'16',TO:'17',MA:'21',PI:'22',CE:'23',RN:'24',PB:'25',PE:'26',AL:'27',SE:'28',BA:'29',MG:'31',ES:'32',RJ:'33',SP:'35',PR:'41',SC:'42',RS:'43',MS:'50',MT:'51',GO:'52',DF:'53'};\nconst UF_BORDERS={AC:['AM','RO'],AL:['BA','PE','SE'],AM:['AC','RO','RR','PA','MT'],AP:['PA'],\n BA:['AL','SE','PE','PI','TO','GO','MG','ES'],CE:['PI','PB','PE','RN'],DF:['GO','MG'],\n ES:['BA','MG','RJ'],GO:['DF','MT','MS','MG','BA','TO'],MA:['PA','TO','PI'],\n MG:['BA','GO','DF','MS','SP','RJ','ES'],MS:['MT','GO','MG','SP','PR'],MT:['RO','AM','PA','TO','GO','MS'],\n PA:['AP','AM','MT','TO','MA','RR'],PB:['RN','CE','PE'],PE:['PB','CE','PI','BA','AL'],\n PI:['MA','TO','BA','PE','CE'],PR:['SP','MS','SC'],RJ:['ES','MG','SP'],RN:['CE','PB'],\n RO:['AC','AM','MT'],RR:['AM','PA'],RS:['SC'],SC:['PR','RS'],SE:['BA','AL'],\n SP:['MG','RJ','PR','MS'],TO:['PA','MA','PI','BA','GO','MT']};\nconst NIVEIS=['Bronze','Cristal','Prata','Ouro','Diamante','Diamante+'];\nconst METRICS_DEF=[['cbs','CBs'],['ativas','Ativas'],['pedidos','Pedidos'],['pontos','Pontos'],['receita','Receita','$'],['rec_nat','Rec. Natura','$'],['rec_avon','Rec. Avon','$']];\nconst OPT_K=1.5;\nconst SESSIONS_DS='timeline-shared-sessionsDataSet';   // same table as SHARED_DS — see notes at listSessions()\n// Span defaults are the real operating band for a setor receptor, not placeholders: 2200 ≤ span ≤ 3500\n// with 2700 as the target. null meant \"sem limite\", so every new session started with the optimiser\n// balancing against nothing. Existing sessions are NOT touched — their persisted settings carry explicit\n// values that spread OVER these in openOptions/applyOptions, which is deliberate: their etapas were\n// computed under the old band and changing it silently would leave the stored result and the rule that\n// produced it out of sync.\nconst DEFAULT_SETTINGS={destRule:'any',destMinCbs:9,targetSpan:2700,maxSpan:3500,minSpan:2200};\nconst DOM_MEDIA_BASE='https://natura-geomarketing.data2.media/file/';\nconst DOM_CSV_FALLBACK=DOM_MEDIA_BASE+'yw_TQdp0QXEk6JsrliAqP'; \nconst numOrNull=v=>{const n=Math.round(+v);return (isFinite(n)&&n>0)?n:null;};\nconst spanShort=st=>{const p=[];if(st&&st.targetSpan)p.push('alvo '+st.targetSpan);if(st&&st.maxSpan)p.push('máx '+st.maxSpan);if(st&&st.minSpan)p.push('mín '+st.minSpan);return p.length?p.join(' · '):'livre';};\nconst ruleShort=st=>((st&&st.destRule)==='dominant')?('dominantes ≥'+((st&&st.destMinCbs)||DEFAULT_SETTINGS.destMinCbs)+' CBs'):'qualquer municipio';\n\nexport default {\n  css: `\n  :host{display:block;height:100%;--bg:#f5f5f7;--panel:#ffffff;--panel2:#f2f2f7;--line:#e5e5ea;--ink:#1c1c1e;--mut:#6e6e73;--acc:#007aff;--acc2:#0060df;--closing:#ff3b30;--ok:#34c759}\n  *{box-sizing:border-box}\n  .simroot{position:relative;height:100%;overflow:auto;font:13px/1.45 -apple-system,BlinkMacSystemFont,\"SF Pro Text\",\"Segoe UI\",Roboto,sans-serif;background:var(--bg);color:var(--ink);-webkit-font-smoothing:antialiased}\n  header{padding:10px 16px;background:rgba(246,246,248,.85);backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);border-bottom:1px solid var(--line);display:flex;align-items:center;gap:10px;flex-wrap:wrap}\n  header h1{font-size:14.5px;margin:0;font-weight:600;letter-spacing:-.1px;color:var(--ink)}\n  .mac-spacer{flex:1}\n  .howto{padding:8px 16px;background:var(--panel);border-bottom:1px solid var(--line);display:flex;gap:16px;flex-wrap:wrap;font-size:11.5px;color:var(--mut);align-items:center}\n  .howto b{color:var(--ink)} .howto span{max-width:340px}\n  .pill{font-size:10.5px;padding:2.5px 9px;border-radius:99px;border:1px solid var(--line);color:var(--mut);background:var(--panel2)}\n  .pill.live{color:var(--ink);cursor:pointer;user-select:none;transition:border-color .1s,color .1s,background .1s}\n  .pill.live:hover{border-color:var(--acc);color:var(--acc);background:#eaf3ff}\n  .pill.live:focus-visible{outline:2px solid rgba(0,122,255,.35);outline-offset:1px}\n  .pill.live.busy{border-color:var(--acc);color:var(--acc);cursor:progress}\n  .status{font-size:11px;color:var(--mut)}.status.err{color:var(--closing)}\n  select,input,textarea,button{font:inherit}\n  select,input{background:var(--panel);border:1px solid var(--line);color:var(--ink);border-radius:7px;padding:5.5px 9px}\n  select:focus,input:focus{outline:2px solid rgba(0,122,255,.35);outline-offset:0;border-color:var(--acc)}\n  button.act{background:var(--acc);color:#fff;border:1px solid transparent;border-radius:7px;padding:6px 13px;font-weight:600;cursor:pointer;box-shadow:0 1px 1px rgba(0,0,0,.08)}\n  button.act:hover{background:var(--acc2)}\n  button.ghost{background:var(--panel);color:var(--ink);border:1px solid var(--line);border-radius:7px;padding:5.5px 12px;cursor:pointer}\n  button.ghost:hover{background:var(--panel2)}\n  button.ghost.on{border-color:var(--acc);color:var(--acc);background:#eaf3ff}\n  button.ghost:disabled,button.act:disabled{opacity:.4;cursor:not-allowed}\n  .sessbar{padding:9px 20px;background:var(--panel2);border-bottom:1px solid var(--line);display:flex;gap:8px;flex-wrap:wrap;align-items:center}\n  .rail{padding:9px 16px;background:var(--panel);border-bottom:1px solid var(--line);display:flex;gap:8px;align-items:center;overflow-x:auto}\n  #movementChips{display:flex;gap:8px;flex:0 0 auto}\n  #addMovementGroup{display:flex;gap:8px;align-items:center;flex:0 0 auto;margin-left:auto;padding-left:12px;border-left:1px solid var(--line)}\n  #addMovementGroup input{min-width:150px}\n  .tchip{display:flex;align-items:center;gap:7px;background:var(--panel2);border:1px solid var(--line);border-radius:8px;padding:6px 10px;cursor:pointer;font-size:12px;flex:0 0 auto}\n  .tchip.on{border-color:var(--acc);background:#eaf3ff}\n  .tchip.stale{border-style:dashed;opacity:.85}\n  .tchip .tstale{color:#ff9500;font-weight:700}\n  .tchip .tnum{background:var(--ink);color:#fff;border-radius:99px;width:16px;height:16px;font-size:9.5px;display:flex;align-items:center;justify-content:center;font-weight:700}\n  .tchip .tsec{font-weight:600}\n  .tchip .tstat{color:var(--mut)}\n  .tchip .trm{color:var(--mut);font-weight:700;padding:0 3px}\n  .tchip .trm:hover{color:var(--closing)}\n  .rail .empty{color:var(--mut);font-size:12px}\n  .wrap{display:grid;grid-template-columns:minmax(360px,1fr) 430px;gap:14px;padding:14px 16px;align-items:start}\n  @media(max-width:1150px){.wrap{grid-template-columns:1fr}}\n  .card{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:14px 16px;margin-bottom:14px;box-shadow:0 1px 2px rgba(0,0,0,.04)}\n  .card h2{font-size:11px;text-transform:uppercase;letter-spacing:.4px;color:var(--mut);margin:0 0 9px;font-weight:600}\n  /* user-select, not pointer-events. .lbl already sets pointer-events:none, which stops the text from\n     RECEIVING clicks but does not exclude it from the browser's selection range — so cycling a\n     município's destination with repeated clicks kept dragging a double-click selection across the\n     labels. Nothing drawn in an svg here is text anyone needs to copy. */\n  svg{width:100%;height:auto;display:block;user-select:none;-webkit-user-select:none}\n  .map-wrap{position:relative}\n  #map{cursor:grab;touch-action:none}\n  #map.dragging{cursor:grabbing}\n  .zoom-pill{position:absolute;left:10px;bottom:10px;display:flex;align-items:stretch;background:var(--panel);border:1px solid var(--line);border-radius:99px;box-shadow:0 2px 8px rgba(0,0,0,.14);overflow:hidden;z-index:3}\n  .zoom-pill button{width:30px;height:30px;border:0;background:transparent;color:var(--ink);font:16px/1 -apple-system,BlinkMacSystemFont,sans-serif;font-weight:600;cursor:pointer;display:flex;align-items:center;justify-content:center}\n  .zoom-pill button:hover{background:var(--panel2)}\n  .zoom-pill button:active{background:#e5e5ea}\n  .zoom-pill .zoom-div{width:1px;background:var(--line)}\n  /* White hairlines inside the closing sector: the municipios read as one territory cut into parts\n     rather than as separate outlined units, and the saturated fills carry the grouping instead of the\n     ink. Neighbour sectors keep their own coloured strokes (.sect) — that contrast is what separates\n     what is being reallocated from what is only context. Selection no longer draws an outline; the\n     white border was the click affordance AND the default is now white, so it had nothing left to say. */\n  .muni{stroke:#fff;stroke-width:1.1;cursor:pointer;transition:filter .1s}.muni:hover{filter:brightness(1.15)}.muni.munihl{filter:brightness(1.15)}\n  .sect{stroke-width:1;fill-opacity:.32;stroke-opacity:.6}\n  .sect.plain{fill:#e8e8ec;stroke:#d4d4d9;fill-opacity:1;stroke-opacity:1}\n  .sect.closed-ctx{fill:#e2e2e7;stroke:#aeaeb2;stroke-dasharray:3 2;fill-opacity:1;stroke-opacity:1}\n  .lbl{pointer-events:none}\n  /* No plate behind the text: a halo painted UNDER the glyphs (paint-order) keeps a name legible on any\n     fill without stamping an opaque box over the territory it names. Ink and halo are chosen per label\n     from the luminance of the fill underneath, so they are deliberately NOT declared here — a\n     stylesheet rule outranks a presentation attribute and would silently override that choice. */\n  .lbl text{text-anchor:middle;paint-order:stroke fill;stroke-width:2.2px;stroke-linejoin:round;stroke-linecap:round}\n  .lbl.big text{stroke-width:2.9px}\n  .lbl line.lead{stroke-opacity:.5;stroke-width:.8}\n  .legend{display:flex;gap:12px;flex-wrap:wrap;margin-top:8px;font-size:12px}\n  .legend b{display:inline-block;width:11px;height:11px;border-radius:3px;margin-right:5px;vertical-align:-1px}\n  .kpis{display:grid;grid-template-columns:1fr 1fr;gap:9px;margin-bottom:12px}\n  .kpi{background:var(--panel2);border:1px solid var(--line);border-radius:10px;padding:9px 11px}\n  .kpi .n{font-size:19px;font-weight:700}.kpi .l{font-size:10.5px;color:var(--mut);margin-top:2px}\n  .kpi.warn{border-color:#ffd1cc}.kpi.warn .n{color:var(--closing)}.kpi.ok{border-color:#bdeecb}.kpi.ok .n{color:var(--ok)}\n  .bar-row{display:flex;align-items:center;gap:8px;margin:6px 0}\n  .bar-row .tag{width:42px;font-weight:600;font-size:12px}\n  .bar-track{flex:1;height:18px;background:var(--panel2);border-radius:5px;overflow:hidden;display:flex;position:relative}\n  .bar-mark{position:absolute;top:0;bottom:0;width:2px;opacity:.9;z-index:2}\n  .bar-base{height:100%;opacity:.4}.bar-inc{height:100%}\n  .bar-val{width:132px;text-align:right;font-size:11px;color:var(--mut);font-variant-numeric:tabular-nums}\n  table{border-collapse:collapse;width:100%;font-size:11.5px}\n  th,td{padding:5px 6px;text-align:right;border-bottom:1px solid var(--line);font-variant-numeric:tabular-nums}\n  th:first-child,td:first-child{text-align:left}\n  thead th{color:var(--mut);font-weight:600;font-size:10.5px;position:sticky;top:0;background:var(--panel)}\n  .home{display:inline-block;width:9px;height:9px;border-radius:2px;margin-right:4px}\n  .muni-item{display:flex;align-items:center;gap:8px;background:var(--panel2);border:1px solid var(--line);border-radius:8px;padding:5px 8px;margin-bottom:6px}\n  .muni-item .nm{flex:1;font-weight:600;font-size:12px}.muni-item .ct{color:var(--mut);font-size:11px}\n  .seg{display:flex;border:1px solid var(--line);border-radius:7px;overflow:hidden}\n  .seg button{border:0;background:transparent;color:var(--mut);padding:4px 8px;font-size:11px;font-weight:600;cursor:pointer}\n  .seg button.on{color:#fff}\n  .toolbar{display:flex;gap:8px;align-items:center;flex-wrap:wrap}\n  .toggle{display:flex;border:1px solid var(--line);border-radius:8px;overflow:hidden;font-size:12px}\n  .toggle button{background:transparent;border:0;color:var(--mut);padding:6px 10px;cursor:pointer;font-weight:600}\n  .toggle button.on{background:var(--panel2);color:var(--ink)}\n  .note{color:var(--mut);font-size:10.5px;margin-top:7px;line-height:1.5}\n  .cell{font-variant-numeric:tabular-nums}\n  .lider-foot td{background:var(--panel2);font-weight:600;font-size:11px;color:var(--ink);border-bottom:2px solid var(--line);padding:5px 6px;text-align:left}\n  .scroll{max-height:240px;overflow:auto}\n  /* Tables meant to be READ in full rather than sampled. Only the vertical cap is dropped — overflow\n     stays auto so the wide grupo grid can still scroll sideways inside its card, which is the one axis\n     that genuinely cannot fit. */\n  .scroll.grow{max-height:none}\n  .tip{position:fixed;pointer-events:none;background:#1c1c1e;color:#fff;border-radius:8px;padding:7px 9px;font-size:11px;opacity:0;transition:opacity .1s;z-index:9;max-width:230px}\n  .spark{display:flex;align-items:flex-end;gap:3px;height:44px}\n  .spark .b{flex:1;background:var(--acc);border-radius:2px 2px 0 0;min-height:2px;opacity:.85}\n  .delta{font-size:10px}.delta.up{color:var(--ok)}.delta.dn{color:var(--closing)}\n  .tabs{display:flex;gap:6px;margin-bottom:10px;flex-wrap:wrap}\n  .tabs button{background:transparent;border:1px solid var(--line);border-radius:8px;color:var(--mut);padding:6px 12px;cursor:pointer;font-weight:600}\n  .tabs button.on{background:var(--panel2);color:var(--ink);border-color:var(--acc)}\n  .hidden{display:none}\n  .sqlbox{width:100%;height:60px;font-family:ui-monospace,Menlo,monospace;font-size:11px;resize:vertical}\n  .load{position:absolute;inset:0;background:rgba(245,245,247,.85);backdrop-filter:blur(4px);display:flex;align-items:center;justify-content:center;z-index:20;font-size:13px;color:var(--acc);font-weight:600;text-align:center;padding:20px}\n  .load.hidden{display:none}\n  .badge{font-size:10px;padding:1px 6px;border-radius:5px;background:var(--panel2);border:1px solid var(--line);color:var(--mut)}\n  .sheet-bg{position:fixed;inset:0;background:rgba(28,28,30,.34);backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);display:flex;align-items:center;justify-content:center;z-index:40;padding:24px}\n  .sheet-bg.hidden{display:none}\n  .sheet{background:var(--panel);border:1px solid var(--line);border-radius:14px;box-shadow:0 24px 60px rgba(0,0,0,.22);width:min(580px,100%);max-height:100%;display:flex;flex-direction:column;overflow:hidden}\n  .sheet-hd{display:flex;align-items:center;gap:9px;padding:12px 16px;border-bottom:1px solid var(--line)}\n  .sheet-hd h3{margin:0;font-size:14px;font-weight:600;letter-spacing:-.1px}\n  .sheet-x{background:transparent;border:0;color:var(--mut);font-size:13px;cursor:pointer;padding:3px 7px;border-radius:6px}\n  .sheet-x:hover{background:var(--panel2);color:var(--ink)}\n  .sheet-bd{padding:14px 16px;overflow:auto}\n  .sheet-ft{display:flex;align-items:center;gap:8px;padding:11px 16px;border-top:1px solid var(--line);background:var(--panel2)}\n  .opt-lbl{font-size:11px;text-transform:uppercase;letter-spacing:.4px;color:var(--mut);font-weight:600}\n  .opt-sub{font-size:11.5px;color:var(--mut);margin:4px 0 10px;line-height:1.5}\n  .opt-row{display:flex;gap:10px;align-items:flex-start;border:1px solid var(--line);border-radius:10px;padding:10px 12px;margin-bottom:8px;cursor:pointer;background:var(--panel)}\n  .opt-row:hover{background:var(--panel2)}\n  .opt-row.on{border-color:var(--acc);background:#eaf3ff}\n  .opt-row:has(input:disabled){opacity:.5;cursor:not-allowed}\n  .opt-row input[type=radio]{margin:2px 0 0;accent-color:var(--acc);flex:0 0 auto}\n  .opt-t{font-size:12.5px;font-weight:600;display:flex;align-items:center;gap:6px;flex-wrap:wrap}\n  .opt-d{font-size:11.5px;color:var(--mut);margin-top:3px;line-height:1.55}\n  .opt-inline{font-size:11.5px;color:var(--mut);margin-top:9px;display:flex;align-items:center;gap:7px;flex-wrap:wrap}\n  .opt-inline.off{opacity:.4;pointer-events:none}\n  .opt-note{border:1px solid var(--line);background:var(--panel2);border-radius:10px;padding:9px 11px;font-size:11.5px;color:var(--mut);line-height:1.6;margin-top:12px}\n  .opt-grid{display:grid;grid-template-columns:1fr 1fr 1fr;gap:8px;margin-top:2px}\n  .opt-fld{display:flex;flex-direction:column;gap:5px;border:1px solid var(--line);border-radius:9px;padding:8px 10px;background:var(--panel2)}\n  .opt-fld span{font-size:11px;color:var(--mut);font-weight:600;line-height:1.35}\n  .opt-fld i{font-style:normal;font-weight:400;opacity:.72}\n  .opt-fld input{width:100%;background:var(--panel)}\n  .opt-err{margin-top:9px;font-size:11.5px;color:var(--closing);font-weight:600}\n  .opt-hr{height:1px;background:var(--line);margin:17px 0 0}\n  .shareurl{margin-top:9px;padding:9px 10px;border-radius:8px;background:var(--panel);border:1px solid var(--acc);\n    font-family:ui-monospace,Menlo,monospace;font-size:11px;color:var(--ink);word-break:break-all;user-select:all}\n`,\n  render(d2){\n    return `<div class=\"simroot\"><header id=\"topHeader\" class=\"hidden\">\n  <h1>Simulador de Timeline de Fechamentos</h1>\n  <span class=\"pill live\" id=\"liveState\" role=\"button\" tabindex=\"0\" title=\"Clique pra buscar o snapshot mais recente e recalcular a timeline inteira\">● iniciando</span>\n  <span class=\"pill ro\">read-only · nunca escreve</span>\n  <span class=\"pill\" id=\"basePill\"></span>\n  <span class=\"pill\" id=\"rulePill\"></span>\n  <span class=\"pill\" id=\"spanPill\"></span>\n  <span class=\"status\" id=\"ds\"></span>\n  <div class=\"mac-spacer\"></div>\n  <select id=\"sessionPick\" style=\"min-width:200px\"></select>\n  <button class=\"ghost\" id=\"openOptions\" title=\"Configurações desta sessão\">⚙ Opções</button>\n  <button class=\"act\" id=\"saveSession\">Salvar sessão</button>\n  <button class=\"ghost\" id=\"dupSession\" title=\"Cria uma cópia independente desta sessão — a original fica intacta e a cópia passa a ser a sessão ativa\">⧉ Duplicar</button>\n  <button class=\"ghost\" id=\"openShare\" title=\"Publicar uma cópia congelada desta sessão em modo leitura\">⇪ Compartilhar</button>\n  <span class=\"status\" id=\"sessStatus\"></span>\n</header>\n\n<div class=\"rail hidden\" id=\"timelineRail\">\n  <div id=\"movementChips\"></div>\n  <div id=\"addMovementGroup\">\n    <button class=\"act\" id=\"openMove\">Adicionar movimentação</button>\n  </div>\n</div>\n\n<div class=\"card\" id=\"confirmCard\" style=\"margin:14px 20px\">\n  <h2 style=\"margin:0 0 9px\">Confirmar snapshot antes de simular</h2>\n  <div class=\"note\" id=\"confirmBody\">congelando snapshot…</div>\n  <button class=\"act\" id=\"confirmSnap\" style=\"margin-top:12px\">Confirmar snapshot ▶ ir pra simulação</button>\n  <div class=\"note\" style=\"margin-top:16px\">ou continue uma sessão salva:</div>\n  <select id=\"confirmSessionPick\" style=\"min-width:260px;margin-top:4px\"></select>\n  <div class=\"status\" id=\"confirmStatus\" style=\"margin-top:8px\"></div>\n</div>\n\n<div class=\"wrap hidden\" id=\"mainWrap\">\n  <div>\n    <div class=\"card\">\n      <div style=\"display:flex;justify-content:space-between;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:9px\">\n        <h2 id=\"mapTitle\" style=\"margin:0\">Mapa — clique num município p/ trocar o setor destino</h2>\n        <div class=\"toggle\" id=\"viewToggle\" title=\"ASIS = estrutura do setor antes desta etapa (já considerando etapas anteriores) · TOBE = após a redistribuição desta etapa\">\n          <button data-v=\"asis\">◧ ASIS (antes desta etapa)</button>\n          <button data-v=\"tobe\" class=\"on\">◨ TOBE (simulação)</button>\n        </div>\n      </div>\n      <div class=\"map-wrap\">\n        <svg id=\"map\" viewBox=\"0 0 700 500\" preserveAspectRatio=\"xMidYMid meet\"></svg>\n        <div class=\"zoom-pill\" id=\"mapZoom\">\n          <button type=\"button\" id=\"mapZoomOut\" title=\"Diminuir zoom\">−</button>\n          <span class=\"zoom-div\"></span>\n          <button type=\"button\" id=\"mapZoomIn\" title=\"Aumentar zoom\">+</button>\n        </div>\n      </div>\n      <div class=\"legend\" id=\"legend\"></div>\n      <div class=\"note\">Coloridos = municípios do setor fechado nesta etapa (cor = destino). Ao redor, cada área é um <b>setor vizinho inteiro</b> com o código no meio — não municípios soltos: cor = setor destino, cinza = contexto, cinza tracejado = setor já fechado numa etapa anterior. Shapes reais IBGE/tbrugz.</div>\n      <div class=\"note\" id=\"mapIgnoredNote\"></div>\n    </div>\n\n    <div class=\"card\">\n      <h2>Líderes — destino e CBs deslocadas (nesta etapa)</h2>\n      <div class=\"note\" style=\"margin:-4px 0 9px\"><b>Home</b> = setor que ficou com a maioria das CBs da líder. <b style=\"color:var(--closing)\">Deslocadas</b> = CBs dela que caíram noutro setor.</div>\n      <div class=\"scroll grow\"><table id=\"leaders\"></table></div>\n    </div>\n\n    <div class=\"card\">\n      <div class=\"tabs\">\n        <button data-tab=\"matrix\" class=\"on\">Matriz ASIS</button>\n        <button data-tab=\"tobe\">Matriz TOBE</button>\n        <button data-tab=\"report\">Relatório de impacto (etapa)</button>\n        <button data-tab=\"cumulative\">Impacto acumulado (timeline)</button>\n        <button data-tab=\"sql\">Console SQL</button>\n      </div>\n      <div id=\"tab-matrix\"><div class=\"scroll grow\"><table id=\"matrix\"></table></div></div>\n      <div id=\"tab-tobe\" class=\"hidden\"><div class=\"scroll grow\"><table id=\"matrixTobe\"></table></div>\n        <div class=\"note\" id=\"tobeNote\"></div></div>\n      <div id=\"tab-report\" class=\"hidden\"></div>\n      <div id=\"tab-cumulative\" class=\"hidden\"></div>\n      <div id=\"tab-sql\" class=\"hidden\">\n        <textarea class=\"sqlbox\" id=\"sqlIn\">SELECT DS_MUNICIPIO, COUNT(DISTINCT CD_CONSULTORA) qtd FROM product.perfil_cb.crm_perfil_cb_diaria_historico WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR=3504 GROUP BY DS_MUNICIPIO ORDER BY qtd DESC</textarea>\n        <div class=\"toolbar\" style=\"margin:8px 0\"><button class=\"act\" id=\"runSql\">▶ Rodar</button><span class=\"status\" id=\"sqlStatus\"></span></div>\n        <div class=\"note\" style=\"margin:-4px 0 8px\">Roda contra o snapshot congelado desta sessão (não \"ao vivo\") — mesma coerência da timeline.</div>\n        <div class=\"scroll\"><table id=\"sqlOut\"></table></div>\n      </div>\n    </div>\n  </div>\n\n  <div>\n    <div class=\"card\">\n      <div class=\"toolbar\" style=\"margin-bottom:11px\">\n        <button class=\"ghost\" id=\"optim\" title=\"testa alocações que mantêm cada setor conectado e escolhe a que equilibra a carga entre setores + minimiza a quebra (evita empilhar tudo num setor)\">★ Modelo ÓTIMO (equilíbrio + quebra)</button>\n        <button class=\"ghost\" id=\"autoTobe\" title=\"preenche cada município pelo setor vizinho mais próximo (geografia)\">TOBE por adjacência</button>\n        <span class=\"badge\" id=\"optBadge\"></span>\n      </div>\n      <div class=\"note\" style=\"margin:-4px 0 10px\"><b style=\"color:var(--ink)\">★ ÓTIMO</b> = equilibra a carga entre os setores <b>e</b> minimiza a quebra (mantém o território conectado; não empilha tudo num setor). <b style=\"color:var(--ink)\">TOBE</b> = sugestão por vizinhança. Editar esta etapa recalcula automaticamente as etapas seguintes da timeline.</div>\n      <div class=\"note\" id=\"ruleNote\" style=\"margin:-6px 0 11px;padding:7px 9px;background:var(--panel2);border:1px solid var(--line);border-radius:8px\"></div>\n      <div class=\"kpis\" id=\"kpis\"></div>\n      <div id=\"contig\"></div>\n      <div id=\"spanRule\"></div>\n      <h2>Span por setor (CBs) — base + entrantes</h2>\n      <div id=\"spans\"></div>\n      <div id=\"policySection\">\n      <div style=\"display:flex;justify-content:space-between;align-items:center;margin:14px 0 7px\">\n        <h2 style=\"margin:0\">CBs deslocadas</h2>\n        <div class=\"toggle\" id=\"policy\">\n          <button data-p=\"fora\" class=\"on\">= fora do setor</button>\n          <button data-p=\"quebra\">= quebra de relação</button>\n        </div>\n      </div>\n      <div class=\"note\" id=\"policyNote\"></div>\n      </div>\n    </div>\n\n    <div class=\"card\">\n      <h2 id=\"muniListTitle\">Municípios → setor destino</h2>\n      <div class=\"note\" id=\"muniListNote\" style=\"margin:-4px 0 9px\">Clique no <b>código do setor</b> pra mandar o município <b>inteiro</b> pra lá (regra de negócio). A cor acompanha o mapa.</div>\n      <div id=\"muniList\"></div>\n    </div>\n\n    <div class=\"card\">\n      <div class=\"toolbar\" style=\"justify-content:space-between\">\n        <h2 style=\"margin:0\">Plano de migração (etapa selecionada)</h2>\n        <div><button class=\"ghost\" id=\"copyPlan\">Copiar</button> <button class=\"ghost\" id=\"csvPlan\">CSV</button></div>\n      </div>\n      <div id=\"plan\" class=\"note\"></div>\n    </div>\n  </div>\n</div>\n\n<div class=\"sheet-bg hidden\" id=\"shareBg\">\n  <div class=\"sheet\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"shareTitle\">\n    <div class=\"sheet-hd\"><h3 id=\"shareTitle\">Compartilhar sessão</h3><div class=\"mac-spacer\"></div><button class=\"sheet-x\" id=\"shareX\" title=\"Fechar\">✕</button></div>\n    <div class=\"sheet-bd\" id=\"shareBody\"></div>\n    <div class=\"sheet-ft\">\n      <span class=\"status\" id=\"shareStatus\"></span>\n      <div class=\"mac-spacer\"></div>\n      <button class=\"ghost hidden\" id=\"shareCopy\">Copiar link</button>\n      <button class=\"ghost hidden\" id=\"shareOpen\">Abrir</button>\n      <button class=\"ghost\" id=\"shareCancel\">Cancelar</button>\n      <button class=\"act\" id=\"shareGo\">Compartilhar</button>\n    </div>\n  </div>\n</div>\n\n<div class=\"sheet-bg hidden\" id=\"optionsBg\">\n  <div class=\"sheet\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"optTitle\">\n    <div class=\"sheet-hd\"><h3 id=\"optTitle\">Opções da sessão</h3><span class=\"badge\" id=\"optSessName\"></span><div class=\"mac-spacer\"></div><button class=\"sheet-x\" id=\"optClose\" title=\"Fechar\">✕</button></div>\n    <div class=\"sheet-bd\">\n      <div class=\"opt-lbl\">Regra rígida — seleção dos setores destino</div>\n      <div class=\"opt-sub\">Define quais setores vizinhos podem entrar na lista de destinos de cada etapa. Vale pra toda a timeline desta sessão.</div>\n      <label class=\"opt-row\" data-r=\"any\">\n        <input type=\"radio\" name=\"destRule\" value=\"any\">\n        <div>\n          <div class=\"opt-t\">Adjacente a qualquer município <span class=\"badge\">padrão</span></div>\n          <div class=\"opt-d\">Um setor entra na lista de destinos se tiver município vizinho a <b>qualquer</b> município do setor fechado — inclusive os menores. É o comportamento de hoje.</div>\n        </div>\n      </label>\n      <label class=\"opt-row\" data-r=\"dominant\">\n        <input type=\"radio\" name=\"destRule\" value=\"dominant\">\n        <div>\n          <div class=\"opt-t\">Adjacente a municípios dominantes</div>\n          <div class=\"opt-d\">Só os municípios do setor fechado com <b>CBs suficientes</b> valem como ponte. Os pequenos continuam sendo redistribuídos normalmente — só não trazem setor novo pra lista de destinos.</div>\n          <div class=\"opt-inline\" id=\"optMinCbsWrap\">Ignorar municípios com menos de <input type=\"number\" id=\"optMinCbs\" min=\"1\" max=\"9999\" step=\"1\" style=\"width:74px\"> CBs</div>\n        </div>\n      </label>\n      <div class=\"opt-hr\"></div>\n      <div class=\"opt-lbl\" style=\"margin-top:15px\">Pré-requisitos do setor destino — tamanho em CBs</div>\n      <div class=\"opt-sub\">Vale pro tamanho de cada setor receptor <b>depois</b> da redistribuição (base + entrantes). Em branco = desligado.</div>\n      <div class=\"opt-grid\">\n        <label class=\"opt-fld\"><span>Span alvo <i>(tamanho ideal)</i></span><input type=\"number\" id=\"optTargetSpan\" min=\"1\" max=\"99999\" step=\"1\" placeholder=\"livre\"></label>\n        <label class=\"opt-fld\"><span>Span máximo <i>(nenhum setor acima)</i></span><input type=\"number\" id=\"optMaxSpan\" min=\"1\" max=\"99999\" step=\"1\" placeholder=\"sem limite\"></label>\n        <label class=\"opt-fld\"><span>Span mínimo <i>(nenhum setor abaixo)</i></span><input type=\"number\" id=\"optMinSpan\" min=\"1\" max=\"99999\" step=\"1\" placeholder=\"sem limite\"></label>\n      </div>\n      <div class=\"opt-err hidden\" id=\"optSpanErr\"></div>\n      <div class=\"opt-note\" id=\"optPreview\"></div>\n    </div>\n    <div class=\"sheet-ft\"><span class=\"status\" id=\"optStatus\"></span><div class=\"mac-spacer\"></div><button class=\"ghost\" id=\"optCancel\">Cancelar</button><button class=\"act\" id=\"optApply\">Aplicar</button></div>\n  </div>\n</div>\n\n<div class=\"sheet-bg hidden\" id=\"moveBg\">\n  <div class=\"sheet\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"moveTitle\">\n    <div class=\"sheet-hd\"><h3 id=\"moveTitle\">Adicionar movimentação</h3><div class=\"mac-spacer\"></div><button class=\"sheet-x\" id=\"moveClose\" title=\"Fechar\">✕</button></div>\n    <div class=\"sheet-bd\">\n      <div class=\"opt-lbl\">Tipo de movimentação</div>\n      <div class=\"opt-sub\" id=\"moveLockNote\">Escolha o nível a fechar. Você pode fechar setores à vontade até fechar uma GV; aí só GV (ou mercado) daqui pra frente. Fechar um mercado trava a sessão em mercado.</div>\n      <label class=\"opt-row\" data-lvl=\"setor\"><input type=\"radio\" name=\"moveLevel\" value=\"setor\"><div><div class=\"opt-t\">Fechar Setor</div><div class=\"opt-d\">Redistribui os municípios do setor entre setores vizinhos da mesma GV.</div></div></label>\n      <label class=\"opt-row\" data-lvl=\"gv\"><input type=\"radio\" name=\"moveLevel\" value=\"gv\"><div><div class=\"opt-t\">Fechar GV</div><div class=\"opt-d\">Redistribui os setores (com municípios e CBs) da GV entre GVs vizinhas do mesmo mercado.</div></div></label>\n      <label class=\"opt-row\" data-lvl=\"mercado\"><input type=\"radio\" name=\"moveLevel\" value=\"mercado\"><div><div class=\"opt-t\">Fechar Mercado</div><div class=\"opt-d\">Redistribui as GVs (com setores, municípios e CBs) do mercado entre mercados vizinhos.</div></div></label>\n      <div class=\"opt-hr\"></div>\n      <div class=\"opt-lbl\" style=\"margin-top:15px\" id=\"moveCodeLbl\">Setor a fechar</div>\n      <div class=\"opt-inline\" id=\"moveCodeRow\">\n        <input id=\"moveCode\" list=\"moveCodeList\" placeholder=\"código\" style=\"min-width:150px\">\n        <datalist id=\"moveCodeList\"></datalist>\n        <button class=\"ghost\" id=\"moveRand\" title=\"Aleatório\">🎲</button>\n      </div>\n      <div class=\"opt-err hidden\" id=\"moveErr\"></div>\n    </div>\n    <div class=\"sheet-ft\"><span class=\"status\" id=\"moveStatus\"></span><div class=\"mac-spacer\"></div><button class=\"ghost\" id=\"moveCancel\">Cancelar</button><button class=\"act\" id=\"moveGo\">Fechar ▶ (nova etapa)</button></div>\n  </div>\n</div>\n\n<div class=\"tip\" id=\"tip\"></div>\n<div class=\"load hidden\" id=\"loader\">carregando…</div>\n<span id=\"ready\" style=\"display:none\"></span></div>`;\n  },\n  mounted(d2, root){\n\nconst $=s=>root.querySelector(s);\nconst fmt=n=>n==null?'–':Math.round(+n).toLocaleString('pt-BR');\nconst money=n=>{n=+n||0;return n>=1e6?'R$'+(n/1e6).toFixed(1)+'M':n>=1e3?'R$'+(n/1e3).toFixed(0)+'k':'R$'+Math.round(n)};\nconst norm=s=>(s||'').normalize('NFKD').replace(/[̀-ͯ]/g,'').toUpperCase().replace(/[^A-Z0-9]+/g,' ').trim();\nconst esc=s=>(s==null?'':String(s)).replace(/[&<>]/g,c=>({'&':'&amp;','<':'&lt;','>':'&gt;'}[c]));\nconst blankM=()=>({cbs:0,receita:0,rec_nat:0,rec_avon:0,pontos:0,pedidos:0,ativas:0});\n// ---------- município identity ----------\n// Brazil has many municipalities sharing a name (Bom Jesus alone exists in PI, RN, RS, SC, PB, GO).\n// A stage loads the dominant UF PLUS every bordering UF, so those collisions land in the SAME\n// feature set routinely: keyed by name alone the last shape loaded won, the map could draw a\n// município from the wrong state, buildAdj merged two unrelated municipalities into one node, and\n// GROUP BY DS_MUNICIPIO summed two real municipalities into one row. The key is NAME/UF everywhere\n// — SQL rows, GeoJSON features, the dominantes base, assignments, persisted sessions. norm() maps\n// every non-alphanumeric to a space, so '/' can never occur inside a name and the split is exact.\n// A missing UF degrades to a bare NAME key rather than inventing one.\nconst mkey=(name,uf)=>{const n=norm(name),u=String(uf==null?'':uf).trim().toUpperCase();return u?n+'/'+u:n;};\nconst mName=k=>{const s=String(k==null?'':k),i=s.lastIndexOf('/');return i<0?s:s.slice(0,i);};\nconst mUf=k=>{const s=String(k==null?'':k),i=s.lastIndexOf('/');return i<0?'':s.slice(i+1);};\nconst mDisp=k=>{const u=mUf(k);return u?mName(k)+' ('+u+')':mName(k);};\n// The base CSV is the ONLY source of a município's UF now, so its column is accepted in whatever\n// shape the base is maintained in: sigla, IBGE numeric code, or full state name. Anything that does\n// not resolve to a real sigla is treated as UNKNOWN rather than passed through — a bogus UF would key\n// a município to a shape that does not exist and drop it off the map without a word.\nconst UF_OF_CODE={}; Object.keys(UF_CODE).forEach(k=>{ UF_OF_CODE[UF_CODE[k]]=k; });\nconst UF_OF_NAME={ACRE:'AC',ALAGOAS:'AL',AMAPA:'AP',AMAZONAS:'AM',BAHIA:'BA',CEARA:'CE','DISTRITO FEDERAL':'DF','ESPIRITO SANTO':'ES',GOIAS:'GO',MARANHAO:'MA','MATO GROSSO':'MT','MATO GROSSO DO SUL':'MS','MINAS GERAIS':'MG',PARA:'PA',PARAIBA:'PB',PARANA:'PR',PERNAMBUCO:'PE',PIAUI:'PI','RIO DE JANEIRO':'RJ','RIO GRANDE DO NORTE':'RN','RIO GRANDE DO SUL':'RS',RONDONIA:'RO',RORAIMA:'RR','SANTA CATARINA':'SC','SAO PAULO':'SP',SERGIPE:'SE',TOCANTINS:'TO'};\nconst ufNorm=v=>{const s=norm(v); if(!s) return '';\n  if(UF_CODE[s]) return s;\n  if(UF_OF_CODE[s]) return UF_OF_CODE[s];\n  return UF_OF_NAME[s]||'';};\nconst loader=(on,t)=>{const l=$('#loader');l.classList.toggle('hidden',!on);if(t)l.textContent=t;};\nconst setError=(msg)=>{ const t=$('#ds'); if(t){t.textContent=msg;t.classList.add('err');} const c=$('#confirmStatus'); if(c){c.textContent=msg;c.classList.add('err');} };\n\n// ---------- base de municípios dominantes (CSV) ----------\n// WHICH municipalities belong to a sector is a business fact, not something to infer from CB volume:\n// it comes from a maintained CSV (one row per setor x município) linked through the `dominantesCsvUrl`\n// param. Anything the closing sector has CBs in but that the base does NOT assign to it is spillover:\n// not realocated, not drawn on the map, and its CBs follow their leader. Loaded once per URL and\n// cached for the whole session; a failure is thrown, never swallowed — a silent fallback here would\n// quietly change every number on the screen.\nconst DOM={url:null,promise:null,bySetor:null,ufBySetorMuni:null,rows:0,setores:0,hasUf:false,ufCol:null,badUf:0,clashes:0,headers:null,error:null};\nfunction parseCsv(text){\n  const out=[]; let row=[],cur='',q=false;\n  const push=()=>{ row.push(cur); cur=''; };\n  const endRow=()=>{ push(); if(row.length>1||row[0]!=='') out.push(row); row=[]; };\n  for(let i=0;i<text.length;i++){ const ch=text[i];\n    if(q){ if(ch==='\"'){ if(text[i+1]==='\"'){ cur+='\"'; i++; } else q=false; } else cur+=ch; }\n    else if(ch==='\"') q=true;\n    else if(ch===',') push();\n    else if(ch==='\\n') endRow();\n    else if(ch!=='\\r') cur+=ch;\n  }\n  if(cur!==''||row.length) endRow();\n  return out;\n}\n// `dominantesCsvUrl` is declared as a FileComponentUrlReference, so the instance points at the Drive\n// FILE, not at a URL literal — the Drive is policy-gated behind the app's auth strategy and a baked\n// string would be both stale and unauthorised. What the resolver hands back varies by where it is\n// resolved (URL string / file record / bare reference), so accept every shape instead of silently\n// reading undefined and falling through to the fallback.\n// The Drive is gated by the app's AuthenticationStrategy, so this read has to travel as the LOGGED-IN\n// USER — an anonymous CDN GET is exactly what the policy is there to refuse. `<system>.data2.media` is\n// only a cache in front of the SSP: on a cache miss it 302s to `<system>.data2apis.com`, which is where\n// the policy is actually evaluated.\n// COOKIES CANNOT CARRY THAT SESSION, which is why the previous `credentials:'include'` attempt could\n// never have worked: the app runs on <app>.<system>.data2.app and the SSP on <system>.data2apis.com —\n// cross-site — and the SSP answers `Access-Control-Allow-Origin: *` with no `Allow-Credentials`, so the\n// browser rejects a credentialed CORS read before it ever leaves the page. What the SSP actually reads\n// is `Authorization: Bearer <token>`: the runtime keeps that token in localStorage under\n// `__data2-session-<systemDomain>` (`__data2-session-data2` inside the builder preview) and replays it\n// on every dataset and rush call — same token, same header, same session, so the Drive policy sees the\n// logged-in user. Preflight passes because the SSP echoes whatever header the request asks for.\nfunction d2SessionToken(sysDomain){\n  const read=k=>{ try{ return (k&&window.localStorage.getItem(k))||''; }catch(e){ return ''; } };\n  return read(sysDomain?('__data2-session-'+sysDomain):'')||read('__data2-session-data2')||'';\n}\nfunction domCsvSystemDomain(url){\n  const m=/^https?:\\/\\/([^.\\/]+)\\.data2\\.(?:media|app)\\//i.exec(url)||/^https?:\\/\\/([^.\\/]+)\\.data2apis\\.com\\//i.exec(url);\n  return m?m[1]:'';\n}\nfunction domCsvCandidates(url){\n  const out=[];\n  const isMedia=/^https?:\\/\\/[^.\\/]+\\.data2\\.media\\//i.test(url);\n  const api=isMedia?url.replace(/^(https?:\\/\\/[^.\\/]+)\\.data2\\.media\\//i,'$1.data2apis.com/'):null;\n  const tok=d2SessionToken(domCsvSystemDomain(url));\n  const auth=tok?{authorization:'Bearer '+tok}:null;\n  // Authenticated origin read first — the only candidate a GATED Drive can actually answer.\n  if(api&&auth) out.push({url:api,headers:auth,label:'api+sessão'});\n  if(!api&&auth) out.push({url:url,headers:auth,label:'origem+sessão'});\n  // Anonymous last: only ever succeeds on an UNGATED Drive — or on a stale CDN cache hit, which is NOT\n  // proof the file is public (the origin keeps answering 401 once the edge entry expires).\n  if(api) out.push({url:api,headers:null,label:'api anônimo'});\n  out.push({url:url,headers:null,label:'origem anônima'});\n  return out;\n}\nfunction domCsvUrl(){\n  const pick=v=>{\n    if(!v) return '';\n    if(typeof v==='string') return v;\n    const q=v.params||{};\n    const ref=q.reference||v.reference;\n    return q.fileUrl||q.url||v.fileUrl||v.url||(ref?DOM_MEDIA_BASE+ref:'');\n  };\n  return String(pick(d2.param('dominantesCsvUrl'))||DOM_CSV_FALLBACK||'').trim();\n}\nasync function ensureDominantes(){\n  const url=domCsvUrl();\n  if(!url) throw new Error('base de municípios dominantes não configurada — ligue o arquivo CSV no parâmetro dominantesCsvUrl da instância do componente');\n  if(DOM.url===url && DOM.bySetor) return DOM.bySetor;\n  if(DOM.url===url && DOM.promise) return DOM.promise;\n  DOM.url=url; DOM.error=null;\n  DOM.promise=(async()=>{\n    // Self-diagnosing on purpose: every candidate reports its own outcome and the message names the\n    // session it was carrying. \"Unauthorized\" alone cannot distinguish \"not logged into THIS strategy\"\n    // from \"cookie not sent cross-site\" from \"param never bound, so it tried the fallback URL\" — and\n    // guessing between those from the outside costs a round trip each time.\n    let r=null; const tried=[];\n    for(const c of domCsvCandidates(url)){\n      let res=null;\n      try{ res=await fetch(c.url,{cache:'no-store',credentials:'omit',headers:c.headers||undefined}); }\n      catch(e){ tried.push(c.label+' → rede/CORS'); continue; }\n      if(res.ok){ r=res; break; }\n      tried.push(c.label+' → '+res.status);\n    }\n    if(!r){\n      let sess='sessão desconhecida';\n      try{\n        const a=d2.auth(AUTH_REF);\n        sess=(a&&a.isAuthed)?('logado como '+((a.user&&(a.user.email||a.user.nome))||'?')):('NÃO logado na estratégia '+AUTH_REF);\n      }catch(e){ sess='estratégia '+AUTH_REF+' não resolvida'; }\n      const tk=d2SessionToken(domCsvSystemDomain(url));\n      throw new Error('base de municípios dominantes: não foi possível ler o arquivo — '+sess+' · token de sessão '+(tk?'presente':'AUSENTE no localStorage')+'. Tentativas: '+tried.join(' · '));\n    }\n    const table=parseCsv(await r.text());\n    if(table.length<2) throw new Error('base de municípios dominantes vazia');\n    const head=table[0].map(h=>norm(h));\n    const iS=head.indexOf('CD SETOR'), iM=head.indexOf('MUNICIPIO');\n    if(iS<0||iM<0) throw new Error('base de municípios dominantes sem as colunas CD_SETOR / MUNICIPIO');\n    // CD_GV is the gerência de vendas the setor answers to, and it is the authority for the hard rule\n    // that a closing sector only ever hands territory to sectors of its OWN gerência. Its absence is\n    // fatal rather than a warning: with no GV there is no way to PROVE two sectors share one, and\n    // falling through unchecked is exactly the leak this column exists to close.\n    const iG=['CD GV','CDGV','GV','CD GERENCIA','CD GERENCIA VENDAS','CD GERENCIA DE VENDAS','GERENCIA DE VENDAS','GERENCIA'].map(h=>head.indexOf(h)).find(i=>i>=0);\n    if(iG==null) throw new Error('base de municípios dominantes sem a coluna CD_GV — a regra de gerência de vendas não pode ser aplicada. Colunas lidas: '+head.slice(0,40).join(', '));\n    // MERCADO fica ACIMA de GV na hierarquia (mercado > GV > setor) — fechamento de Mercado e a regra\n    // \"GV só fecha pra GV do mesmo mercado\" dependem dela do mesmo jeito que a regra de GV depende\n    // de CD_GV, então a ausência é fatal pelo mesmo motivo.\n    const iK=['MERCADO','MERCADO REGIONAL','MKT','MARKET'].map(h=>head.indexOf(h)).find(i=>i>=0);\n    if(iK==null) throw new Error('base de municípios dominantes sem a coluna MERCADO — fechamento de GV/Mercado precisa dela. Colunas lidas: '+head.slice(0,40).join(', '));\n    // Nomes de exibição — opcionais: a hierarquia funciona só com os códigos, mas o código sozinho\n    // não diz nada pro operador escolhendo o que fechar.\n    const iDS=['DC SETOR','NOME SETOR','DESCRICAO SETOR','NM SETOR'].map(h=>head.indexOf(h)).find(i=>i>=0);\n    const iDG=['DC GV','NOME GV','DESCRICAO GV','NM GV','GV NOME'].map(h=>head.indexOf(h)).find(i=>i>=0);\n    // The UF column is what the whole keying now rests on — SQL no longer carries DS_ESTADO — so its\n    // absence is a first-class finding, not a footnote. The header actually matched is reported on the\n    // base pill, and when nothing matches the pill lists every column read, because guessing a header\n    // name from the outside costs a round trip each time.\n    const iU=['UF','SIGLA UF','SG UF','CD UF','ESTADO','DS ESTADO','SIGLA','ESTADO SIGLA','UF MUNICIPIO'].map(h=>head.indexOf(h)).find(i=>i>=0);\n    const by={},ufBy={},gvBy={},mkBySetor={},setorLabel={},gvLabel={}; let n=0,bad=0; const clash={},gvClash={},mkClash={};\n    for(let i=1;i<table.length;i++){\n      const line=table[i]; if(!line) continue;\n      const s=String(line[iS]==null?'':line[iS]).trim(), m=norm(line[iM]);\n      if(!s||!m) continue;\n      // One setor spans many rows (one per município) and every one of them repeats its CD_GV. Two\n      // DIFFERENT values for the same setor means the base itself disagrees about which gerência owns\n      // it — counted and reported, never keyed to whichever row happened to be read last.\n      const gvv=String(line[iG]==null?'':line[iG]).trim();\n      if(gvv){ if(gvBy[s]!==undefined && gvBy[s]!==gvv) gvClash[s]=true; else gvBy[s]=gvv; }\n      const mkv=String(line[iK]==null?'':line[iK]).trim();\n      if(mkv){ if(mkBySetor[s]!==undefined && mkBySetor[s]!==mkv) mkClash[s]=true; else mkBySetor[s]=mkv; }\n      if(iDS!=null){ const lbl=String(line[iDS]==null?'':line[iDS]).trim(); if(lbl && !setorLabel[s]) setorLabel[s]=lbl; }\n      if(iDG!=null && gvv){ const lbl=String(line[iDG]==null?'':line[iDG]).trim(); if(lbl && !gvLabel[gvv]) gvLabel[gvv]=lbl; }\n      const raw=(iU==null)?'':line[iU];\n      const u=(iU==null)?'':ufNorm(raw);\n      if(iU!=null && String(raw==null?'':raw).trim() && !u) bad++;\n      // The same name twice in ONE setor under two UFs is the single case the reverted SQL cannot\n      // survive: mSQL groups by DS_MUNICIPIO alone, so both municipalities arrive summed into one row\n      // and no lookup can split them again. Counted and reported — never quietly keyed to whichever\n      // UF happened to be read last.\n      const kk=s+'|'+m;\n      // An UNRESOLVED uf must never outrank a resolved one. Reading a blank/bogus UF row first wrote ''\n      // here, and the next row carrying the real sigla was then rejected as a clash — so the key stayed\n      // falsy for good, ufFor() fell through, and the município degraded to a bare NAME key that matches\n      // no shape and no dominance entry. With DISTRITO/ZONA in the base a município spans several rows,\n      // so which row lands first is pure luck. A clash is only two RESOLVED siglas that disagree.\n      if(!u){ if(ufBy[kk]===undefined) ufBy[kk]=''; }\n      else if(!ufBy[kk]) ufBy[kk]=u;\n      else if(ufBy[kk]!==u) clash[kk]=true;\n      (by[s]=by[s]||new Set()).add(u?m+'/'+u:m); n++;\n    }\n    if(!n) throw new Error('base de municípios dominantes sem linhas válidas');\n    DOM.bySetor=by; DOM.ufBySetorMuni=ufBy; DOM.rows=n; DOM.setores=Object.keys(by).length;\n    DOM.gvBySetor=gvBy; DOM.gvClashes=Object.keys(gvClash).length; DOM.gvCol=String(table[0][iG]||'').trim();\n    DOM.gvSetores=Object.keys(gvBy).length;\n    DOM.hasUf=(iU!=null); DOM.ufCol=(iU==null?null:String(table[0][iU]||'').trim());\n    DOM.badUf=bad; DOM.clashes=Object.keys(clash).length; DOM.headers=head.slice(0,40); DOM.error=null;\n    // ---- hierarquia: setor ⊂ GV ⊂ mercado, tudo derivado do MESMO csv que a regra de setor já\n    // confia — fechamento de GV/Mercado lê a mesma fonte, nunca uma segunda base paralela.\n    DOM.mercadoBySetor=mkBySetor; DOM.mercadoClashes=Object.keys(mkClash).length; DOM.mercadoCol=String(table[0][iK]||'').trim();\n    DOM.setorLabel=setorLabel; DOM.gvLabel=gvLabel;\n    const sectorsByGv={},sectorsByMercado={},gvsByMercado={},mercadoByGv={},gvMercClash={};\n    Object.keys(by).forEach(s=>{\n      const gv=gvBy[s], mk=mkBySetor[s];\n      if(gv) (sectorsByGv[gv]=sectorsByGv[gv]||new Set()).add(s);\n      if(mk) (sectorsByMercado[mk]=sectorsByMercado[mk]||new Set()).add(s);\n      if(gv&&mk){ if(mercadoByGv[gv]!==undefined && mercadoByGv[gv]!==mk) gvMercClash[gv]=true; else mercadoByGv[gv]=mk; }\n    });\n    Object.entries(mercadoByGv).forEach(([gv,mk])=>(gvsByMercado[mk]=gvsByMercado[mk]||new Set()).add(gv));\n    DOM.sectorsByGv=sectorsByGv; DOM.sectorsByMercado=sectorsByMercado; DOM.gvsByMercado=gvsByMercado;\n    DOM.mercadoByGv=mercadoByGv; DOM.gvMercadoClashes=Object.keys(gvMercClash).length;\n    return by;\n  })();\n  DOM.promise.catch(e=>{ DOM.promise=null; DOM.bySetor=null; DOM.error=e.message; renderAll(); });\n  return DOM.promise;\n}\n\nlet SESS={ snapshotRaw:null, snapshotSyncedAt:null, snapLiteral:null, eloMaxCycle:null, timeline:[], selected:0,\n           sessionId:null, sessionLabel:null, sessionsList:[], sectorsList:[], sectorBaseCache:{}, stage:'loading', dirtyFrom:null,\n           snapBusy:false, settings:{...DEFAULT_SETTINGS} };\n\nasync function q(sql){\n  let dbx,res;\n  try{\n    res=await d2.rush('AwW_11Nkg-dKksP7ic8V8').invoke({sql});\n  }catch(e){\n    throw new Error('Databricks indisponível (rush AwW_11Nkg-dKksP7ic8V8): '+e.message);\n  }\n  // The listener answers 200 with {sql} and NO `result` when its upstream probe times out: the\n  // handler builds `result: $result.data`, so an empty upstream simply drops the key rather than\n  // failing. Reading straight through to res.data.result.data reported \"Cannot read properties of\n  // undefined (reading 'data')\" — which reads like a bug in THIS component and sent a debugging\n  // session after the wrong thing. Name the layer that actually failed instead.\n  const payload=res&&res.data;\n  if(!payload) throw new Error('rush AwW_11Nkg-dKksP7ic8V8 não devolveu corpo — listener fora do ar?');\n  if(!payload.result) throw new Error('a sonda Databricks não respondeu: o listener AwW_11Nkg-dKksP7ic8V8 devolveu 200 sem `result`, o que normalmente é timeout do upstream (natura-x-app). O SQL não chegou a rodar.');\n  dbx=payload.result.data;\n  if(!dbx) throw new Error('sonda Databricks respondeu sem dados (result.data vazio).');\n  if(dbx.state && dbx.state!=='SUCCEEDED') throw new Error('Databricks '+dbx.state+': '+(dbx.error?.message||JSON.stringify(dbx.error)||'erro desconhecido'));\n  return dbx;\n}\nfunction rows(resp){const c=(resp.columns||[]).map(x=>x.name);\n  return (resp.rows||[]).map(a=>Object.fromEntries(c.map((k,i)=>[k,a[i]])));}\n// Stamps the UF onto every feature at load: the fetch is per-UF, so this is the ONLY point where a\n// shape's state is known for certain. Downstream the features are flattened into one array and the\n// origin would be unrecoverable. Persisted with the feature in saved sessions.\nasync function geoUF(uf){const code=UF_CODE[uf]||uf;const r=await fetch('https://raw.githubusercontent.com/tbrugz/geodata-br/master/geojson/geojs-'+code+'-mun.json');if(!r.ok)throw new Error('geo '+uf);\n  const g=await r.json(); const U=String(uf).toUpperCase();\n  (g.features||[]).forEach(f=>{ f.__uf=U; });\n  return g;}\n\nfunction buildAdj(features){\n  const pts=f=>{const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates],s=new Set();\n    ps.forEach(poly=>poly.forEach(ring=>ring.forEach(p=>s.add(Math.round(p[0]*1000)/1000+','+Math.round(p[1]*1000)/1000))));return s;};\n  const feat={},idx={};\n  features.forEach(f=>{const nm=mkey(f.properties.name||f.properties.NOME||f.properties.nome,f.__uf);feat[nm]={f,pts:pts(f)};});\n  for(const nm in feat) feat[nm].pts.forEach(p=>(idx[p]=idx[p]||[]).push(nm));\n  const nbrs=nm=>{const c={};feat[nm].pts.forEach(p=>idx[p].forEach(o=>{if(o!==nm)c[o]=(c[o]||0)+1;}));\n    return Object.entries(c).filter(([,n])=>n>=2).map(([o,n])=>({o,w:n}));};\n  return {feat,nbrs};\n}\nfunction centroidLL(f){let x=0,y=0,n=0;const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];\n  ps.forEach(poly=>poly[0].forEach(p=>{x+=p[0];y+=p[1];n++;}));return[x/n,y/n];}\n\n// ---------- snapshot pinning ----------\nasync function resolveSnapshotPin(){\n  const [rawR,liveCountR,eloR]=await Promise.all([\n    q(`SELECT MAX(DT_HISTORICO) snap FROM ${T} WHERE CD_PAIS=1`).then(rows),\n    q(`SELECT COUNT(*) n FROM ${T} WHERE CD_PAIS=1 AND DT_HISTORICO=(SELECT MAX(DT_HISTORICO) FROM ${T} WHERE CD_PAIS=1)`).then(rows),\n    q(`SELECT MAX(operational_cycle) mx FROM ${ELO} WHERE country_code=1`).then(rows).catch(()=>[]),\n  ]);\n  const raw=rawR[0]&&rawR[0].snap;\n  const liveCount=+((liveCountR[0]||{}).n||0);\n  const eloMax=+((eloR[0]||{}).mx||0);\n  const LIVE_SUBQ=`(SELECT MAX(DT_HISTORICO) FROM ${T} WHERE CD_PAIS=1)`;\n  const dbTs=(raw||'').replace('T',' ').replace(/Z$/,'');\n  const candidates=[`TIMESTAMP'${dbTs}'`,`'${dbTs}'`,`DATE'${dbTs}'`];\n  const tests=await Promise.all(candidates.map(c=>\n    q(`SELECT COUNT(*) n FROM ${T} WHERE CD_PAIS=1 AND DT_HISTORICO=${c}`).then(rows).then(r=>+((r[0]||{}).n||0)).catch(()=>-1)\n  ));\n  let chosen=LIVE_SUBQ;\n  for(let i=0;i<candidates.length;i++){ if(liveCount>0 && tests[i]===liveCount){ chosen=candidates[i]; break; } }\n  return {snapshotRaw:raw, snapLiteral:chosen, eloMaxCycle:eloMax, syncedAt:new Date().toISOString()};\n}\n// DISPLAY CONTRACT: the UI never prints the snapshot's own DT_HISTORICO (snapshotRaw). What the user\n// sees is `snapshotSyncedAt` — the date AND hour at which THIS instance last pulled/pinned the\n// snapshot it is querying. snapshotRaw is still resolved, still drives every SQL literal, and is\n// still persisted by saveSession/doShare; it is only kept off the screen.\nfunction fmtSyncedAt(iso){\n  if(!iso) return '—';\n  const d=new Date(iso);\n  if(isNaN(d.getTime())) return String(iso);\n  return d.toLocaleString('pt-BR',{day:'2-digit',month:'2-digit',year:'numeric',hour:'2-digit',minute:'2-digit'});\n}\nasync function ensurePinned(){\n  if(SESS.snapLiteral) return;\n  const p=await resolveSnapshotPin();\n  SESS.snapshotRaw=p.snapshotRaw; SESS.snapLiteral=p.snapLiteral; SESS.eloMaxCycle=p.eloMaxCycle;\n  SESS.snapshotSyncedAt=p.syncedAt;\n}\n\n// ---------- world-state fold ----------\nfunction accMetrics(base,add){\n  const out=base?{...base}:blankM();\n  Object.keys(blankM()).forEach(k=>{ out[k]=(out[k]||0)+((add&&add[k])||0); });\n  return out;\n}\nfunction foldWorldState(timeline,uptoIdx){\n  const closedSectors=new Set(),muniOverride={},muniGeo={},muniRow={},muniLevel={},sectorInflow={},sectorInflowLevel={},sectorOrphanRows={};\n  // GV/mercado: setores e GVs não se dissolvem quando o dono deles fecha — eles só passam a\n  // responder a um destino novo. Por isso o rastro do cascade mora numa camada PRÓPRIA\n  // (secOverride/gvOverride), separada da camada de município do fechamento de setor — a\n  // hierarquia trava a sessão num nível só, então nunca as duas camadas têm conteúdo ao mesmo tempo.\n  const closedGvs=new Set(),secOverride={},gvInflow={};\n  const closedMercados=new Set(),gvOverride={},mercadoInflow={};\n  for(let k=0;k<uptoIdx;k++){\n    const mv=timeline[k]; if(!mv||!mv.sector||!mv.munis) continue;\n    const level=mv.level||'setor';\n    if(level==='gv'){\n      closedGvs.add(String(mv.sector));\n      Object.keys(mv.munis).forEach(u=>{\n        if(u==='__OUTROS__') return;\n        const dest=mv.assign[u]; if(!dest) return;\n        secOverride[u]=String(dest);\n        gvInflow[dest]=accMetrics(gvInflow[dest],mv.munis[u]);\n      });\n      continue;\n    }\n    if(level==='mercado'){\n      closedMercados.add(String(mv.sector));\n      Object.keys(mv.munis).forEach(u=>{\n        if(u==='__OUTROS__') return;\n        const dest=mv.assign[u]; if(!dest) return;\n        gvOverride[u]=String(dest);\n        mercadoInflow[dest]=accMetrics(mercadoInflow[dest],mv.munis[u]);\n      });\n      continue;\n    }\n    closedSectors.add(String(mv.sector));\n    Object.keys(mv.munis).forEach(m=>{\n      if(m==='__OUTROS__') return;\n      const dest=mv.assign[m]; if(!dest) return;\n      muniOverride[m]=String(dest);\n      if(mv.geoFeat&&mv.geoFeat[m]) muniGeo[m]=mv.geoFeat[m];\n      const rws=(mv.matrix||[]).filter(r=>mkey(r.municipio,r.uf)===m);\n      muniRow[m]=(muniRow[m]||[]).concat(rws);\n      if(mv.levelByMuni&&mv.levelByMuni[m]) muniLevel[m]={...(muniLevel[m]||{}),...mv.levelByMuni[m]};\n      sectorInflow[dest]=accMetrics(sectorInflow[dest],mv.munis[m]);\n      const lv=(mv.levelByMuni&&mv.levelByMuni[m])||{};\n      sectorInflowLevel[dest]=sectorInflowLevel[dest]||{};\n      Object.entries(lv).forEach(([nv,c])=>{ sectorInflowLevel[dest][nv]=(sectorInflowLevel[dest][nv]||0)+c; });\n    });\n    // Orphan CBs follow their leader's home sector, so later etapas must inherit them the same way\n    // the allocated municipalities are inherited — otherwise a stage's span would not match the\n    // base carried into the next one.\n    if(mv.orphanMetricsByGroup && Object.keys(mv.orphanMetricsByGroup).length){\n      const d=computeDerived(mv);\n      d.leaders.forEach(L=>{\n        if(!L.home) return;\n        const om=mv.orphanMetricsByGroup[L.grupo];\n        if(om) sectorInflow[L.home]=accMetrics(sectorInflow[L.home],om);\n        // sectorInflow only reaches a sector while it is a DESTINATION (it lands in baseMetrics).\n        // Keep the rows as well, so the sector still carries these CBs on the day it is the one\n        // being closed — that read goes through mv.matrix, which baseMetrics never touches.\n        const orws=mv.orphanRowsByGroup&&mv.orphanRowsByGroup[L.grupo];\n        if(orws&&orws.length) sectorOrphanRows[L.home]=(sectorOrphanRows[L.home]||[]).concat(orws);\n        const ol=mv.orphanLevelByGroup&&mv.orphanLevelByGroup[L.grupo];\n        if(ol){ sectorInflowLevel[L.home]=sectorInflowLevel[L.home]||{};\n          Object.entries(ol).forEach(([nv,c])=>{ sectorInflowLevel[L.home][nv]=(sectorInflowLevel[L.home][nv]||0)+c; }); }\n      });\n    }\n  }\n  return {closedSectors,muniOverride,muniGeo,muniRow,muniLevel,sectorInflow,sectorInflowLevel,sectorOrphanRows,\n          closedGvs,secOverride,gvInflow,closedMercados,gvOverride,mercadoInflow};\n}\n\n// ---------- per-movement compute ----------\nfunction aggregateMovement(mv){\n  const level=mv.level||'setor';\n  const munis={},leaders={};\n  const exSet=new Set((mv.excludedMunis||[]).map(x=>x.muni));\n  const acc=(o,r)=>{o.cbs+=+r.cbs;o.receita+=+r.receita||0;o.rec_nat+=+r.rec_nat||0;o.rec_avon+=+r.rec_avon||0;o.pontos+=+r.pontos||0;o.pedidos+=+r.pedidos||0;o.ativas+=+r.ativas||0;};\n  // Orphans = CBs in municipalities outside the sector's dominance base. They are NOT allocated\n  // geographically; they follow their own leader's home sector. Kept per leader group so every\n  // consumer (span, cascade, impact report) can route them the same way. Só existe no nível setor —\n  // GV/mercado não têm spillover (todo setor pertence a exatamente uma GV/mercado na base).\n  mv.orphanByGroup={}; mv.orphanMetricsByGroup={}; mv.orphanRowsByGroup={};\n  // unidade que este nível redistribui: a própria município (setor fecha), o setor da linha (GV\n  // fecha), a GV do setor da linha (mercado fecha).\n  const unitOf=r=>level==='setor'?null:(level==='gv'?String(r.setor):(DOM.gvBySetor[String(r.setor)]||''));\n  mv.matrix.forEach(r=>{\n    const m=mkey(r.municipio,r.uf);\n    r._out=!mv.geoFeat[m];   // assign, never just set: absorbed rows are reused across etapas\n    const mm=level==='setor'?(r._out?'__OUTROS__':m):(unitOf(r)||'__OUTROS__');\n    munis[mm]=munis[mm]||{...blankM(),name:mm}; acc(munis[mm],r);\n    const g=String(r.grupo); leaders[g]=leaders[g]||{grupo:g,lider:r.lider,total:0,byMuni:{}};\n    leaders[g].total+=+r.cbs; leaders[g].byMuni[mm]=(leaders[g].byMuni[mm]||0)+ +r.cbs;\n    if(level==='setor' && r._out && exSet.has(m)){\n      mv.orphanByGroup[g]=(mv.orphanByGroup[g]||0)+ +r.cbs;\n      // The ROW too, not just the totals: when the leader's home sector is itself closed in a later\n      // etapa, that etapa rebuilds its matrix from SQL + absorbed municípios, and these CBs are in\n      // neither (their município never moved). Without the row they silently vanish from the sector\n      // they were just credited to — see sectorOrphanRows in foldWorldState.\n      (mv.orphanRowsByGroup[g]=mv.orphanRowsByGroup[g]||[]).push(r);\n      mv.orphanMetricsByGroup[g]=accMetrics(mv.orphanMetricsByGroup[g],\n        {cbs:+r.cbs,receita:+r.receita||0,rec_nat:+r.rec_nat||0,rec_avon:+r.rec_avon||0,pontos:+r.pontos||0,pedidos:+r.pedidos||0,ativas:+r.ativas||0});\n    }\n  });\n  // Level counts only exist per municipality, never per leader, so an excluded municipality's level\n  // mix is credited to the group holding most of its CBs (sub-threshold by definition, so usually one).\n  mv.orphanLevelByGroup={};\n  (mv.excludedMunis||[]).forEach(({muni})=>{\n    const lv=(mv.levelByMuni&&mv.levelByMuni[muni])||{}; if(!Object.keys(lv).length) return;\n    let bg=null,bc=-1;\n    mv.matrix.forEach(r=>{ if(mkey(r.municipio,r.uf)!==muni) return; const cc=+r.cbs; if(cc>bc){bc=cc;bg=String(r.grupo);} });\n    if(!bg) return;\n    mv.orphanLevelByGroup[bg]=mv.orphanLevelByGroup[bg]||{};\n    Object.entries(lv).forEach(([nv,cc])=>{ mv.orphanLevelByGroup[bg][nv]=(mv.orphanLevelByGroup[bg][nv]||0)+cc; });\n  });\n  mv.munis=munis; mv.leaders=Object.values(leaders).sort((a,b)=>b.total-a.total);\n}\nfunction autoAssignFor(mv){\n  const a={};\n  Object.keys(mv.munis).forEach(m=>{ if(m==='__OUTROS__')return;\n    const v=mv.allowed[m]||{}; const votes=Object.keys(v);\n    if(votes.length){ let best=votes[0],bw=-1; for(const s of votes) if(v[s]>bw){bw=v[s];best=s;} a[m]=best; }\n    else if(mv.dest.length){ const c=mv.muniCentroid[m]; let best=mv.dest[0],bd=Infinity;\n      for(const s of mv.dest){ const sc=mv.secCentroid[s]; if(!sc||!c)continue; const d=(c[0]-sc[0])**2+(c[1]-sc[1])**2; if(d<bd){bd=d;best=s;} }\n      a[m]=best; }\n  });\n  return a;\n}\nfunction deslocFor(mv,assign){\n  let d=0;\n  mv.leaders.forEach(L=>{const byS={};let tot=0;\n    for(const [m,c] of Object.entries(L.byMuni)){if(m==='__OUTROS__')continue;const s=assign[m];if(s){byS[s]=(byS[s]||0)+c;tot+=c;}}\n    const home=mv.dest.reduce((a,s)=>(byS[s]||0)>(byS[a]||0)?s:a,mv.dest[0]);\n    d+=tot-(byS[home]||0);});\n  return d;\n}\nfunction spanMapFor(mv,a){const inc={};mv.dest.forEach(s=>inc[s]=0);\n  Object.entries(mv.munis).forEach(([m,o])=>{if(m==='__OUTROS__')return;const s=a[m];if(s&&inc[s]!=null)inc[s]+=o.cbs;});\n  // Orphan CBs follow their leader's home sector, and that home depends on THIS candidate\n  // assignment — so they have to be counted here, or the optimizer would score and constrain a\n  // span that differs from the one the UI shows. Skipped entirely when there are no orphans.\n  if(mv.orphanByGroup&&Object.keys(mv.orphanByGroup).length){\n    mv.leaders.forEach(L=>{\n      const orphan=mv.orphanByGroup[L.grupo]||0; if(!orphan) return;\n      const byS={}; let tot=0;\n      for(const [m,c] of Object.entries(L.byMuni)){ if(m==='__OUTROS__') continue; const s=a[m]; if(s&&inc[s]!=null){ byS[s]=(byS[s]||0)+c; tot+=c; } }\n      if(!tot) return;   // no home to follow -> stranded, counted nowhere\n      const home=mv.dest.reduce((x,s)=>(byS[s]||0)>(byS[x]||0)?s:x,mv.dest[0]);\n      if(inc[home]!=null) inc[home]+=orphan;\n    });\n  }\n  const sp={};mv.dest.forEach(s=>sp[s]=(+(mv.baseMetrics[s]?.cbs||0))+inc[s]);return sp;}\nfunction maxSpanOfFor(mv,a){return Math.max(...Object.values(spanMapFor(mv,a)),0);}\nfunction spanLimits(mv){\n  // Span alvo/máximo/mínimo é uma regra de fechamento de SETOR (tamanho ideal de território) —\n  // GV/mercado não têm essa noção e ignoram qualquer valor configurado nas opções da sessão.\n  if(mv && (mv.level||'setor')!=='setor') return {target:null,max:null,min:null};\n  const st={...DEFAULT_SETTINGS,...(SESS.settings||{})};\n  return {target:numOrNull(st.targetSpan),max:numOrNull(st.maxSpan),min:numOrNull(st.minSpan)};}\nfunction spanLimitsOn(lim){return !!(lim.target||lim.max||lim.min);}\nfunction spanViolationsOf(sp,lim){const over=[],under=[];\n  Object.entries(sp).forEach(([s,v])=>{ if(lim.max&&v>lim.max)over.push(s); if(lim.min&&v<lim.min)under.push(s); });\n  return {over,under};}\nfunction spanViolationsFor(mv,a){return spanViolationsOf(spanMapFor(mv,a),spanLimits(mv));}\n// With a target span the objective becomes RMS distance from the ideal size (punishes too big AND\n// too small). With no target we keep the legacy objective: shave the biggest sector.\nfunction spanCostFor(mv,a){const lim=spanLimits(mv),vals=Object.values(spanMapFor(mv,a));\n  if(!vals.length) return 0;\n  if(lim.target) return Math.sqrt(vals.reduce((s,v)=>s+(v-lim.target)**2,0)/vals.length);\n  return Math.max(...vals);}\n// ---------- ÓTIMO: objetivo multi-critério ----------\n// Three normalised objectives, each 0..1, so the weights below are directly comparable. The old\n// score added a span cost measured in CBs to a desloc measured in CBs, so on a large sector the\n// balance term was numerically ~100x the desloc term and silently decided everything on its own.\n//   balance — RMS spread of the resulting spans (against the target span when one is set,\n//             otherwise against their own mean), over that reference. 0 = every destination\n//             sector ends up the same size.\n//   dist    — how far each município travels, CB-weighted: half from the share of its outer\n//             border that faces the sector it was given to, half from centroid distance. 0 =\n//             every município went to a sector it physically touches. Adjacency used to be a\n//             pure yes/no constraint (contiguity); this is what makes it a preference too.\n//   orphan  — stranded orphan CBs (leader left without a home sector, so they land nowhere at\n//             all) plus CBs split away from their leader's home, over the CBs at stake.\n//             Stranded ones count OPT_STRAND_K times: a stranded CB leaves the model entirely,\n//             a deslocated one merely changes hands.\nconst OPT_W={balance:1, dist:0.85, orphan:1};\nconst OPT_STRAND_K=3;\nconst OPT_SIMS=24;             // simultaneous simulations per run, scaled down on big stages\nconst OPT_PASSES=14;           // local-search sweeps inside one simulation\nconst OPT_EVAL_BUDGET=120000;  // total candidate evaluations across the whole portfolio\nconst OPT_EXHAUSTIVE_MAX=60000;\nfunction optDistPrep(mv){\n  let mx=0;\n  Object.keys(mv.munis).forEach(m=>{ if(m==='__OUTROS__') return; const c=mv.muniCentroid[m]; if(!c) return;\n    mv.dest.forEach(s=>{ const sc=mv.secCentroid[s]; if(!sc) return;\n      const d=Math.hypot(c[0]-sc[0],c[1]-sc[1]); if(d>mx) mx=d; }); });\n  return mx||1;\n}\nfunction optDistCost(mv,m,s,dmax){\n  const v=mv.allowed[m]||{}; let tot=0; for(const k in v) tot+=v[k];\n  const share=tot?((v[s]||0)/tot):0;\n  const c=mv.muniCentroid[m], sc=mv.secCentroid[s];\n  // Missing centroid on either side is neutral (0.5), never 0 — an unmeasurable move must not\n  // score as the cheapest one on the board.\n  const geo=(c&&sc)?Math.min(1,Math.hypot(c[0]-sc[0],c[1]-sc[1])/dmax):0.5;\n  return 0.5*(1-share)+0.5*geo;\n}\nfunction optEval(mv,a,dmax){\n  const lim=spanLimits(mv);\n  const sp=spanMapFor(mv,a), vals=Object.values(sp);\n  let balance=0;\n  if(vals.length){\n    const ref=lim.target||(vals.reduce((x,y)=>x+y,0)/vals.length);\n    if(ref) balance=Math.min(1,Math.sqrt(vals.reduce((s,v)=>s+(v-ref)**2,0)/vals.length)/ref);\n  }\n  let cbs=0,dist=0;\n  for(const m in a){ const o=mv.munis[m]; if(!o) continue; const w=+o.cbs||0; cbs+=w; dist+=w*optDistCost(mv,m,a[m],dmax); }\n  dist=cbs?(dist/cbs):0;\n  let stranded=0,desloc=0,tot=0;\n  mv.leaders.forEach(L=>{\n    const byS={}; let t=0;\n    for(const [m,c] of Object.entries(L.byMuni)){ if(m==='__OUTROS__') continue; const s=a[m]; if(s){ byS[s]=(byS[s]||0)+c; t+=c; } }\n    const orphan=(mv.orphanByGroup&&mv.orphanByGroup[L.grupo])||0;\n    tot+=t+orphan;\n    if(!t){ stranded+=orphan; return; }   // no allocated CBs -> no home -> these orphans land nowhere\n    const home=mv.dest.reduce((x,s)=>(byS[s]||0)>(byS[x]||0)?s:x,mv.dest[0]);\n    desloc+=t-(byS[home]||0);\n  });\n  const orphanTerm=tot?Math.min(1,(desloc+OPT_STRAND_K*stranded)/tot):0;\n  return { cost:OPT_W.balance*balance+OPT_W.dist*dist+OPT_W.orphan*orphanTerm,\n           balance, dist, desloc, stranded, sp, viol:spanViolationsOf(sp,lim) };\n}\nfunction optScoreFor(mv,a){ return optEval(mv,a,mv.__optDmax||optDistPrep(mv)).cost; }\n// Seeded PRNG on purpose. computeMovement runs the optimizer for EVERY stage and recomputeFrom\n// re-runs every stage downstream of an edit, so a Math.random() portfolio would hand back a\n// different allocation on each pass and a saved timeline would never reproduce.\nfunction optRng(seed){ let a=seed>>>0;\n  return ()=>{ a=(a+0x6D2B79F5)>>>0; let t=Math.imul(a^(a>>>15),1|a);\n    t=(t+Math.imul(t^(t>>>7),61|t))^t; return ((t^(t>>>14))>>>0)/4294967296; }; }\nfunction optSeed(mv,ms){ let h=2166136261>>>0;\n  const s=String(mv.sector)+'|'+ms.join(',')+'|'+mv.dest.join(',');\n  for(let i=0;i<s.length;i++) h=Math.imul(h^s.charCodeAt(i),16777619);\n  return h>>>0; }\nfunction contigBadFor(mv,assign){\n  // Contiguidade geográfica só faz sentido no grão de município (setor fechando): setores e GVs\n  // não precisam formar uma mancha contínua quando GV/mercado fecha — cada setor/GV vai pro destino\n  // que faz sentido pra ele, sem exigir que o conjunto redistribuído continue \"grudado\".\n  if((mv.level||'setor')!=='setor') return [];\n  const bySec={}; for(const m in assign){(bySec[assign[m]]=bySec[assign[m]]||[]).push(m);}\n  const bad=[];\n  for(const s in bySec){const grp=bySec[s],inGrp=new Set(grp);\n    const seeds=grp.filter(m=>(mv.allowed[m]||{})[s]);\n    if(!seeds.length){bad.push(s);continue;}\n    const seen=new Set(seeds),st=[...seeds];\n    while(st.length){const m=st.pop();(mv.closeAdj[m]||[]).forEach(o=>{if(inGrp.has(o)&&!seen.has(o)){seen.add(o);st.push(o);}});}\n    if(seen.size!==grp.length)bad.push(s);}\n  return bad;\n}\nfunction greedyFor(mv,ms,opts){const lim=spanLimits(mv);const a={};\n  ms.forEach((m,i)=>{let best=opts[i][0],bd=Infinity;\n    for(const s of opts[i]){a[m]=s;\n      // over-max only grows as we keep assigning, so it is safe to penalise mid-build;\n      // under-min shrinks, so penalising it here would just chase noise.\n      const over=lim.max?spanViolationsOf(spanMapFor(mv,a),{max:lim.max,min:null}).over.length:0;\n      const d=optScoreFor(mv,a)+(contigBadFor(mv,a).length?1e9:0)+over*1e6;\n      if(d<bd){bd=d;best=s;}}\n    a[m]=best;});\n  return a;}\nfunction optimizeFor(mv){\n  const ms=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__');\n  if(!ms.length||!mv.dest.length){ mv.optBadge=mv.dest.length?'':'sem setor destino identificado'; return {}; }\n  const opts=ms.map(m=>{const al=(mv.reachable[m]&&mv.reachable[m].length)?mv.reachable[m]:mv.dest.slice();return al.length?al:mv.dest.slice();});\n  const combos=opts.reduce((a,o)=>a*o.length,1);\n  const lim=spanLimits(mv);\n  const dmax=optDistPrep(mv); mv.__optDmax=dmax;\n\n  // Feasibility ladder — same meaning as before, because renderSpanRule and the saved sessions\n  // both read mv.optTier: 0 = contíguo + max + min span, 1 = contíguo + max span, 2 = contíguo\n  // only. Every candidate any simulation produces is offered to all three tiers; we ship the\n  // strictest tier that got a solution, so an unreachable min/max relaxes loudly instead of\n  // stranding the stage with nothing.\n  const tier=[null,null,null],tSc=[Infinity,Infinity,Infinity],tEv=[null,null,null];\n  let feasible=0,evals=0;\n  const offer=(a,ev)=>{\n    if(contigBadFor(mv,a).length) return false;\n    feasible++;\n    const put=t=>{ if(ev.cost<tSc[t]){ tSc[t]=ev.cost; tier[t]={...a}; tEv[t]=ev; } };\n    put(2);\n    if(!ev.viol.over.length){ put(1); if(!ev.viol.under.length) put(0); }\n    return true;\n  };\n  const evalOf=a=>{ evals++; return optEval(mv,a,dmax); };\n\n  // Small enough to settle the question outright: enumerate every contiguous allocation and the\n  // winner is provably the best one under this objective. No search needed, so none is run.\n  const exhaustive=combos<=OPT_EXHAUSTIVE_MAX;\n  let sims=0;\n  if(exhaustive){\n    const cur={};\n    const rec=i=>{ if(i===ms.length){ offer(cur,evalOf(cur)); return; }\n      for(const s of opts[i]){ cur[ms[i]]=s; rec(i+1); } };\n    rec(0);\n  } else {\n    // Too big to enumerate, so run a portfolio of independent simulations instead. Each one is a\n    // seed assignment, then hill-climbing on single-município reassignments, then one perturbation\n    // and another climb to escape whatever local optimum it settled into. Different seeds land in\n    // different basins; the ladder above keeps the best across all of them.\n    const improve=a=>{\n      let ev=evalOf(a); offer(a,ev);\n      for(let pass=0;pass<OPT_PASSES;pass++){\n        let moved=false;\n        for(let i=0;i<ms.length;i++){\n          const m=ms[i],cur=a[m]; let best=cur,bev=ev;\n          for(const s of opts[i]){\n            if(s===cur) continue;\n            a[m]=s;\n            const e=evalOf(a);\n            // contiguity is a hard constraint, and the cheaper test runs first on purpose\n            if(e.cost<bev.cost-1e-12 && !contigBadFor(mv,a).length){ best=s; bev=e; }\n          }\n          a[m]=best;\n          if(best!==cur){ ev=bev; moved=true; offer(a,ev); }\n        }\n        if(!moved) break;\n      }\n    };\n    const rng=optRng(optSeed(mv,ms));\n    const perSim=Math.max(1,ms.length*Math.max(1,mv.dest.length)*OPT_PASSES);\n    const budget=Math.max(4,Math.min(OPT_SIMS,Math.floor(OPT_EVAL_BUDGET/perSim)||4));\n    const seeds=[];\n    if(mv.assign&&ms.every(m=>mv.assign[m])) seeds.push({...mv.assign});   // never regress on what is already on screen\n    seeds.push(autoAssignFor(mv));                                        // adjacency-first seed\n    seeds.push(greedyFor(mv,ms,opts));                                    // balance-first seed\n    while(seeds.length<budget){\n      // randomised construction biased toward nearby sectors — the bias keeps each seed sane, the\n      // randomness is what sends the runs into different basins\n      const a={};\n      ms.forEach((m,i)=>{ let bs=opts[i][0],bw=-Infinity;\n        for(const s of opts[i]){ const w=(1-optDistCost(mv,m,s,dmax))+rng()*0.9; if(w>bw){bw=w;bs=s;} }\n        a[m]=bs; });\n      seeds.push(a);\n    }\n    seeds.forEach(seed=>{\n      const a={...seed};\n      // a restored or legacy assign can still name a sector this stage no longer offers\n      ms.forEach((m,i)=>{ if(!opts[i].includes(a[m])) a[m]=opts[i][0]; });\n      improve(a);\n      const kick=Math.max(1,Math.round(ms.length*0.25));\n      for(let k=0;k<kick;k++){ const i=Math.floor(rng()*ms.length); a[ms[i]]=opts[i][Math.floor(rng()*opts[i].length)]; }\n      improve(a);\n    });\n    sims=seeds.length;\n  }\n\n  const t=tier.findIndex(x=>x);\n  if(t<0){ mv.optTier=-1; mv.optBadge='sem solução conectada — heurística'; return greedyFor(mv,ms,opts); }\n  const best=tier[t], ev=tEv[t]; mv.optTier=t;\n  const relax=[];\n  if(t>0 && lim.min) relax.push('span mínimo '+fmt(lim.min));\n  if(t>1 && lim.max) relax.push('span máximo '+fmt(lim.max));\n  mv.optStats={balance:ev.balance,dist:ev.dist,desloc:ev.desloc,stranded:ev.stranded,sims,evals,feasible,combos,exhaustive};\n  mv.optBadge=`ótimo · ${exhaustive?`espaço completo (${fmt(combos)})`:`${fmt(sims)} simulações`}`\n    +` · equilíbrio ±${Math.round(ev.balance*100)}% · adjacência ${Math.round((1-ev.dist)*100)}%`\n    +` · quebra ${fmt(ev.desloc)} CBs · ${fmt(ev.stranded)} fora do setor sem destino`\n    +` · pico ${fmt(maxSpanOfFor(mv,best))} CBs`\n    +(lim.target?` · alvo ${fmt(lim.target)}`:'')\n    +(relax.length?` · ⚠ inatingível: ${relax.join(' + ')}`:(spanLimitsOn(lim)?' · limites ok':''));\n  return best;\n}\nfunction computeDerived(mv){\n  const inc={},gained={},orph={};mv.dest.forEach(s=>{inc[s]=0;gained[s]=0;orph[s]=0;});\n  Object.entries(mv.munis).forEach(([m,o])=>{if(m==='__OUTROS__')return;const s=mv.assign[m];if(s&&inc[s]!=null)inc[s]+=o.cbs;});\n  let desloc=0,orphanTotal=0,orphanStranded=0;\n  const L2=mv.leaders.map(L=>{const byS={};mv.dest.forEach(s=>byS[s]=0);let tot=0;\n    for(const [m,c] of Object.entries(L.byMuni)){if(m==='__OUTROS__')continue;const s=mv.assign[m];if(s&&byS[s]!=null){byS[s]+=c;tot+=c;}}\n    // no allocated CBs => no home. Picking dest[0] by default would silently dump this leader's\n    // orphan CBs into an arbitrary sector, so we leave it null and report them as stranded.\n    const home=(tot>0&&mv.dest.length)?mv.dest.reduce((a,s)=>byS[s]>byS[a]?s:a,mv.dest[0]):null;\n    const dl=tot-(home?byS[home]:0);desloc+=dl;if(home)gained[home]++;\n    const orphan=(mv.orphanByGroup&&mv.orphanByGroup[L.grupo])||0;\n    orphanTotal+=orphan;\n    if(orphan){ if(home&&orph[home]!=null) orph[home]+=orphan; else orphanStranded+=orphan; }\n    return {...L,byS,home,desloc:dl,assignedTotal:tot,orphan,orphanHome:(orphan&&home)?home:null};});\n  const span={};mv.dest.forEach(s=>span[s]=(+(mv.baseMetrics[s]?.cbs||0))+inc[s]+orph[s]);\n  return {inc,gained,desloc,leaders:L2,span,orph,orphanTotal,orphanStranded};\n}\n\nasync function computeMovement(code,level,world){\n  level=level||'setor';\n  code=String(code);\n  const mv={sector:code,level,policy:'fora',view:'tobe',selMuni:null,optBadge:''};\n  const SNAP=SESS.snapLiteral;\n  // GV/mercado precisam da base ANTES de montar a query (pra saber quais CD_SETOR entram no IN);\n  // setor não precisa — mantém o timing original (a query dispara sem esperar o CSV).\n  let domBase=level==='setor'?null:await ensureDominantes();\n  const memberSectors=level==='setor'?[code]:memberSectorsOf(level,code,world);\n  if(!memberSectors.length) throw new Error(`${LEVELS[level].label} ${code} não existe na base de municípios dominantes (CSV) — atualize a base antes de fechar`);\n  const secList=memberSectors.join(',');\n\n  const mSQL=`SELECT DS_MUNICIPIO municipio, CD_SETOR setor, CD_GRUPO grupo, MAX(DS_LEADER_NAME) lider,\n     COUNT(DISTINCT CD_CONSULTORA) cbs, ROUND(SUM(VL_PEDIDOS_CICLO),0) receita,\n     ROUND(SUM(VL_PEDIDOS_NATURA_CICLO),0) rec_nat, ROUND(SUM(VL_PEDIDOS_AVON_CICLO),0) rec_avon,\n     ROUND(SUM(QT_PONTOS_CICLO),0) pontos, ROUND(SUM(QT_PEDIDOS_CICLO),0) pedidos,\n     SUM(CASE WHEN ST_FEZ_PED_CICLO_ATUAL THEN 1 ELSE 0 END) ativas\n    FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR IN (${secList}) AND DT_HISTORICO=${SNAP}\n    GROUP BY DS_MUNICIPIO, CD_SETOR, CD_GRUPO`;\n  const ufSQL=`SELECT DS_ESTADO uf, COUNT(*) n FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR IN (${secList}) AND DT_HISTORICO=${SNAP} GROUP BY DS_ESTADO ORDER BY n DESC`;\n  const trendSQL=`SELECT operational_cycle ciclo, COUNT(DISTINCT person_code) cbs,\n     COUNT(DISTINCT CASE WHEN registered_bc_ind=1 THEN person_code END) ativas,\n     ROUND(SUM(revenue_nat_ss_amt),0) receita, ROUND(SUM(points_nat_ss_amt),0) pontos\n    FROM ${ELO} WHERE country_code=1 AND sector_code IN (${secList}) AND operational_cycle<=${SESS.eloMaxCycle||999999} GROUP BY operational_cycle ORDER BY operational_cycle DESC LIMIT 8`;\n  const lvlSQL=`SELECT DS_NVL_PLAN_CRESC nivel, COUNT(DISTINCT CD_CONSULTORA) cbs,\n     ROUND(SUM(VL_PEDIDOS_NATURA_CICLO),0) rec_nat, ROUND(SUM(VL_PEDIDOS_AVON_CICLO),0) rec_avon\n    FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR IN (${secList}) AND DS_NVL_PLAN_CRESC IS NOT NULL AND DT_HISTORICO=${SNAP} GROUP BY DS_NVL_PLAN_CRESC ORDER BY cbs DESC`;\n  const lvlMuniSQL=`SELECT DS_MUNICIPIO municipio, CD_SETOR setor, DS_NVL_PLAN_CRESC nivel, COUNT(DISTINCT CD_CONSULTORA) cbs\n    FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR IN (${secList}) AND DS_NVL_PLAN_CRESC IS NOT NULL AND DT_HISTORICO=${SNAP} GROUP BY DS_MUNICIPIO, CD_SETOR, DS_NVL_PLAN_CRESC`;\n  const [mR,ufR,tR,lR,lmR]=await Promise.all([q(mSQL),q(ufSQL),q(trendSQL),q(lvlSQL),q(lvlMuniSQL)]);\n\n  const ownMatrix=rows(mR).filter(r=>+r.cbs>0);\n  mv.pureOwnMetrics=blankM();\n  ownMatrix.forEach(r=>{ mv.pureOwnMetrics.cbs+=+r.cbs; mv.pureOwnMetrics.receita+=+r.receita||0; mv.pureOwnMetrics.rec_nat+=+r.rec_nat||0; mv.pureOwnMetrics.rec_avon+=+r.rec_avon||0; mv.pureOwnMetrics.pontos+=+r.pontos||0; mv.pureOwnMetrics.pedidos+=+r.pedidos||0; mv.pureOwnMetrics.ativas+=+r.ativas||0; });\n\n  mv.levelByMuni={};\n  if(level==='setor') Object.entries(world.muniLevel||{}).forEach(([m,lv])=>{ if(world.muniOverride[m]===code) mv.levelByMuni[m]={...lv}; });\n\n  mv.trend=rows(tR).map(r=>({...r,cbs:+r.cbs,ativas:+r.ativas,receita:+r.receita,pontos:+r.pontos})).filter(r=>r.cbs>10).reverse();\n  mv.levels=rows(lR);\n\n  let absorbedRows=[],inheritedOrphanRows=[];\n  if(level==='setor'){\n    Object.entries(world.muniOverride).forEach(([m,destSec])=>{ if(destSec===code && world.muniRow[m]) absorbedRows.push(...world.muniRow[m]); });\n    inheritedOrphanRows=(world.sectorOrphanRows&&world.sectorOrphanRows[code])||[];\n  }\n  mv.matrix=ownMatrix.concat(absorbedRows,inheritedOrphanRows);\n\n  const ufList=rows(ufR).map(r=>r.uf).filter(Boolean);\n  const domUF=ufList[0]||'PR';\n  mv.domUF=domUF;\n  domBase=domBase||await ensureDominantes();\n  // Uma GV ou mercado pode espalhar por mais UFs do que \"a UF dominante + suas vizinhas\" cobre —\n  // toda UF que aparece na base de dominantes de QUALQUER setor-membro entra na janela de shapes.\n  const memberUFs=new Set([domUF]);\n  memberSectors.forEach(s=>{ (domBase[String(s)]||new Set()).forEach(entry=>{ const u=mUf(entry); if(u) memberUFs.add(u); }); });\n  const ufSet=new Set(memberUFs);\n  memberUFs.forEach(u=>(UF_BORDERS[u]||[]).forEach(b=>ufSet.add(b)));\n  const geos=await Promise.all([...ufSet].map(u=>geoUF(u).catch(()=>null)));\n  const allFeat=geos.filter(Boolean).flatMap(g=>g.features);\n  const adj=buildAdj(allFeat);\n\n  // A UF só vem da base de dominantes (setor real da linha × município), nunca de \"esse nome só\n  // apareceu numa UF carregada\" ou de um chute pra UF dominante do fechamento inteiro. Os dois\n  // eram seguros quando só 1-3 UFs entravam na janela (fechamento de setor); GV e principalmente\n  // mercado carregam dezenas de UFs de uma vez, então \"único entre as UFs carregadas\" deixa de\n  // significar \"único no Brasil\" — era exatamente esse chute que colocava um homônimo de outra UF\n  // espalhado longe do resto do mapa. Sem entrada na base, o município fica sem UF (mesmo\n  // tratamento de \"sem shape\" que já existe) em vez de arriscar aparecer no lugar errado.\n  const ufGuessed={};\n  const ufFor=(setorOf,muni)=>{const nm=norm(muni);\n    return (DOM.ufBySetorMuni&&DOM.ufBySetorMuni[String(setorOf)+'|'+nm])||'';};\n  mv.matrix.forEach(r=>{ if(!r.uf) r.uf=ufFor(r.setor,r.municipio); });\n  rows(lmR).forEach(r=>{ const k=mkey(r.municipio,ufFor(r.setor,r.municipio)); (mv.levelByMuni[k]=mv.levelByMuni[k]||{})[r.nivel]=+r.cbs; });\n\n  const totBy={}; mv.matrix.forEach(r=>{const n=mkey(r.municipio,r.uf); totBy[n]=(totBy[n]||0)+ +r.cbs;});\n  const footprint=new Set(Object.entries(totBy).filter(([,c])=>c>0).map(([m])=>m));\n  const withShape=[...footprint].filter(n=>adj.feat[n]||world.muniGeo[n]);\n  mv.cbsByMuni={...totBy}; mv.shapeMunis=withShape.slice();\n  mv.noShapeMunis=[...footprint].filter(n=>!(adj.feat[n]||world.muniGeo[n])).map(n=>({muni:n,cbs:totBy[n]||0})).sort((a,b)=>b.cbs-a.cbs);\n  mv.noShapeCbs=mv.noShapeMunis.reduce((a,x)=>a+x.cbs,0);\n\n  // ---- RULE: quais municípios pertencem a este fechamento ----\n  // setor: exatamente a regra de hoje. GV/mercado: união da base de TODOS os setores-membro — a\n  // base já garante que um setor pertence a uma única GV/mercado, então não existe aqui o spillover\n  // fuzzy que município tem contra setor (por isso o orphan-handling abaixo é pulado nesses níveis).\n  let domOwn;\n  if(level==='setor'){\n    domOwn=domBase[code]||new Set();\n  } else {\n    domOwn=new Set();\n    memberSectors.forEach(s=>(domBase[String(s)]||new Set()).forEach(n=>domOwn.add(n)));\n  }\n  const inherited=level==='setor'?new Set(Object.keys(world.muniOverride||{}).filter(m=>world.muniOverride[m]===code)):new Set();\n  if(!domOwn.size && !inherited.size) throw new Error(`${LEVELS[level].label} ${code} não existe na base de municípios dominantes (CSV) — atualize a base antes de fechar`);\n  const belongs=n=>domOwn.has(n)||(!DOM.hasUf&&domOwn.has(mName(n)))||inherited.has(n);\n  mv.domCsvMunis=domOwn.size;\n  const dropped=level==='setor'?withShape.filter(n=>!belongs(n)):[];\n  if(withShape.length && dropped.length===withShape.length) throw new Error(`${LEVELS[level].label} ${code}: nenhum dos municípios com CBs está na base de dominantes — nada pra realocar`);\n  const droppedSet=new Set(dropped);\n  mv.excludedMunis=dropped.map(n=>({muni:n,cbs:totBy[n]||0})).sort((a,b)=>b.cbs-a.cbs);\n  mv.excludedCbs=dropped.reduce((a,n)=>a+(totBy[n]||0),0);\n\n  const closingNames=withShape.filter(n=>!droppedSet.has(n));\n  const closingSet=new Set(closingNames);\n  mv.geoFeat={}; closingNames.forEach(n=>{ mv.geoFeat[n]=(adj.feat[n]&&adj.feat[n].f)||world.muniGeo[n]; });\n\n  // ---- unidade de realocação: a geometria é sempre município; a UNIDADE que troca de dono é o\n  // próprio município (setor fecha), o setor inteiro (GV fecha) ou a GV inteira (mercado fecha).\n  const municipioSetor={}; mv.matrix.forEach(r=>{ const n=mkey(r.municipio,r.uf); if(!municipioSetor[n]) municipioSetor[n]=String(r.setor); });\n  const resolveUnit=n=>{\n    if(level==='setor') return n;\n    const sOf=municipioSetor[n]; if(!sOf) return '';\n    return level==='gv'?sOf:(DOM.gvBySetor[sOf]||'');\n  };\n  mv.unitOfMuni={}; closingNames.forEach(n=>{ mv.unitOfMuni[n]=resolveUnit(n); });\n  mv.unitMunis={}; closingNames.forEach(n=>{ const u=mv.unitOfMuni[n]; if(!u) return; (mv.unitMunis[u]=mv.unitMunis[u]||[]).push(n); });\n  const units=level==='setor'?closingNames:Object.keys(mv.unitMunis);\n\n  const drawnCsv=new Set(closingNames.map(n=>DOM.hasUf?n:mName(n)));\n  const footKeyOf=k=>DOM.hasUf?(footprint.has(k)?k:null):([...footprint].find(x=>mName(x)===k)||null);\n  mv.csvMunisTotal=domOwn.size;\n  mv.ufGuessed={...ufGuessed};\n  if(level==='setor'){\n    mv.missingMunis=[...domOwn].filter(k=>!drawnCsv.has(k)).map(k=>{\n      const fk=footKeyOf(k);\n      const hasShape=!!(adj.feat[fk||k]||world.muniGeo[fk||k]);\n      const alias=[...footprint].filter(x=>x!==k&&mName(x)===mName(k));\n      let reason;\n      if(!fk&&alias.length) reason=`UF divergente — as CBs entraram na chave ${alias.join(' / ')} e a base diz ${k}`;\n      else if(!fk) reason=hasShape?'sem CBs neste setor no snapshot — desenhado como vizinho':'sem CBs neste setor no snapshot';\n      else if(!hasShape) reason='sem shape nas UFs carregadas';\n      else reason='chave não casou com a base de dominantes';\n      return {muni:k,cbs:(fk?totBy[fk]:alias.reduce((a,x)=>a+(totBy[x]||0),0))||0,reason:reason};\n    });\n  } else {\n    mv.missingMunis=[];\n  }\n\n  // ---- HARD RULE: destino tem de compartilhar a fronteira certa acima do que está fechando ----\n  // setor → mesma GV; GV → mesmo mercado; mercado → nada acima, qualquer vizinho vale.\n  const ownParent=parentOf(level,code);\n  if(level!=='mercado' && !ownParent) throw new Error(`${LEVELS[level].label} ${code} não tem ${level==='setor'?'CD_GV':'MERCADO'} na base de municípios dominantes — sem essa fronteira não há como garantir que os destinos ficam do lado certo da hierarquia`);\n  const sameParent=destCode=>!ownParent||parentOf(level,destCode)===ownParent;\n  mv.gv=ownParent;\n  const alreadyClosed=destCode=>level==='setor'?world.closedSectors.has(destCode):(level==='gv'?(world.closedGvs||new Set()).has(destCode):(world.closedMercados||new Set()).has(destCode));\n\n  const destRule=(SESS.settings&&SESS.settings.destRule)||DEFAULT_SETTINGS.destRule;\n  const destMinCbs=Math.max(1,Math.round(+((SESS.settings||{}).destMinCbs)||DEFAULT_SETTINGS.destMinCbs));\n  mv.destRule=destRule; mv.destMinCbs=destMinCbs; mv.destRuleFallback=false;\n  mv.allowed={}; mv.allowedRaw={};\n  units.forEach(u=>{ mv.allowed[u]={}; mv.allowedRaw[u]={}; });\n\n  const extVotes={}; const nbrNames=new Set(); let domSecOf={};\n  if(level==='setor'){\n    // setor: destino descoberto por ADJACÊNCIA GEOGRÁFICA de município — uma query ao vivo por\n    // vizinho, mas o perímetro de UM setor é pequeno o bastante pra valer a pena.\n    closingNames.forEach(n=>{\n      if(!adj.feat[n]) return;\n      adj.nbrs(n).forEach(({o,w})=>{ if(!closingSet.has(o) && !droppedSet.has(o)){ nbrNames.add(o); (extVotes[n]=extVotes[n]||[]).push({o,w}); } });\n    });\n    let neigh=[];\n    if(nbrNames.size){\n      const inList=[...new Set([...nbrNames].map(n=>mName(n)))].map(n=>`'${n.replace(/'/g,\"''\")}'`).join(',');\n      const nSQL=`SELECT DS_MUNICIPIO municipio, CD_SETOR setor, COUNT(DISTINCT CD_CONSULTORA) cbs\n        FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR NOT IN (${secList}) AND CD_SETOR>0 AND DT_HISTORICO=${SNAP} AND DS_MUNICIPIO IN (${inList}) GROUP BY DS_MUNICIPIO, CD_SETOR`;\n      neigh=rows(await q(nSQL));\n    }\n    neigh.forEach(r=>{ if(!r.uf) r.uf=ufFor(r.setor,r.municipio); });\n    const byM={}; neigh.forEach(r=>{const m=mkey(r.municipio,r.uf); if(!nbrNames.has(m)) return; (byM[m]=byM[m]||[]).push(r);});\n    Object.entries(byM).forEach(([m,rs])=>{ rs.sort((a,b)=>+b.cbs-+a.cbs); domSecOf[m]=String(rs[0].setor); });\n    nbrNames.forEach(n=>{ if(world.muniOverride && world.muniOverride[n]) domSecOf[n]=world.muniOverride[n]; });\n\n    mv.nbrCurrentSector={};\n    mv.gvRejected=[];\n    const gvHidden=new Set();\n    nbrNames.forEach(n=>{\n      const destCode=destUnitOfSector(level,domSecOf[n],world);\n      if(destCode && !sameParent(destCode)){ gvHidden.add(n); if(mv.gvRejected.indexOf(destCode)<0) mv.gvRejected.push(destCode); return; }\n      if(domSecOf[n]) mv.nbrCurrentSector[n]=destCode;\n    });\n    gvHidden.forEach(n=>{ nbrNames.delete(n); delete domSecOf[n]; delete mv.nbrCurrentSector[n]; });\n    Object.keys(extVotes).forEach(n=>{ extVotes[n]=extVotes[n].filter(v=>!gvHidden.has(v.o)); });\n\n    const isBridge=n=>destRule!=='dominant'||(totBy[n]||0)>=destMinCbs;\n    mv.bridgeMunis=closingNames.filter(isBridge);\n    mv.ignoredBridges=closingNames.filter(n=>!isBridge(n));\n\n    const wAny={}, wDom={};\n    closingNames.forEach(n=>{\n      const u=n;\n      if(!mv.allowed[u]) return;\n      const bridge=isBridge(n);\n      (extVotes[n]||[]).forEach(({o,w})=>{\n        const destCode=mv.nbrCurrentSector[o];\n        if(!destCode || destCode===code || alreadyClosed(destCode)) return;\n        mv.allowed[u][destCode]=(mv.allowed[u][destCode]||0)+w;\n        mv.allowedRaw[u][destCode]=(mv.allowedRaw[u][destCode]||0)+w;\n        wAny[destCode]=(wAny[destCode]||0)+w;\n        if(bridge) wDom[destCode]=(wDom[destCode]||0)+w;\n      });\n    });\n    let secWeight=wAny;\n    if(destRule==='dominant'){\n      if(Object.keys(wDom).length) secWeight=wDom;\n      else { secWeight=wAny; mv.destRuleFallback=true; }\n    }\n    mv.dest=Object.keys(secWeight).sort((a,b)=>secWeight[b]-secWeight[a]).slice(0,6);\n    if(!mv.dest.length){\n      mv.dest=[...new Set(Object.values(mv.nbrCurrentSector))].filter(destCode=>destCode&&destCode!==code&&!alreadyClosed(destCode)&&sameParent(destCode)).slice(0,6);\n      units.forEach(u=>{ if(mv.allowed[u]&&!Object.keys(mv.allowed[u]).length){ mv.dest.forEach(destCode=>mv.allowed[u][destCode]=1); } });\n    }\n  } else {\n    // GV/mercado: destino é SEMPRE todo irmão válido na hierarquia — NUNCA descoberto por\n    // adjacência geográfica de município. Uma GV/mercado pode ter território espalhado por\n    // dezenas de UFs sem qualquer conexão física entre as partes (a hierarquia aqui é\n    // organizacional, não geográfica) — \"vizinho por fronteira de município\" não é só caro (a\n    // query ao vivo vira um IN-list de centenas de municípios e estoura timeout: foi exatamente\n    // isso que quebrou o fechamento de um mercado espalhado) — é a pergunta errada. A fronteira que\n    // já importa (mesma GV / mesmo mercado) é imposta pela regra de parentesco logo acima; dentro\n    // dela QUALQUER irmão é candidato, e o otimizador decide pelo equilíbrio de span e continuidade\n    // de líder, nunca por proximidade física — geografia não pesa aqui.\n    mv.nbrCurrentSector={};\n    mv.gvRejected=[];\n    mv.bridgeMunis=closingNames.slice();\n    mv.ignoredBridges=[];\n    const siblings=level==='gv'\n      ? [...(DOM.gvsByMercado[ownParent]||[])]\n      : Object.keys(DOM.sectorsByMercado||{});\n    mv.dest=siblings.filter(destCode=>destCode!==code && !alreadyClosed(destCode) && sameParent(destCode));\n    units.forEach(u=>{ mv.dest.forEach(destCode=>{ mv.allowed[u][destCode]=1; mv.allowedRaw[u][destCode]=1; }); });\n  }\n  mv.dest=mv.dest.filter(sameParent);\n\n  // ---- O QUE É DESENHADO: território COMPLETO de cada destino (não só a borda), sempre lido da\n  // mesma base de dominantes já usada pro lado que fecha.\n  const territoryOf=destCode=>{\n    const secs=memberSectorsOf(level,destCode,world);\n    const out=new Set();\n    secs.forEach(s=>(domBase[String(s)]||new Set()).forEach(n=>out.add(n)));\n    return out;\n  };\n  const drawSet=new Set(mv.dest);\n  mv.dest.forEach(destCode=>{\n    territoryOf(destCode).forEach(n=>{\n      if(nbrNames.has(n)) return;\n      nbrNames.add(n);\n      mv.nbrCurrentSector[n]=(level==='setor'&&world.muniOverride&&world.muniOverride[n])?world.muniOverride[n]:destCode;\n    });\n  });\n  mv.nbrFeat=[...nbrNames].filter(n=>drawSet.has(mv.nbrCurrentSector[n])).map(n=>adj.feat[n]&&adj.feat[n].f).filter(Boolean);\n  units.forEach(u=>{ Object.keys(mv.allowed[u]||{}).forEach(destCode=>{ if(!mv.dest.includes(destCode)) delete mv.allowed[u][destCode]; }); });\n  mv.color={}; mv.dest.forEach((destCode,i)=>mv.color[destCode]=PALETTE[i%PALETTE.length]);\n\n  const accC={}; Object.entries(mv.nbrCurrentSector).forEach(([nb,destCode])=>{ if(!mv.dest.includes(destCode))return; const f=(adj.feat[nb]&&adj.feat[nb].f)||world.muniGeo[nb]; if(!f)return; const c=centroidLL(f); accC[destCode]=accC[destCode]||[0,0,0]; accC[destCode][0]+=c[0]; accC[destCode][1]+=c[1]; accC[destCode][2]++; });\n  mv.secCentroid={}; mv.dest.forEach(destCode=>{ if(accC[destCode]) mv.secCentroid[destCode]=[accC[destCode][0]/accC[destCode][2],accC[destCode][1]/accC[destCode][2]]; });\n\n  if(level==='setor'){\n    mv.muniCentroid={}; closingNames.forEach(n=>{ if(mv.geoFeat[n]) mv.muniCentroid[n]=centroidLL(mv.geoFeat[n]); });\n    mv.closeAdj={}; closingNames.forEach(n=>{ mv.closeAdj[n]=adj.feat[n]?adj.nbrs(n).filter(({o})=>closingSet.has(o)).map(({o})=>o):[]; });\n  } else {\n    mv.muniCentroid={};\n    Object.entries(mv.unitMunis).forEach(([u,ms])=>{\n      const cs=ms.map(n=>mv.geoFeat[n]&&centroidLL(mv.geoFeat[n])).filter(Boolean);\n      if(cs.length) mv.muniCentroid[u]=[cs.reduce((a,c)=>a+c[0],0)/cs.length,cs.reduce((a,c)=>a+c[1],0)/cs.length];\n    });\n    mv.closeAdj={};\n    const unitSet=new Set(units);\n    Object.entries(mv.unitMunis).forEach(([u,ms])=>{\n      const touch=new Set();\n      ms.forEach(n=>{ if(!adj.feat[n]) return; adj.nbrs(n).forEach(({o})=>{ const ou=mv.unitOfMuni[o]; if(ou&&ou!==u&&unitSet.has(ou)) touch.add(ou); }); });\n      mv.closeAdj[u]=[...touch];\n    });\n  }\n  const comp={}; let ci=0; units.forEach(n=>{ if(comp[n]!=null)return; const st=[n]; comp[n]=ci; while(st.length){ const x=st.pop(); (mv.closeAdj[x]||[]).forEach(o=>{ if(comp[o]==null){ comp[o]=ci; st.push(o); } }); } ci++; });\n  const compAllowed={}; units.forEach(n=>{ const cid=comp[n]; (compAllowed[cid]=compAllowed[cid]||new Set()); Object.keys(mv.allowed[n]||{}).forEach(s=>compAllowed[cid].add(s)); });\n  mv.reachable={}; units.forEach(n=>{ mv.reachable[n]=[...(compAllowed[comp[n]]||[])].filter(s=>mv.dest.includes(s)); });\n\n  if(mv.dest.length){\n    const destSectorMap={}; mv.dest.forEach(destCode=>{ destSectorMap[destCode]=memberSectorsOf(level,destCode,world); });\n    const allDestSecs=[...new Set(Object.values(destSectorMap).flat())];\n    const rList=allDestSecs.join(',');\n    const bSQL=`SELECT CD_SETOR setor, COUNT(DISTINCT CD_CONSULTORA) cbs,\n       SUM(CASE WHEN ST_FEZ_PED_CICLO_ATUAL THEN 1 ELSE 0 END) ativas,\n       ROUND(SUM(VL_PEDIDOS_CICLO),0) receita, ROUND(SUM(VL_PEDIDOS_NATURA_CICLO),0) rec_nat,\n       ROUND(SUM(VL_PEDIDOS_AVON_CICLO),0) rec_avon, ROUND(SUM(QT_PONTOS_CICLO),0) pontos, ROUND(SUM(QT_PEDIDOS_CICLO),0) pedidos\n      FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR IN (${rList}) AND DT_HISTORICO=${SNAP} GROUP BY CD_SETOR`;\n    const blSQL=`SELECT CD_SETOR setor, DS_NVL_PLAN_CRESC nivel, COUNT(DISTINCT CD_CONSULTORA) cbs\n      FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR IN (${rList}) AND DS_NVL_PLAN_CRESC IS NOT NULL AND DT_HISTORICO=${SNAP} GROUP BY CD_SETOR, DS_NVL_PLAN_CRESC`;\n    const [bR,blR]=await Promise.all([q(bSQL),q(blSQL)]);\n    const secMetrics={}; rows(bR).forEach(r=>{ secMetrics[String(r.setor)]=r; if(!SESS.sectorBaseCache[String(r.setor)]) SESS.sectorBaseCache[String(r.setor)]=r; });\n    const secLevel={}; rows(blR).forEach(r=>{ const s=String(r.setor); (secLevel[s]=secLevel[s]||{})[r.nivel]=+r.cbs; });\n    mv.baseMetrics={}; mv.baseLevel={};\n    mv.dest.forEach(destCode=>{\n      const secs=destSectorMap[destCode];\n      const acc=blankM(); acc.setor=destCode;\n      secs.forEach(s=>{ const r=secMetrics[String(s)]; if(!r) return; Object.keys(blankM()).forEach(k=>{ acc[k]=(+acc[k]||0)+(+r[k]||0); }); });\n      mv.baseMetrics[destCode]=acc;\n      const lv={}; secs.forEach(s=>{ const l=secLevel[String(s)]; if(!l) return; Object.entries(l).forEach(([nv,c])=>{ lv[nv]=(lv[nv]||0)+c; }); });\n      mv.baseLevel[destCode]=lv;\n    });\n  } else { mv.baseMetrics={}; mv.baseLevel={}; }\n\n  mv.dest.forEach(destCode=>{\n    if(!mv.baseMetrics[destCode]) mv.baseMetrics[destCode]={setor:destCode,cbs:0,ativas:0,receita:0,rec_nat:0,rec_avon:0,pontos:0,pedidos:0};\n    const inflowSrc=level==='setor'?world.sectorInflow:(level==='gv'?world.gvInflow:world.mercadoInflow);\n    const infl=inflowSrc&&inflowSrc[destCode];\n    if(infl) Object.keys(blankM()).forEach(k=>{ mv.baseMetrics[destCode][k]=(+mv.baseMetrics[destCode][k]||0)+(infl[k]||0); });\n    if(level==='setor'){\n      const inflLv=world.sectorInflowLevel&&world.sectorInflowLevel[destCode];\n      if(inflLv){ mv.baseLevel[destCode]=mv.baseLevel[destCode]||{}; Object.entries(inflLv).forEach(([nv,c])=>{ mv.baseLevel[destCode][nv]=(mv.baseLevel[destCode][nv]||0)+c; }); }\n    }\n  });\n\n  aggregateMovement(mv);\n  mv.assign=optimizeFor(mv);\n  return mv;\n}\n\n// ---------- cascade engine ----------\nasync function computeAt(i){\n  await ensurePinned();\n  const world=foldWorldState(SESS.timeline,i);\n  const sec=SESS.timeline[i].sector;\n  const level=SESS.timeline[i].level||'setor';\n  const mv=await computeMovement(sec,level,world);\n  SESS.timeline[i]=mv;\n}\nasync function recomputeFrom(i){\n  for(let k=i;k<SESS.timeline.length;k++){\n    loader(true,`recalculando etapa ${k+1} de ${SESS.timeline.length}…`);\n    try{ await computeAt(k); }\n    catch(e){\n      // A stage that failed to recompute still holds its PREVIOUS result, so the timeline would\n      // silently mix pre- and post-change etapas. Flag this stage and everything after it as stale\n      // (dashed chip + ⟳) so the state is visible and flushDirty retries from here.\n      SESS.dirtyFrom = SESS.dirtyFrom==null ? k : Math.min(SESS.dirtyFrom,k);\n      throw e;\n    }\n  }\n}\nasync function flushDirty(){\n  if(SESS.dirtyFrom==null) return;\n  const from=SESS.dirtyFrom; SESS.dirtyFrom=null;\n  loader(true,'recalculando etapas seguintes…');\n  try{ await recomputeFrom(from); }\n  catch(e){ $('#ds').textContent='erro ao recalcular cadeia: '+e.message; $('#ds').classList.add('err'); }\n  finally{ loader(false); }\n}\nasync function addMovement(level,sec){\n  level=level||'setor';\n  sec=(sec==null?'':String(sec)).trim();\n  if(!sec) return;\n  if(!movementAvailable(level)){ $('#ds').textContent=`Fechar ${LEVELS[level].label} ainda não está disponível.`; $('#ds').classList.add('err'); return; }\n  if(!hierarchyAllows(level)){ const minLabel=LEVELS[Object.keys(LEVEL_RANK).find(k=>LEVEL_RANK[k]===sessionMinRank())].label; $('#ds').textContent=`esta sessão já fechou um nível mais alto — só \"${minLabel}\" (ou acima) fica disponível.`; $('#ds').classList.add('err'); return; }\n  const closedNow=new Set(SESS.timeline.filter(mv=>(mv.level||'setor')===level).map(mv=>mv.sector));\n  if(closedNow.has(sec)){ $('#ds').textContent=LEVELS[level].label+' '+sec+' já fechado(a) nesta timeline.'; $('#ds').classList.add('err'); return; }\n  if(level==='setor' && !SESS.sectorsList.some(s=>s.setor===sec)){ $('#ds').textContent='setor \"'+sec+'\" não existe no snapshot congelado.'; $('#ds').classList.add('err'); return; }\n  await flushDirty();\n  loader(true,`fechando ${lc(LEVELS[level].label)} `+sec+' — puxando dado do snapshot congelado…');\n  $('#liveState').classList.remove('err');\n  try{\n    SESS.timeline.push({sector:String(sec),level:level});\n    await computeAt(SESS.timeline.length-1);\n    SESS.selected=SESS.timeline.length-1;\n    $('#ds').classList.remove('err'); $('#ds').textContent='';\n  }catch(e){\n    SESS.timeline.pop();\n    $('#ds').textContent=`erro ao fechar ${lc(LEVELS[level].label)} `+sec+': '+e.message; $('#ds').classList.add('err');\n  } finally { loader(false); renderAll(); }\n}\nfunction removeFrom(i){\n  SESS.timeline.length=i;\n  SESS.selected=Math.min(SESS.selected,Math.max(0,SESS.timeline.length-1));\n  if(SESS.dirtyFrom!=null && SESS.dirtyFrom>=SESS.timeline.length) SESS.dirtyFrom=null;\n  renderAll();\n}\nasync function editSelected(mutator){\n  const mv=SESS.timeline[SESS.selected]; if(!mv) return;\n  mutator(mv);\n  if(SESS.selected<SESS.timeline.length-1){\n    SESS.dirtyFrom = SESS.dirtyFrom==null ? SESS.selected+1 : Math.min(SESS.dirtyFrom, SESS.selected+1);\n  }\n  renderAll();\n}\n\n// ---------- sectors list / picker ----------\nasync function loadSectors(){\n  const sql=`SELECT CD_SETOR setor, MAX(DS_ESTADO) uf, COUNT(DISTINCT CD_CONSULTORA) cbs, COUNT(DISTINCT DS_MUNICIPIO) munis\n    FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR>0 AND DT_HISTORICO=(SELECT MAX(DT_HISTORICO) FROM ${T} WHERE CD_PAIS=1) GROUP BY CD_SETOR ORDER BY CD_SETOR`;\n  SESS.sectorsList=rows(await q(sql)).map(r=>({setor:String(r.setor),uf:r.uf,cbs:+r.cbs,munis:+r.munis}));\n}\nfunction renderSectorPicker(){\n  const ready=SESS.stage==='main';\n  const ob=$('#openMove'); if(ob) ob.disabled=!ready;\n}\n\n// ---------- movement modal (setor / GV / mercado) ----------\n// Hierarquia mercado > GV > setor: a sessão trava no nível da primeira movimentação. Misturar\n// níveis quebraria a leitura de \"antes/depois\" da cadeia — fechar uma GV já redistribui setores\n// inteiros pra outras GVs; fechar um setor isolado depois não bate mais com o mundo que sobrou.\n// de/a/no: contrações de \"de\"/\"a\"/\"em\" com o artigo de cada nível — GV é feminina (a Gerência de\n// Vendas), setor e mercado são masculinos. Errar o gênero aqui é o tipo de coisa que grita \"isto foi\n// feito pra setor e só remendado pros outros níveis\", exatamente o que este objeto existe pra evitar.\nconst LEVELS={\n  setor:{label:'Setor',codeLbl:'Setor a fechar',placeholder:'código do setor',childLabel:'Município',destLabel:'Setor',de:'do',a:'ao',no:'no',parentLabel:'GV',parentPhrase:'da mesma GV',parentWord:'gerência'},\n  gv:{label:'GV',codeLbl:'GV a fechar',placeholder:'código da GV',childLabel:'Setor',destLabel:'GV',de:'da',a:'à',no:'na',parentLabel:'Mercado',parentPhrase:'do mesmo mercado',parentWord:'mercado'},\n  mercado:{label:'Mercado',codeLbl:'Mercado a fechar',placeholder:'nome do mercado',childLabel:'GV',destLabel:'Mercado',de:'do',a:'ao',no:'no',parentLabel:null,parentPhrase:null,parentWord:null},\n};\n// GV é sigla — .toLowerCase() a transformaria em \"gv\", errado em qualquer posição da frase. Palavras\n// normais (Setor/Mercado/Município) minúsculam à vontade no meio de uma frase; GV nunca.\nconst LOWER={Setor:'setor',Mercado:'mercado',Município:'município',GV:'GV'};\nconst lc=w=>LOWER[w]||w.toLowerCase();\n// Hierarquia é uma catraca, não um cadeado: mercado(0) > GV(1) > setor(2). Fechar um nível mais\n// alto (número menor) trava PRA SEMPRE nesta sessão qualquer nível mais baixo (número maior) —\n// mas o próprio nível, ou um ainda mais alto, continua liberado. É assim que \"posso fechar setores\n// até fechar uma GV; posso fechar GVs até fechar um mercado\" funciona: nunca destrava de volta.\nconst LEVEL_RANK={mercado:0,gv:1,setor:2};\nfunction sessionMinRank(){\n  let r=LEVEL_RANK.setor;\n  SESS.timeline.forEach(mv=>{ const rk=LEVEL_RANK[mv.level||'setor']; if(rk<r) r=rk; });\n  return r;\n}\nfunction hierarchyAllows(lvl){ return LEVEL_RANK[lvl]<=sessionMinRank(); }\nfunction movementAvailable(lvl){ return lvl==='setor'||lvl==='gv'||lvl==='mercado'; }\n// ---------- hierarquia: setor ⊂ GV ⊂ mercado — tudo derivado da base de dominantes (DOM) ----------\n// memberSectors: o escopo de CD_SETOR que a query no CRM precisa cobrir pra fechar este código, em\n// qualquer nível — um setor é ele mesmo; uma GV é todo setor que a base lhe atribui; um mercado é\n// todo setor de toda GV que a base atribui a ele.\n// membros ATUAIS de um GV/mercado, um nível abaixo (setores de uma GV; GVs de um mercado) — nunca\n// só a foto estática do CSV: uma etapa anterior NESTA MESMA sessão pode já ter movido um filho pra\n// dentro ou pra fora deste código, e um fechamento seguinte tem de enxergar o mundo como ele está\n// agora, não como o CSV descreveu antes de qualquer movimentação.\nfunction currentMembersOf(level,code,world){\n  code=String(code);\n  // \"gv\": setores da GV (DOM.sectorsByGv). \"mercado\": GVs do mercado (DOM.gvsByMercado) — NUNCA\n  // sectorsByMercado, que pula a camada de GV inteira e faz memberSectorsOf tratar códigos de\n  // setor como se fossem códigos de GV (não batem em DOM.sectorsByGv, e o fechamento morre com\n  // \"não existe na base\" mesmo quando o mercado está lá).\n  const staticMembers=level==='gv'?(DOM.sectorsByGv[code]||new Set()):(DOM.gvsByMercado[code]||new Set());\n  const overrideMap=level==='gv'?(world&&world.secOverride):(world&&world.gvOverride);\n  const out=new Set(staticMembers);\n  if(overrideMap){\n    Object.entries(overrideMap).forEach(([child,dest])=>{\n      if(dest===code) out.add(child);\n      else if(staticMembers.has(child)) out.delete(child);\n    });\n  }\n  return [...out];\n}\n// setores que a query no CRM precisa cobrir pra fechar este código, em qualquer nível — setor é\n// ele mesmo; GV é seus setores ATUAIS; mercado é todo setor de toda GV ATUALMENTE sua (setor não\n// troca de GV sozinho numa sessão de mercado — só GV inteira troca de mercado).\nfunction memberSectorsOf(level,code,world){\n  code=String(code);\n  if(level==='setor') return [code];\n  if(level==='gv') return currentMembersOf('gv',code,world);\n  const gvs=currentMembersOf('mercado',code,world);\n  const out=new Set();\n  gvs.forEach(gv=>(DOM.sectorsByGv[gv]||new Set()).forEach(s=>out.add(s)));\n  return [...out];\n}\n// fronteira que um destino tem de respeitar: GV do setor que fecha, mercado da GV que fecha —\n// mercado não tem nada acima, então não existe regra pra ele. Estática de propósito: um setor não\n// troca de GV nem uma GV troca de mercado só por existirem etapas anteriores nesta sessão — quem\n// muda de dono é o NÍVEL ABAIXO do que está fechando, nunca o próprio código sendo avaliado aqui.\nfunction parentOf(level,code){\n  code=String(code);\n  if(level==='setor') return DOM.gvBySetor[code]||'';\n  if(level==='gv') return DOM.mercadoByGv[code]||'';\n  return '';\n}\n// dado o setor que uma município vizinha atualmente pertence (fato ao vivo do CRM, nunca muda de\n// verdade), a que CANDIDATO A DESTINO isso corresponde neste nível — considerando que uma etapa\n// anterior desta sessão pode já ter movido esse setor (GV fechando) ou essa GV (mercado fechando)\n// pra outro dono, o que a foto estática do CSV sozinha não enxergaria.\nfunction destUnitOfSector(level,setorCode,world){\n  setorCode=String(setorCode);\n  if(level==='setor') return setorCode;\n  if(level==='gv'){ const ov=world&&world.secOverride&&world.secOverride[setorCode]; return ov||DOM.gvBySetor[setorCode]||''; }\n  const gv=DOM.gvBySetor[setorCode]||'';\n  const ov=world&&world.gvOverride&&world.gvOverride[gv];\n  return ov||DOM.mercadoBySetor[setorCode]||'';\n}\nfunction currentMoveLevel(){ const r=root.querySelector('input[name=\"moveLevel\"]:checked'); return (r&&r.value)||'setor'; }\nfunction openMove(){\n  const minRank=sessionMinRank();\n  const lastLevel=SESS.timeline.length?(SESS.timeline[SESS.timeline.length-1].level||'setor'):'setor';\n  root.querySelectorAll('input[name=\"moveLevel\"]').forEach(r=>{\n    const lvl=r.value;\n    r.disabled=!movementAvailable(lvl)||!hierarchyAllows(lvl);\n    r.checked=hierarchyAllows(lastLevel)?lvl===lastLevel:lvl===Object.keys(LEVEL_RANK).find(k=>LEVEL_RANK[k]===minRank);\n  });\n  const note=$('#moveLockNote');\n  const minLabel=LEVELS[Object.keys(LEVEL_RANK).find(k=>LEVEL_RANK[k]===minRank)].label;\n  if(note) note.textContent=minRank<LEVEL_RANK.setor\n    ? `Esta sessão já fechou um nível mais alto na hierarquia — só \"${minLabel}\" (ou acima) continua disponível daqui pra frente.`\n    : 'Escolha o nível a fechar. Você pode fechar setores à vontade até fechar uma GV; aí só GV (ou mercado) daqui pra frente. Fechar um mercado trava a sessão em mercado.';\n  $('#moveCode').value='';\n  const err=$('#moveErr'); if(err){ err.textContent=''; err.classList.add('hidden'); }\n  const st=$('#moveStatus'); if(st) st.textContent='';\n  $('#moveBg').classList.remove('hidden');\n  renderMoveForm();\n  const c=$('#moveCancel'); if(c) c.focus();\n}\nfunction closeMove(){ const b=$('#moveBg'); if(b) b.classList.add('hidden'); }\nfunction renderMoveForm(){\n  root.querySelectorAll('#moveBg .opt-row').forEach(r=>r.classList.toggle('on',r.dataset.lvl===currentMoveLevel()));\n  const lvl=LEVELS[currentMoveLevel()];\n  $('#moveCodeLbl').textContent=lvl.codeLbl;\n  $('#moveCode').placeholder=lvl.placeholder;\n  loadMoveOptions();\n}\nasync function loadMoveOptions(){\n  const lvl=currentMoveLevel();\n  const dl=$('#moveCodeList'); if(!dl) return;\n  const closedSet=new Set(SESS.timeline.filter(mv=>(mv.level||'setor')===lvl).map(mv=>mv.sector));\n  if(lvl==='setor'){\n    dl.innerHTML=SESS.sectorsList.filter(s=>!closedSet.has(s.setor))\n      .map(s=>`<option value=\"${s.setor}\">${s.setor} · ${s.uf||'?'} · ${fmt(s.cbs)} CBs · ${s.munis} munic.</option>`).join('');\n    return;\n  }\n  dl.innerHTML='';\n  try{ await ensureDominantes(); }catch(e){ return; }\n  if(lvl==='gv'){\n    const gvs=Object.keys(DOM.sectorsByGv||{}).filter(g=>!closedSet.has(g)).sort();\n    dl.innerHTML=gvs.map(g=>`<option value=\"${g}\">${g}${DOM.gvLabel[g]?' · '+esc(DOM.gvLabel[g]):''} · ${DOM.sectorsByGv[g].size} setor(es)</option>`).join('');\n  } else if(lvl==='mercado'){\n    const mks=Object.keys(DOM.sectorsByMercado||{}).filter(m=>!closedSet.has(m)).sort();\n    dl.innerHTML=mks.map(m=>`<option value=\"${m}\">${m} · ${(DOM.gvsByMercado[m]||new Set()).size} GV(s) · ${DOM.sectorsByMercado[m].size} setor(es)</option>`).join('');\n  }\n}\nfunction moveRandPick(){\n  const opts=[...($('#moveCodeList').options||[])].map(o=>o.value);\n  if(!opts.length) return;\n  $('#moveCode').value=opts[Math.floor(Math.random()*opts.length)];\n}\nasync function submitMove(){\n  const lvl=currentMoveLevel();\n  const code=($('#moveCode').value||'').trim();\n  const err=$('#moveErr');\n  const fail=msg=>{ if(err){ err.textContent=msg; err.classList.remove('hidden'); } };\n  if(err){ err.textContent=''; err.classList.add('hidden'); }\n  if(!movementAvailable(lvl)) return fail(`Fechar ${LEVELS[lvl].label} ainda não está disponível.`);\n  if(!hierarchyAllows(lvl)){ const minLabel=LEVELS[Object.keys(LEVEL_RANK).find(k=>LEVEL_RANK[k]===sessionMinRank())].label; return fail(`Esta sessão já fechou um nível mais alto — só \"${minLabel}\" (ou acima) fica disponível.`); }\n  if(!code) return fail('Informe um código.');\n  closeMove();\n  await addMovement(lvl,code);\n}\nfunction renderStage(){\n  const isMain=SESS.stage==='main';\n  const cc=$('#confirmCard'), mw=$('#mainWrap');\n  const hdr=$('#topHeader'), rl=$('#timelineRail');\n  if(hdr) hdr.classList.toggle('hidden', !isMain);\n  if(rl) rl.classList.toggle('hidden', !isMain);\n  if(cc) cc.classList.toggle('hidden', isMain);\n  if(mw) mw.classList.toggle('hidden', !isMain);\n  const cb=$('#confirmBody');\n  if(cb && !isMain) cb.innerHTML = SESS.snapshotRaw\n    ? `Snapshot congelado · atualizado em <b>${fmtSyncedAt(SESS.snapshotSyncedAt)}</b> · <b>${SESS.sectorsList.length}</b> setor(es) disponível(eis) pra fechar. Nenhuma consulta de detalhe roda até você confirmar e escolher o primeiro setor.`\n    : 'congelando snapshot…';\n}\n\n// ---------- session persistence ----------\n// ONE table (`timeline-shared-sessions`) holds BOTH kinds of row, so SESSIONS_DS and SHARED_DS\n// deliberately resolve to the SAME DataSet — the two names mark intent, not two stores:\n//   · working session  — carries `movements`; saveSession updates it in place\n//   · shared snapshot  — carries `sharedAt` + `stages`; doShare CREATES it and nothing updates it\n// listSessions MUST exclude the shared rows. They are write-once by contract, and if one showed\n// up in the picker, loading it and pressing Salvar would fire ds.update() straight at a frozen\n// snapshot. Filtering here is what keeps that unreachable — it is the guard, not a cosmetic.\n// Both lookups stay because a policy-gated DataSet's Process resolves late; same race the reader\n// component polls for. SESSIONS_DS lives at module scope so no call site can hit it in the TDZ.\nasync function listSessions(){\n  const ds=(d2.data('sessionsDataset')||d2.data(SESSIONS_DS)); if(!ds) return [];\n  await ds.refresh();\n  const recs=ds.records()||[];\n  return [...recs].filter(r=>!r.sharedAt).sort((a,b)=>new Date(b.updatedAt||0)-new Date(a.updatedAt||0));\n}\nasync function refreshSessionPicker(){\n  const list=await listSessions().catch(()=>[]);\n  SESS.sessionsList=list;\n  const opts=list.map(s=>`<option value=\"${s._id}\">${esc(s.label||'sem nome')} · ${fmt((s.movements||[]).length)} etapa(s)</option>`).join('')+`<option value=\"\">+ Nova sessão</option>`;\n  const sel=$('#sessionPick'); if(sel){ sel.innerHTML=opts; sel.value=SESS.sessionId||''; }\n  const csel=$('#confirmSessionPick'); if(csel){ csel.innerHTML=opts; csel.value=SESS.sessionId||''; }\n}\nasync function saveSession(){\n  const ds=(d2.data('sessionsDataset')||d2.data(SESSIONS_DS));\n  if(!ds){ $('#sessStatus').textContent='dataset de sessões indisponível'; return; }\n  if(!SESS.timeline.length){ $('#sessStatus').textContent='nada pra salvar ainda'; return; }\n  await flushDirty();\n  const label=SESS.sessionLabel||('Sessão '+new Date().toLocaleString('pt-BR'));\n  const nowIso=new Date().toISOString();\n  const payload={\n    label,\n    settings:{...DEFAULT_SETTINGS,...(SESS.settings||{})},\n    snapshotRaw:SESS.snapshotRaw, snapshotSyncedAt:SESS.snapshotSyncedAt, snapLiteral:SESS.snapLiteral, eloMaxCycle:SESS.eloMaxCycle,\n    movements:SESS.timeline.map(mv=>({\n      sector:mv.sector, level:mv.level||'setor', assign:mv.assign, policy:mv.policy,\n      matrix:mv.matrix, trend:mv.trend, levels:mv.levels, levelByMuni:mv.levelByMuni,\n      pureOwnMetrics:mv.pureOwnMetrics, domUF:mv.domUF, dest:mv.dest, color:mv.color,\n      gv:mv.gv, gvRejected:mv.gvRejected,\n      missingMunis:mv.missingMunis, csvMunisTotal:mv.csvMunisTotal, ufGuessed:mv.ufGuessed,\n      baseMetrics:mv.baseMetrics, baseLevel:mv.baseLevel, geoFeat:mv.geoFeat, nbrFeat:mv.nbrFeat,\n      nbrCurrentSector:mv.nbrCurrentSector, allowed:mv.allowed, allowedRaw:mv.allowedRaw, reachable:mv.reachable,\n      destRule:mv.destRule, destMinCbs:mv.destMinCbs, destRuleFallback:mv.destRuleFallback, optTier:mv.optTier,\n      cbsByMuni:mv.cbsByMuni, shapeMunis:mv.shapeMunis, excludedMunis:mv.excludedMunis, domCsvMunis:mv.domCsvMunis,\n      excludedCbs:mv.excludedCbs, noShapeMunis:mv.noShapeMunis, noShapeCbs:mv.noShapeCbs,\n      secCentroid:mv.secCentroid, muniCentroid:mv.muniCentroid, closeAdj:mv.closeAdj, optBadge:mv.optBadge,\n    })),\n    updatedAt:nowIso,\n  };\n  $('#sessStatus').textContent='salvando…';\n  try{\n    if(SESS.sessionId){\n      await ds.update({_id:SESS.sessionId,...payload});\n    } else {\n      payload.createdAt=nowIso;\n      const created=await ds.create(payload);\n      SESS.sessionId=(created&&created._id)||(created&&created.data&&created.data._id)||(ds.selected&&ds.selected()&&ds.selected()._id)||null;\n    }\n    SESS.sessionLabel=label;\n    await refreshSessionPicker();\n    $('#sessStatus').textContent='salvo ✓';\n  }catch(e){ $('#sessStatus').textContent='erro ao salvar: '+e.message; }\n  setTimeout(()=>{ if($('#sessStatus')) $('#sessStatus').textContent=''; },2200);\n}\n// Duplicate = drop sessionId so saveSession takes its CREATE branch instead of its update branch.\n// The source record is never written to, the copy gets a fresh _id and its own createdAt, and the\n// copy becomes the active session (so the next Salvar edits the copy, not the original).\nasync function duplicateSession(){\n  if(!SESS.timeline.length){ $('#sessStatus').textContent='nada pra duplicar ainda'; return; }\n  const prevId=SESS.sessionId, prevLabel=SESS.sessionLabel;\n  SESS.sessionId=null;\n  SESS.sessionLabel=(SESS.sessionLabel||'Sessão')+' (cópia)';\n  await saveSession();\n  if(!SESS.sessionId){\n    // saveSession swallows its own errors into #sessStatus, so a still-null id after the await is\n    // the only failure signal we get. Put the original identity back — otherwise a failed copy\n    // silently leaves the session detached, and the next Salvar would fork a new record instead\n    // of updating the one the user thought they were editing.\n    SESS.sessionId=prevId; SESS.sessionLabel=prevLabel;\n    await refreshSessionPicker().catch(()=>{});\n    return;\n  }\n  if($('#sessStatus')) $('#sessStatus').textContent='duplicado ✓';\n}\nasync function loadSession(id){\n  if(!id) return newSession();\n  const list=(SESS.sessionsList&&SESS.sessionsList.length)?SESS.sessionsList:await listSessions().catch(()=>[]);\n  const rec=list.find(s=>String(s._id)===String(id));\n  if(!rec) return newSession();\n  loader(true,'carregando sessão…');\n  SESS.sessionId=rec._id; SESS.sessionLabel=rec.label;\n  SESS.snapshotRaw=rec.snapshotRaw; SESS.snapshotSyncedAt=rec.snapshotSyncedAt||null; SESS.snapLiteral=rec.snapLiteral; SESS.eloMaxCycle=rec.eloMaxCycle;\n  SESS.settings={...DEFAULT_SETTINGS,...(rec.settings||{})};\n  SESS.timeline=(rec.movements||[]).map(m=>({sector:String(m.sector),level:m.level||'setor'}));\n  SESS.selected=0; SESS.sectorBaseCache={}; SESS.stage='main'; SESS.dirtyFrom=null;\n  try{\n    for(let i=0;i<SESS.timeline.length;i++){\n      const saved=(rec.movements||[])[i]||{};\n      // Sessions saved before the UF became part of the key hold bare-name keys in matrix rows,\n      // assign, geoFeat and closeAdj alike. Restoring that cache would mix key shapes the moment the\n      // stage is recomputed — and it would preserve the very collision this fixes — so those stages\n      // are replayed against the pinned snapshot and the manual assignment is remapped by name.\n      const legacyKeys=!!(saved.matrix&&saved.matrix.length&&saved.matrix.every(r=>r&&r.uf==null));\n      // Sessões salvas antes da regra de gerência podem carregar um destino de outra GV no cache.\n      // Restaurar esse cache manteria o setor proibido na tela para sempre, então essas etapas são\n      // reprocessadas contra o snapshot fixado — igual ao tratamento das chaves legadas.\n      const crossGv=await savedCrossesGv(saved);\n      if(saved.matrix&&!legacyKeys&&!crossGv){\n        loader(true,`restaurando etapa ${i+1}/${SESS.timeline.length} — setor ${SESS.timeline[i].sector} (cache, sem consulta)…`);\n        const mv={sector:String(saved.sector), level:saved.level||'setor', policy:saved.policy||'fora', view:'tobe', selMuni:null, optBadge:saved.optBadge||''};\n        mv.matrix=saved.matrix; mv.trend=saved.trend||[]; mv.levels=saved.levels||[]; mv.levelByMuni=saved.levelByMuni||{};\n        mv.pureOwnMetrics=saved.pureOwnMetrics||blankM(); mv.domUF=saved.domUF; mv.dest=saved.dest||[]; mv.color=saved.color||{};\n        mv.baseMetrics=saved.baseMetrics||{}; mv.baseLevel=saved.baseLevel||{}; mv.geoFeat=saved.geoFeat||{}; mv.nbrFeat=saved.nbrFeat||[];\n        mv.nbrCurrentSector=saved.nbrCurrentSector||{}; mv.allowed=saved.allowed||{}; mv.reachable=saved.reachable||{};\n        mv.allowedRaw=saved.allowedRaw||saved.allowed||{};\n        mv.destRule=saved.destRule||SESS.settings.destRule; mv.destMinCbs=saved.destMinCbs||SESS.settings.destMinCbs; mv.destRuleFallback=!!saved.destRuleFallback;\n        mv.optTier=(saved.optTier==null?0:saved.optTier);\n        mv.gv=saved.gv||''; mv.gvRejected=saved.gvRejected||[];\n        mv.missingMunis=saved.missingMunis||[]; mv.csvMunisTotal=saved.csvMunisTotal||0;\n        mv.ufGuessed=saved.ufGuessed||{};\n        mv.cbsByMuni=saved.cbsByMuni||{}; mv.shapeMunis=saved.shapeMunis||[];\n        mv.excludedMunis=saved.excludedMunis||[]; mv.excludedCbs=saved.excludedCbs||0; mv.domCsvMunis=saved.domCsvMunis||0;\n        mv.noShapeMunis=saved.noShapeMunis||[]; mv.noShapeCbs=saved.noShapeCbs||0;\n        mv.secCentroid=saved.secCentroid||{}; mv.muniCentroid=saved.muniCentroid||{}; mv.closeAdj=saved.closeAdj||{};\n        aggregateMovement(mv);\n        mv.assign=saved.assign||{};\n        if((mv.level||'setor')==='setor') mv.dest.forEach(s=>{ if(!SESS.sectorBaseCache[s]) SESS.sectorBaseCache[s]=mv.baseMetrics[s]; });\n        SESS.timeline[i]=mv;\n      } else {\n        loader(true,`replay ${i+1}/${SESS.timeline.length} — setor ${SESS.timeline[i].sector}…`);\n        await computeAt(i);\n        if(saved.assign) SESS.timeline[i].assign=legacyKeys?remapAssign(SESS.timeline[i],saved.assign):saved.assign;\n        if(saved.policy) SESS.timeline[i].policy=saved.policy;\n      }\n    }\n    await loadSectors();\n  }catch(e){ $('#ds').textContent='erro ao carregar sessão: '+e.message; $('#ds').classList.add('err'); }\n  finally{ loader(false); }\n  renderAll();\n}\n// Re-points a legacy bare-name assignment at the NAME/UF key it can only mean. When a name resolves\n// to more than one município in the recomputed stage the manual choice is genuinely ambiguous —\n// dropping it lets the optimizer allocate instead of guessing on the operator's behalf.\n// True when a cached stage names a destination outside the closing sector's gerência de vendas.\n// Judges the cache by TODAY's rule, reading the (memoised) dominantes base rather than trusting what\n// the session was saved with. Unknown GV on the closing sector answers false: the stage then loads\n// from cache instead of being replayed into the hard throw in computeMovement, which would leave the\n// operator staring at a broken session with no way back.\nasync function savedCrossesGv(saved){\n  if(!saved||!saved.sector||!(saved.dest||[]).length) return false;\n  let gvBy={};\n  try{ await ensureDominantes(); gvBy=DOM.gvBySetor||{}; }catch(e){ return false; }\n  const own=gvBy[String(saved.sector)]||'';\n  if(!own) return false;\n  if(saved.dest.some(s=>(gvBy[String(s)]||'')!==own)) return true;\n  // A stage saved before foreign-GV neighbours stopped being drawn can hold a perfectly clean dest and\n  // STILL carry their shapes in nbrFeat/nbrCurrentSector — it would repaint the old map straight from\n  // cache. An unknown gerência is not evidence of a foreign one, so only a known, differing GV replays.\n  return Object.values(saved.nbrCurrentSector||{}).some(s=>{ const g=gvBy[String(s)]||''; return g&&g!==own; });\n}\nfunction remapAssign(mv,savedAssign){\n  const keys=Object.keys(mv.munis||{}).filter(k=>k!=='__OUTROS__');\n  const out={};\n  Object.entries(savedAssign||{}).forEach(([k,v])=>{\n    if(keys.indexOf(k)>=0){ out[k]=v; return; }\n    const cand=keys.filter(x=>mName(x)===mName(k));\n    if(cand.length===1) out[cand[0]]=v;\n  });\n  return out;\n}\nfunction newSession(){\n  SESS.sessionId=null; SESS.sessionLabel=null; SESS.timeline=[]; SESS.selected=0; SESS.sectorBaseCache={};\n  SESS.settings={...DEFAULT_SETTINGS};\n  SESS.snapshotRaw=null; SESS.snapshotSyncedAt=null; SESS.snapLiteral=null; SESS.eloMaxCycle=null; SESS.stage='loading'; SESS.dirtyFrom=null;\n  (async()=>{\n    loader(true,'iniciando nova sessão…');\n    try{ await Promise.all([ensurePinned(), loadSectors()]); SESS.stage='confirm'; }\n    catch(e){ setError('erro init: '+e.message); }\n    finally{ loader(false); renderAll(); }\n  })();\n}\n\n// ---------- snapshot refresh ----------\n// Deliberately breaks the frozen-snapshot guarantee, on demand: re-resolves DT_HISTORICO and\n// replays the whole timeline against the new one. Skips the replay when the snapshot has not\n// actually moved, so a stray click on a long timeline costs one cheap probe instead of ~8 queries\n// per etapa.\nasync function refreshSnapshot(){\n  if(SESS.stage!=='main' || SESS.snapBusy) return;\n  SESS.snapBusy=true;\n  const prevRaw=SESS.snapshotRaw;\n  const pill=$('#liveState'); if(pill){ pill.classList.add('busy'); pill.textContent='◌ atualizando snapshot…'; }\n  loader(true,'buscando o snapshot mais recente…');\n  let ok=false;\n  try{\n    const p=await resolveSnapshotPin();\n    if(!p.snapshotRaw) throw new Error('não foi possível resolver DT_HISTORICO');\n    const same=String(p.snapshotRaw)===String(prevRaw);\n    SESS.snapshotRaw=p.snapshotRaw; SESS.snapshotSyncedAt=p.syncedAt; SESS.snapLiteral=p.snapLiteral; SESS.eloMaxCycle=p.eloMaxCycle;\n    await loadSectors();   // the sector list follows the live max, so it can have moved too\n    if(same){\n      $('#ds').textContent=`snapshot já era o mais recente · atualizado em ${fmtSyncedAt(p.syncedAt)} — nada recalculado`;\n    } else if(SESS.timeline.length){\n      SESS.dirtyFrom=null;\n      SESS.sectorBaseCache={};   // baselines come from the snapshot, so every one of them changed\n      loader(true,'snapshot novo — recalculando a timeline…');\n      await recomputeFrom(0);\n      $('#ds').textContent=`snapshot atualizado em ${fmtSyncedAt(p.syncedAt)} · ${fmt(SESS.timeline.length)} etapa(s) recalculada(s)`;\n    } else {\n      $('#ds').textContent=`snapshot atualizado em ${fmtSyncedAt(p.syncedAt)}`;\n    }\n    $('#ds').classList.remove('err');\n    ok=true;\n  }catch(e){\n    const at=(SESS.dirtyFrom==null?null:SESS.dirtyFrom+1);\n    $('#ds').textContent='erro ao atualizar o snapshot'+(at?` na etapa ${at} — etapa ${at} em diante ficou desatualizada (⟳)`:'')+': '+e.message;\n    $('#ds').classList.add('err');\n  }finally{\n    SESS.snapBusy=false;\n    if(pill) pill.classList.remove('busy');\n    loader(false); renderAll();\n    if(ok) setTimeout(()=>{ const d=$('#ds'); if(d&&!d.classList.contains('err')) d.textContent=''; },7000);\n  }\n}\n\n// ---------- session options ----------\nfunction previewDest(mv,rule,minCbs){\n  if(!mv||!mv.allowedRaw||!mv.munis) return null;\n  const w={}; let relaxed=false;\n  const cbsOf=m=>(mv.cbsByMuni&&mv.cbsByMuni[m]!=null)?mv.cbsByMuni[m]:((mv.munis[m]&&mv.munis[m].cbs)||0);\n  const add=m=>Object.entries(mv.allowedRaw[m]||{}).forEach(([s,v])=>{ w[s]=(w[s]||0)+v; });\n  // allowedRaw only carries municipalities already inside the sector's dominance base, so there is\n  // nothing left to filter out here beyond the destination rule itself.\n  Object.keys(mv.allowedRaw).forEach(m=>{ const cbs=cbsOf(m);\n    if(rule==='dominant'&&cbs<minCbs) return; add(m); });\n  if(rule==='dominant'&&!Object.keys(w).length){ Object.keys(mv.allowedRaw).forEach(add); relaxed=true; }\n  return {dest:Object.keys(w).sort((a,b)=>w[b]-w[a]).slice(0,6),relaxed};\n}\nfunction readOptForm(){\n  const r=root.querySelector('input[name=\"destRule\"]:checked');\n  let n=Math.round(+$('#optMinCbs').value);\n  if(!(n>0)) n=DEFAULT_SETTINGS.destMinCbs;\n  return {destRule:(r&&r.value)||DEFAULT_SETTINGS.destRule, destMinCbs:n,\n          targetSpan:numOrNull($('#optTargetSpan').value),\n          maxSpan:numOrNull($('#optMaxSpan').value),\n          minSpan:numOrNull($('#optMinSpan').value)};\n}\nfunction spanFormError(f){\n  if(f.minSpan&&f.maxSpan&&f.minSpan>f.maxSpan) return `Span mínimo (${fmt(f.minSpan)}) não pode ser maior que o máximo (${fmt(f.maxSpan)}).`;\n  if(f.targetSpan&&f.maxSpan&&f.targetSpan>f.maxSpan) return `Span alvo (${fmt(f.targetSpan)}) não pode passar do máximo (${fmt(f.maxSpan)}).`;\n  if(f.targetSpan&&f.minSpan&&f.targetSpan<f.minSpan) return `Span alvo (${fmt(f.targetSpan)}) não pode ficar abaixo do mínimo (${fmt(f.minSpan)}).`;\n  return '';\n}\nfunction renderOptPreview(){\n  const el=$('#optPreview'); if(!el) return;\n  const f=readOptForm();\n  root.querySelectorAll('.opt-row').forEach(r=>{\n    if(r.dataset.r!=null) r.classList.toggle('on',r.dataset.r===f.destRule);\n  });\n  const wrap=$('#optMinCbsWrap'); if(wrap) wrap.classList.toggle('off',f.destRule!=='dominant');\n  const err=spanFormError(f), ee=$('#optSpanErr');\n  if(ee){ ee.textContent=err; ee.classList.toggle('hidden',!err); }\n  const ap=$('#optApply'); if(ap) ap.disabled=!!err;\n  const mv=SESS.timeline[SESS.selected];\n  // Prévia inteira é sobre conceitos de setor (ponte por município, span alvo/máx/mín) que não\n  // existem em GV/mercado — mostrar aqui só confundiria com números que não valem nada.\n  if(mv && (mv.level||'setor')!=='setor'){ el.innerHTML=''; return; }\n  if(!mv||!mv.munis){ el.innerHTML='Nenhuma etapa calculada ainda — as regras passam a valer no próximo fechamento.'; return; }\n  const cbsOf=m=>(mv.cbsByMuni&&mv.cbsByMuni[m]!=null)?mv.cbsByMuni[m]:((mv.munis[m]&&mv.munis[m].cbs)||0);\n  const ms=Object.keys(mv.geoFeat||{});\n  const ig=f.destRule==='dominant'?ms.filter(m=>cbsOf(m)<f.destMinCbs):[];\n  const pv=previewDest(mv,f.destRule,f.destMinCbs);\n  let h=`<b style=\"color:var(--ink)\">Prévia — etapa ${SESS.selected+1}, setor ${mv.sector}</b><br>`;\n  const exN=(mv.excludedMunis||[]).length;\n  if(exN) h+=`Base de dominantes: <b>${fmt(ms.length)}</b> município(s) no mapa · <span style=\"color:var(--closing)\">${fmt(exN)} fora da base — ${fmt(mv.excludedCbs||0)} CBs seguem suas líderes</span><br>`;\n  h+=`${fmt(ms.length-ig.length)} de ${fmt(ms.length)} município(s) valem como ponte`;\n  if(ig.length) h+=` · <span style=\"color:var(--closing)\">ignorados:</span> ${ig.slice(0,8).join(', ')}${ig.length>8?' +'+(ig.length-8):''}`;\n  if(pv){\n    h+=`<br>Setores destino com esta regra: <b style=\"color:var(--ink)\">${pv.dest.join(', ')||'–'}</b>`;\n    const cur=(mv.dest||[]).join(', ');\n    if(pv.dest.join(',')!==(mv.dest||[]).join(',')) h+=` <span style=\"color:var(--closing)\">(hoje: ${cur||'–'})</span>`;\n    if(pv.relaxed) h+=`<br><b style=\"color:var(--closing)\">⚠ nenhum município dominante nesta etapa — a regra relaxa pra \"qualquer município\" pra não deixar a etapa sem destino.</b>`;\n  }\n  if(f.targetSpan||f.maxSpan||f.minSpan){\n    const sp=spanMapFor(mv,mv.assign||{}), v=spanViolationsOf(sp,{target:f.targetSpan,max:f.maxSpan,min:f.minSpan});\n    h+=`<br><br>Span dos destinos como está hoje: ${mv.dest.map(s=>s+' <b>'+fmt(sp[s])+'</b>').join(' · ')||'–'}`;\n    if(v.over.length||v.under.length) h+=`<br><span style=\"color:var(--closing)\">Fora dos limites: ${[...v.over.map(s=>s+' ▲ acima do máx'),...v.under.map(s=>s+' ▼ abaixo do mín')].join(', ')}</span> — o modelo ÓTIMO tenta corrigir no recálculo.`;\n    else h+=` <span style=\"color:var(--ok)\">— já dentro dos limites</span>`;\n  }\n  if(SESS.timeline.length) h+=`<br><span style=\"margin-top:4px;display:inline-block\">Aplicar <b>recalcula as ${fmt(SESS.timeline.length)} etapa(s)</b> contra o snapshot congelado — os destinos ajustados à mão serão refeitos pelo modelo ÓTIMO.</span>`;\n  el.innerHTML=h;\n}\nfunction openOptions(){\n  const st={...DEFAULT_SETTINGS,...(SESS.settings||{})};\n  root.querySelectorAll('input[name=\"destRule\"]').forEach(r=>{ r.checked=(r.value===st.destRule); });\n  $('#optMinCbs').value=st.destMinCbs;\n  $('#optTargetSpan').value=st.targetSpan||'';\n  $('#optMaxSpan').value=st.maxSpan||'';\n  $('#optMinSpan').value=st.minSpan||'';\n  $('#optApply').disabled=false;\n  $('#optSessName').textContent=SESS.sessionLabel||'sessão não salva';\n  $('#optStatus').textContent='';\n  $('#optionsBg').classList.remove('hidden');\n  renderOptPreview();\n  const c=$('#optCancel'); if(c) c.focus();\n}\nfunction closeOptions(){ const b=$('#optionsBg'); if(b) b.classList.add('hidden'); }\nasync function applyOptions(){\n  const f=readOptForm();\n  if(spanFormError(f)) return;\n  const prev={...DEFAULT_SETTINGS,...(SESS.settings||{})};\n  const changed = prev.destRule!==f.destRule\n    || (f.destRule==='dominant' && prev.destMinCbs!==f.destMinCbs)\n    || numOrNull(prev.targetSpan)!==f.targetSpan\n    || numOrNull(prev.maxSpan)!==f.maxSpan\n    || numOrNull(prev.minSpan)!==f.minSpan;\n  SESS.settings={...prev,...f};\n  closeOptions();\n  if(!changed || !SESS.timeline.length){ renderAll(); return; }\n  SESS.dirtyFrom=null;\n  SESS.sectorBaseCache={};   // the recompute re-derives every baseline; keeping the old ones would\n                             // leave \"Impacto acumulado\" comparing against pre-change numbers\n  loader(true,'aplicando nova regra de destino — recalculando timeline…');\n  try{\n    await recomputeFrom(0);\n    $('#ds').textContent=''; $('#ds').classList.remove('err');\n  }catch(e){\n    const at=(SESS.dirtyFrom==null?0:SESS.dirtyFrom)+1;\n    $('#ds').textContent=`erro ao aplicar a regra na etapa ${at}: ${e.message} — etapa ${at} em diante ficou desatualizada (⟳)`;\n    $('#ds').classList.add('err');\n  }finally{ loader(false); renderAll(); }\n}\n\nconst SHARED_DS='timeline-shared-sessionsDataSet';\nconst AUTH_REF='timelineSimAuthFinal';   // single source of truth for the auth strategy reference\nlet SHARE={busy:false,url:null,last:null};\n// Serialise a PRESENTATION model, not the raw session, so the reader stays purely presentational\n// and never re-derives spans/desloc/orphans — no second copy of this engine to keep in sync.\n// NOTE: METRICS_DEF[2] is the money marker; read it as !!md[2] (a literal dollar sign in this\n// position trips the upsert's parse check).\nfunction buildShareStages(){\n  return SESS.timeline.map((mv,i)=>{\n    const c=computeDerived(mv);\n    const incBy={};\n    mv.dest.forEach(s=>{ incBy[s]=Object.fromEntries(METRICS_DEF.map(md=>[md[0],0])); });\n    Object.entries(mv.munis).forEach(([m,o])=>{\n      if(m==='__OUTROS__') return;\n      const s=mv.assign[m]; if(!s||!incBy[s]) return;\n      METRICS_DEF.forEach(md=>{ incBy[s][md[0]]+=o[md[0]]||0; });\n    });\n    const saiTot={};\n    METRICS_DEF.forEach(md=>{\n      const k=md[0];\n      saiTot[k]=Object.entries(mv.munis).filter(([m])=>m!=='__OUTROS__').reduce((a,p)=>a+((p[1][k])||0),0);\n    });\n    // orphans follow their leader's home: they enter that sector AND leave the closing one\n    c.leaders.forEach(L=>{\n      const om=mv.orphanMetricsByGroup&&mv.orphanMetricsByGroup[L.grupo];\n      if(!om||!L.home) return;\n      METRICS_DEF.forEach(md=>{ const k=md[0];\n        if(incBy[L.home]) incBy[L.home][k]+=om[k]||0;\n        saiTot[k]+=om[k]||0; });\n    });\n    const ms=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__').sort((a,b)=>mv.munis[b].cbs-mv.munis[a].cbs);\n    const sv=mv.dest.map(s=>c.span[s]);\n    const baseOf=(s,k)=>{ const b=mv.baseMetrics[s]||{}; return +(b[k]||0); };\n    return {\n      i:i, sector:mv.sector, level:mv.level||'setor', unitOfMuni:mv.unitOfMuni||{}, policy:mv.policy, domUF:mv.domUF,\n      optTier:(mv.optTier==null?0:mv.optTier),\n      destRuleFallback:!!mv.destRuleFallback,\n      dest:mv.dest.slice(), color:Object.assign({},mv.color), assign:Object.assign({},mv.assign),\n      kpis:{ cbsRealocadas:closingCbsOf(mv), desloc:c.desloc,\n             spread:(sv.length?Math.max.apply(null,sv)-Math.min.apply(null,sv):0),\n             municipios:ms.length, lideres:mv.leaders.length },\n      destinos:mv.dest.map(s=>({ s:s, base:baseOf(s,'cbs'), inc:c.inc[s]||0, orph:c.orph[s]||0, span:c.span[s]||0, gained:c.gained[s]||0 })),\n      municipios:ms.map(m=>(mv.level&&mv.level!=='setor')?{ nome:m, uf:'', cbs:mv.munis[m].cbs, destino:mv.assign[m]||null }:{ nome:mName(m), uf:mUf(m), cbs:mv.munis[m].cbs, destino:mv.assign[m]||null }),\n      excluidos:(mv.excludedMunis||[]).map(x=>({ muni:x.muni, cbs:x.cbs })),\n      orphanTotal:c.orphanTotal||0, orphanStranded:c.orphanStranded||0, noShapeCbs:mv.noShapeCbs||0,\n      lideres:c.leaders.map(L=>({ lider:(L.lider||'').split(' ').slice(0,2).join(' '), grupo:L.grupo,\n        total:L.total, home:L.home, desloc:L.desloc, orphan:L.orphan||0 })),\n      metricas:METRICS_DEF.map(md=>{ const k=md[0];\n        return { key:k, label:md[1], money:!!md[2],\n          rows:mv.dest.map(s=>({ s:s, antes:baseOf(s,k), depois:baseOf(s,k)+((incBy[s]&&incBy[s][k])||0) })),\n          sai:saiTot[k]||0 }; }),\n      geoFeat:mv.geoFeat, nbrFeat:mv.nbrFeat, excludedFeat:[]\n    };\n  });\n}\nfunction buildShareSummary(stages){\n  const world=foldWorldState(SESS.timeline,SESS.timeline.length);\n  const receivers=[];\n  SESS.timeline.forEach((mv,i)=>{\n    const own=mv.pureOwnMetrics||{};\n    receivers.push({ s:mv.sector, situacao:'fechado (etapa '+(i+1)+')', antes:+(own.cbs||0), depois:0 });\n  });\n  const seen={};\n  Object.values(world.muniOverride).forEach(s=>{\n    if(seen[s]) return; seen[s]=1;\n    const base=SESS.sectorBaseCache[s]||{}, infl=world.sectorInflow[s]||{};\n    receivers.push({ s:s, situacao:'recebeu território', antes:+(base.cbs||0), depois:(+(base.cbs||0))+(infl.cbs||0) });\n  });\n  return { stages:stages.length, sectors:SESS.timeline.map(mv=>mv.sector),\n    totalCbs:stages.reduce((a,s)=>a+(s.kpis.cbsRealocadas||0),0),\n    totalDesloc:stages.reduce((a,s)=>a+(s.kpis.desloc||0),0), receivers:receivers };\n}\nfunction renderShareBody(){\n  const el=$('#shareBody'); if(!el) return;\n  const go=$('#shareGo'), cp=$('#shareCopy'), op=$('#shareOpen'), cc=$('#shareCancel');\n  if(SHARE.url){\n    el.innerHTML=`<div class=\"opt-note\" style=\"margin-top:0\"><b style=\"color:var(--ink)\">Sessão compartilhada ✓</b><br>\n      Link de leitura desta simulação congelada. Quem abrir precisa ter login no simulador.\n      <div class=\"shareurl\">${esc(SHARE.url)}</div></div>`;\n    if(go) go.classList.add('hidden');\n    if(cp) cp.classList.remove('hidden');\n    if(op) op.classList.remove('hidden');\n    if(cc) cc.textContent='Fechar';\n    return;\n  }\n  if(go) go.classList.remove('hidden');\n  if(cp) cp.classList.add('hidden');\n  if(op) op.classList.add('hidden');\n  if(cc) cc.textContent='Cancelar';\n  const st={...DEFAULT_SETTINGS,...(SESS.settings||{})};\n  const desloc=SESS.timeline.reduce((a,mv)=>a+(mv.munis?computeDerived(mv).desloc:0),0);\n  const destTxt=st.destRule==='dominant'?('dominantes ≥'+fmt(st.destMinCbs)+' CBs'):'qualquer município';\n  el.innerHTML=`<div class=\"opt-lbl\">Confirmar compartilhamento</div>\n    <div class=\"opt-sub\">Publica uma <b>cópia congelada</b> desta sessão, exatamente no estado atual.</div>\n    <div class=\"opt-note\" style=\"margin-top:0\">\n      · <b>${fmt(SESS.timeline.length)}</b> etapa(s) — ${esc(SESS.timeline.map(mv=>mv.sector).join(' → '))}<br>\n      · snapshot atualizado em <b>${esc(fmtSyncedAt(SESS.snapshotSyncedAt))}</b><br>\n      · base: <b>municípios dominantes (CSV)</b> · destino: <b>${esc(destTxt)}</b> · span: <b>${esc(spanShort(st))}</b><br>\n      · <b>${fmt(desloc)}</b> CBs deslocadas somando a cadeia\n    </div>\n    <div class=\"opt-note\">A cópia <b>não</b> acompanha edições posteriores desta sessão — pra atualizar, compartilhe de novo e use o link novo. O link exige login no simulador; não é público.</div>\n    ${SHARE.last?`<div class=\"opt-note\"><b style=\"color:var(--ink)\">Último link gerado nesta sessão</b> — aponta pro estado de <b>antes</b> das edições feitas depois dele.<div class=\"shareurl\">${esc(SHARE.last)}</div></div>`:''}`;\n}\nasync function openShare(){\n  if(!SESS.timeline.length){ $('#ds').textContent='nada pra compartilhar — feche pelo menos um setor primeiro.'; $('#ds').classList.add('err'); return; }\n  await flushDirty();\n  SHARE.url=null;\n  const s=$('#shareStatus'); if(s){ s.textContent=''; s.classList.remove('err'); }\n  renderShareBody();\n  $('#shareBg').classList.remove('hidden');\n  const b=$('#shareCancel'); if(b) b.focus();\n}\nfunction closeShare(){ const b=$('#shareBg'); if(b) b.classList.add('hidden'); }\nasync function doShare(){\n  if(SHARE.busy) return;\n  const go=$('#shareGo'), stx=$('#shareStatus');\n  SHARE.busy=true;\n  if(go){ go.disabled=true; go.textContent='Compartilhando…'; }\n  if(stx){ stx.textContent=''; stx.classList.remove('err'); }\n  try{\n    // Resolved as a GLOBAL PROCESS, not a declared param — which only works because the block\n    // instance on the `main` artboard binds `sharedDataset: @timeline-shared-sessionsDataSet`.\n    // That binding is load-bearing: a Process is only define()d once something on the rendering\n    // tree references it, so without it this lookup returns null and sharing dies on the guard\n    // below. Do NOT remove the instance param because this file never reads d2.params.sharedDataset.\n    const ds=d2.data(SHARED_DS);\n    if(!ds) throw new Error('dataset de sessões compartilhadas indisponível');\n    await flushDirty();\n    const stages=buildShareStages();\n    const summary=buildShareSummary(stages);\n    let who='';\n    try{ const a=d2.auth(AUTH_REF); who=(a&&a.user&&(a.user.email||a.user.nome))||''; }catch(e){}\n    const created=await ds.create({\n      label:SESS.sessionLabel||('Sessão '+new Date().toLocaleString('pt-BR')),\n      snapshotRaw:SESS.snapshotRaw, snapshotSyncedAt:SESS.snapshotSyncedAt,\n      settings:{...DEFAULT_SETTINGS,...(SESS.settings||{})},\n      stages:stages, summary:summary, sharedBy:who, sharedAt:new Date().toISOString()\n    });\n    const id=(created&&created._id)||(created&&created.data&&created.data._id)||(ds.selected&&ds.selected()&&ds.selected()._id)||null;\n    if(!id) throw new Error('registro gravado, mas sem _id na resposta — não foi possível montar o link');\n    SHARE.url=window.location.origin+'/sessions/'+id;\n    SHARE.last=SHARE.url;\n    renderShareBody();\n  }catch(e){\n    if(stx){ stx.textContent='erro ao compartilhar: '+e.message; stx.classList.add('err'); }\n  }finally{\n    SHARE.busy=false;\n    if(go){ go.disabled=false; go.textContent='Compartilhar'; }\n  }\n}\n\n// ---------- rendering ----------\nfunction renderTimeline(){\n  const el=$('#movementChips'); if(!el) return;\n  if(!SESS.timeline.length){ el.innerHTML='<span class=\"empty\">Nenhuma etapa ainda — use \"Adicionar movimentação\" à direita.</span>'; return; }\n  el.innerHTML=SESS.timeline.map((mv,i)=>{\n    const ready=mv.dest!==undefined;\n    const c=ready?computeDerived(mv):null;\n    const stale=SESS.dirtyFrom!=null && i>=SESS.dirtyFrom;\n    return `<div class=\"tchip ${i===SESS.selected?'on':''} ${stale?'stale':''}\" data-i=\"${i}\">\n      <span class=\"tnum\">${i+1}</span><span class=\"tsec\">${LEVELS[mv.level||'setor'].label} ${mv.sector}</span>\n      <span class=\"tstat\">${ready?((mv.level||'setor')==='setor'?fmt(c.desloc)+' desloc.':fmt(closingCbsOf(mv))+' CBs'):'…'}</span>\n      ${stale?'<span class=\"tstale\" title=\"recalcula ao selecionar outra etapa\">⟳</span>':''}\n      <span class=\"trm\" data-rm=\"${i}\" title=\"remover esta etapa e as seguintes\">✕</span>\n    </div>`;\n  }).join('');\n  el.querySelectorAll('.tchip').forEach(ch=>{\n    ch.addEventListener('click',async (e)=>{\n      if(e.target.dataset.rm!=null && e.target.dataset.rm!==''){ removeFrom(+e.target.dataset.rm); return; }\n      const i=+ch.dataset.i;\n      if(i!==SESS.selected) await flushDirty();\n      SESS.selected=i; renderAll();\n    });\n  });\n}\nfunction renderRuleNote(){\n  const el=$('#ruleNote'); if(!el) return;\n  const st={...DEFAULT_SETTINGS,...(SESS.settings||{})};\n  const mv=SESS.timeline[SESS.selected];\n  const lvl=LEVELS[(mv&&mv.level)||'setor'];\n  let h='';\n  if(!mv || (mv.level||'setor')==='setor'){\n    h+=`<b style=\"color:var(--ink)\">Base de municípios dominantes:</b> só os municípios que a base (CSV) atribui ao setor entram no mapa e na alocação`;\n    if(mv&&mv.domCsvMunis) h+=` · <b>${fmt(mv.domCsvMunis)}</b> na base do setor ${mv.sector}`;\n    if(mv&&mv.excludedCbs) h+=` · <b style=\"color:var(--closing)\">${fmt(mv.excludedMunis.length)} município(s) / ${fmt(mv.excludedCbs)} CBs</b> fora da base nesta etapa — não aparecem no mapa e as CBs seguem suas líderes (quebra de vínculo)`;\n  } else {\n    // GV/mercado não têm spillover (todo setor pertence a exatamente uma GV/mercado na base), então\n    // não existe \"excluído\" pra reportar aqui — só o tamanho da base e em quantas unidades ela se agrupa.\n    h+=`<b style=\"color:var(--ink)\">Base de ${lc(lvl.childLabel)}s dominantes:</b> ${mv.domCsvMunis!=null?`<b>${fmt(mv.domCsvMunis)}</b> município(s) `:''}na base ${lvl.de} ${lc(lvl.label)} ${mv.sector}, agrupados em <b>${fmt(Object.keys(mv.unitMunis||{}).length)}</b> ${lc(lvl.childLabel)}(s)`;\n  }\n  if(DOM.error) h+=` · <b style=\"color:var(--closing)\">⚠ base indisponível: ${esc(DOM.error)}</b>`;\n  h+=`<br>`;\n  h+=`<b style=\"color:var(--ink)\">Regra de destino:</b> `;\n  h+= st.destRule==='dominant'\n    ? `só municípios com <b>≥${fmt(st.destMinCbs)} CBs</b> trazem ${lc(lvl.destLabel)} pra lista de destinos`\n    : `qualquer município ${lvl.de} ${lc(lvl.label)} fechad${lvl.a==='à'?'a':'o'} vale como ponte <span style=\"opacity:.7\">(padrão)</span>`;\n  if(mv&&st.destRule==='dominant'){\n    // A ponte é sempre por MUNICÍPIO, em qualquer nível — mv.ignoredBridges já é a lista definitiva\n    // que computeMovement calculou, então lê-la aqui em vez de recalcular contra mv.munis, que em\n    // GV/mercado está no grão de setor/GV e daria o número errado.\n    const ig=mv.ignoredBridges||[];\n    if(ig.length) h+=` · <b style=\"color:var(--closing)\">${fmt(ig.length)}</b> ignorado(s) como ponte (ainda redistribuído(s)): ${ig.slice(0,5).join(', ')}${ig.length>5?' +'+(ig.length-5):''}`;\n    if(mv.destRuleFallback) h+=`<br><b style=\"color:var(--closing)\">⚠ nenhum município dominante nesta etapa — regra relaxada pra \"qualquer município\".</b>`;\n  }\n  el.innerHTML=h;\n}\nfunction renderSpanRule(){\n  const el=$('#spanRule'); if(!el) return;\n  const mv=SESS.timeline[SESS.selected], lim=spanLimits(mv);\n  if(!mv||!mv.munis||mv.view==='asis'||!spanLimitsOn(lim)){ el.innerHTML=''; return; }\n  const sp=spanMapFor(mv,mv.assign||{}), v=spanViolationsOf(sp,lim);\n  const bits=[];\n  if(lim.target) bits.push(`alvo <b>${fmt(lim.target)}</b>`);\n  if(lim.max) bits.push(`máx <b>${fmt(lim.max)}</b>`);\n  if(lim.min) bits.push(`mín <b>${fmt(lim.min)}</b>`);\n  let h=`Pré-requisito de span: ${bits.join(' · ')} CBs — `;\n  if(v.over.length||v.under.length){\n    h+=`<b style=\"color:var(--closing)\">⚠ `;\n    if(v.over.length) h+=`acima do máximo: ${v.over.map(s=>s+' ('+fmt(sp[s])+')').join(', ')}`;\n    if(v.over.length&&v.under.length) h+=' · ';\n    if(v.under.length) h+=`abaixo do mínimo: ${v.under.map(s=>s+' ('+fmt(sp[s])+')').join(', ')}`;\n    h+=`</b>`;\n    if(mv.optTier===1) h+=`<br><span style=\"opacity:.85\">Nenhuma alocação conectada respeita o span mínimo nesta etapa — o modelo relaxou essa exigência.</span>`;\n    else if(mv.optTier===2) h+=`<br><span style=\"opacity:.85\">Nenhuma alocação conectada respeita os limites nesta etapa — o modelo relaxou essa exigência.</span>`;\n    else if(mv.optTier===-1) h+=`<br><span style=\"opacity:.85\">Etapa resolvida por heurística — os limites não são garantidos.</span>`;\n  } else h+=`<b style=\"color:var(--ok)\">✓ todos os setores receptores dentro dos limites</b>`;\n  el.innerHTML=`<div class=\"note\" style=\"margin:-2px 0 6px\">${h}</div>`;\n}\nfunction renderContig(){const mv=SESS.timeline[SESS.selected];const el=$('#contig');if(!el||!mv)return;\n  if(mv.view==='asis'){el.innerHTML='';return;}\n  const lvl=LEVELS[mv.level||'setor'];\n  // Indicador de conectividade geográfica só se aplica a fechamento de setor — ver contigBadFor.\n  if((mv.level||'setor')!=='setor'){ el.innerHTML=''; return; }\n  const bad=contigBadFor(mv,mv.assign);\n  el.innerHTML=bad.length\n    ?`<div class=\"note\" style=\"color:var(--closing);font-weight:600;margin:-2px 0 6px\">⚠ Território desconectado em ${bad.join(', ')} — ${lc(lvl.childLabel)}(s) desconectado(s) do território ${lvl.de} ${lc(lvl.label)}. Use ★ ÓTIMO ou reassocie no mapa.</div>`\n    :`<div class=\"note\" style=\"color:var(--ok);margin:-2px 0 6px\">✓ Sem quebras — cada ${lc(lvl.label)} forma uma região conectada.</div>`;\n}\nfunction closingCbsOf(mv){ return Object.entries(mv.munis).filter(([m])=>m!=='__OUTROS__').reduce((a,[,o])=>a+o.cbs,0); }\nfunction sectorTotalCbs(mv){ return Object.values(mv.munis).reduce((a,o)=>a+o.cbs,0); }\nfunction renderKpis(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const c=computeDerived(mv); const lvl=LEVELS[mv.level||'setor'];\n  const childPlural=lvl.childLabel==='Setor'?'Setores':(lvl.childLabel==='GV'?'GVs':'Municípios');\n  if(mv.view==='asis'){const mc=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__').length;\n    $('#kpis').innerHTML=[\n      {n:fmt(sectorTotalCbs(mv)),l:`CBs ${lvl.no} ${lc(lvl.label)} ${mv.sector} (antes desta etapa)`,t:`Total de CBs ${lvl.no} ${lc(lvl.label)} hoje — já considerando o que etapas anteriores da timeline mandaram pra cá.`},\n      {n:mv.csvMunisTotal?`${fmt(mc)}/${fmt(mv.csvMunisTotal)}`:fmt(mc),l:`${childPlural} ${lvl.de} ${lc(lvl.label)}`,t:`${lvl.childLabel}(s) desenhados nesta etapa${mv.csvMunisTotal?` de ${fmt(mv.csvMunisTotal)} que a base de dominantes atribui ${lvl.a} ${lc(lvl.label)}`:''}.${(mv.missingMunis||[]).length?' Fora do mapa: '+mv.missingMunis.map(x=>x.muni+' ('+x.reason+')').join(' · '):''}${Object.keys(mv.ufGuessed||{}).length?' UF inferida da UF dominante do setor (nome repetido em outra UF carregada): '+Object.entries(mv.ufGuessed).map(([nm,u])=>nm+'→'+u).join(', '):''}`},\n      {n:fmt(mv.leaders.length),l:'Líderes (grupos)',t:`Líderes presentes ${lvl.no} ${lc(lvl.label)} nesta etapa.`},\n      {n:fmt(mv.dest.length),l:`${lvl.destLabel}s adjacentes`,t:`${lvl.destLabel}s vizinh${lvl.destLabel==='GV'?'as':'os'} (ainda abertas)${lvl.parentPhrase?` ${lvl.parentPhrase}`:''}${mv.gv?` (${mv.gv})`:''} que poderiam receber os ${lc(lvl.childLabel)}s.${(mv.gvRejected||[]).length&&lvl.parentWord?' Fora do mapa, por serem de outr'+(lvl.parentWord==='gerência'?'a':'o')+' '+lvl.parentWord+': '+mv.gvRejected.join(', ')+'.':''}`},\n    ].map(k=>`<div class=\"kpi\" title=\"${k.t}\"><div class=\"n\">${k.n}</div><div class=\"l\">${k.l}</div></div>`).join('');\n    return;}\n  const sv=mv.dest.map(s=>c.span[s]);const spread=sv.length?Math.max(...sv)-Math.min(...sv):0;\n  const zero=mv.dest.filter(s=>c.gained[s]===0);const totCbs=closingCbsOf(mv);\n  $('#kpis').innerHTML=[\n    // \"CBs fora do X\" só faz sentido pra fechamento de setor — a mecânica de vínculo (CBs que\n    // seguem a líder pra fora do território) é uma coisa de setor/orphan, não de GV/mercado.\n    (mv.level||'setor')==='setor'?{n:fmt(c.desloc),l:mv.policy==='fora'?`CBs fora ${lvl.de} ${lc(lvl.destLabel)}`:'CBs c/ quebra de relação',cls:'warn',t:`CBs cuja líder acabou noutr${lvl.a==='à'?'a':'o'} ${lc(lvl.destLabel)} nesta etapa.`}:null,\n    {n:fmt(spread),l:'Desequilíbrio (máx−mín CBs)',cls:spread>800?'warn':'ok',t:`Diferença de tamanho entre ${lvl.destLabel==='GV'?'a maior e a menor':'o maior e o menor'} ${lc(lvl.destLabel)} depois desta etapa.`},\n    {n:fmt(totCbs),l:'CBs realocadas',cls:'',t:`Total de CBs ${lvl.de} ${lc(lvl.label)} ${mv.sector} sendo redistribuídas nesta etapa.`},\n    (mv.level||'setor')==='setor'?{n:zero.length?zero.join(', '):'nenhum',l:`${lvl.destLabel} sem líder herdada`,cls:zero.length?'warn':'ok',t:`${lvl.destLabel} que recebe ${lc(lvl.childLabel)}(s) mas nenhuma líder nesta etapa.`}:null,\n  ].filter(Boolean).concat(mv.excludedCbs?[{n:fmt(mv.excludedCbs),l:`CBs fora do setor · ${fmt(mv.excludedMunis.length)} município(s) fora da base`,cls:'warn',t:'CBs em municípios que a base de dominantes não atribui a este setor: ficam fora do mapa e da alocação geográfica e seguem a líder do seu grupo.'}]:[])\n   .concat((mv.missingMunis||[]).length?[{n:fmt(mv.missingMunis.length),l:`Município(s) da base fora do mapa · ${fmt(mv.csvMunisTotal)} na base`,cls:'warn',t:`A base de dominantes atribui ${fmt(mv.csvMunisTotal)} município(s) ao setor ${mv.sector} e ${fmt(mv.csvMunisTotal-mv.missingMunis.length)} chegaram ao mapa. Fora: ${mv.missingMunis.map(x=>x.muni+' — '+x.reason+(x.cbs?' ('+fmt(x.cbs)+' CBs)':'')).join(' · ')}`}]:[])\n   .map(k=>`<div class=\"kpi ${k.cls}\" title=\"${k.t}\"><div class=\"n\">${k.n}</div><div class=\"l\">${k.l}</div></div>`).join('');\n}\nfunction renderSpans(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const c=computeDerived(mv); const lvl=LEVELS[mv.level||'setor'];\n  if(mv.view==='asis'){const items=[{s:mv.sector,val:sectorTotalCbs(mv),color:CLOSE_COLOR}].concat(mv.dest.map(s=>({s,val:+(mv.baseMetrics[s]?.cbs||0),color:mv.color[s]})));\n    const max=Math.max(...items.map(x=>x.val),1);\n    $('#spans').innerHTML=items.map(x=>`<div class=\"bar-row\"><div class=\"tag\" style=\"color:${x.color}\">${x.s}</div><div class=\"bar-track\">\n      <div class=\"bar-inc\" style=\"width:${x.val/max*100}%;background:${x.color}\"></div></div>\n      <div class=\"bar-val\">${fmt(x.val)}</div></div>`).join('')\n      +`<div class=\"note\">Estrutura antes desta etapa — ${lvl.a} ${lc(lvl.label)} <b>${mv.sector}</b> ainda existe. Alterne pra <b>TOBE</b> pra ver a redistribuição.</div>`;\n    return;}\n  const lim=spanLimits(mv),on=spanLimitsOn(lim);\n  const rawMax=Math.max(...mv.dest.map(s=>c.span[s]),lim.target||0,lim.max||0,1);\n  const max=on?rawMax*1.04:rawMax;   // headroom so a marker sitting at the scale top stays visible\n  const marks='';\n  $('#spans').innerHTML=mv.dest.map(s=>{const base=+(mv.baseMetrics[s]?.cbs||0),i=c.inc[s];\n    const over=lim.max&&c.span[s]>lim.max,under=lim.min&&c.span[s]<lim.min;\n    return `<div class=\"bar-row\"><div class=\"tag\" style=\"color:${mv.color[s]}\">${s}</div><div class=\"bar-track\">\n      <div class=\"bar-base\" style=\"width:${base/max*100}%;background:${mv.color[s]}\"></div>\n      <div class=\"bar-inc\" style=\"width:${i/max*100}%;background:${mv.color[s]}\"></div>${marks}</div>\n      <div class=\"bar-val\" style=\"${over?'color:var(--closing);font-weight:700':(under?'color:#ff9500;font-weight:700':'')}\">${fmt(c.span[s])} <span style=\"opacity:.6\">(+${fmt(i)})</span>${over?' ▲':''}${under?' ▼':''}</div></div>`;}).join('')\n    +`<div class=\"note\">Claro = base (já incluindo etapas anteriores) · cheio = CBs entrantes ${lvl.de} ${mv.sector} nesta etapa.${c.orphanTotal?` Inclui <b>${fmt(c.orphanTotal-c.orphanStranded)}</b> CB(s) de municípios fora da base de dominantes que seguiram suas líderes.`:''}</div>`;\n}\n// Two very different reasons land rows in the __OUTROS__ bucket — no IBGE shape, or outside the\n// sector's dominance base. Same bucket computationally, but they must not read as the same thing.\nfunction outsideNote(mv){\n  const bits=[];\n  if(mv.noShapeCbs) bits.push(`<b>${fmt(mv.noShapeCbs)}</b> CBs em ${fmt(mv.noShapeMunis.length)} município(s) sem shape na UF`);\n  if(mv.excludedCbs) bits.push(`<b>${fmt(mv.excludedCbs)}</b> CBs em ${fmt(mv.excludedMunis.length)} município(s) <b>fora da base de dominantes</b> deste setor — <b style=\"color:var(--closing)\">quebra de vínculo</b>`);\n  if(!bits.length) return '';\n  let h=`<div class=\"note\">Fora do mapa e da alocação geográfica: ${bits.join(' · ')}.`;\n  if(mv.excludedCbs){\n    const c=computeDerived(mv);\n    h+=` As <b>${fmt(mv.excludedCbs)}</b> CBs em quebra de vínculo <b>seguem a líder do seu grupo</b>`;\n    const byS=mv.dest.filter(s=>c.orph[s]).map(s=>`<b style=\"color:${mv.color[s]}\">${s}</b> (${fmt(c.orph[s])})`);\n    h+=byS.length?`: ${byS.join(' · ')}.`:'.';\n    if(c.orphanStranded) h+=` <b style=\"color:var(--closing)\">${fmt(c.orphanStranded)} CB(s) sem destino</b> — a líder não ficou com nenhum município realocado, então não há setor pra seguir.`;\n  }\n  if(mv.noShapeCbs) h+=` As CBs sem shape na UF continuam fora de qualquer setor destino.`;\n  if(mv.excludedMunis&&mv.excludedMunis.length) h+=`<br><span style=\"opacity:.85\">${mv.excludedMunis.slice(0,8).map(x=>x.muni+' ('+fmt(x.cbs)+')').join(', ')}${mv.excludedMunis.length>8?' +'+(mv.excludedMunis.length-8):''}</span>`;\n  return h+`</div>`;\n}\nfunction renderMuni(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const lvl=LEVELS[mv.level||'setor'];\n  const plural=lvl.childLabel==='Setor'?'Setores':(lvl.childLabel==='GV'?'GVs':'Municípios');\n  const fem=lvl.childLabel==='GV';\n  const t=$('#muniListTitle'); if(t) t.textContent=`${plural} → ${lc(lvl.destLabel)} destino`;\n  const nt=$('#muniListNote'); if(nt) nt.innerHTML=`Clique no <b>código ${lvl.a} ${lc(lvl.destLabel)}</b> pra mandar ${lvl.a} ${lc(lvl.childLabel)} <b>inteir${fem?'a':'o'}</b> pra lá (regra de negócio). A cor acompanha o mapa.`;\n  const ms=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__').sort((a,b)=>mv.munis[b].cbs-mv.munis[a].cbs);\n  if(mv.view==='asis'){$('#muniList').innerHTML=ms.map(m=>`<div class=\"muni-item\"><div class=\"nm\">${m}</div><div class=\"ct\">${fmt(mv.munis[m].cbs)} CBs</div><span class=\"badge\" style=\"background:${CLOSE_COLOR};color:#fff;border-color:${CLOSE_COLOR}\">${lc(lvl.label)} ${mv.sector}</span></div>`).join('')\n      +`<div class=\"note\">Hoje tod${fem?'as':'os'} pertencem ${lvl.a} ${lc(lvl.label)} <b>${mv.sector}</b>. No <b>TOBE</b> cada um vira botões de destino.</div>`+outsideNote(mv);return;}\n  $('#muniList').innerHTML=ms.map(m=>`<div class=\"muni-item\"><div class=\"nm\">${m}</div><div class=\"ct\">${fmt(mv.munis[m].cbs)} CBs</div>\n    <div class=\"seg\" data-m=\"${m}\">${mv.dest.map(s=>`<button data-s=\"${s}\" class=\"${mv.assign[m]===s?'on':''}\" style=\"${mv.assign[m]===s?'background:'+mv.color[s]:''}\">${s}</button>`).join('')}</div></div>`).join('')\n    +outsideNote(mv);\n  $('#muniList').querySelectorAll('.seg button').forEach(b=>b.onclick=()=>{const m=b.parentElement.dataset.m,s=b.dataset.s;editSelected(m2=>{m2.assign[m]=s;});});\n}\nfunction renderLeaders(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const c=computeDerived(mv);\n  if(mv.view==='asis'){$('#leaders').innerHTML=`<thead><tr><th>Líder</th><th>Grupo</th><th>CBs</th><th>${LEVELS[mv.level||'setor'].label}</th></tr></thead><tbody>`\n    +mv.leaders.map(L=>`<tr><td>${(L.lider||'').split(' ').slice(0,2).join(' ')}</td><td>${L.grupo}</td><td>${fmt(L.total)}</td><td><span class=\"home\" style=\"background:${CLOSE_COLOR}\"></span>${mv.sector}</td></tr>`).join('')\n    +`<tr style=\"font-weight:700\"><td>TOTAL</td><td></td><td>${fmt(mv.leaders.reduce((a,L)=>a+L.total,0))}</td><td></td></tr></tbody>`;return;}\n  const showOrph=c.orphanTotal>0;\n  $('#leaders').innerHTML=`<thead><tr><th>Líder</th><th>CBs</th><th>Home</th>${mv.dest.map(s=>`<th>${s}</th>`).join('')}${showOrph?'<th title=\"CBs em municípios fora da base de dominantes que seguiram esta líder\">Fora do setor</th>':''}<th>Desloc.</th></tr></thead><tbody>`\n   +c.leaders.map(L=>`<tr><td>${(L.lider||'').split(' ').slice(0,2).join(' ')}</td><td>${fmt(L.total)}</td>\n     <td>${L.home?`<span class=\"home\" style=\"background:${mv.color[L.home]}\"></span>${L.home}`:'–'}</td>\n     ${mv.dest.map(s=>`<td class=\"cell\" style=\"${s===L.home?'color:'+mv.color[s]+';font-weight:700':''}\">${L.byS[s]||'·'}</td>`).join('')}\n     ${showOrph?`<td class=\"cell\" style=\"${L.orphan&&!L.orphanHome?'color:var(--closing);font-weight:700':''}\" title=\"${L.orphan?(L.orphanHome?'seguem a líder para o setor '+L.orphanHome:'sem home — CBs sem setor pra seguir'):''}\">${L.orphan?fmt(L.orphan)+(L.orphanHome?'':' ⚠'):'·'}</td>`:''}\n     <td style=\"color:${L.desloc?'var(--closing)':'var(--mut)'};font-weight:${L.desloc?700:400}\">${L.desloc||'0'}</td></tr>`).join('')\n   +`<tr style=\"font-weight:700\"><td>TOTAL</td><td>${fmt(c.leaders.reduce((a,L)=>a+L.total,0))}</td><td></td>${mv.dest.map(s=>`<td>${fmt(c.leaders.reduce((a,L)=>a+L.byS[s],0))}</td>`).join('')}${showOrph?`<td>${fmt(c.orphanTotal)}</td>`:''}<td style=\"color:var(--closing)\">${fmt(c.desloc)}</td></tr></tbody>`;\n}\nfunction renderMatrix(){const mv=SESS.timeline[SESS.selected]; if(!mv) return;\n  // Esta matriz cruza LINHAS DO CRM (município x grupo) — no fechamento de GV/mercado a unidade\n  // que troca de dono é setor/GV, não município, e reconstruir a matriz nesse grão é trabalho ainda\n  // não feito; mostrar a tabela como se fosse por município aqui daria linhas vazias sem avisar.\n  if((mv.level||'setor')!=='setor'){ $('#matrix').innerHTML=`<tr><td class=\"note\" style=\"padding:10px\">Matriz por município × grupo ainda não disponível pra fechamento de ${LEVELS[mv.level].label} — use os KPIs, líderes e plano de migração acima.</td></tr>`; return; }\n  const ms=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__').sort((a,b)=>mv.munis[b].cbs-mv.munis[a].cbs);\n  // `_out` is a flag stamped on the ROW, and rows are shared between etapas (absorbed + inherited\n  // orphans), so the last etapa to aggregate wins and reading it here can describe the wrong etapa.\n  // Derive the bucket from THIS mv instead. Summing rather than .find() because several out-municípios\n  // of the same group all collapse into __OUTROS__, and only the first was being counted.\n  const outOf=x=>!mv.geoFeat[mkey(x.municipio,x.uf)];\n  const cell=(m,g)=>mv.matrix.reduce((a,x)=>a+((((outOf(x)?'__OUTROS__':mkey(x.municipio,x.uf))===m)&&String(x.grupo)===g)?+x.cbs:0),0);\n  const mx=Math.max(...ms.flatMap(m=>mv.leaders.map(L=>cell(m,L.grupo))),1);\n  // No destination column here. This is the AS-IS matrix: every município in it still belongs to the\n  // closing sector, so showing where it is HEADED mixed the two states of the world in one table and\n  // made the ASIS view read like a plan. The destination lives on the map and in \"Municípios → setor\n  // destino\", which are about the to-be.\n  $('#matrix').innerHTML=`<thead><tr><th>Município</th>${mv.leaders.map(L=>`<th title=\"${L.lider}\">${L.grupo}</th>`).join('')}<th>Tot</th></tr></thead><tbody>`\n   +ms.map(m=>`<tr><td>${m}</td>`\n     +mv.leaders.map(L=>{const v=cell(m,L.grupo);return `<td class=\"cell\" style=\"${v?`background:rgba(229,181,63,${.08+v/mx*.5})`:''}\">${v||'·'}</td>`;}).join('')\n     +`<td style=\"font-weight:700\">${fmt(mv.munis[m].cbs)}</td></tr>`).join('')+`</tbody>`;\n}\n// TOBE counterpart of the AS-IS matrix: the same município × grupo grid plus the two columns the AS-IS\n// view deliberately refuses to carry — where the município ends up, and under which líder.\n// \"Líder resultante\" is the líder holding the most CBs in that município. A município is served by several\n// grupos at once and the data names no single owner, so the dominant one is the honest answer and its\n// share is printed beside it instead of being hidden behind a single name.\nfunction renderMatrixTobe(){const mv=SESS.timeline[SESS.selected]; const el=$('#matrixTobe'); const nt=$('#tobeNote');\n  if(!el) return;\n  if(!mv||!mv.munis){ el.innerHTML=''; if(nt) nt.innerHTML=''; return; }\n  if((mv.level||'setor')!=='setor'){ el.innerHTML=`<tr><td class=\"note\" style=\"padding:10px\">Matriz por município × grupo ainda não disponível pra fechamento de ${LEVELS[mv.level].label} — use os KPIs, líderes e plano de migração acima.</td></tr>`; if(nt) nt.innerHTML=''; return; }\n  const c=computeDerived(mv);\n  const homeOf={}; c.leaders.forEach(L=>{ homeOf[L.grupo]=L.home; });\n  const ms=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__').sort((a,b)=>mv.munis[b].cbs-mv.munis[a].cbs);\n  // One pass over the matrix instead of a scan per cell: the AS-IS table can afford the naive version\n  // on six municípios, but this one asks for the dominant líder too, which multiplies the lookups.\n  const outOf=x=>!mv.geoFeat[mkey(x.municipio,x.uf)];\n  const cellBy={}; mv.matrix.forEach(x=>{ const k=(outOf(x)?'__OUTROS__':mkey(x.municipio,x.uf))+'|'+String(x.grupo);\n    cellBy[k]=(cellBy[k]||0)+ +x.cbs; });\n  const cell=(m,g)=>cellBy[m+'|'+g]||0;\n  const mx=Math.max(...ms.flatMap(m=>mv.leaders.map(L=>cell(m,L.grupo))),1);\n  const domLeader=m=>{ let best=null,bc=0;\n    mv.leaders.forEach(L=>{ const v=cell(m,L.grupo); if(v>bc){ bc=v; best=L; } });\n    return best?{L:best,cbs:bc}:null; };\n  const short=L=>(L.lider||'').split(' ').slice(0,2).join(' ')||('grupo '+L.grupo);\n  // NOT named `rows` — that is the module-level Databricks response helper, and shadowing it inside a\n  // render function is a trap for whoever adds a query here later.\n  // Off-mismatch ainda calculado pra alimentar a nota abaixo da tabela — só não vira mais coluna: o\n  // destino agora é \"Setor destino\" por GRUPO no rodapé, não mais por município na grade.\n  const recs=ms.map(m=>{ const d=mv.assign[m]||null, dl=domLeader(m);\n    const home=dl?(homeOf[dl.L.grupo]||null):null;\n    return {m:m,off:!!(dl&&home&&d&&home!==d)}; });\n  el.innerHTML=`<thead><tr><th>Município</th>${mv.leaders.map(L=>`<th title=\"${esc(L.lider||'')}\">${L.grupo}<br><span style=\"font-weight:400;font-size:10px;color:var(--mut)\">${esc(short(L))}</span></th>`).join('')}<th>Tot</th></tr></thead><tbody>`\n   +ms.map(m=>`<tr><td>${m}</td>`\n     +mv.leaders.map(L=>{const v=cell(m,L.grupo);return `<td class=\"cell\" style=\"${v?`background:rgba(229,181,63,${.08+v/mx*.5})`:''}\">${v||'·'}</td>`;}).join('')\n     +`<td style=\"font-weight:700\">${fmt(mv.munis[m].cbs)}</td></tr>`).join('')\n   // Um rótulo de destino por GRUPO (coluna), não por município (linha) — cada grupo tem UM home\n   // fixo (computeDerived já calculou), então ele mora uma vez no rodapé, igual o nome já morava.\n   +`<tr class=\"lider-foot\"><td>Setor destino</td>`\n     +mv.leaders.map(L=>{const h=homeOf[L.grupo]; return `<td>${h?`<span class=\"home\" style=\"background:${mv.color[h]}\"></span>${h}`:'–'}</td>`;}).join('')\n     +`<td></td></tr>`\n   +`</tbody>`;\n  if(nt){\n    const offN=recs.filter(r=>r.off).length;\n    nt.innerHTML=(mv.policy!=='fora')\n      ? `Política <b>quebrar relação</b>: as CBs deixam a líder atual e passam à estrutura do setor destino — o rodapé mostra pra onde cada grupo vai.`\n      : `<b>Setor destino</b> = o setor que recebe a maior parte das CBs de cada líder (rodapé, uma vez por grupo). `\n        +(offN?`<span style=\"color:var(--closing)\">${fmt(offN)} município(s) ⚠</span> têm a líder dominante indo para um setor diferente do dela — as CBs seguem a líder (é disso que o KPI “CBs fora do setor” é feito).`\n          :`Em todos os municípios a líder dominante termina no mesmo setor que recebe o território.`);\n  }\n}\nfunction renderPolicy(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const c=computeDerived(mv); const lvl=LEVELS[mv.level||'setor'];\n  // O toggle fora-do-setor/quebra-de-relação é uma decisão de setor fechando — em GV/mercado a\n  // seção some inteira em vez de mostrar um controle que não corresponde a nada calculado.\n  const sec=$('#policySection'); if(sec) sec.classList.toggle('hidden',(mv.level||'setor')!=='setor');\n  if((mv.level||'setor')!=='setor') return;\n  $('#policyNote').innerHTML=mv.policy==='fora'\n    ?`<b style=\"color:var(--acc)\">Mantendo vínculo:</b> ${fmt(c.desloc)} CBs seguem com a líder mas ficam <b>fisicamente noutr${lvl.a==='à'?'a':'o'} ${lc(lvl.destLabel)}</b>. Preserva relação; suja geografia.`\n    :`<b style=\"color:var(--acc)\">Quebrando vínculo:</b> ${fmt(c.desloc)} CBs <b>re-vinculam a uma líder d${lvl.a==='à'?'a':'o'} ${lc(lvl.destLabel)} destino</b>. Geografia limpa; rompe relação.`;\n}\nfunction renderPlan(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const c=computeDerived(mv); const lvl=LEVELS[mv.level||'setor']; const ms=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__').sort((a,b)=>a.localeCompare(b));\n  // GV/mercado: a chave \"m\" aqui é um código de setor/GV, não uma chave município/UF — mName/mUf\n  // parseariam lixo, então o CSV de plano exporta o código cru nesses níveis.\n  mv._plan=ms.map(m=>(mv.level&&mv.level!=='setor')?{municipio:m,uf:'',cbs:mv.munis[m].cbs,destino:mv.assign[m]}:{municipio:mName(m),uf:mUf(m),cbs:mv.munis[m].cbs,destino:mv.assign[m]});\n  $('#plan').innerHTML=`Etapa ${SESS.selected+1} · ${lvl.label} <b>${mv.sector}</b> → ${ms.map(m=>`${m}→<b style=\"color:${mv.color[mv.assign[m]]}\">${mv.assign[m]||'–'}</b>`).join(' · ')}<br>\n   Política: <b>${mv.policy==='fora'?`manter vínculo (CBs fora ${lvl.de} ${lc(lvl.destLabel)})`:'quebrar relação'}</b> · ${fmt(c.desloc)} CBs impactadas nesta etapa.`\n   +(c.orphanTotal?`<br>Fora da base de dominantes: ${fmt(c.orphanTotal)} CB(s) seguem suas líderes — ${mv.dest.filter(s=>c.orph[s]).map(s=>`${s} (${fmt(c.orph[s])})`).join(' · ')||'–'}${c.orphanStranded?` · <b style=\"color:var(--closing)\">${fmt(c.orphanStranded)} sem líder com destino</b>`:''}. Não entram no CSV, que é por município.`:'');\n}\nfunction renderReport(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const c=computeDerived(mv);\n  mv.metric=mv.metric||'cbs';\n  const KEYS=METRICS_DEF.map(m=>m[0]);\n  const incBy={};mv.dest.forEach(s=>incBy[s]=Object.fromEntries(KEYS.map(k=>[k,0])));\n  Object.entries(mv.munis).forEach(([m,o])=>{if(m==='__OUTROS__')return;const s=mv.assign[m];if(!s||!incBy[s])return;KEYS.forEach(k=>incBy[s][k]+=o[k]||0);});\n  // orphan CBs land on their leader's home sector, not on a geographic destination\n  c.leaders.forEach(L=>{ const om=mv.orphanMetricsByGroup&&mv.orphanMetricsByGroup[L.grupo];\n    if(om&&L.home&&incBy[L.home]) KEYS.forEach(k=>incBy[L.home][k]+=om[k]||0); });\n  const closeTot={};KEYS.forEach(k=>closeTot[k]=Object.entries(mv.munis).filter(([m])=>m!=='__OUTROS__').reduce((a,[,o])=>a+(o[k]||0),0));\n  // they leave the closing sector too, so antes → depois still balances\n  c.leaders.forEach(L=>{ const om=mv.orphanMetricsByGroup&&mv.orphanMetricsByGroup[L.grupo];\n    if(om&&L.home) KEYS.forEach(k=>closeTot[k]+=om[k]||0); });\n  const trend=mv.trend.slice(-6);\n  const chartHTML=mk=>{\n    const isM=['receita','rec_nat','rec_avon'].includes(mk); const fN=isM?money:fmt;\n    const data=mv.dest.map(s=>({label:s,color:mv.color[s],antes:+(mv.baseMetrics[s]?.[mk]||0),depois:+(mv.baseMetrics[s]?.[mk]||0)+(incBy[s]?.[mk]||0)}));\n    data.push({label:mv.sector+'✕',color:'#ff3b30',antes:closeTot[mk]||0,depois:0});\n    const max=Math.max(...data.flatMap(d=>[d.antes,d.depois]),1);\n    const W=720,H=290,base=238,top=42,maxH=base-top,n=data.length,gw=(W-16)/n;\n    let g='';\n    data.forEach((d,i)=>{const cx=8+gw*i+gw/2,bw=Math.min(30,gw*0.30);\n      const ah=d.antes/max*maxH,dh=d.depois/max*maxH,ax=cx-bw-2,dx=cx+2;\n      g+=`<rect x=\"${ax.toFixed(1)}\" y=\"${(base-ah).toFixed(1)}\" width=\"${bw.toFixed(1)}\" height=\"${ah.toFixed(1)}\" rx=\"2.5\" fill=\"${d.color}\" opacity=\"0.35\"/>`;\n      g+=`<rect x=\"${dx.toFixed(1)}\" y=\"${(base-dh).toFixed(1)}\" width=\"${bw.toFixed(1)}\" height=\"${dh.toFixed(1)}\" rx=\"2.5\" fill=\"${d.color}\"/>`;\n      g+=`<text x=\"${(ax+bw/2).toFixed(1)}\" y=\"${(base-ah-4).toFixed(1)}\" text-anchor=\"middle\" font-size=\"9\" fill=\"#9a9aa8\">${fN(d.antes)}</text>`;\n      g+=`<text x=\"${(dx+bw/2).toFixed(1)}\" y=\"${(base-dh-4).toFixed(1)}\" text-anchor=\"middle\" font-size=\"9.5\" font-weight=\"700\" fill=\"${d.color}\">${fN(d.depois)}</text>`;\n      const dp=d.antes?((d.depois-d.antes)/d.antes*100):(d.depois?100:0);\n      g+=`<text x=\"${cx.toFixed(1)}\" y=\"16\" text-anchor=\"middle\" font-size=\"10.5\" font-weight=\"700\" fill=\"${dp>=0?'#34c759':'#ff3b30'}\">${dp>0?'+':''}${dp.toFixed(0)}%</text>`;\n      g+=`<text x=\"${cx.toFixed(1)}\" y=\"${base+16}\" text-anchor=\"middle\" font-size=\"10.5\" font-weight=\"700\" fill=\"#1c1c2b\">${d.label}</text>`;});\n    return `<svg viewBox=\"0 0 ${W} ${H}\" style=\"width:100%\"><line x1=\"8\" y1=\"${base}\" x2=\"${W-8}\" y2=\"${base}\" stroke=\"#e7e7ef\"/>${g}</svg>`;\n  };\n  let h=`<div style=\"display:flex;justify-content:space-between;align-items:center;gap:10px;flex-wrap:wrap\">\n      <h2 style=\"margin:0\">Impacto antes → depois desta etapa</h2>\n      <select id=\"metricSel\">${METRICS_DEF.map(m=>`<option value=\"${m[0]}\" ${m[0]===mv.metric?'selected':''}>${m[1]}</option>`).join('')}</select></div>\n    <div class=\"note\" style=\"margin:2px 0 4px\">Barra clara = <b>antes desta etapa</b> (já incluindo etapas anteriores) · barra cheia = <b>depois</b> · <b style=\"color:var(--acc)\">${mv.sector}✕</b> = ${lc(lvl.label)} fechad${lvl.a==='à'?'a':'o'} nesta etapa · % = variação</div>\n    ${chartHTML(mv.metric)}`;\n  h+=`<h2 style=\"margin-top:16px\">Antes → Depois por ${lc(lvl.destLabel)} receptor (snapshot congelado)</h2>\n    <div class=\"scroll\"><table><thead><tr><th>${lvl.destLabel}</th>${METRICS_DEF.map(m=>`<th>${m[1]}</th>`).join('')}</tr></thead><tbody>`;\n  mv.dest.forEach(s=>{const b=mv.baseMetrics[s]||{};const inc=incBy[s];\n    h+=`<tr><td><span class=\"home\" style=\"background:${mv.color[s]}\"></span>${s}</td>`+\n      METRICS_DEF.map(([k])=>{const bv=+b[k]||0,av=bv+(inc[k]||0);const d=bv?((av-bv)/bv*100):0;const f=METRICS_DEF.find(x=>x[0]===k)[2]==='$'?money:fmt;\n        return `<td>${f(av)}<div class=\"delta ${d>=0?'up':'dn'}\">${d>0?'+':''}${d.toFixed(0)}%</div></td>`;}).join('')+`</tr>`;});\n  h+=`<tr style=\"opacity:.8\"><td>${mv.sector} (sai)</td>`+METRICS_DEF.map(([k,,t])=>`<td>${(t==='$'?money:fmt)(closeTot[k]||0)}</td>`).join('')+`</tr>`;\n  h+=`</tbody></table></div>`;\n  const incLvl={};mv.dest.forEach(s=>incLvl[s]={});\n  Object.keys(mv.munis).forEach(m=>{if(m==='__OUTROS__')return;const s=mv.assign[m];if(!s||!incLvl[s])return;const lv=mv.levelByMuni[m]||{};for(const nv in lv)incLvl[s][nv]=(incLvl[s][nv]||0)+lv[nv];});\n  c.leaders.forEach(L=>{ const ol=mv.orphanLevelByGroup&&mv.orphanLevelByGroup[L.grupo];\n    if(ol&&L.home&&incLvl[L.home]) Object.entries(ol).forEach(([nv,n])=>incLvl[L.home][nv]=(incLvl[L.home][nv]||0)+n); });\n  h+=`<h2 style=\"margin-top:18px\">Consultoras por nível — antes → depois por ${lc(lvl.destLabel)} receptor</h2>\n    <div class=\"scroll\"><table><thead><tr><th>${lvl.destLabel}</th>${NIVEIS.map(n=>`<th>${n}</th>`).join('')}<th>Total</th></tr></thead><tbody>`;\n  mv.dest.forEach(s=>{const base=mv.baseLevel[s]||{},inc=incLvl[s]||{};let tb=0,ta=0;\n    h+=`<tr><td><span class=\"home\" style=\"background:${mv.color[s]}\"></span>${s}</td>`+\n      NIVEIS.map(nv=>{const b=base[nv]||0,i=inc[nv]||0,a=b+i;tb+=b;ta+=a;\n        return `<td>${a?fmt(a):'·'}${i?`<div class=\"delta up\">+${fmt(i)}</div>`:''}</td>`;}).join('')+\n      `<td style=\"font-weight:700\">${fmt(ta)}${ta-tb?`<div class=\"delta up\">+${fmt(ta-tb)}</div>`:''}</td></tr>`;});\n  h+=`</tbody></table></div><div class=\"note\">Número = CBs por nível <b>depois</b> desta etapa · <span style=\"color:var(--ok)\">+N</span> = entrantes do ${mv.sector}.</div>`;\n  const spk=(key)=>{const vals=trend.map(t=>+t[key]||0);const mx=Math.max(...vals,1);\n    return `<div class=\"spark\">${vals.map(v=>`<div class=\"b\" style=\"height:${(v/mx*100).toFixed(0)}%\" title=\"${fmt(v)}\"></div>`).join('')}</div>\n      <div class=\"note\">${trend.map(t=>String(t.ciclo).slice(-2)).join(' · ')}</div>`;};\n  h+=`<h2 style=\"margin-top:18px\">Setor ${mv.sector} — últimos ${trend.length} ciclos até o snapshot congelado</h2>\n    <div class=\"note\" style=\"margin:-4px 0 8px\">Tendência histórica <b>do próprio setor</b> — não ajustada pela absorção hipotética de etapas anteriores (limitação conhecida: tendência é por setor, não decomponível por município).</div>\n    <div style=\"display:grid;grid-template-columns:repeat(4,1fr);gap:10px\">\n    ${[['cbs','CBs'],['ativas','Ativas'],['receita','Receita'],['pontos','Pontos']].map(([k,l])=>`<div><div class=\"note\" style=\"margin:0 0 3px;font-weight:600;color:var(--ink)\">${l}</div>${spk(k)}</div>`).join('')}</div>`;\n  $('#tab-report').innerHTML=h;\n  const sel=$('#metricSel'); if(sel) sel.onchange=()=>{mv.metric=sel.value; renderReport();};\n}\nfunction renderCumulative(){\n  const el=$('#tab-cumulative'); if(!el) return;\n  // Esta view soma a cadeia inteira via foldWorldState().muniOverride/sectorBaseCache — hoje só\n  // populados pelo fechamento de setor. GV/mercado têm o rastro equivalente (secOverride/gvOverride),\n  // mas essa agregação ainda não foi refeita nesse grão; melhor avisar do que mostrar tabela vazia.\n  const lockLvl=SESS.timeline.length?(SESS.timeline[0].level||'setor'):'setor';\n  if(lockLvl!=='setor'){ el.innerHTML=`<div class=\"note\">Impacto acumulado da cadeia ainda não disponível pra sessões de ${lc(LEVELS[lockLvl].label)} — use o relatório da etapa (aba anterior) etapa a etapa.</div>`; return; }\n  if(!SESS.timeline.length){ el.innerHTML='<div class=\"note\">Nenhuma etapa na timeline ainda.</div>'; return; }\n  const ready=SESS.timeline.every(mv=>mv.munis);\n  if(!ready){ el.innerHTML='<div class=\"note\">Aguardando etapas terminarem de calcular…</div>'; return; }\n  const finalWorld=foldWorldState(SESS.timeline,SESS.timeline.length);\n  const openSectors=[...new Set(Object.values(finalWorld.muniOverride))];\n  let h=`<h2 style=\"margin:0 0 8px\">Linha do tempo — ${SESS.timeline.length} fechamento(s)</h2>\n    <div class=\"note\" style=\"margin:-2px 0 10px\">Setores fechados, em ordem: ${SESS.timeline.map(mv=>mv.sector).join(' → ')}. Cada linha abaixo soma o efeito de <b>toda a cadeia</b>, não apenas da última etapa.</div>`;\n  h+=`<div class=\"scroll\"><table><thead><tr><th>Setor</th><th>Situação</th>${METRICS_DEF.map(([,l])=>`<th>${l}</th>`).join('')}</tr></thead><tbody>`;\n  SESS.timeline.forEach((mv,i)=>{\n    h+=`<tr style=\"opacity:.75\"><td>${mv.sector}</td><td>fechado (etapa ${i+1})</td>`+METRICS_DEF.map(([k,,t])=>`<td>${(t==='$'?money:fmt)(mv.pureOwnMetrics?.[k]||0)}</td>`).join('')+`</tr>`;\n  });\n  openSectors.forEach(s=>{\n    const base=SESS.sectorBaseCache[s]||{};\n    const infl=finalWorld.sectorInflow[s]||{};\n    h+=`<tr><td>${s}</td><td>recebeu território</td>`+METRICS_DEF.map(([k,,t])=>{\n      const bv=+base[k]||0, av=bv+(infl[k]||0); const d=bv?((av-bv)/bv*100):0; const f=(t==='$'?money:fmt);\n      return `<td>${f(av)}<div class=\"delta ${d>=0?'up':'dn'}\">${d>0?'+':''}${d.toFixed(0)}%</div></td>`;\n    }).join('')+`</tr>`;\n  });\n  h+=`</tbody></table></div><div class=\"note\">\"Antes\" de um setor receptor é o snapshot congelado (sem nenhum fechamento aplicado); \"depois\" soma tudo que a cadeia inteira jogou pra ele.</div>`;\n  el.innerHTML=h;\n}\nfunction project(feats){let mnx=1/0,mny=1/0,mxx=-1/0,mxy=-1/0;\n  const each=cb=>feats.forEach(f=>{const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];ps.forEach(p=>p.forEach(r=>r.forEach(cb)));});\n  each(p=>{mnx=Math.min(mnx,p[0]);mxx=Math.max(mxx,p[0]);mny=Math.min(mny,p[1]);mxy=Math.max(mxy,p[1]);});\n  const mlat=(mny+mxy)/2,kx=Math.cos(mlat*Math.PI/180),W=700,H=500,pad=22;\n  const gw=(mxx-mnx)*kx,gh=(mxy-mny),sc=Math.min((W-2*pad)/gw,(H-2*pad)/gh);\n  const ox=(W-gw*sc)/2,oy=(H-gh*sc)/2;\n  return p=>[ox+(p[0]-mnx)*kx*sc, oy+(mxy-p[1])*sc];\n}\nfunction pathFor(f,pr){const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];\n  return ps.map(poly=>poly.map(r=>'M'+r.map(p=>{const q=pr(p);return q[0].toFixed(1)+','+q[1].toFixed(1);}).join('L')+'Z').join('')).join('');}\nfunction cxy(f,pr){let x=0,y=0,n=0;const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];ps.forEach(poly=>poly[0].forEach(p=>{const q=pr(p);x+=q[0];y+=q[1];n++;}));return[x/n,y/n];}\n// ---------- label placement ----------\n// Pole of inaccessibility: the interior point farthest from ANY boundary of the dissolved area. A\n// centroid is only a mean — on a concave sector, one split across a river, or a member whose vertex\n// average falls in a bay, it lands outside the very territory it is supposed to name, which is what\n// pushed the sector numbers off their own shapes. Even-odd across every ring of every member is a\n// correct union test here because municipalities tile rather than overlap.\n// The search box is clipped to the viewBox, so the result is inside the territory AND on screen.\n// Rings are decimated first — this is a label, not a measurement — which keeps a 20-município sector\n// to a few million ops, and the result is cached per stage: geometry never changes between renders,\n// only the fill does.\nfunction labelPointFor(fs,pr){\n  const rings=[];\n  (fs||[]).forEach(f=>{ if(!f||!f.geometry) return;\n    const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];\n    ps.forEach(poly=>poly.forEach(r=>{\n      if(!r||r.length<4) return;\n      const step=Math.max(1,Math.floor(r.length/120)),pts=[];\n      for(let i=0;i<r.length;i+=step) pts.push(pr(r[i]));\n      if(pts.length>3) rings.push(pts);\n    }));});\n  if(!rings.length) return null;\n  let mnx=1/0,mny=1/0,mxx=-1/0,mxy=-1/0;\n  rings.forEach(r=>r.forEach(p=>{ if(p[0]<mnx)mnx=p[0]; if(p[0]>mxx)mxx=p[0]; if(p[1]<mny)mny=p[1]; if(p[1]>mxy)mxy=p[1]; }));\n  mnx=Math.max(mnx,2); mny=Math.max(mny,2); mxx=Math.min(mxx,698); mxy=Math.min(mxy,498);\n  if(!(mxx>mnx&&mxy>mny)) return null;\n  const inside=(x,y)=>{ let c=false;\n    for(const r of rings) for(let i=0,j=r.length-1;i<r.length;j=i++){ const a=r[i],b=r[j];\n      if(((a[1]>y)!==(b[1]>y)) && (x<(b[0]-a[0])*(y-a[1])/(b[1]-a[1])+a[0])) c=!c; }\n    return c; };\n  const edgeDist=(x,y)=>{ let m=Infinity;\n    for(const r of rings) for(let i=0,j=r.length-1;i<r.length;j=i++){ const a=r[i],b=r[j];\n      const dx=b[0]-a[0],dy=b[1]-a[1],L=dx*dx+dy*dy;\n      let t=L?(((x-a[0])*dx+(y-a[1])*dy)/L):0; t=t<0?0:(t>1?1:t);\n      const ex=a[0]+t*dx-x,ey=a[1]+t*dy-y,d=ex*ex+ey*ey; if(d<m)m=d; }\n    return Math.sqrt(m); };\n  const W=mxx-mnx,H=mxy-mny,N=26;\n  let best=null,bd=-1;\n  for(let i=0;i<=N;i++) for(let j=0;j<=N;j++){\n    const x=mnx+W*i/N,y=mny+H*j/N;\n    if(!inside(x,y)) continue;\n    const d=edgeDist(x,y); if(d>bd){ bd=d; best=[x,y]; }\n  }\n  if(!best) return null;\n  // Hill-climb off the coarse grid: the grid only has to land somewhere in the right lobe, the\n  // refinement finds the deep point inside it — halving the step whenever no neighbour improves.\n  let step=Math.max(W,H)/N/2;\n  for(let k=0;k<7;k++){\n    let moved=false;\n    for(const o of [[1,0],[-1,0],[0,1],[0,-1],[1,1],[1,-1],[-1,1],[-1,-1]]){\n      const x=best[0]+o[0]*step,y=best[1]+o[1]*step;\n      if(x<mnx||x>mxx||y<mny||y>mxy||!inside(x,y)) continue;\n      const d=edgeDist(x,y); if(d>bd){ bd=d; best=[x,y]; moved=true; }\n    }\n    if(!moved) step/=2;\n  }\n  // The clearance travels with the point: it is the radius of the largest circle that fits inside the\n  // territory there, which is exactly the budget a caller needs to decide how much text will fit.\n  return {p:best,r:bd};\n}\nfunction labelPointOf(mv,key,fs,pr){\n  if(!mv._lbl) mv._lbl={};\n  if(!(key in mv._lbl)) mv._lbl[key]=labelPointFor(fs,pr);\n  return mv._lbl[key];\n}\n// ---------- map zoom/pan ----------\n// Zoom é feito manipulando o viewBox, nunca um transform CSS — assim rótulos e polígonos vivem no\n// MESMO sistema de coordenadas e escalam juntos automaticamente (texto tem font-size em unidades do\n// viewBox, então encolher o viewBox amplia tudo por igual, sem lógica extra pro tamanho da fonte).\nconst MAP_W=700, MAP_H=500, MAP_ZOOM_MAX=8;\nlet mapView={x:0,y:0,w:MAP_W,h:MAP_H};\nfunction applyMapView(){\n  const svg=$('#map'); if(!svg) return;\n  svg.setAttribute('viewBox', mapView.x.toFixed(2)+' '+mapView.y.toFixed(2)+' '+mapView.w.toFixed(2)+' '+mapView.h.toFixed(2));\n  // Rótulo tem font-size em unidades do viewBox, então sem isso ele cresceria junto com o zoom até\n  // virar um borrão — encolhendo o font-size na mesma proporção que o viewBox encolhe cancela\n  // exatamente o zoom, e o texto fica do MESMO tamanho na tela em qualquer nível de zoom.\n  const fsScale=mapView.w/MAP_W;\n  svg.querySelectorAll('text[data-fs]').forEach(t=>{\n    const base=+t.getAttribute('data-fs')||8;\n    t.setAttribute('font-size',(base*fsScale).toFixed(2));\n  });\n  // Mesmo raciocínio pro halo do texto e pro fio que liga um rótulo deslocado ao seu município —\n  // os dois têm largura de traço fixa em unidades do viewBox, então sem reescalar iam virar uma\n  // mancha grossa (halo) ou uma barra (fio) no zoom alto em vez de ficarem do mesmo tamanho na tela.\n  svg.querySelectorAll('[data-sw]').forEach(el=>{\n    const base=+el.getAttribute('data-sw')||1;\n    el.style.strokeWidth=(base*fsScale).toFixed(3)+'px';\n  });\n}\nfunction zoomMapBy(factor){\n  const cx=mapView.x+mapView.w/2, cy=mapView.y+mapView.h/2;\n  let w=mapView.w/factor, h=mapView.h/factor;\n  w=Math.min(MAP_W, Math.max(MAP_W/MAP_ZOOM_MAX, w));\n  h=Math.min(MAP_H, Math.max(MAP_H/MAP_ZOOM_MAX, h));\n  let x=cx-w/2, y=cy-h/2;\n  x=Math.min(MAP_W-w, Math.max(0,x));\n  y=Math.min(MAP_H-h, Math.max(0,y));\n  mapView={x,y,w,h};\n  applyMapView();\n}\n// Arrastar sempre fica DENTRO do canvas de 700x500 (clamp em [0, MAP_W-w] / [0, MAP_H-h]) — nunca\n// existe um x/y que deixa o viewBox parcialmente fora da área com conteúdo, então o mapa nunca\n// \"some\" da tela, só pode chegar até a borda do que existe pra ver.\nlet mapDrag=null, mapDidDrag=false;\nfunction mapPointerDown(e){\n  const svg=$('#map'); if(!svg) return;\n  mapDrag={x0:e.clientX,y0:e.clientY,vx0:mapView.x,vy0:mapView.y,rect:svg.getBoundingClientRect()};\n  mapDidDrag=false;\n  svg.classList.add('dragging');\n  // NÃO setPointerCapture aqui: capturar o ponteiro no <svg> reencaminha o click resultante pro\n  // próprio <svg> em vez do <path> do município embaixo do cursor — todo clique parava de chegar\n  // no onclick de reatribuição, não só depois de um arrasto de verdade. move/up escutam em `root`\n  // (nunca substituído por renderAll) em vez de no <svg>, então o arrasto continua funcionando\n  // mesmo se o ponteiro sair da área do mapa no meio do gesto.\n}\nfunction mapPointerMove(e){\n  if(!mapDrag) return;\n  const dxPix=e.clientX-mapDrag.x0, dyPix=e.clientY-mapDrag.y0;\n  if(!mapDidDrag && Math.hypot(dxPix,dyPix)>4) mapDidDrag=true;\n  if(!mapDrag.rect.width||!mapDrag.rect.height) return;\n  const sx=mapView.w/mapDrag.rect.width, sy=mapView.h/mapDrag.rect.height;\n  let x=mapDrag.vx0-dxPix*sx, y=mapDrag.vy0-dyPix*sy;\n  x=Math.min(MAP_W-mapView.w, Math.max(0,x));\n  y=Math.min(MAP_H-mapView.h, Math.max(0,y));\n  mapView={...mapView,x,y};\n  applyMapView();\n}\nfunction mapPointerUp(){\n  if(!mapDrag) return;\n  mapDrag=null;\n  const svg=$('#map'); if(svg) svg.classList.remove('dragging');\n}\nfunction drawMap(){\n  const mv=SESS.timeline[SESS.selected]; const svg=$('#map'); const ignNote=$('#mapIgnoredNote');\n  if(!mv){ svg.innerHTML=''; if(ignNote) ignNote.innerHTML=''; return; }\n  const level=mv.level||'setor';\n  // setor fecha: a unidade É o município. GV/mercado fecham: cada município herda a atribuição do\n  // setor/GV a que pertence — municípios do mesmo setor sempre têm a MESMA cor e giram JUNTOS no\n  // clique, porque é o setor inteiro (não o município) que troca de dono nesses níveis.\n  const unitAssign=m=>level==='setor'?mv.assign[m]:mv.assign[(mv.unitOfMuni||{})[m]];\n  const c=computeDerived(mv);const NS='http://www.w3.org/2000/svg'; svg.innerHTML='';\n  const feats=[...mv.nbrFeat,...Object.values(mv.geoFeat)]; if(!feats.length) return;\n  const pr=project(feats);\n  const world=foldWorldState(SESS.timeline,SESS.selected);\n  // The context layer is ONE area per SECTOR, not one shape per município. The unit of this decision\n  // is the destination sector; a scatter of individually outlined municipalities carrying their own\n  // names invited exactly the wrong reading of the map. Members of a sector are filled AND stroked in\n  // the same colour, so the shared borders vanish and the group reads as a single dissolved\n  // territory — the IBGE shapes do not share vertices precisely enough to extract a clean union\n  // outline, and carrying a real polygon-clipping union for a context layer is not worth it.\n  // Labels are COLLECTED here and drawn last, after every path. Drawn inline they were buried by the\n  // next sector's fill, and placement cannot avoid a collision it has not seen yet.\n  const labels=[],placed=[];\n  const textW=(s,fs)=>String(s).length*fs*0.56;\n  // WCAG relative luminance of the fill a label sits on, so ink and halo can invert per label. \"Would\n  // white be better?\" has no single answer on this map: white reads on #5856d6 (L≈0.14) and disappears\n  // on #ff9500 and #34c759 (both L≈0.43, where black wins ~9:1 against white's ~2.2:1) and on every\n  // context fill, which is .32 opacity over white. Decided per label, never globally.\n  const lum=col=>{let h=String(col||'').replace('#','');\n    if(h.length===3) h=h[0]+h[0]+h[1]+h[1]+h[2]+h[2];\n    if(h.length!==6) return 1;\n    const c=[0,2,4].map(i=>parseInt(h.slice(i,i+2),16)/255)\n      .map(v=>v<=0.03928?v/12.92:Math.pow((v+0.055)/1.055,2.4));\n    return 0.2126*c[0]+0.7152*c[1]+0.0722*c[2];};\n  // Centred on (x,y) in BOTH axes. The old box hung off the first line's baseline, so every two-line\n  // label sat half its own height below the point it was supposed to mark.\n  const rectOf=(x,y,lines)=>{const w=Math.max.apply(null,lines.map(l=>textW(l.t,l.size)));\n    const h=lines.reduce((a,l)=>a+l.size*1.2,0);\n    return {x1:x-w/2-2.5,x2:x+w/2+2.5,y1:y-h/2-1.5,y2:y+h/2+1.5};};\n  const nbrBySec={};\n  mv.nbrFeat.forEach(f=>{\n    const nm=mkey(f.properties.name||f.properties.NOME||f.properties.nome||'',f.__uf);\n    const s=String((mv.nbrCurrentSector&&mv.nbrCurrentSector[nm])||'');\n    (nbrBySec[s]=nbrBySec[s]||[]).push(f);\n  });\n  Object.keys(nbrBySec).forEach(s=>{\n    const fs=nbrBySec[s];\n    const isDest=!!s&&mv.dest.includes(s);\n    const closedCtx=!!s&&world.closedSectors.has(s);\n    const col=isDest?(mv.color[s]||null):null;\n    fs.forEach(f=>{\n      const p=document.createElementNS(NS,'path');\n      p.setAttribute('d',pathFor(f,pr));\n      p.setAttribute('class','sect'+(isDest?'':(closedCtx?' closed-ctx':' plain')));\n      // isDest: NO stroke at all, fill only. Matching stroke to fill (even at the same opacity)\n      // still doubles up at every shared município edge — two adjacent members each paint their own\n      // translucent stroke on top of the shared line, so it composites darker than the interior even\n      // when both strokes are the exact fill colour. Only an absent stroke truly stops compositing.\n      if(col){ p.setAttribute('fill',col); }\n      svg.appendChild(p);\n    });\n    if(!s) return;\n    // One number per sector, at the pole of inaccessibility of its DISSOLVED area — the whole group\n    // of members at once, not a representative member, so the number sits in the visual middle of the\n    // territory the operator actually sees.\n    const lp=labelPointOf(mv,'s:'+s,fs,pr);\n    // Context areas always read LIGHT — .sect paints dest colours at fill-opacity .32 over white, and\n    // plain/closed-ctx are near-white greys — so a sector number never wants white ink, whatever colour\n    // the sector itself was assigned.\n    if(lp&&lp.p) labels.push({anchor:lp.p,big:true,dark:false,lines:[{t:s,size:11.5,weight:700}]});\n  });\n  const asis=mv.view==='asis';\n  // The UF prefix is information only when the stage actually straddles a border. On a single-UF setor\n  // it is the same three characters repeated on every label — a large share of the clutter and none of\n  // the meaning. The hover tooltip carries the UF either way.\n  const showUf=new Set(Object.keys(mv.geoFeat).map(k=>mUf(k)).filter(Boolean)).size>1;\n  if(level==='setor'){\n    // Setor fechando: a UNIDADE é o próprio município — cada um se comporta, colore e rotula\n    // individualmente, exatamente como sempre foi.\n    Object.entries(mv.geoFeat).forEach(([m,f])=>{const p=document.createElementNS(NS,'path');p.setAttribute('d',pathFor(f,pr));\n      const fillCol=asis?CLOSE_COLOR:(mv.color[unitAssign(m)]||'#444');\n      p.setAttribute('class','muni');p.setAttribute('fill',fillCol);\n      if(!asis) p.onclick=()=>{editSelected(m2=>{const i=m2.dest.indexOf(m2.assign[m]);if(m2.dest.length)m2.assign[m]=m2.dest[(i+1)%m2.dest.length];m2.selMuni=m;});};\n      p.style.cursor=asis?'default':'pointer';\n      p.onmousemove=e=>{const t=$('#tip');t.style.opacity=1;t.style.left=(e.clientX+12)+'px';t.style.top=(e.clientY+12)+'px';\n        t.innerHTML=asis?`<b>${mDisp(m)}</b><br>${fmt(mv.cbsByMuni[m]||0)} CBs · setor ${mv.sector}`:`<b>${mDisp(m)}</b><br>${fmt(mv.cbsByMuni[m]||0)} CBs → ${unitAssign(m)||'–'}<br><span style=\"color:var(--mut)\">clique p/ trocar</span>`;};\n      p.onmouseleave=()=>$('#tip').style.opacity=0;svg.appendChild(p);\n      const lp=labelPointOf(mv,'m:'+m,[f],pr);\n      const at=(lp&&lp.p)||cxy(f,pr);\n      const nmFull=(showUf&&mUf(m)?mUf(m)+'-':'')+mName(m);\n      const num=fmt(mv.cbsByMuni[m]||0)+(asis?'':'·'+(unitAssign(m)||'–'));\n      labels.push({anchor:at,cbs:+(mv.cbsByMuni[m]||0),dark:lum(fillCol)<0.18,\n        lines:[{t:nmFull,size:8.2,weight:700},{t:num,size:7,weight:500,mut:true}]});\n    });\n  } else {\n    // GV/mercado fechando: a UNIDADE é o setor (ou a GV) inteiro, nunca o município isolado — vários\n    // municípios do MESMO setor têm de ler como UMA área só (stroke = fill inline, opaco, então não há\n    // o artefato de dupla-composição da camada de destino: aqui a cor é sólida, não translúcida).\n    // A fronteira que o operador precisa ver é setor-a-setor, não município-a-município, e isso já\n    // sai de graça da própria cor: setores com destinos diferentes contrastam sem precisar de traço\n    // algum. O único caso que fica sem contorno é dois setores vizinhos caindo no MESMO destino — sem\n    // union real de polígono (ver nota da camada de contexto, acima) não há como bordear só o setor\n    // sem também bordear cada município dentro dele, e a segunda opção é a bagunça pontilhada que essa\n    // troca veio corrigir. UM rótulo só por unidade, no ponto de inacessibilidade da área do grupo,\n    // nunca um rótulo por município.\n    Object.entries(mv.unitMunis||{}).forEach(([u,ms])=>{\n      const fillCol=asis?CLOSE_COLOR:(mv.color[mv.assign[u]]||'#444');\n      const feats=ms.map(m=>mv.geoFeat[m]).filter(Boolean);\n      // Todo município deste u é UMA unidade só na tela — passar o mouse sobre qualquer pedaço tem\n      // que acender o grupo inteiro, não só o pedaço que o cursor está tocando. :hover no CSS só\n      // sabe acender o próprio <path>; o grupo inteiro precisa de JS guardando os irmãos.\n      const els=[];\n      ms.forEach(m=>{\n        const f=mv.geoFeat[m]; if(!f) return;\n        const p=document.createElementNS(NS,'path');p.setAttribute('d',pathFor(f,pr));\n        p.setAttribute('class','muni');p.setAttribute('fill',fillCol);p.style.stroke=fillCol;\n        els.push(p);\n        if(!asis) p.onclick=()=>{editSelected(m2=>{const i=m2.dest.indexOf(m2.assign[u]);if(m2.dest.length)m2.assign[u]=m2.dest[(i+1)%m2.dest.length];m2.selMuni=u;});};\n        p.style.cursor=asis?'default':'pointer';\n        p.onmouseenter=()=>{ els.forEach(e=>e.classList.add('munihl')); };\n        p.onmousemove=e=>{const t=$('#tip');t.style.opacity=1;t.style.left=(e.clientX+12)+'px';t.style.top=(e.clientY+12)+'px';\n          t.innerHTML=asis?`<b>${LEVELS[level].childLabel} ${u}</b><br>${fmt(mv.munis[u]?.cbs||0)} CBs · ${LEVELS[level].label} ${mv.sector}`:`<b>${LEVELS[level].childLabel} ${u}</b><br>${fmt(mv.munis[u]?.cbs||0)} CBs → ${mv.assign[u]||'–'}<br><span style=\"color:var(--mut)\">clique p/ trocar</span>`;};\n        p.onmouseleave=()=>{ els.forEach(e=>e.classList.remove('munihl')); $('#tip').style.opacity=0; };svg.appendChild(p);\n      });\n      const lp=labelPointOf(mv,'u:'+u,feats,pr);\n      const at=(lp&&lp.p)||(feats[0]&&cxy(feats[0],pr));\n      if(at){\n        const num=fmt(mv.munis[u]?.cbs||0)+(asis?'':'·'+(mv.assign[u]||'–'));\n        labels.push({anchor:at,big:true,cbs:+(mv.munis[u]?.cbs||0),dark:lum(fillCol)<0.18,\n          lines:[{t:`${LEVELS[level].childLabel} ${u}`,size:9,weight:700},{t:num,size:7.5,weight:500,mut:true}]});\n      }\n    });\n  }\n  // Placement, not de-cluttering. Every label IS drawn: it starts at its anchor and, if the text does\n  // not fit the territory or the slot is already taken, walks outward ring by ring until it finds\n  // clear canvas, trailing a hairline leader back to the shape it names. The previous pass dropped the\n  // loser of every collision outright, which is why municípios silently had no name at all.\n  // Order still matters — sector numbers first, then municípios by CB weight — because the earlier a\n  // label is placed the closer to home it lands.\n  const CW=700,CH=500,CPAD=2;\n  const inBounds=r=>r.x1>=CPAD&&r.x2<=CW-CPAD&&r.y1>=CPAD&&r.y2<=CH-CPAD;\n  const hits=r=>placed.reduce((a,q)=>a+((r.x2<q.x1||r.x1>q.x2||r.y2<q.y1||r.y1>q.y2)?0:1),0);\n  // Ring 0 is the anchor itself. Rings step 9u out over 16 directions, stretched horizontally because\n  // a label is wider than it is tall and sideways room is the room it actually needs.\n  const CAND=[[0,0]];\n  for(let ring=1;ring<=7;ring++){ const d=ring*9;\n    for(let a=0;a<16;a++){ const th=a*Math.PI/8; CAND.push([Math.cos(th)*d*1.35,Math.sin(th)*d]); } }\n  labels.sort((a,b)=>(b.big?1:0)-(a.big?1:0)||((b.cbs||0)-(a.cbs||0)));\n  labels.forEach(L=>{\n    let chosen=null,best=null,bestN=Infinity;\n    // Centred on the anchor is ALWAYS the first choice. An earlier cut here refused the anchor whenever\n    // the text was wider than the município's inscribed circle — true of almost every real name at this\n    // scale (BA-SAO SEBASTIAO DO PASSE is ~140u against ~80u of clearance), so every single label got\n    // nudged outside and nothing ended up centred on anything. Spilling past a border is normal on a\n    // choropleth and the halo keeps it readable; only a genuine COLLISION earns a move.\n    for(const off of CAND){\n      const x=L.anchor[0]+off[0], y=L.anchor[1]+off[1];\n      const r=rectOf(x,y,L.lines);\n      if(!inBounds(r)) continue;\n      const n=hits(r);\n      if(!n){ chosen={x,y,r,off}; break; }\n      // No clear slot yet — remember the LEAST crowded one. Falling back to the first in-bounds\n      // candidate meant falling back to the anchor every time, so a crowded map piled every loser onto\n      // the same point. CAND is ordered nearest-first and the compare is strict, so ties keep the\n      // closest slot.\n      if(n<bestN){ bestN=n; best={x,y,r,off}; }\n    }\n    // Canvas genuinely full: take the nearest in-bounds slot and accept the overlap. A label sitting\n    // on top of another is recoverable by eye; a name that was never drawn is not.\n    if(!chosen) chosen=best||{x:L.anchor[0],y:L.anchor[1],r:rectOf(L.anchor[0],L.anchor[1],L.lines),off:[0,0]};\n    placed.push(chosen.r);\n    const g=document.createElementNS(NS,'g'); g.setAttribute('class','lbl'+(L.big?' big':''));\n    if(Math.abs(chosen.off[0])>0.5||Math.abs(chosen.off[1])>0.5){\n      // The leader stops at the label's edge rather than its centre, so it never runs under the glyphs.\n      const cx=(chosen.r.x1+chosen.r.x2)/2, cy=(chosen.r.y1+chosen.r.y2)/2;\n      const hw=(chosen.r.x2-chosen.r.x1)/2, hh=(chosen.r.y2-chosen.r.y1)/2;\n      const dx=L.anchor[0]-cx, dy=L.anchor[1]-cy;\n      const tt=Math.min(dx?hw/Math.abs(dx):Infinity, dy?hh/Math.abs(dy):Infinity);\n      const ln=document.createElementNS(NS,'line'); ln.setAttribute('class','lead');\n      ln.style.stroke=L.dark?'#fff':'#1c1c1e';\n      // A largura do fio também é fixa em unidades do viewBox, igual o halo do texto — sem\n      // reescalar junto, no zoom alto ela vira uma barra grossa em vez de um fio fino.\n      ln.setAttribute('data-sw','0.8'); ln.style.strokeWidth='0.8px';\n      ln.setAttribute('x1',L.anchor[0].toFixed(1)); ln.setAttribute('y1',L.anchor[1].toFixed(1));\n      ln.setAttribute('x2',(cx+dx*tt).toFixed(1)); ln.setAttribute('y2',(cy+dy*tt).toFixed(1));\n      g.appendChild(ln);\n    }\n    const hTot=L.lines.reduce((a,l)=>a+l.size*1.2,0);\n    let ty=chosen.y-hTot/2+L.lines[0].size*0.86;\n    // Inline style rather than a class: a stylesheet rule would outrank a presentation attribute and\n    // undo the per-label contrast decision made above.\n    const ink=L.dark?'#fff':'#1c1c1e', inkMut=L.dark?'rgba(255,255,255,.85)':'#48484d';\n    const halo=L.dark?'rgba(0,0,0,.6)':'#fff';\n    // Halo do texto (o \"contorno\" que garante legibilidade sobre qualquer cor de fundo) também é\n    // fixo em unidades do viewBox via .lbl text{stroke-width}/.lbl.big text{stroke-width} — sem\n    // reescalar junto com o font-size, no zoom alto ele vira uma mancha escura cobrindo a letra\n    // inteira em vez de um contorno fino, exatamente o \"Setor 3570\" ilegível reportado.\n    const swBase=L.big?2.9:2.2;\n    L.lines.forEach(l=>{ const t=document.createElementNS(NS,'text');\n      t.setAttribute('x',chosen.x.toFixed(1)); t.setAttribute('y',ty.toFixed(1));\n      t.setAttribute('font-size',l.size); t.setAttribute('data-fs',l.size); t.setAttribute('font-weight',l.weight||600);\n      t.setAttribute('data-sw',swBase); t.style.strokeWidth=swBase+'px';\n      t.style.fill=l.mut?inkMut:ink; t.style.stroke=halo;\n      t.textContent=l.t; g.appendChild(t); ty+=l.size*1.2; });\n    svg.appendChild(g);\n  });\n  $('#legend').innerHTML=asis\n    ?`<span><b style=\"background:${CLOSE_COLOR}\"></b>${LEVELS[level].label} ${mv.sector} (estrutura antes desta etapa — ${level==='setor'?Object.keys(mv.geoFeat).length+' municípios':Object.keys(mv.unitMunis||{}).length+' '+LEVELS[level].childLabel.toLowerCase()+'(s)'})</span>`\n    // No \"vizinhos (contexto)\" or \"setor já fechado antes\" entry any more: every feature still drawn\n    // belongs to a destination sector, so .sect.plain and .sect.closed-ctx can no longer be produced\n    // and a legend key for them would point at nothing on the map.\n    :mv.dest.map(s=>`<span><b style=\"background:${mv.color[s]}\"></b>${LEVELS[level].destLabel} ${s} — ${c.gained[s]} líder(es)</span>`).join('');\n  // Municipalities outside the dominance base are deliberately NOT drawn — no shape, no hover, no\n  // legend entry. They are reported in the panel instead, so the map only ever shows territory that\n  // is actually being reallocated.\n  if(ignNote) ignNote.innerHTML=(mv.excludedMunis&&mv.excludedMunis.length)\n    ? `<b style=\"color:var(--closing)\">${fmt(mv.excludedMunis.length)} município(s) / ${fmt(mv.excludedCbs||0)} CBs</b> fora da base de dominantes deste setor não são desenhados no mapa — as CBs seguem a líder do seu grupo (detalhe em “Municípios → setor destino”).`\n    : '';\n  applyMapView();\n}\nasync function runSql(){const sql=$('#sqlIn').value.trim();$('#sqlStatus').textContent='rodando…';$('#sqlStatus').classList.remove('err');\n  try{ await ensurePinned(); const resp=await q(sql);const rs=rows(resp);const cols=(resp.manifest?.schema?.columns||[]).map(c=>c.name);\n    $('#sqlOut').innerHTML=`<thead><tr>${cols.map(c=>`<th>${c}</th>`).join('')}</tr></thead><tbody>`+rs.slice(0,200).map(r=>`<tr>${cols.map(c=>`<td>${r[c]??'·'}</td>`).join('')}</tr>`).join('')+`</tbody>`;\n    $('#sqlStatus').textContent=rs.length+' linha(s)';}\n  catch(e){$('#sqlStatus').textContent='bloqueado/erro: '+e.message;$('#sqlStatus').classList.add('err');}\n}\nfunction renderAll(){\n  renderStage();\n  renderTimeline(); renderSectorPicker();\n  const shb=$('#openShare'); if(shb) shb.disabled=!SESS.timeline.length;\n  const dpb=$('#dupSession'); if(dpb) dpb.disabled=!SESS.timeline.length;\n  const mv=SESS.timeline[SESS.selected];\n  // resolveSnapshotPin falls back to a live sub-select when it cannot pin a literal; saying\n  // \"congelado\" in that case would be a lie, so the pill reports what is actually in the SQL.\n  const pinned=SESS.snapLiteral && !/^\\(SELECT/i.test(SESS.snapLiteral);\n  $('#liveState').textContent = SESS.snapshotRaw\n    ? (pinned?'● snapshot congelado · ':'◍ snapshot ao vivo (não fixado) · ')+'atualizado em '+fmtSyncedAt(SESS.snapshotSyncedAt)+' · ↻'\n    : '● iniciando';\n  const mp=$('#basePill');\n  if(mp){\n    const warn=[];\n    if(DOM.bySetor&&!DOM.hasUf) warn.push('⚠ sem coluna UF');\n    if(DOM.badUf) warn.push('⚠ '+fmt(DOM.badUf)+' UF não reconhecida(s)');\n    if(DOM.clashes) warn.push('⚠ '+fmt(DOM.clashes)+' homônimo(s) no mesmo setor');\n    mp.textContent=DOM.bySetor?('◇ base dominantes: '+fmt(DOM.setores)+' setores · '+fmt(DOM.rows)+' municípios'+(warn.length?' · '+warn.join(' · '):'')):(DOM.error?'◇ base dominantes: indisponível':'◇ base dominantes: carregando…');\n    mp.title=DOM.error||(DOM.bySetor?((DOM.hasUf\n        ?('Coluna de UF usada: \"'+DOM.ufCol+'\".')\n        :('SEM coluna de UF. Colunas lidas: '+((DOM.headers||[]).join(' | ')||'?')+'. A UF de cada município vem desta base — sem ela, homônimos voltam a ser casados só pelo nome.'))\n      +(DOM.badUf?('\\n'+DOM.badUf+' linha(s) com UF irreconhecível — tratadas como desconhecida.'):'')\n      +(DOM.clashes?('\\n'+DOM.clashes+' município(s) aparecem no mesmo setor com UFs diferentes. O SQL agrupa só por DS_MUNICIPIO, então esses chegam somados numa linha única e não há como separá-los.'):'')\n      ):'')||DOM.url||''; }\n  const rp=$('#rulePill'); if(rp) rp.textContent='◈ destino: '+ruleShort(SESS.settings);\n  const sp=$('#spanPill'); if(sp) sp.textContent='◎ span: '+spanShort(SESS.settings);\n  renderRuleNote(); renderSpanRule();\n  if(!mv){ ['#map','#matrix','#matrixTobe','#tobeNote','#leaders'].forEach(s=>{const el=$(s);if(el)el.innerHTML='';}); $('#kpis').innerHTML=''; $('#spans').innerHTML=''; $('#muniList').innerHTML=''; $('#plan').innerHTML=''; return; }\n  $('#mapTitle').textContent=`Etapa ${SESS.selected+1}/${SESS.timeline.length} — fechando ${lc(LEVELS[mv.level||'setor'].label)} ${mv.sector}`;\n  $('#viewToggle').querySelectorAll('button').forEach(b=>b.classList.toggle('on',b.dataset.v===mv.view));\n  $('#policy').querySelectorAll('button').forEach(b=>b.classList.toggle('on',b.dataset.p===mv.policy));\n  $('#optBadge').textContent=mv.optBadge||'';\n  drawMap(); renderContig(); renderSpanRule(); renderKpis(); renderSpans(); renderMuni(); renderLeaders(); renderMatrix(); renderMatrixTobe(); renderPolicy(); renderPlan(); renderReport(); renderCumulative();\n}\n\n// ---------- event wiring ----------\n$('#confirmSnap').onclick=()=>{ SESS.stage='main'; renderAll(); };\n$('#openMove').onclick=openMove;\n$('#moveClose').onclick=closeMove;\n$('#moveCancel').onclick=closeMove;\n$('#moveBg').addEventListener('click',e=>{ if(e.target.id==='moveBg') closeMove(); });\nroot.querySelectorAll('input[name=\"moveLevel\"]').forEach(r=>r.addEventListener('change',renderMoveForm));\n$('#moveRand').onclick=moveRandPick;\n$('#moveGo').onclick=submitMove;\n$('#moveCode').addEventListener('keydown',e=>{ if(e.key==='Enter') submitMove(); });\n$('#confirmSessionPick').onchange=()=>loadSession($('#confirmSessionPick').value);\n$('#optim').onclick=()=>editSelected(mv=>{ mv.assign=optimizeFor(mv); });\n$('#autoTobe').onclick=()=>editSelected(mv=>{ mv.assign=autoAssignFor(mv); mv.optBadge='TOBE por adjacência'; });\n$('#viewToggle').querySelectorAll('button').forEach(b=>b.onclick=()=>{const mv=SESS.timeline[SESS.selected];if(!mv)return;mv.view=b.dataset.v;renderAll();});\n$('#mapZoomIn').onclick=()=>zoomMapBy(1.4);\n$('#mapZoomOut').onclick=()=>zoomMapBy(1/1.4);\n$('#map').addEventListener('pointerdown',mapPointerDown);\nroot.addEventListener('pointermove',mapPointerMove);\nroot.addEventListener('pointerup',mapPointerUp);\nroot.addEventListener('pointerleave',mapPointerUp);\n// Arrastar não pode virar \"cliquei num município e troquei o destino sem querer\": se o ponteiro se\n// moveu além do limiar de arrasto, este clique (capture, antes de chegar no <path>) é engolido.\n$('#map').addEventListener('click',e=>{ if(mapDidDrag){ e.stopPropagation(); e.preventDefault(); mapDidDrag=false; } },true);\n$('#policy').querySelectorAll('button').forEach(b=>b.onclick=()=>{const mv=SESS.timeline[SESS.selected];if(!mv)return;mv.policy=b.dataset.p;renderKpis();renderPolicy();renderPlan();});\nroot.querySelectorAll('.tabs button').forEach(b=>b.onclick=()=>{root.querySelectorAll('.tabs button').forEach(x=>x.classList.toggle('on',x===b));\n  ['matrix','tobe','report','cumulative','sql'].forEach(t=>$('#tab-'+t).classList.toggle('hidden',t!==b.dataset.tab));});\n$('#runSql').onclick=runSql;\n$('#copyPlan').onclick=()=>{const mv=SESS.timeline[SESS.selected];if(!mv)return;navigator.clipboard.writeText(JSON.stringify({setor:mv.sector,politica:mv.policy,plano:mv._plan},null,2));$('#copyPlan').textContent='copiado ✓';setTimeout(()=>$('#copyPlan').textContent='Copiar',1500);};\n$('#csvPlan').onclick=()=>{const mv=SESS.timeline[SESS.selected];if(!mv)return;const csv='municipio,uf,cbs,setor_destino\\n'+mv._plan.map(p=>`${p.municipio},${p.uf||''},${p.cbs},${p.destino}`).join('\\n');\n  const a=document.createElement('a');a.href=URL.createObjectURL(new Blob([csv],{type:'text/csv'}));a.download=`plano_migracao_setor_${mv.sector}.csv`;a.click();};\n$('#saveSession').onclick=saveSession;\n$('#dupSession').onclick=duplicateSession;\n$('#sessionPick').onchange=()=>loadSession($('#sessionPick').value);\n$('#liveState').onclick=refreshSnapshot;\n$('#liveState').addEventListener('keydown',e=>{ if(e.key==='Enter'||e.key===' '){ e.preventDefault(); refreshSnapshot(); } });\n$('#openOptions').onclick=openOptions;\n$('#optClose').onclick=closeOptions;\n$('#optCancel').onclick=closeOptions;\n$('#optApply').onclick=applyOptions;\n$('#optMinCbs').addEventListener('input',renderOptPreview);\n['#optTargetSpan','#optMaxSpan','#optMinSpan'].forEach(id=>$(id).addEventListener('input',renderOptPreview));\nroot.querySelectorAll('input[name=\"destRule\"]').forEach(r=>r.addEventListener('change',renderOptPreview));\n$('#optionsBg').addEventListener('click',e=>{ if(e.target.id==='optionsBg') closeOptions(); });\nroot.addEventListener('keydown',e=>{ if(e.key==='Escape'){ closeOptions(); closeShare(); closeMove(); } });\n\n$('#openShare').onclick=openShare;\n$('#shareX').onclick=closeShare;\n$('#shareCancel').onclick=closeShare;\n$('#shareGo').onclick=doShare;\n$('#shareCopy').onclick=()=>{ if(!SHARE.url) return; navigator.clipboard.writeText(SHARE.url);\n  const b=$('#shareCopy'); if(b){ b.textContent='copiado ✓'; setTimeout(()=>{ const x=$('#shareCopy'); if(x) x.textContent='Copiar link'; },1500); } };\n$('#shareOpen').onclick=()=>{ if(SHARE.url) window.open(SHARE.url,'_blank'); };\n$('#shareBg').addEventListener('click',e=>{ if(e.target.id==='shareBg') closeShare(); });\n\n// ---------- init ----------\n(async()=>{\n  loader(true,'congelando snapshot da sessão…');\n  try{\n    await Promise.all([ensurePinned(), loadSectors(), refreshSessionPicker()]);\n    SESS.stage='confirm';\n  }catch(e){ setError('erro init: '+e.message); }\n  finally{ loader(false); renderAll(); const rd=$('#ready'); if(rd) rd.setAttribute('data-loaded','1'); }\n})();\n\n  }\n}\n"}},"sessionsDataset":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"sessionsDataset"}}}},"dominantesCsvUrl":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"dominantesCsvUrl"}}}}}}}},"__d2PrevCode":{"code":"const T='product.perfil_cb.crm_perfil_cb_diaria_historico';\nconst ELO='product.elo_modelo_combinado.commercial_consultant_index';\nconst PALETTE=['#5856d6','#ff9500','#34c759','#af52de','#ff2d55','#a2845e'];\nconst CLOSE_COLOR='#8e8e93';\nconst UF_CODE={RO:'11',AC:'12',AM:'13',RR:'14',PA:'15',AP:'16',TO:'17',MA:'21',PI:'22',CE:'23',RN:'24',PB:'25',PE:'26',AL:'27',SE:'28',BA:'29',MG:'31',ES:'32',RJ:'33',SP:'35',PR:'41',SC:'42',RS:'43',MS:'50',MT:'51',GO:'52',DF:'53'};\nconst UF_BORDERS={AC:['AM','RO'],AL:['BA','PE','SE'],AM:['AC','RO','RR','PA','MT'],AP:['PA'],\n BA:['AL','SE','PE','PI','TO','GO','MG','ES'],CE:['PI','PB','PE','RN'],DF:['GO','MG'],\n ES:['BA','MG','RJ'],GO:['DF','MT','MS','MG','BA','TO'],MA:['PA','TO','PI'],\n MG:['BA','GO','DF','MS','SP','RJ','ES'],MS:['MT','GO','MG','SP','PR'],MT:['RO','AM','PA','TO','GO','MS'],\n PA:['AP','AM','MT','TO','MA','RR'],PB:['RN','CE','PE'],PE:['PB','CE','PI','BA','AL'],\n PI:['MA','TO','BA','PE','CE'],PR:['SP','MS','SC'],RJ:['ES','MG','SP'],RN:['CE','PB'],\n RO:['AC','AM','MT'],RR:['AM','PA'],RS:['SC'],SC:['PR','RS'],SE:['BA','AL'],\n SP:['MG','RJ','PR','MS'],TO:['PA','MA','PI','BA','GO','MT']};\nconst NIVEIS=['Bronze','Cristal','Prata','Ouro','Diamante','Diamante+'];\nconst METRICS_DEF=[['cbs','CBs'],['ativas','Ativas'],['pedidos','Pedidos'],['pontos','Pontos'],['receita','Receita','$'],['rec_nat','Rec. Natura','$'],['rec_avon','Rec. Avon','$']];\nconst OPT_K=1.5;\nconst SESSIONS_DS='timeline-shared-sessionsDataSet';   // same table as SHARED_DS — see notes at listSessions()\n// Span defaults are the real operating band for a setor receptor, not placeholders: 2200 ≤ span ≤ 3500\n// with 2700 as the target. null meant \"sem limite\", so every new session started with the optimiser\n// balancing against nothing. Existing sessions are NOT touched — their persisted settings carry explicit\n// values that spread OVER these in openOptions/applyOptions, which is deliberate: their etapas were\n// computed under the old band and changing it silently would leave the stored result and the rule that\n// produced it out of sync.\nconst DEFAULT_SETTINGS={destRule:'any',destMinCbs:9,targetSpan:2700,maxSpan:3500,minSpan:2200};\nconst DOM_MEDIA_BASE='https://natura-geomarketing.data2.media/file/';\nconst DOM_CSV_FALLBACK=DOM_MEDIA_BASE+'yw_TQdp0QXEk6JsrliAqP'; \nconst numOrNull=v=>{const n=Math.round(+v);return (isFinite(n)&&n>0)?n:null;};\nconst spanShort=st=>{const p=[];if(st&&st.targetSpan)p.push('alvo '+st.targetSpan);if(st&&st.maxSpan)p.push('máx '+st.maxSpan);if(st&&st.minSpan)p.push('mín '+st.minSpan);return p.length?p.join(' · '):'livre';};\nconst ruleShort=st=>((st&&st.destRule)==='dominant')?('dominantes ≥'+((st&&st.destMinCbs)||DEFAULT_SETTINGS.destMinCbs)+' CBs'):'qualquer municipio';\n\nexport default {\n  css: `\n  :host{display:block;height:100%;--bg:#f5f5f7;--panel:#ffffff;--panel2:#f2f2f7;--line:#e5e5ea;--ink:#1c1c1e;--mut:#6e6e73;--acc:#007aff;--acc2:#0060df;--closing:#ff3b30;--ok:#34c759}\n  *{box-sizing:border-box}\n  .simroot{position:relative;height:100%;overflow:auto;font:13px/1.45 -apple-system,BlinkMacSystemFont,\"SF Pro Text\",\"Segoe UI\",Roboto,sans-serif;background:var(--bg);color:var(--ink);-webkit-font-smoothing:antialiased}\n  header{padding:10px 16px;background:rgba(246,246,248,.85);backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);border-bottom:1px solid var(--line);display:flex;align-items:center;gap:10px;flex-wrap:wrap}\n  header h1{font-size:14.5px;margin:0;font-weight:600;letter-spacing:-.1px;color:var(--ink)}\n  .mac-spacer{flex:1}\n  .howto{padding:8px 16px;background:var(--panel);border-bottom:1px solid var(--line);display:flex;gap:16px;flex-wrap:wrap;font-size:11.5px;color:var(--mut);align-items:center}\n  .howto b{color:var(--ink)} .howto span{max-width:340px}\n  .pill{font-size:10.5px;padding:2.5px 9px;border-radius:99px;border:1px solid var(--line);color:var(--mut);background:var(--panel2)}\n  .pill.live{color:var(--ink);cursor:pointer;user-select:none;transition:border-color .1s,color .1s,background .1s}\n  .pill.live:hover{border-color:var(--acc);color:var(--acc);background:#eaf3ff}\n  .pill.live:focus-visible{outline:2px solid rgba(0,122,255,.35);outline-offset:1px}\n  .pill.live.busy{border-color:var(--acc);color:var(--acc);cursor:progress}\n  .status{font-size:11px;color:var(--mut)}.status.err{color:var(--closing)}\n  select,input,textarea,button{font:inherit}\n  select,input{background:var(--panel);border:1px solid var(--line);color:var(--ink);border-radius:7px;padding:5.5px 9px}\n  select:focus,input:focus{outline:2px solid rgba(0,122,255,.35);outline-offset:0;border-color:var(--acc)}\n  button.act{background:var(--acc);color:#fff;border:1px solid transparent;border-radius:7px;padding:6px 13px;font-weight:600;cursor:pointer;box-shadow:0 1px 1px rgba(0,0,0,.08)}\n  button.act:hover{background:var(--acc2)}\n  button.ghost{background:var(--panel);color:var(--ink);border:1px solid var(--line);border-radius:7px;padding:5.5px 12px;cursor:pointer}\n  button.ghost:hover{background:var(--panel2)}\n  button.ghost.on{border-color:var(--acc);color:var(--acc);background:#eaf3ff}\n  button.ghost:disabled,button.act:disabled{opacity:.4;cursor:not-allowed}\n  .sessbar{padding:9px 20px;background:var(--panel2);border-bottom:1px solid var(--line);display:flex;gap:8px;flex-wrap:wrap;align-items:center}\n  .rail{padding:9px 16px;background:var(--panel);border-bottom:1px solid var(--line);display:flex;gap:8px;align-items:center;overflow-x:auto}\n  #movementChips{display:flex;gap:8px;flex:0 0 auto}\n  #addMovementGroup{display:flex;gap:8px;align-items:center;flex:0 0 auto;margin-left:auto;padding-left:12px;border-left:1px solid var(--line)}\n  #addMovementGroup input{min-width:150px}\n  .tchip{display:flex;align-items:center;gap:7px;background:var(--panel2);border:1px solid var(--line);border-radius:8px;padding:6px 10px;cursor:pointer;font-size:12px;flex:0 0 auto}\n  .tchip.on{border-color:var(--acc);background:#eaf3ff}\n  .tchip.stale{border-style:dashed;opacity:.85}\n  .tchip .tstale{color:#ff9500;font-weight:700}\n  .tchip .tnum{background:var(--ink);color:#fff;border-radius:99px;width:16px;height:16px;font-size:9.5px;display:flex;align-items:center;justify-content:center;font-weight:700}\n  .tchip .tsec{font-weight:600}\n  .tchip .tstat{color:var(--mut)}\n  .tchip .trm{color:var(--mut);font-weight:700;padding:0 3px}\n  .tchip .trm:hover{color:var(--closing)}\n  .rail .empty{color:var(--mut);font-size:12px}\n  .wrap{display:grid;grid-template-columns:minmax(360px,1fr) 430px;gap:14px;padding:14px 16px;align-items:start}\n  @media(max-width:1150px){.wrap{grid-template-columns:1fr}}\n  .card{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:14px 16px;margin-bottom:14px;box-shadow:0 1px 2px rgba(0,0,0,.04)}\n  .card h2{font-size:11px;text-transform:uppercase;letter-spacing:.4px;color:var(--mut);margin:0 0 9px;font-weight:600}\n  /* user-select, not pointer-events. .lbl already sets pointer-events:none, which stops the text from\n     RECEIVING clicks but does not exclude it from the browser's selection range — so cycling a\n     município's destination with repeated clicks kept dragging a double-click selection across the\n     labels. Nothing drawn in an svg here is text anyone needs to copy. */\n  svg{width:100%;height:auto;display:block;user-select:none;-webkit-user-select:none}\n  .map-wrap{position:relative}\n  #map{cursor:grab;touch-action:none}\n  #map.dragging{cursor:grabbing}\n  .zoom-pill{position:absolute;left:10px;bottom:10px;display:flex;align-items:stretch;background:var(--panel);border:1px solid var(--line);border-radius:99px;box-shadow:0 2px 8px rgba(0,0,0,.14);overflow:hidden;z-index:3}\n  .zoom-pill button{width:30px;height:30px;border:0;background:transparent;color:var(--ink);font:16px/1 -apple-system,BlinkMacSystemFont,sans-serif;font-weight:600;cursor:pointer;display:flex;align-items:center;justify-content:center}\n  .zoom-pill button:hover{background:var(--panel2)}\n  .zoom-pill button:active{background:#e5e5ea}\n  .zoom-pill .zoom-div{width:1px;background:var(--line)}\n  /* White hairlines inside the closing sector: the municipios read as one territory cut into parts\n     rather than as separate outlined units, and the saturated fills carry the grouping instead of the\n     ink. Neighbour sectors keep their own coloured strokes (.sect) — that contrast is what separates\n     what is being reallocated from what is only context. Selection no longer draws an outline; the\n     white border was the click affordance AND the default is now white, so it had nothing left to say. */\n  .muni{stroke:#fff;stroke-width:1.1;cursor:pointer;transition:filter .1s}.muni:hover{filter:brightness(1.15)}.muni.munihl{filter:brightness(1.15)}\n  .sect{stroke-width:1;fill-opacity:.32;stroke-opacity:.6}\n  .sect.plain{fill:#e8e8ec;stroke:#d4d4d9;fill-opacity:1;stroke-opacity:1}\n  .sect.closed-ctx{fill:#e2e2e7;stroke:#aeaeb2;stroke-dasharray:3 2;fill-opacity:1;stroke-opacity:1}\n  .lbl{pointer-events:none}\n  /* No plate behind the text: a halo painted UNDER the glyphs (paint-order) keeps a name legible on any\n     fill without stamping an opaque box over the territory it names. Ink and halo are chosen per label\n     from the luminance of the fill underneath, so they are deliberately NOT declared here — a\n     stylesheet rule outranks a presentation attribute and would silently override that choice. */\n  .lbl text{text-anchor:middle;paint-order:stroke fill;stroke-width:2.2px;stroke-linejoin:round;stroke-linecap:round}\n  .lbl.big text{stroke-width:2.9px}\n  .lbl line.lead{stroke-opacity:.5;stroke-width:.8}\n  .legend{display:flex;gap:12px;flex-wrap:wrap;margin-top:8px;font-size:12px}\n  .legend b{display:inline-block;width:11px;height:11px;border-radius:3px;margin-right:5px;vertical-align:-1px}\n  .kpis{display:grid;grid-template-columns:1fr 1fr;gap:9px;margin-bottom:12px}\n  .kpi{background:var(--panel2);border:1px solid var(--line);border-radius:10px;padding:9px 11px}\n  .kpi .n{font-size:19px;font-weight:700}.kpi .l{font-size:10.5px;color:var(--mut);margin-top:2px}\n  .kpi.warn{border-color:#ffd1cc}.kpi.warn .n{color:var(--closing)}.kpi.ok{border-color:#bdeecb}.kpi.ok .n{color:var(--ok)}\n  .bar-row{display:flex;align-items:center;gap:8px;margin:6px 0}\n  .bar-row .tag{width:42px;font-weight:600;font-size:12px}\n  .bar-track{flex:1;height:18px;background:var(--panel2);border-radius:5px;overflow:hidden;display:flex;position:relative}\n  .bar-mark{position:absolute;top:0;bottom:0;width:2px;opacity:.9;z-index:2}\n  .bar-base{height:100%;opacity:.4}.bar-inc{height:100%}\n  .bar-val{width:132px;text-align:right;font-size:11px;color:var(--mut);font-variant-numeric:tabular-nums}\n  table{border-collapse:collapse;width:100%;font-size:11.5px}\n  th,td{padding:5px 6px;text-align:right;border-bottom:1px solid var(--line);font-variant-numeric:tabular-nums}\n  th:first-child,td:first-child{text-align:left}\n  thead th{color:var(--mut);font-weight:600;font-size:10.5px;position:sticky;top:0;background:var(--panel)}\n  .home{display:inline-block;width:9px;height:9px;border-radius:2px;margin-right:4px}\n  .muni-item{display:flex;align-items:center;gap:8px;background:var(--panel2);border:1px solid var(--line);border-radius:8px;padding:5px 8px;margin-bottom:6px}\n  .muni-item .nm{flex:1;font-weight:600;font-size:12px}.muni-item .ct{color:var(--mut);font-size:11px}\n  .seg{display:flex;border:1px solid var(--line);border-radius:7px;overflow:hidden}\n  .seg button{border:0;background:transparent;color:var(--mut);padding:4px 8px;font-size:11px;font-weight:600;cursor:pointer}\n  .seg button.on{color:#fff}\n  .toolbar{display:flex;gap:8px;align-items:center;flex-wrap:wrap}\n  .toggle{display:flex;border:1px solid var(--line);border-radius:8px;overflow:hidden;font-size:12px}\n  .toggle button{background:transparent;border:0;color:var(--mut);padding:6px 10px;cursor:pointer;font-weight:600}\n  .toggle button.on{background:var(--panel2);color:var(--ink)}\n  .note{color:var(--mut);font-size:10.5px;margin-top:7px;line-height:1.5}\n  .cell{font-variant-numeric:tabular-nums}\n  .lider-foot td{background:var(--panel2);font-weight:600;font-size:11px;color:var(--ink);border-bottom:2px solid var(--line);padding:5px 6px;text-align:left}\n  .scroll{max-height:240px;overflow:auto}\n  /* Tables meant to be READ in full rather than sampled. Only the vertical cap is dropped — overflow\n     stays auto so the wide grupo grid can still scroll sideways inside its card, which is the one axis\n     that genuinely cannot fit. */\n  .scroll.grow{max-height:none}\n  .tip{position:fixed;pointer-events:none;background:#1c1c1e;color:#fff;border-radius:8px;padding:7px 9px;font-size:11px;opacity:0;transition:opacity .1s;z-index:9;max-width:230px}\n  .spark{display:flex;align-items:flex-end;gap:3px;height:44px}\n  .spark .b{flex:1;background:var(--acc);border-radius:2px 2px 0 0;min-height:2px;opacity:.85}\n  .delta{font-size:10px}.delta.up{color:var(--ok)}.delta.dn{color:var(--closing)}\n  .tabs{display:flex;gap:6px;margin-bottom:10px;flex-wrap:wrap}\n  .tabs button{background:transparent;border:1px solid var(--line);border-radius:8px;color:var(--mut);padding:6px 12px;cursor:pointer;font-weight:600}\n  .tabs button.on{background:var(--panel2);color:var(--ink);border-color:var(--acc)}\n  .hidden{display:none}\n  .sqlbox{width:100%;height:60px;font-family:ui-monospace,Menlo,monospace;font-size:11px;resize:vertical}\n  .load{position:absolute;inset:0;background:rgba(245,245,247,.85);backdrop-filter:blur(4px);display:flex;align-items:center;justify-content:center;z-index:20;font-size:13px;color:var(--acc);font-weight:600;text-align:center;padding:20px}\n  .load.hidden{display:none}\n  .badge{font-size:10px;padding:1px 6px;border-radius:5px;background:var(--panel2);border:1px solid var(--line);color:var(--mut)}\n  .sheet-bg{position:fixed;inset:0;background:rgba(28,28,30,.34);backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);display:flex;align-items:center;justify-content:center;z-index:40;padding:24px}\n  .sheet-bg.hidden{display:none}\n  .sheet{background:var(--panel);border:1px solid var(--line);border-radius:14px;box-shadow:0 24px 60px rgba(0,0,0,.22);width:min(580px,100%);max-height:100%;display:flex;flex-direction:column;overflow:hidden}\n  .sheet-hd{display:flex;align-items:center;gap:9px;padding:12px 16px;border-bottom:1px solid var(--line)}\n  .sheet-hd h3{margin:0;font-size:14px;font-weight:600;letter-spacing:-.1px}\n  .sheet-x{background:transparent;border:0;color:var(--mut);font-size:13px;cursor:pointer;padding:3px 7px;border-radius:6px}\n  .sheet-x:hover{background:var(--panel2);color:var(--ink)}\n  .sheet-bd{padding:14px 16px;overflow:auto}\n  .sheet-ft{display:flex;align-items:center;gap:8px;padding:11px 16px;border-top:1px solid var(--line);background:var(--panel2)}\n  .opt-lbl{font-size:11px;text-transform:uppercase;letter-spacing:.4px;color:var(--mut);font-weight:600}\n  .opt-sub{font-size:11.5px;color:var(--mut);margin:4px 0 10px;line-height:1.5}\n  .opt-row{display:flex;gap:10px;align-items:flex-start;border:1px solid var(--line);border-radius:10px;padding:10px 12px;margin-bottom:8px;cursor:pointer;background:var(--panel)}\n  .opt-row:hover{background:var(--panel2)}\n  .opt-row.on{border-color:var(--acc);background:#eaf3ff}\n  .opt-row:has(input:disabled){opacity:.5;cursor:not-allowed}\n  .opt-row input[type=radio]{margin:2px 0 0;accent-color:var(--acc);flex:0 0 auto}\n  .opt-t{font-size:12.5px;font-weight:600;display:flex;align-items:center;gap:6px;flex-wrap:wrap}\n  .opt-d{font-size:11.5px;color:var(--mut);margin-top:3px;line-height:1.55}\n  .opt-inline{font-size:11.5px;color:var(--mut);margin-top:9px;display:flex;align-items:center;gap:7px;flex-wrap:wrap}\n  .opt-inline.off{opacity:.4;pointer-events:none}\n  .opt-note{border:1px solid var(--line);background:var(--panel2);border-radius:10px;padding:9px 11px;font-size:11.5px;color:var(--mut);line-height:1.6;margin-top:12px}\n  .opt-grid{display:grid;grid-template-columns:1fr 1fr 1fr;gap:8px;margin-top:2px}\n  .opt-fld{display:flex;flex-direction:column;gap:5px;border:1px solid var(--line);border-radius:9px;padding:8px 10px;background:var(--panel2)}\n  .opt-fld span{font-size:11px;color:var(--mut);font-weight:600;line-height:1.35}\n  .opt-fld i{font-style:normal;font-weight:400;opacity:.72}\n  .opt-fld input{width:100%;background:var(--panel)}\n  .opt-err{margin-top:9px;font-size:11.5px;color:var(--closing);font-weight:600}\n  .opt-hr{height:1px;background:var(--line);margin:17px 0 0}\n  .shareurl{margin-top:9px;padding:9px 10px;border-radius:8px;background:var(--panel);border:1px solid var(--acc);\n    font-family:ui-monospace,Menlo,monospace;font-size:11px;color:var(--ink);word-break:break-all;user-select:all}\n`,\n  render(d2){\n    return `<div class=\"simroot\"><header id=\"topHeader\" class=\"hidden\">\n  <h1>Simulador de Timeline de Fechamentos</h1>\n  <span class=\"pill live\" id=\"liveState\" role=\"button\" tabindex=\"0\" title=\"Clique pra buscar o snapshot mais recente e recalcular a timeline inteira\">● iniciando</span>\n  <span class=\"pill ro\">read-only · nunca escreve</span>\n  <span class=\"pill\" id=\"basePill\"></span>\n  <span class=\"pill\" id=\"rulePill\"></span>\n  <span class=\"pill\" id=\"spanPill\"></span>\n  <span class=\"status\" id=\"ds\"></span>\n  <div class=\"mac-spacer\"></div>\n  <select id=\"sessionPick\" style=\"min-width:200px\"></select>\n  <button class=\"ghost\" id=\"openOptions\" title=\"Configurações desta sessão\">⚙ Opções</button>\n  <button class=\"act\" id=\"saveSession\">Salvar sessão</button>\n  <button class=\"ghost\" id=\"dupSession\" title=\"Cria uma cópia independente desta sessão — a original fica intacta e a cópia passa a ser a sessão ativa\">⧉ Duplicar</button>\n  <button class=\"ghost\" id=\"openShare\" title=\"Publicar uma cópia congelada desta sessão em modo leitura\">⇪ Compartilhar</button>\n  <span class=\"status\" id=\"sessStatus\"></span>\n</header>\n\n<div class=\"rail hidden\" id=\"timelineRail\">\n  <div id=\"movementChips\"></div>\n  <div id=\"addMovementGroup\">\n    <button class=\"act\" id=\"openMove\">Adicionar movimentação</button>\n  </div>\n</div>\n\n<div class=\"card\" id=\"confirmCard\" style=\"margin:14px 20px\">\n  <h2 style=\"margin:0 0 9px\">Confirmar snapshot antes de simular</h2>\n  <div class=\"note\" id=\"confirmBody\">congelando snapshot…</div>\n  <button class=\"act\" id=\"confirmSnap\" style=\"margin-top:12px\">Confirmar snapshot ▶ ir pra simulação</button>\n  <div class=\"note\" style=\"margin-top:16px\">ou continue uma sessão salva:</div>\n  <select id=\"confirmSessionPick\" style=\"min-width:260px;margin-top:4px\"></select>\n  <div class=\"status\" id=\"confirmStatus\" style=\"margin-top:8px\"></div>\n</div>\n\n<div class=\"wrap hidden\" id=\"mainWrap\">\n  <div>\n    <div class=\"card\">\n      <div style=\"display:flex;justify-content:space-between;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:9px\">\n        <h2 id=\"mapTitle\" style=\"margin:0\">Mapa — clique num município p/ trocar o setor destino</h2>\n        <div class=\"toggle\" id=\"viewToggle\" title=\"ASIS = estrutura do setor antes desta etapa (já considerando etapas anteriores) · TOBE = após a redistribuição desta etapa\">\n          <button data-v=\"asis\">◧ ASIS (antes desta etapa)</button>\n          <button data-v=\"tobe\" class=\"on\">◨ TOBE (simulação)</button>\n        </div>\n      </div>\n      <div class=\"map-wrap\">\n        <svg id=\"map\" viewBox=\"0 0 700 500\" preserveAspectRatio=\"xMidYMid meet\"></svg>\n        <div class=\"zoom-pill\" id=\"mapZoom\">\n          <button type=\"button\" id=\"mapZoomOut\" title=\"Diminuir zoom\">−</button>\n          <span class=\"zoom-div\"></span>\n          <button type=\"button\" id=\"mapZoomIn\" title=\"Aumentar zoom\">+</button>\n        </div>\n      </div>\n      <div class=\"legend\" id=\"legend\"></div>\n      <div class=\"note\">Coloridos = municípios do setor fechado nesta etapa (cor = destino). Ao redor, cada área é um <b>setor vizinho inteiro</b> com o código no meio — não municípios soltos: cor = setor destino, cinza = contexto, cinza tracejado = setor já fechado numa etapa anterior. Shapes reais IBGE/tbrugz.</div>\n      <div class=\"note\" id=\"mapIgnoredNote\"></div>\n    </div>\n\n    <div class=\"card\">\n      <h2>Líderes — destino e CBs deslocadas (nesta etapa)</h2>\n      <div class=\"note\" style=\"margin:-4px 0 9px\"><b>Home</b> = setor que ficou com a maioria das CBs da líder. <b style=\"color:var(--closing)\">Deslocadas</b> = CBs dela que caíram noutro setor.</div>\n      <div class=\"scroll grow\"><table id=\"leaders\"></table></div>\n    </div>\n\n    <div class=\"card\">\n      <div class=\"tabs\">\n        <button data-tab=\"matrix\" class=\"on\">Matriz ASIS</button>\n        <button data-tab=\"tobe\">Matriz TOBE</button>\n        <button data-tab=\"report\">Relatório de impacto (etapa)</button>\n        <button data-tab=\"cumulative\">Impacto acumulado (timeline)</button>\n        <button data-tab=\"sql\">Console SQL</button>\n      </div>\n      <div id=\"tab-matrix\"><div class=\"scroll grow\"><table id=\"matrix\"></table></div></div>\n      <div id=\"tab-tobe\" class=\"hidden\"><div class=\"scroll grow\"><table id=\"matrixTobe\"></table></div>\n        <div class=\"note\" id=\"tobeNote\"></div></div>\n      <div id=\"tab-report\" class=\"hidden\"></div>\n      <div id=\"tab-cumulative\" class=\"hidden\"></div>\n      <div id=\"tab-sql\" class=\"hidden\">\n        <textarea class=\"sqlbox\" id=\"sqlIn\">SELECT DS_MUNICIPIO, COUNT(DISTINCT CD_CONSULTORA) qtd FROM product.perfil_cb.crm_perfil_cb_diaria_historico WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR=3504 GROUP BY DS_MUNICIPIO ORDER BY qtd DESC</textarea>\n        <div class=\"toolbar\" style=\"margin:8px 0\"><button class=\"act\" id=\"runSql\">▶ Rodar</button><span class=\"status\" id=\"sqlStatus\"></span></div>\n        <div class=\"note\" style=\"margin:-4px 0 8px\">Roda contra o snapshot congelado desta sessão (não \"ao vivo\") — mesma coerência da timeline.</div>\n        <div class=\"scroll\"><table id=\"sqlOut\"></table></div>\n      </div>\n    </div>\n  </div>\n\n  <div>\n    <div class=\"card\">\n      <div class=\"toolbar\" style=\"margin-bottom:11px\">\n        <button class=\"ghost\" id=\"optim\" title=\"testa alocações que mantêm cada setor conectado e escolhe a que equilibra a carga entre setores + minimiza a quebra (evita empilhar tudo num setor)\">★ Modelo ÓTIMO (equilíbrio + quebra)</button>\n        <button class=\"ghost\" id=\"autoTobe\" title=\"preenche cada município pelo setor vizinho mais próximo (geografia)\">TOBE por adjacência</button>\n        <span class=\"badge\" id=\"optBadge\"></span>\n      </div>\n      <div class=\"note\" style=\"margin:-4px 0 10px\"><b style=\"color:var(--ink)\">★ ÓTIMO</b> = equilibra a carga entre os setores <b>e</b> minimiza a quebra (mantém o território conectado; não empilha tudo num setor). <b style=\"color:var(--ink)\">TOBE</b> = sugestão por vizinhança. Editar esta etapa recalcula automaticamente as etapas seguintes da timeline.</div>\n      <div class=\"note\" id=\"ruleNote\" style=\"margin:-6px 0 11px;padding:7px 9px;background:var(--panel2);border:1px solid var(--line);border-radius:8px\"></div>\n      <div class=\"kpis\" id=\"kpis\"></div>\n      <div id=\"contig\"></div>\n      <div id=\"spanRule\"></div>\n      <h2>Span por setor (CBs) — base + entrantes</h2>\n      <div id=\"spans\"></div>\n      <div id=\"policySection\">\n      <div style=\"display:flex;justify-content:space-between;align-items:center;margin:14px 0 7px\">\n        <h2 style=\"margin:0\">CBs deslocadas</h2>\n        <div class=\"toggle\" id=\"policy\">\n          <button data-p=\"fora\" class=\"on\">= fora do setor</button>\n          <button data-p=\"quebra\">= quebra de relação</button>\n        </div>\n      </div>\n      <div class=\"note\" id=\"policyNote\"></div>\n      </div>\n    </div>\n\n    <div class=\"card\">\n      <h2 id=\"muniListTitle\">Municípios → setor destino</h2>\n      <div class=\"note\" id=\"muniListNote\" style=\"margin:-4px 0 9px\">Clique no <b>código do setor</b> pra mandar o município <b>inteiro</b> pra lá (regra de negócio). A cor acompanha o mapa.</div>\n      <div id=\"muniList\"></div>\n    </div>\n\n    <div class=\"card\">\n      <div class=\"toolbar\" style=\"justify-content:space-between\">\n        <h2 style=\"margin:0\">Plano de migração (etapa selecionada)</h2>\n        <div><button class=\"ghost\" id=\"copyPlan\">Copiar</button> <button class=\"ghost\" id=\"csvPlan\">CSV</button></div>\n      </div>\n      <div id=\"plan\" class=\"note\"></div>\n    </div>\n  </div>\n</div>\n\n<div class=\"sheet-bg hidden\" id=\"shareBg\">\n  <div class=\"sheet\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"shareTitle\">\n    <div class=\"sheet-hd\"><h3 id=\"shareTitle\">Compartilhar sessão</h3><div class=\"mac-spacer\"></div><button class=\"sheet-x\" id=\"shareX\" title=\"Fechar\">✕</button></div>\n    <div class=\"sheet-bd\" id=\"shareBody\"></div>\n    <div class=\"sheet-ft\">\n      <span class=\"status\" id=\"shareStatus\"></span>\n      <div class=\"mac-spacer\"></div>\n      <button class=\"ghost hidden\" id=\"shareCopy\">Copiar link</button>\n      <button class=\"ghost hidden\" id=\"shareOpen\">Abrir</button>\n      <button class=\"ghost\" id=\"shareCancel\">Cancelar</button>\n      <button class=\"act\" id=\"shareGo\">Compartilhar</button>\n    </div>\n  </div>\n</div>\n\n<div class=\"sheet-bg hidden\" id=\"optionsBg\">\n  <div class=\"sheet\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"optTitle\">\n    <div class=\"sheet-hd\"><h3 id=\"optTitle\">Opções da sessão</h3><span class=\"badge\" id=\"optSessName\"></span><div class=\"mac-spacer\"></div><button class=\"sheet-x\" id=\"optClose\" title=\"Fechar\">✕</button></div>\n    <div class=\"sheet-bd\">\n      <div class=\"opt-lbl\">Regra rígida — seleção dos setores destino</div>\n      <div class=\"opt-sub\">Define quais setores vizinhos podem entrar na lista de destinos de cada etapa. Vale pra toda a timeline desta sessão.</div>\n      <label class=\"opt-row\" data-r=\"any\">\n        <input type=\"radio\" name=\"destRule\" value=\"any\">\n        <div>\n          <div class=\"opt-t\">Adjacente a qualquer município <span class=\"badge\">padrão</span></div>\n          <div class=\"opt-d\">Um setor entra na lista de destinos se tiver município vizinho a <b>qualquer</b> município do setor fechado — inclusive os menores. É o comportamento de hoje.</div>\n        </div>\n      </label>\n      <label class=\"opt-row\" data-r=\"dominant\">\n        <input type=\"radio\" name=\"destRule\" value=\"dominant\">\n        <div>\n          <div class=\"opt-t\">Adjacente a municípios dominantes</div>\n          <div class=\"opt-d\">Só os municípios do setor fechado com <b>CBs suficientes</b> valem como ponte. Os pequenos continuam sendo redistribuídos normalmente — só não trazem setor novo pra lista de destinos.</div>\n          <div class=\"opt-inline\" id=\"optMinCbsWrap\">Ignorar municípios com menos de <input type=\"number\" id=\"optMinCbs\" min=\"1\" max=\"9999\" step=\"1\" style=\"width:74px\"> CBs</div>\n        </div>\n      </label>\n      <div class=\"opt-hr\"></div>\n      <div class=\"opt-lbl\" style=\"margin-top:15px\">Pré-requisitos do setor destino — tamanho em CBs</div>\n      <div class=\"opt-sub\">Vale pro tamanho de cada setor receptor <b>depois</b> da redistribuição (base + entrantes). Em branco = desligado.</div>\n      <div class=\"opt-grid\">\n        <label class=\"opt-fld\"><span>Span alvo <i>(tamanho ideal)</i></span><input type=\"number\" id=\"optTargetSpan\" min=\"1\" max=\"99999\" step=\"1\" placeholder=\"livre\"></label>\n        <label class=\"opt-fld\"><span>Span máximo <i>(nenhum setor acima)</i></span><input type=\"number\" id=\"optMaxSpan\" min=\"1\" max=\"99999\" step=\"1\" placeholder=\"sem limite\"></label>\n        <label class=\"opt-fld\"><span>Span mínimo <i>(nenhum setor abaixo)</i></span><input type=\"number\" id=\"optMinSpan\" min=\"1\" max=\"99999\" step=\"1\" placeholder=\"sem limite\"></label>\n      </div>\n      <div class=\"opt-err hidden\" id=\"optSpanErr\"></div>\n      <div class=\"opt-note\" id=\"optPreview\"></div>\n    </div>\n    <div class=\"sheet-ft\"><span class=\"status\" id=\"optStatus\"></span><div class=\"mac-spacer\"></div><button class=\"ghost\" id=\"optCancel\">Cancelar</button><button class=\"act\" id=\"optApply\">Aplicar</button></div>\n  </div>\n</div>\n\n<div class=\"sheet-bg hidden\" id=\"moveBg\">\n  <div class=\"sheet\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"moveTitle\">\n    <div class=\"sheet-hd\"><h3 id=\"moveTitle\">Adicionar movimentação</h3><div class=\"mac-spacer\"></div><button class=\"sheet-x\" id=\"moveClose\" title=\"Fechar\">✕</button></div>\n    <div class=\"sheet-bd\">\n      <div class=\"opt-lbl\">Tipo de movimentação</div>\n      <div class=\"opt-sub\" id=\"moveLockNote\">Escolha o nível a fechar. Você pode fechar setores à vontade até fechar uma GV; aí só GV (ou mercado) daqui pra frente. Fechar um mercado trava a sessão em mercado.</div>\n      <label class=\"opt-row\" data-lvl=\"setor\"><input type=\"radio\" name=\"moveLevel\" value=\"setor\"><div><div class=\"opt-t\">Fechar Setor</div><div class=\"opt-d\">Redistribui os municípios do setor entre setores vizinhos da mesma GV.</div></div></label>\n      <label class=\"opt-row\" data-lvl=\"gv\"><input type=\"radio\" name=\"moveLevel\" value=\"gv\"><div><div class=\"opt-t\">Fechar GV</div><div class=\"opt-d\">Redistribui os setores (com municípios e CBs) da GV entre GVs vizinhas do mesmo mercado.</div></div></label>\n      <label class=\"opt-row\" data-lvl=\"mercado\"><input type=\"radio\" name=\"moveLevel\" value=\"mercado\"><div><div class=\"opt-t\">Fechar Mercado</div><div class=\"opt-d\">Redistribui as GVs (com setores, municípios e CBs) do mercado entre mercados vizinhos.</div></div></label>\n      <div class=\"opt-hr\"></div>\n      <div class=\"opt-lbl\" style=\"margin-top:15px\" id=\"moveCodeLbl\">Setor a fechar</div>\n      <div class=\"opt-inline\" id=\"moveCodeRow\">\n        <input id=\"moveCode\" list=\"moveCodeList\" placeholder=\"código\" style=\"min-width:150px\">\n        <datalist id=\"moveCodeList\"></datalist>\n        <button class=\"ghost\" id=\"moveRand\" title=\"Aleatório\">🎲</button>\n      </div>\n      <div class=\"opt-err hidden\" id=\"moveErr\"></div>\n    </div>\n    <div class=\"sheet-ft\"><span class=\"status\" id=\"moveStatus\"></span><div class=\"mac-spacer\"></div><button class=\"ghost\" id=\"moveCancel\">Cancelar</button><button class=\"act\" id=\"moveGo\">Fechar ▶ (nova etapa)</button></div>\n  </div>\n</div>\n\n<div class=\"tip\" id=\"tip\"></div>\n<div class=\"load hidden\" id=\"loader\">carregando…</div>\n<span id=\"ready\" style=\"display:none\"></span></div>`;\n  },\n  mounted(d2, root){\n\nconst $=s=>root.querySelector(s);\nconst fmt=n=>n==null?'–':Math.round(+n).toLocaleString('pt-BR');\nconst money=n=>{n=+n||0;return n>=1e6?'R$'+(n/1e6).toFixed(1)+'M':n>=1e3?'R$'+(n/1e3).toFixed(0)+'k':'R$'+Math.round(n)};\nconst norm=s=>(s||'').normalize('NFKD').replace(/[̀-ͯ]/g,'').toUpperCase().replace(/[^A-Z0-9]+/g,' ').trim();\nconst esc=s=>(s==null?'':String(s)).replace(/[&<>]/g,c=>({'&':'&amp;','<':'&lt;','>':'&gt;'}[c]));\nconst blankM=()=>({cbs:0,receita:0,rec_nat:0,rec_avon:0,pontos:0,pedidos:0,ativas:0});\n// ---------- município identity ----------\n// Brazil has many municipalities sharing a name (Bom Jesus alone exists in PI, RN, RS, SC, PB, GO).\n// A stage loads the dominant UF PLUS every bordering UF, so those collisions land in the SAME\n// feature set routinely: keyed by name alone the last shape loaded won, the map could draw a\n// município from the wrong state, buildAdj merged two unrelated municipalities into one node, and\n// GROUP BY DS_MUNICIPIO summed two real municipalities into one row. The key is NAME/UF everywhere\n// — SQL rows, GeoJSON features, the dominantes base, assignments, persisted sessions. norm() maps\n// every non-alphanumeric to a space, so '/' can never occur inside a name and the split is exact.\n// A missing UF degrades to a bare NAME key rather than inventing one.\nconst mkey=(name,uf)=>{const n=norm(name),u=String(uf==null?'':uf).trim().toUpperCase();return u?n+'/'+u:n;};\nconst mName=k=>{const s=String(k==null?'':k),i=s.lastIndexOf('/');return i<0?s:s.slice(0,i);};\nconst mUf=k=>{const s=String(k==null?'':k),i=s.lastIndexOf('/');return i<0?'':s.slice(i+1);};\nconst mDisp=k=>{const u=mUf(k);return u?mName(k)+' ('+u+')':mName(k);};\n// The base CSV is the ONLY source of a município's UF now, so its column is accepted in whatever\n// shape the base is maintained in: sigla, IBGE numeric code, or full state name. Anything that does\n// not resolve to a real sigla is treated as UNKNOWN rather than passed through — a bogus UF would key\n// a município to a shape that does not exist and drop it off the map without a word.\nconst UF_OF_CODE={}; Object.keys(UF_CODE).forEach(k=>{ UF_OF_CODE[UF_CODE[k]]=k; });\nconst UF_OF_NAME={ACRE:'AC',ALAGOAS:'AL',AMAPA:'AP',AMAZONAS:'AM',BAHIA:'BA',CEARA:'CE','DISTRITO FEDERAL':'DF','ESPIRITO SANTO':'ES',GOIAS:'GO',MARANHAO:'MA','MATO GROSSO':'MT','MATO GROSSO DO SUL':'MS','MINAS GERAIS':'MG',PARA:'PA',PARAIBA:'PB',PARANA:'PR',PERNAMBUCO:'PE',PIAUI:'PI','RIO DE JANEIRO':'RJ','RIO GRANDE DO NORTE':'RN','RIO GRANDE DO SUL':'RS',RONDONIA:'RO',RORAIMA:'RR','SANTA CATARINA':'SC','SAO PAULO':'SP',SERGIPE:'SE',TOCANTINS:'TO'};\nconst ufNorm=v=>{const s=norm(v); if(!s) return '';\n  if(UF_CODE[s]) return s;\n  if(UF_OF_CODE[s]) return UF_OF_CODE[s];\n  return UF_OF_NAME[s]||'';};\nconst loader=(on,t)=>{const l=$('#loader');l.classList.toggle('hidden',!on);if(t)l.textContent=t;};\nconst setError=(msg)=>{ const t=$('#ds'); if(t){t.textContent=msg;t.classList.add('err');} const c=$('#confirmStatus'); if(c){c.textContent=msg;c.classList.add('err');} };\n\n// ---------- base de municípios dominantes (CSV) ----------\n// WHICH municipalities belong to a sector is a business fact, not something to infer from CB volume:\n// it comes from a maintained CSV (one row per setor x município) linked through the `dominantesCsvUrl`\n// param. Anything the closing sector has CBs in but that the base does NOT assign to it is spillover:\n// not realocated, not drawn on the map, and its CBs follow their leader. Loaded once per URL and\n// cached for the whole session; a failure is thrown, never swallowed — a silent fallback here would\n// quietly change every number on the screen.\nconst DOM={url:null,promise:null,bySetor:null,ufBySetorMuni:null,rows:0,setores:0,hasUf:false,ufCol:null,badUf:0,clashes:0,headers:null,error:null};\nfunction parseCsv(text){\n  const out=[]; let row=[],cur='',q=false;\n  const push=()=>{ row.push(cur); cur=''; };\n  const endRow=()=>{ push(); if(row.length>1||row[0]!=='') out.push(row); row=[]; };\n  for(let i=0;i<text.length;i++){ const ch=text[i];\n    if(q){ if(ch==='\"'){ if(text[i+1]==='\"'){ cur+='\"'; i++; } else q=false; } else cur+=ch; }\n    else if(ch==='\"') q=true;\n    else if(ch===',') push();\n    else if(ch==='\\n') endRow();\n    else if(ch!=='\\r') cur+=ch;\n  }\n  if(cur!==''||row.length) endRow();\n  return out;\n}\n// `dominantesCsvUrl` is declared as a FileComponentUrlReference, so the instance points at the Drive\n// FILE, not at a URL literal — the Drive is policy-gated behind the app's auth strategy and a baked\n// string would be both stale and unauthorised. What the resolver hands back varies by where it is\n// resolved (URL string / file record / bare reference), so accept every shape instead of silently\n// reading undefined and falling through to the fallback.\n// The Drive is gated by the app's AuthenticationStrategy, so this read has to travel as the LOGGED-IN\n// USER — an anonymous CDN GET is exactly what the policy is there to refuse. `<system>.data2.media` is\n// only a cache in front of the SSP: on a cache miss it 302s to `<system>.data2apis.com`, which is where\n// the policy is actually evaluated.\n// COOKIES CANNOT CARRY THAT SESSION, which is why the previous `credentials:'include'` attempt could\n// never have worked: the app runs on <app>.<system>.data2.app and the SSP on <system>.data2apis.com —\n// cross-site — and the SSP answers `Access-Control-Allow-Origin: *` with no `Allow-Credentials`, so the\n// browser rejects a credentialed CORS read before it ever leaves the page. What the SSP actually reads\n// is `Authorization: Bearer <token>`: the runtime keeps that token in localStorage under\n// `__data2-session-<systemDomain>` (`__data2-session-data2` inside the builder preview) and replays it\n// on every dataset and rush call — same token, same header, same session, so the Drive policy sees the\n// logged-in user. Preflight passes because the SSP echoes whatever header the request asks for.\nfunction d2SessionToken(sysDomain){\n  const read=k=>{ try{ return (k&&window.localStorage.getItem(k))||''; }catch(e){ return ''; } };\n  return read(sysDomain?('__data2-session-'+sysDomain):'')||read('__data2-session-data2')||'';\n}\nfunction domCsvSystemDomain(url){\n  const m=/^https?:\\/\\/([^.\\/]+)\\.data2\\.(?:media|app)\\//i.exec(url)||/^https?:\\/\\/([^.\\/]+)\\.data2apis\\.com\\//i.exec(url);\n  return m?m[1]:'';\n}\nfunction domCsvCandidates(url){\n  const out=[];\n  const isMedia=/^https?:\\/\\/[^.\\/]+\\.data2\\.media\\//i.test(url);\n  const api=isMedia?url.replace(/^(https?:\\/\\/[^.\\/]+)\\.data2\\.media\\//i,'$1.data2apis.com/'):null;\n  const tok=d2SessionToken(domCsvSystemDomain(url));\n  const auth=tok?{authorization:'Bearer '+tok}:null;\n  // Authenticated origin read first — the only candidate a GATED Drive can actually answer.\n  if(api&&auth) out.push({url:api,headers:auth,label:'api+sessão'});\n  if(!api&&auth) out.push({url:url,headers:auth,label:'origem+sessão'});\n  // Anonymous last: only ever succeeds on an UNGATED Drive — or on a stale CDN cache hit, which is NOT\n  // proof the file is public (the origin keeps answering 401 once the edge entry expires).\n  if(api) out.push({url:api,headers:null,label:'api anônimo'});\n  out.push({url:url,headers:null,label:'origem anônima'});\n  return out;\n}\nfunction domCsvUrl(){\n  const pick=v=>{\n    if(!v) return '';\n    if(typeof v==='string') return v;\n    const q=v.params||{};\n    const ref=q.reference||v.reference;\n    return q.fileUrl||q.url||v.fileUrl||v.url||(ref?DOM_MEDIA_BASE+ref:'');\n  };\n  return String(pick(d2.param('dominantesCsvUrl'))||DOM_CSV_FALLBACK||'').trim();\n}\nasync function ensureDominantes(){\n  const url=domCsvUrl();\n  if(!url) throw new Error('base de municípios dominantes não configurada — ligue o arquivo CSV no parâmetro dominantesCsvUrl da instância do componente');\n  if(DOM.url===url && DOM.bySetor) return DOM.bySetor;\n  if(DOM.url===url && DOM.promise) return DOM.promise;\n  DOM.url=url; DOM.error=null;\n  DOM.promise=(async()=>{\n    // Self-diagnosing on purpose: every candidate reports its own outcome and the message names the\n    // session it was carrying. \"Unauthorized\" alone cannot distinguish \"not logged into THIS strategy\"\n    // from \"cookie not sent cross-site\" from \"param never bound, so it tried the fallback URL\" — and\n    // guessing between those from the outside costs a round trip each time.\n    let r=null; const tried=[];\n    for(const c of domCsvCandidates(url)){\n      let res=null;\n      try{ res=await fetch(c.url,{cache:'no-store',credentials:'omit',headers:c.headers||undefined}); }\n      catch(e){ tried.push(c.label+' → rede/CORS'); continue; }\n      if(res.ok){ r=res; break; }\n      tried.push(c.label+' → '+res.status);\n    }\n    if(!r){\n      let sess='sessão desconhecida';\n      try{\n        const a=d2.auth(AUTH_REF);\n        sess=(a&&a.isAuthed)?('logado como '+((a.user&&(a.user.email||a.user.nome))||'?')):('NÃO logado na estratégia '+AUTH_REF);\n      }catch(e){ sess='estratégia '+AUTH_REF+' não resolvida'; }\n      const tk=d2SessionToken(domCsvSystemDomain(url));\n      throw new Error('base de municípios dominantes: não foi possível ler o arquivo — '+sess+' · token de sessão '+(tk?'presente':'AUSENTE no localStorage')+'. Tentativas: '+tried.join(' · '));\n    }\n    const table=parseCsv(await r.text());\n    if(table.length<2) throw new Error('base de municípios dominantes vazia');\n    const head=table[0].map(h=>norm(h));\n    const iS=head.indexOf('CD SETOR'), iM=head.indexOf('MUNICIPIO');\n    if(iS<0||iM<0) throw new Error('base de municípios dominantes sem as colunas CD_SETOR / MUNICIPIO');\n    // CD_GV is the gerência de vendas the setor answers to, and it is the authority for the hard rule\n    // that a closing sector only ever hands territory to sectors of its OWN gerência. Its absence is\n    // fatal rather than a warning: with no GV there is no way to PROVE two sectors share one, and\n    // falling through unchecked is exactly the leak this column exists to close.\n    const iG=['CD GV','CDGV','GV','CD GERENCIA','CD GERENCIA VENDAS','CD GERENCIA DE VENDAS','GERENCIA DE VENDAS','GERENCIA'].map(h=>head.indexOf(h)).find(i=>i>=0);\n    if(iG==null) throw new Error('base de municípios dominantes sem a coluna CD_GV — a regra de gerência de vendas não pode ser aplicada. Colunas lidas: '+head.slice(0,40).join(', '));\n    // MERCADO fica ACIMA de GV na hierarquia (mercado > GV > setor) — fechamento de Mercado e a regra\n    // \"GV só fecha pra GV do mesmo mercado\" dependem dela do mesmo jeito que a regra de GV depende\n    // de CD_GV, então a ausência é fatal pelo mesmo motivo.\n    const iK=['MERCADO','MERCADO REGIONAL','MKT','MARKET'].map(h=>head.indexOf(h)).find(i=>i>=0);\n    if(iK==null) throw new Error('base de municípios dominantes sem a coluna MERCADO — fechamento de GV/Mercado precisa dela. Colunas lidas: '+head.slice(0,40).join(', '));\n    // Nomes de exibição — opcionais: a hierarquia funciona só com os códigos, mas o código sozinho\n    // não diz nada pro operador escolhendo o que fechar.\n    const iDS=['DC SETOR','NOME SETOR','DESCRICAO SETOR','NM SETOR'].map(h=>head.indexOf(h)).find(i=>i>=0);\n    const iDG=['DC GV','NOME GV','DESCRICAO GV','NM GV','GV NOME'].map(h=>head.indexOf(h)).find(i=>i>=0);\n    // The UF column is what the whole keying now rests on — SQL no longer carries DS_ESTADO — so its\n    // absence is a first-class finding, not a footnote. The header actually matched is reported on the\n    // base pill, and when nothing matches the pill lists every column read, because guessing a header\n    // name from the outside costs a round trip each time.\n    const iU=['UF','SIGLA UF','SG UF','CD UF','ESTADO','DS ESTADO','SIGLA','ESTADO SIGLA','UF MUNICIPIO'].map(h=>head.indexOf(h)).find(i=>i>=0);\n    const by={},ufBy={},gvBy={},mkBySetor={},setorLabel={},gvLabel={}; let n=0,bad=0; const clash={},gvClash={},mkClash={};\n    for(let i=1;i<table.length;i++){\n      const line=table[i]; if(!line) continue;\n      const s=String(line[iS]==null?'':line[iS]).trim(), m=norm(line[iM]);\n      if(!s||!m) continue;\n      // One setor spans many rows (one per município) and every one of them repeats its CD_GV. Two\n      // DIFFERENT values for the same setor means the base itself disagrees about which gerência owns\n      // it — counted and reported, never keyed to whichever row happened to be read last.\n      const gvv=String(line[iG]==null?'':line[iG]).trim();\n      if(gvv){ if(gvBy[s]!==undefined && gvBy[s]!==gvv) gvClash[s]=true; else gvBy[s]=gvv; }\n      const mkv=String(line[iK]==null?'':line[iK]).trim();\n      if(mkv){ if(mkBySetor[s]!==undefined && mkBySetor[s]!==mkv) mkClash[s]=true; else mkBySetor[s]=mkv; }\n      if(iDS!=null){ const lbl=String(line[iDS]==null?'':line[iDS]).trim(); if(lbl && !setorLabel[s]) setorLabel[s]=lbl; }\n      if(iDG!=null && gvv){ const lbl=String(line[iDG]==null?'':line[iDG]).trim(); if(lbl && !gvLabel[gvv]) gvLabel[gvv]=lbl; }\n      const raw=(iU==null)?'':line[iU];\n      const u=(iU==null)?'':ufNorm(raw);\n      if(iU!=null && String(raw==null?'':raw).trim() && !u) bad++;\n      // The same name twice in ONE setor under two UFs is the single case the reverted SQL cannot\n      // survive: mSQL groups by DS_MUNICIPIO alone, so both municipalities arrive summed into one row\n      // and no lookup can split them again. Counted and reported — never quietly keyed to whichever\n      // UF happened to be read last.\n      const kk=s+'|'+m;\n      // An UNRESOLVED uf must never outrank a resolved one. Reading a blank/bogus UF row first wrote ''\n      // here, and the next row carrying the real sigla was then rejected as a clash — so the key stayed\n      // falsy for good, ufFor() fell through, and the município degraded to a bare NAME key that matches\n      // no shape and no dominance entry. With DISTRITO/ZONA in the base a município spans several rows,\n      // so which row lands first is pure luck. A clash is only two RESOLVED siglas that disagree.\n      if(!u){ if(ufBy[kk]===undefined) ufBy[kk]=''; }\n      else if(!ufBy[kk]) ufBy[kk]=u;\n      else if(ufBy[kk]!==u) clash[kk]=true;\n      (by[s]=by[s]||new Set()).add(u?m+'/'+u:m); n++;\n    }\n    if(!n) throw new Error('base de municípios dominantes sem linhas válidas');\n    DOM.bySetor=by; DOM.ufBySetorMuni=ufBy; DOM.rows=n; DOM.setores=Object.keys(by).length;\n    DOM.gvBySetor=gvBy; DOM.gvClashes=Object.keys(gvClash).length; DOM.gvCol=String(table[0][iG]||'').trim();\n    DOM.gvSetores=Object.keys(gvBy).length;\n    DOM.hasUf=(iU!=null); DOM.ufCol=(iU==null?null:String(table[0][iU]||'').trim());\n    DOM.badUf=bad; DOM.clashes=Object.keys(clash).length; DOM.headers=head.slice(0,40); DOM.error=null;\n    // ---- hierarquia: setor ⊂ GV ⊂ mercado, tudo derivado do MESMO csv que a regra de setor já\n    // confia — fechamento de GV/Mercado lê a mesma fonte, nunca uma segunda base paralela.\n    DOM.mercadoBySetor=mkBySetor; DOM.mercadoClashes=Object.keys(mkClash).length; DOM.mercadoCol=String(table[0][iK]||'').trim();\n    DOM.setorLabel=setorLabel; DOM.gvLabel=gvLabel;\n    const sectorsByGv={},sectorsByMercado={},gvsByMercado={},mercadoByGv={},gvMercClash={};\n    Object.keys(by).forEach(s=>{\n      const gv=gvBy[s], mk=mkBySetor[s];\n      if(gv) (sectorsByGv[gv]=sectorsByGv[gv]||new Set()).add(s);\n      if(mk) (sectorsByMercado[mk]=sectorsByMercado[mk]||new Set()).add(s);\n      if(gv&&mk){ if(mercadoByGv[gv]!==undefined && mercadoByGv[gv]!==mk) gvMercClash[gv]=true; else mercadoByGv[gv]=mk; }\n    });\n    Object.entries(mercadoByGv).forEach(([gv,mk])=>(gvsByMercado[mk]=gvsByMercado[mk]||new Set()).add(gv));\n    DOM.sectorsByGv=sectorsByGv; DOM.sectorsByMercado=sectorsByMercado; DOM.gvsByMercado=gvsByMercado;\n    DOM.mercadoByGv=mercadoByGv; DOM.gvMercadoClashes=Object.keys(gvMercClash).length;\n    return by;\n  })();\n  DOM.promise.catch(e=>{ DOM.promise=null; DOM.bySetor=null; DOM.error=e.message; renderAll(); });\n  return DOM.promise;\n}\n\nlet SESS={ snapshotRaw:null, snapshotSyncedAt:null, snapLiteral:null, eloMaxCycle:null, timeline:[], selected:0,\n           sessionId:null, sessionLabel:null, sessionsList:[], sectorsList:[], sectorBaseCache:{}, stage:'loading', dirtyFrom:null,\n           snapBusy:false, settings:{...DEFAULT_SETTINGS} };\n\nasync function q(sql){\n  let dbx,res;\n  try{\n    res=await d2.rush('AwW_11Nkg-dKksP7ic8V8').invoke({sql});\n  }catch(e){\n    throw new Error('Databricks indisponível (rush AwW_11Nkg-dKksP7ic8V8): '+e.message);\n  }\n  // The listener answers 200 with {sql} and NO `result` when its upstream probe times out: the\n  // handler builds `result: $result.data`, so an empty upstream simply drops the key rather than\n  // failing. Reading straight through to res.data.result.data reported \"Cannot read properties of\n  // undefined (reading 'data')\" — which reads like a bug in THIS component and sent a debugging\n  // session after the wrong thing. Name the layer that actually failed instead.\n  const payload=res&&res.data;\n  if(!payload) throw new Error('rush AwW_11Nkg-dKksP7ic8V8 não devolveu corpo — listener fora do ar?');\n  if(!payload.result) throw new Error('a sonda Databricks não respondeu: o listener AwW_11Nkg-dKksP7ic8V8 devolveu 200 sem `result`, o que normalmente é timeout do upstream (natura-x-app). O SQL não chegou a rodar.');\n  dbx=payload.result.data;\n  if(!dbx) throw new Error('sonda Databricks respondeu sem dados (result.data vazio).');\n  if(dbx.state && dbx.state!=='SUCCEEDED') throw new Error('Databricks '+dbx.state+': '+(dbx.error?.message||JSON.stringify(dbx.error)||'erro desconhecido'));\n  return dbx;\n}\nfunction rows(resp){const c=(resp.columns||[]).map(x=>x.name);\n  return (resp.rows||[]).map(a=>Object.fromEntries(c.map((k,i)=>[k,a[i]])));}\n// Stamps the UF onto every feature at load: the fetch is per-UF, so this is the ONLY point where a\n// shape's state is known for certain. Downstream the features are flattened into one array and the\n// origin would be unrecoverable. Persisted with the feature in saved sessions.\nasync function geoUF(uf){const code=UF_CODE[uf]||uf;const r=await fetch('https://raw.githubusercontent.com/tbrugz/geodata-br/master/geojson/geojs-'+code+'-mun.json');if(!r.ok)throw new Error('geo '+uf);\n  const g=await r.json(); const U=String(uf).toUpperCase();\n  (g.features||[]).forEach(f=>{ f.__uf=U; });\n  return g;}\n\nfunction buildAdj(features){\n  const pts=f=>{const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates],s=new Set();\n    ps.forEach(poly=>poly.forEach(ring=>ring.forEach(p=>s.add(Math.round(p[0]*1000)/1000+','+Math.round(p[1]*1000)/1000))));return s;};\n  const feat={},idx={};\n  features.forEach(f=>{const nm=mkey(f.properties.name||f.properties.NOME||f.properties.nome,f.__uf);feat[nm]={f,pts:pts(f)};});\n  for(const nm in feat) feat[nm].pts.forEach(p=>(idx[p]=idx[p]||[]).push(nm));\n  const nbrs=nm=>{const c={};feat[nm].pts.forEach(p=>idx[p].forEach(o=>{if(o!==nm)c[o]=(c[o]||0)+1;}));\n    return Object.entries(c).filter(([,n])=>n>=2).map(([o,n])=>({o,w:n}));};\n  return {feat,nbrs};\n}\nfunction centroidLL(f){let x=0,y=0,n=0;const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];\n  ps.forEach(poly=>poly[0].forEach(p=>{x+=p[0];y+=p[1];n++;}));return[x/n,y/n];}\n\n// ---------- snapshot pinning ----------\nasync function resolveSnapshotPin(){\n  const [rawR,liveCountR,eloR]=await Promise.all([\n    q(`SELECT MAX(DT_HISTORICO) snap FROM ${T} WHERE CD_PAIS=1`).then(rows),\n    q(`SELECT COUNT(*) n FROM ${T} WHERE CD_PAIS=1 AND DT_HISTORICO=(SELECT MAX(DT_HISTORICO) FROM ${T} WHERE CD_PAIS=1)`).then(rows),\n    q(`SELECT MAX(operational_cycle) mx FROM ${ELO} WHERE country_code=1`).then(rows).catch(()=>[]),\n  ]);\n  const raw=rawR[0]&&rawR[0].snap;\n  const liveCount=+((liveCountR[0]||{}).n||0);\n  const eloMax=+((eloR[0]||{}).mx||0);\n  const LIVE_SUBQ=`(SELECT MAX(DT_HISTORICO) FROM ${T} WHERE CD_PAIS=1)`;\n  const dbTs=(raw||'').replace('T',' ').replace(/Z$/,'');\n  const candidates=[`TIMESTAMP'${dbTs}'`,`'${dbTs}'`,`DATE'${dbTs}'`];\n  const tests=await Promise.all(candidates.map(c=>\n    q(`SELECT COUNT(*) n FROM ${T} WHERE CD_PAIS=1 AND DT_HISTORICO=${c}`).then(rows).then(r=>+((r[0]||{}).n||0)).catch(()=>-1)\n  ));\n  let chosen=LIVE_SUBQ;\n  for(let i=0;i<candidates.length;i++){ if(liveCount>0 && tests[i]===liveCount){ chosen=candidates[i]; break; } }\n  return {snapshotRaw:raw, snapLiteral:chosen, eloMaxCycle:eloMax, syncedAt:new Date().toISOString()};\n}\n// DISPLAY CONTRACT: the UI never prints the snapshot's own DT_HISTORICO (snapshotRaw). What the user\n// sees is `snapshotSyncedAt` — the date AND hour at which THIS instance last pulled/pinned the\n// snapshot it is querying. snapshotRaw is still resolved, still drives every SQL literal, and is\n// still persisted by saveSession/doShare; it is only kept off the screen.\nfunction fmtSyncedAt(iso){\n  if(!iso) return '—';\n  const d=new Date(iso);\n  if(isNaN(d.getTime())) return String(iso);\n  return d.toLocaleString('pt-BR',{day:'2-digit',month:'2-digit',year:'numeric',hour:'2-digit',minute:'2-digit'});\n}\nasync function ensurePinned(){\n  if(SESS.snapLiteral) return;\n  const p=await resolveSnapshotPin();\n  SESS.snapshotRaw=p.snapshotRaw; SESS.snapLiteral=p.snapLiteral; SESS.eloMaxCycle=p.eloMaxCycle;\n  SESS.snapshotSyncedAt=p.syncedAt;\n}\n\n// ---------- world-state fold ----------\nfunction accMetrics(base,add){\n  const out=base?{...base}:blankM();\n  Object.keys(blankM()).forEach(k=>{ out[k]=(out[k]||0)+((add&&add[k])||0); });\n  return out;\n}\nfunction foldWorldState(timeline,uptoIdx){\n  const closedSectors=new Set(),muniOverride={},muniGeo={},muniRow={},muniLevel={},sectorInflow={},sectorInflowLevel={},sectorOrphanRows={};\n  // GV/mercado: setores e GVs não se dissolvem quando o dono deles fecha — eles só passam a\n  // responder a um destino novo. Por isso o rastro do cascade mora numa camada PRÓPRIA\n  // (secOverride/gvOverride), separada da camada de município do fechamento de setor — a\n  // hierarquia trava a sessão num nível só, então nunca as duas camadas têm conteúdo ao mesmo tempo.\n  const closedGvs=new Set(),secOverride={},gvInflow={};\n  const closedMercados=new Set(),gvOverride={},mercadoInflow={};\n  for(let k=0;k<uptoIdx;k++){\n    const mv=timeline[k]; if(!mv||!mv.sector||!mv.munis) continue;\n    const level=mv.level||'setor';\n    if(level==='gv'){\n      closedGvs.add(String(mv.sector));\n      Object.keys(mv.munis).forEach(u=>{\n        if(u==='__OUTROS__') return;\n        const dest=mv.assign[u]; if(!dest) return;\n        secOverride[u]=String(dest);\n        gvInflow[dest]=accMetrics(gvInflow[dest],mv.munis[u]);\n      });\n      continue;\n    }\n    if(level==='mercado'){\n      closedMercados.add(String(mv.sector));\n      Object.keys(mv.munis).forEach(u=>{\n        if(u==='__OUTROS__') return;\n        const dest=mv.assign[u]; if(!dest) return;\n        gvOverride[u]=String(dest);\n        mercadoInflow[dest]=accMetrics(mercadoInflow[dest],mv.munis[u]);\n      });\n      continue;\n    }\n    closedSectors.add(String(mv.sector));\n    Object.keys(mv.munis).forEach(m=>{\n      if(m==='__OUTROS__') return;\n      const dest=mv.assign[m]; if(!dest) return;\n      muniOverride[m]=String(dest);\n      if(mv.geoFeat&&mv.geoFeat[m]) muniGeo[m]=mv.geoFeat[m];\n      const rws=(mv.matrix||[]).filter(r=>mkey(r.municipio,r.uf)===m);\n      muniRow[m]=(muniRow[m]||[]).concat(rws);\n      if(mv.levelByMuni&&mv.levelByMuni[m]) muniLevel[m]={...(muniLevel[m]||{}),...mv.levelByMuni[m]};\n      sectorInflow[dest]=accMetrics(sectorInflow[dest],mv.munis[m]);\n      const lv=(mv.levelByMuni&&mv.levelByMuni[m])||{};\n      sectorInflowLevel[dest]=sectorInflowLevel[dest]||{};\n      Object.entries(lv).forEach(([nv,c])=>{ sectorInflowLevel[dest][nv]=(sectorInflowLevel[dest][nv]||0)+c; });\n    });\n    // Orphan CBs follow their leader's home sector, so later etapas must inherit them the same way\n    // the allocated municipalities are inherited — otherwise a stage's span would not match the\n    // base carried into the next one.\n    if(mv.orphanMetricsByGroup && Object.keys(mv.orphanMetricsByGroup).length){\n      const d=computeDerived(mv);\n      d.leaders.forEach(L=>{\n        if(!L.home) return;\n        const om=mv.orphanMetricsByGroup[L.grupo];\n        if(om) sectorInflow[L.home]=accMetrics(sectorInflow[L.home],om);\n        // sectorInflow only reaches a sector while it is a DESTINATION (it lands in baseMetrics).\n        // Keep the rows as well, so the sector still carries these CBs on the day it is the one\n        // being closed — that read goes through mv.matrix, which baseMetrics never touches.\n        const orws=mv.orphanRowsByGroup&&mv.orphanRowsByGroup[L.grupo];\n        if(orws&&orws.length) sectorOrphanRows[L.home]=(sectorOrphanRows[L.home]||[]).concat(orws);\n        const ol=mv.orphanLevelByGroup&&mv.orphanLevelByGroup[L.grupo];\n        if(ol){ sectorInflowLevel[L.home]=sectorInflowLevel[L.home]||{};\n          Object.entries(ol).forEach(([nv,c])=>{ sectorInflowLevel[L.home][nv]=(sectorInflowLevel[L.home][nv]||0)+c; }); }\n      });\n    }\n  }\n  return {closedSectors,muniOverride,muniGeo,muniRow,muniLevel,sectorInflow,sectorInflowLevel,sectorOrphanRows,\n          closedGvs,secOverride,gvInflow,closedMercados,gvOverride,mercadoInflow};\n}\n\n// ---------- per-movement compute ----------\nfunction aggregateMovement(mv){\n  const level=mv.level||'setor';\n  const munis={},leaders={};\n  const exSet=new Set((mv.excludedMunis||[]).map(x=>x.muni));\n  const acc=(o,r)=>{o.cbs+=+r.cbs;o.receita+=+r.receita||0;o.rec_nat+=+r.rec_nat||0;o.rec_avon+=+r.rec_avon||0;o.pontos+=+r.pontos||0;o.pedidos+=+r.pedidos||0;o.ativas+=+r.ativas||0;};\n  // Orphans = CBs in municipalities outside the sector's dominance base. They are NOT allocated\n  // geographically; they follow their own leader's home sector. Kept per leader group so every\n  // consumer (span, cascade, impact report) can route them the same way. Só existe no nível setor —\n  // GV/mercado não têm spillover (todo setor pertence a exatamente uma GV/mercado na base).\n  mv.orphanByGroup={}; mv.orphanMetricsByGroup={}; mv.orphanRowsByGroup={};\n  // unidade que este nível redistribui: a própria município (setor fecha), o setor da linha (GV\n  // fecha), a GV do setor da linha (mercado fecha).\n  const unitOf=r=>level==='setor'?null:(level==='gv'?String(r.setor):(DOM.gvBySetor[String(r.setor)]||''));\n  mv.matrix.forEach(r=>{\n    const m=mkey(r.municipio,r.uf);\n    r._out=!mv.geoFeat[m];   // assign, never just set: absorbed rows are reused across etapas\n    const mm=level==='setor'?(r._out?'__OUTROS__':m):(unitOf(r)||'__OUTROS__');\n    munis[mm]=munis[mm]||{...blankM(),name:mm}; acc(munis[mm],r);\n    const g=String(r.grupo); leaders[g]=leaders[g]||{grupo:g,lider:r.lider,total:0,byMuni:{}};\n    leaders[g].total+=+r.cbs; leaders[g].byMuni[mm]=(leaders[g].byMuni[mm]||0)+ +r.cbs;\n    if(level==='setor' && r._out && exSet.has(m)){\n      mv.orphanByGroup[g]=(mv.orphanByGroup[g]||0)+ +r.cbs;\n      // The ROW too, not just the totals: when the leader's home sector is itself closed in a later\n      // etapa, that etapa rebuilds its matrix from SQL + absorbed municípios, and these CBs are in\n      // neither (their município never moved). Without the row they silently vanish from the sector\n      // they were just credited to — see sectorOrphanRows in foldWorldState.\n      (mv.orphanRowsByGroup[g]=mv.orphanRowsByGroup[g]||[]).push(r);\n      mv.orphanMetricsByGroup[g]=accMetrics(mv.orphanMetricsByGroup[g],\n        {cbs:+r.cbs,receita:+r.receita||0,rec_nat:+r.rec_nat||0,rec_avon:+r.rec_avon||0,pontos:+r.pontos||0,pedidos:+r.pedidos||0,ativas:+r.ativas||0});\n    }\n  });\n  // Level counts only exist per municipality, never per leader, so an excluded municipality's level\n  // mix is credited to the group holding most of its CBs (sub-threshold by definition, so usually one).\n  mv.orphanLevelByGroup={};\n  (mv.excludedMunis||[]).forEach(({muni})=>{\n    const lv=(mv.levelByMuni&&mv.levelByMuni[muni])||{}; if(!Object.keys(lv).length) return;\n    let bg=null,bc=-1;\n    mv.matrix.forEach(r=>{ if(mkey(r.municipio,r.uf)!==muni) return; const cc=+r.cbs; if(cc>bc){bc=cc;bg=String(r.grupo);} });\n    if(!bg) return;\n    mv.orphanLevelByGroup[bg]=mv.orphanLevelByGroup[bg]||{};\n    Object.entries(lv).forEach(([nv,cc])=>{ mv.orphanLevelByGroup[bg][nv]=(mv.orphanLevelByGroup[bg][nv]||0)+cc; });\n  });\n  mv.munis=munis; mv.leaders=Object.values(leaders).sort((a,b)=>b.total-a.total);\n}\nfunction autoAssignFor(mv){\n  const a={};\n  Object.keys(mv.munis).forEach(m=>{ if(m==='__OUTROS__')return;\n    const v=mv.allowed[m]||{}; const votes=Object.keys(v);\n    if(votes.length){ let best=votes[0],bw=-1; for(const s of votes) if(v[s]>bw){bw=v[s];best=s;} a[m]=best; }\n    else if(mv.dest.length){ const c=mv.muniCentroid[m]; let best=mv.dest[0],bd=Infinity;\n      for(const s of mv.dest){ const sc=mv.secCentroid[s]; if(!sc||!c)continue; const d=(c[0]-sc[0])**2+(c[1]-sc[1])**2; if(d<bd){bd=d;best=s;} }\n      a[m]=best; }\n  });\n  return a;\n}\nfunction deslocFor(mv,assign){\n  let d=0;\n  mv.leaders.forEach(L=>{const byS={};let tot=0;\n    for(const [m,c] of Object.entries(L.byMuni)){if(m==='__OUTROS__')continue;const s=assign[m];if(s){byS[s]=(byS[s]||0)+c;tot+=c;}}\n    const home=mv.dest.reduce((a,s)=>(byS[s]||0)>(byS[a]||0)?s:a,mv.dest[0]);\n    d+=tot-(byS[home]||0);});\n  return d;\n}\nfunction spanMapFor(mv,a){const inc={};mv.dest.forEach(s=>inc[s]=0);\n  Object.entries(mv.munis).forEach(([m,o])=>{if(m==='__OUTROS__')return;const s=a[m];if(s&&inc[s]!=null)inc[s]+=o.cbs;});\n  // Orphan CBs follow their leader's home sector, and that home depends on THIS candidate\n  // assignment — so they have to be counted here, or the optimizer would score and constrain a\n  // span that differs from the one the UI shows. Skipped entirely when there are no orphans.\n  if(mv.orphanByGroup&&Object.keys(mv.orphanByGroup).length){\n    mv.leaders.forEach(L=>{\n      const orphan=mv.orphanByGroup[L.grupo]||0; if(!orphan) return;\n      const byS={}; let tot=0;\n      for(const [m,c] of Object.entries(L.byMuni)){ if(m==='__OUTROS__') continue; const s=a[m]; if(s&&inc[s]!=null){ byS[s]=(byS[s]||0)+c; tot+=c; } }\n      if(!tot) return;   // no home to follow -> stranded, counted nowhere\n      const home=mv.dest.reduce((x,s)=>(byS[s]||0)>(byS[x]||0)?s:x,mv.dest[0]);\n      if(inc[home]!=null) inc[home]+=orphan;\n    });\n  }\n  const sp={};mv.dest.forEach(s=>sp[s]=(+(mv.baseMetrics[s]?.cbs||0))+inc[s]);return sp;}\nfunction maxSpanOfFor(mv,a){return Math.max(...Object.values(spanMapFor(mv,a)),0);}\nfunction spanLimits(mv){\n  // Span alvo/máximo/mínimo é uma regra de fechamento de SETOR (tamanho ideal de território) —\n  // GV/mercado não têm essa noção e ignoram qualquer valor configurado nas opções da sessão.\n  if(mv && (mv.level||'setor')!=='setor') return {target:null,max:null,min:null};\n  const st={...DEFAULT_SETTINGS,...(SESS.settings||{})};\n  return {target:numOrNull(st.targetSpan),max:numOrNull(st.maxSpan),min:numOrNull(st.minSpan)};}\nfunction spanLimitsOn(lim){return !!(lim.target||lim.max||lim.min);}\nfunction spanViolationsOf(sp,lim){const over=[],under=[];\n  Object.entries(sp).forEach(([s,v])=>{ if(lim.max&&v>lim.max)over.push(s); if(lim.min&&v<lim.min)under.push(s); });\n  return {over,under};}\nfunction spanViolationsFor(mv,a){return spanViolationsOf(spanMapFor(mv,a),spanLimits(mv));}\n// With a target span the objective becomes RMS distance from the ideal size (punishes too big AND\n// too small). With no target we keep the legacy objective: shave the biggest sector.\nfunction spanCostFor(mv,a){const lim=spanLimits(mv),vals=Object.values(spanMapFor(mv,a));\n  if(!vals.length) return 0;\n  if(lim.target) return Math.sqrt(vals.reduce((s,v)=>s+(v-lim.target)**2,0)/vals.length);\n  return Math.max(...vals);}\n// ---------- ÓTIMO: objetivo multi-critério ----------\n// Three normalised objectives, each 0..1, so the weights below are directly comparable. The old\n// score added a span cost measured in CBs to a desloc measured in CBs, so on a large sector the\n// balance term was numerically ~100x the desloc term and silently decided everything on its own.\n//   balance — RMS spread of the resulting spans (against the target span when one is set,\n//             otherwise against their own mean), over that reference. 0 = every destination\n//             sector ends up the same size.\n//   dist    — how far each município travels, CB-weighted: half from the share of its outer\n//             border that faces the sector it was given to, half from centroid distance. 0 =\n//             every município went to a sector it physically touches. Adjacency used to be a\n//             pure yes/no constraint (contiguity); this is what makes it a preference too.\n//   orphan  — stranded orphan CBs (leader left without a home sector, so they land nowhere at\n//             all) plus CBs split away from their leader's home, over the CBs at stake.\n//             Stranded ones count OPT_STRAND_K times: a stranded CB leaves the model entirely,\n//             a deslocated one merely changes hands.\nconst OPT_W={balance:1, dist:0.85, orphan:1};\nconst OPT_STRAND_K=3;\nconst OPT_SIMS=24;             // simultaneous simulations per run, scaled down on big stages\nconst OPT_PASSES=14;           // local-search sweeps inside one simulation\nconst OPT_EVAL_BUDGET=120000;  // total candidate evaluations across the whole portfolio\nconst OPT_EXHAUSTIVE_MAX=60000;\nfunction optDistPrep(mv){\n  let mx=0;\n  Object.keys(mv.munis).forEach(m=>{ if(m==='__OUTROS__') return; const c=mv.muniCentroid[m]; if(!c) return;\n    mv.dest.forEach(s=>{ const sc=mv.secCentroid[s]; if(!sc) return;\n      const d=Math.hypot(c[0]-sc[0],c[1]-sc[1]); if(d>mx) mx=d; }); });\n  return mx||1;\n}\nfunction optDistCost(mv,m,s,dmax){\n  const v=mv.allowed[m]||{}; let tot=0; for(const k in v) tot+=v[k];\n  const share=tot?((v[s]||0)/tot):0;\n  const c=mv.muniCentroid[m], sc=mv.secCentroid[s];\n  // Missing centroid on either side is neutral (0.5), never 0 — an unmeasurable move must not\n  // score as the cheapest one on the board.\n  const geo=(c&&sc)?Math.min(1,Math.hypot(c[0]-sc[0],c[1]-sc[1])/dmax):0.5;\n  return 0.5*(1-share)+0.5*geo;\n}\nfunction optEval(mv,a,dmax){\n  const lim=spanLimits(mv);\n  const sp=spanMapFor(mv,a), vals=Object.values(sp);\n  let balance=0;\n  if(vals.length){\n    const ref=lim.target||(vals.reduce((x,y)=>x+y,0)/vals.length);\n    if(ref) balance=Math.min(1,Math.sqrt(vals.reduce((s,v)=>s+(v-ref)**2,0)/vals.length)/ref);\n  }\n  let cbs=0,dist=0;\n  for(const m in a){ const o=mv.munis[m]; if(!o) continue; const w=+o.cbs||0; cbs+=w; dist+=w*optDistCost(mv,m,a[m],dmax); }\n  dist=cbs?(dist/cbs):0;\n  let stranded=0,desloc=0,tot=0;\n  mv.leaders.forEach(L=>{\n    const byS={}; let t=0;\n    for(const [m,c] of Object.entries(L.byMuni)){ if(m==='__OUTROS__') continue; const s=a[m]; if(s){ byS[s]=(byS[s]||0)+c; t+=c; } }\n    const orphan=(mv.orphanByGroup&&mv.orphanByGroup[L.grupo])||0;\n    tot+=t+orphan;\n    if(!t){ stranded+=orphan; return; }   // no allocated CBs -> no home -> these orphans land nowhere\n    const home=mv.dest.reduce((x,s)=>(byS[s]||0)>(byS[x]||0)?s:x,mv.dest[0]);\n    desloc+=t-(byS[home]||0);\n  });\n  const orphanTerm=tot?Math.min(1,(desloc+OPT_STRAND_K*stranded)/tot):0;\n  return { cost:OPT_W.balance*balance+OPT_W.dist*dist+OPT_W.orphan*orphanTerm,\n           balance, dist, desloc, stranded, sp, viol:spanViolationsOf(sp,lim) };\n}\nfunction optScoreFor(mv,a){ return optEval(mv,a,mv.__optDmax||optDistPrep(mv)).cost; }\n// Seeded PRNG on purpose. computeMovement runs the optimizer for EVERY stage and recomputeFrom\n// re-runs every stage downstream of an edit, so a Math.random() portfolio would hand back a\n// different allocation on each pass and a saved timeline would never reproduce.\nfunction optRng(seed){ let a=seed>>>0;\n  return ()=>{ a=(a+0x6D2B79F5)>>>0; let t=Math.imul(a^(a>>>15),1|a);\n    t=(t+Math.imul(t^(t>>>7),61|t))^t; return ((t^(t>>>14))>>>0)/4294967296; }; }\nfunction optSeed(mv,ms){ let h=2166136261>>>0;\n  const s=String(mv.sector)+'|'+ms.join(',')+'|'+mv.dest.join(',');\n  for(let i=0;i<s.length;i++) h=Math.imul(h^s.charCodeAt(i),16777619);\n  return h>>>0; }\nfunction contigBadFor(mv,assign){\n  // Contiguidade geográfica só faz sentido no grão de município (setor fechando): setores e GVs\n  // não precisam formar uma mancha contínua quando GV/mercado fecha — cada setor/GV vai pro destino\n  // que faz sentido pra ele, sem exigir que o conjunto redistribuído continue \"grudado\".\n  if((mv.level||'setor')!=='setor') return [];\n  const bySec={}; for(const m in assign){(bySec[assign[m]]=bySec[assign[m]]||[]).push(m);}\n  const bad=[];\n  for(const s in bySec){const grp=bySec[s],inGrp=new Set(grp);\n    const seeds=grp.filter(m=>(mv.allowed[m]||{})[s]);\n    if(!seeds.length){bad.push(s);continue;}\n    const seen=new Set(seeds),st=[...seeds];\n    while(st.length){const m=st.pop();(mv.closeAdj[m]||[]).forEach(o=>{if(inGrp.has(o)&&!seen.has(o)){seen.add(o);st.push(o);}});}\n    if(seen.size!==grp.length)bad.push(s);}\n  return bad;\n}\nfunction greedyFor(mv,ms,opts){const lim=spanLimits(mv);const a={};\n  ms.forEach((m,i)=>{let best=opts[i][0],bd=Infinity;\n    for(const s of opts[i]){a[m]=s;\n      // over-max only grows as we keep assigning, so it is safe to penalise mid-build;\n      // under-min shrinks, so penalising it here would just chase noise.\n      const over=lim.max?spanViolationsOf(spanMapFor(mv,a),{max:lim.max,min:null}).over.length:0;\n      const d=optScoreFor(mv,a)+(contigBadFor(mv,a).length?1e9:0)+over*1e6;\n      if(d<bd){bd=d;best=s;}}\n    a[m]=best;});\n  return a;}\nfunction optimizeFor(mv){\n  const ms=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__');\n  if(!ms.length||!mv.dest.length){ mv.optBadge=mv.dest.length?'':'sem setor destino identificado'; return {}; }\n  const opts=ms.map(m=>{const al=(mv.reachable[m]&&mv.reachable[m].length)?mv.reachable[m]:mv.dest.slice();return al.length?al:mv.dest.slice();});\n  const combos=opts.reduce((a,o)=>a*o.length,1);\n  const lim=spanLimits(mv);\n  const dmax=optDistPrep(mv); mv.__optDmax=dmax;\n\n  // Feasibility ladder — same meaning as before, because renderSpanRule and the saved sessions\n  // both read mv.optTier: 0 = contíguo + max + min span, 1 = contíguo + max span, 2 = contíguo\n  // only. Every candidate any simulation produces is offered to all three tiers; we ship the\n  // strictest tier that got a solution, so an unreachable min/max relaxes loudly instead of\n  // stranding the stage with nothing.\n  const tier=[null,null,null],tSc=[Infinity,Infinity,Infinity],tEv=[null,null,null];\n  let feasible=0,evals=0;\n  const offer=(a,ev)=>{\n    if(contigBadFor(mv,a).length) return false;\n    feasible++;\n    const put=t=>{ if(ev.cost<tSc[t]){ tSc[t]=ev.cost; tier[t]={...a}; tEv[t]=ev; } };\n    put(2);\n    if(!ev.viol.over.length){ put(1); if(!ev.viol.under.length) put(0); }\n    return true;\n  };\n  const evalOf=a=>{ evals++; return optEval(mv,a,dmax); };\n\n  // Small enough to settle the question outright: enumerate every contiguous allocation and the\n  // winner is provably the best one under this objective. No search needed, so none is run.\n  const exhaustive=combos<=OPT_EXHAUSTIVE_MAX;\n  let sims=0;\n  if(exhaustive){\n    const cur={};\n    const rec=i=>{ if(i===ms.length){ offer(cur,evalOf(cur)); return; }\n      for(const s of opts[i]){ cur[ms[i]]=s; rec(i+1); } };\n    rec(0);\n  } else {\n    // Too big to enumerate, so run a portfolio of independent simulations instead. Each one is a\n    // seed assignment, then hill-climbing on single-município reassignments, then one perturbation\n    // and another climb to escape whatever local optimum it settled into. Different seeds land in\n    // different basins; the ladder above keeps the best across all of them.\n    const improve=a=>{\n      let ev=evalOf(a); offer(a,ev);\n      for(let pass=0;pass<OPT_PASSES;pass++){\n        let moved=false;\n        for(let i=0;i<ms.length;i++){\n          const m=ms[i],cur=a[m]; let best=cur,bev=ev;\n          for(const s of opts[i]){\n            if(s===cur) continue;\n            a[m]=s;\n            const e=evalOf(a);\n            // contiguity is a hard constraint, and the cheaper test runs first on purpose\n            if(e.cost<bev.cost-1e-12 && !contigBadFor(mv,a).length){ best=s; bev=e; }\n          }\n          a[m]=best;\n          if(best!==cur){ ev=bev; moved=true; offer(a,ev); }\n        }\n        if(!moved) break;\n      }\n    };\n    const rng=optRng(optSeed(mv,ms));\n    const perSim=Math.max(1,ms.length*Math.max(1,mv.dest.length)*OPT_PASSES);\n    const budget=Math.max(4,Math.min(OPT_SIMS,Math.floor(OPT_EVAL_BUDGET/perSim)||4));\n    const seeds=[];\n    if(mv.assign&&ms.every(m=>mv.assign[m])) seeds.push({...mv.assign});   // never regress on what is already on screen\n    seeds.push(autoAssignFor(mv));                                        // adjacency-first seed\n    seeds.push(greedyFor(mv,ms,opts));                                    // balance-first seed\n    while(seeds.length<budget){\n      // randomised construction biased toward nearby sectors — the bias keeps each seed sane, the\n      // randomness is what sends the runs into different basins\n      const a={};\n      ms.forEach((m,i)=>{ let bs=opts[i][0],bw=-Infinity;\n        for(const s of opts[i]){ const w=(1-optDistCost(mv,m,s,dmax))+rng()*0.9; if(w>bw){bw=w;bs=s;} }\n        a[m]=bs; });\n      seeds.push(a);\n    }\n    seeds.forEach(seed=>{\n      const a={...seed};\n      // a restored or legacy assign can still name a sector this stage no longer offers\n      ms.forEach((m,i)=>{ if(!opts[i].includes(a[m])) a[m]=opts[i][0]; });\n      improve(a);\n      const kick=Math.max(1,Math.round(ms.length*0.25));\n      for(let k=0;k<kick;k++){ const i=Math.floor(rng()*ms.length); a[ms[i]]=opts[i][Math.floor(rng()*opts[i].length)]; }\n      improve(a);\n    });\n    sims=seeds.length;\n  }\n\n  const t=tier.findIndex(x=>x);\n  if(t<0){ mv.optTier=-1; mv.optBadge='sem solução conectada — heurística'; return greedyFor(mv,ms,opts); }\n  const best=tier[t], ev=tEv[t]; mv.optTier=t;\n  const relax=[];\n  if(t>0 && lim.min) relax.push('span mínimo '+fmt(lim.min));\n  if(t>1 && lim.max) relax.push('span máximo '+fmt(lim.max));\n  mv.optStats={balance:ev.balance,dist:ev.dist,desloc:ev.desloc,stranded:ev.stranded,sims,evals,feasible,combos,exhaustive};\n  mv.optBadge=`ótimo · ${exhaustive?`espaço completo (${fmt(combos)})`:`${fmt(sims)} simulações`}`\n    +` · equilíbrio ±${Math.round(ev.balance*100)}% · adjacência ${Math.round((1-ev.dist)*100)}%`\n    +` · quebra ${fmt(ev.desloc)} CBs · ${fmt(ev.stranded)} fora do setor sem destino`\n    +` · pico ${fmt(maxSpanOfFor(mv,best))} CBs`\n    +(lim.target?` · alvo ${fmt(lim.target)}`:'')\n    +(relax.length?` · ⚠ inatingível: ${relax.join(' + ')}`:(spanLimitsOn(lim)?' · limites ok':''));\n  return best;\n}\nfunction computeDerived(mv){\n  const inc={},gained={},orph={};mv.dest.forEach(s=>{inc[s]=0;gained[s]=0;orph[s]=0;});\n  Object.entries(mv.munis).forEach(([m,o])=>{if(m==='__OUTROS__')return;const s=mv.assign[m];if(s&&inc[s]!=null)inc[s]+=o.cbs;});\n  let desloc=0,orphanTotal=0,orphanStranded=0;\n  const L2=mv.leaders.map(L=>{const byS={};mv.dest.forEach(s=>byS[s]=0);let tot=0;\n    for(const [m,c] of Object.entries(L.byMuni)){if(m==='__OUTROS__')continue;const s=mv.assign[m];if(s&&byS[s]!=null){byS[s]+=c;tot+=c;}}\n    // no allocated CBs => no home. Picking dest[0] by default would silently dump this leader's\n    // orphan CBs into an arbitrary sector, so we leave it null and report them as stranded.\n    const home=(tot>0&&mv.dest.length)?mv.dest.reduce((a,s)=>byS[s]>byS[a]?s:a,mv.dest[0]):null;\n    const dl=tot-(home?byS[home]:0);desloc+=dl;if(home)gained[home]++;\n    const orphan=(mv.orphanByGroup&&mv.orphanByGroup[L.grupo])||0;\n    orphanTotal+=orphan;\n    if(orphan){ if(home&&orph[home]!=null) orph[home]+=orphan; else orphanStranded+=orphan; }\n    return {...L,byS,home,desloc:dl,assignedTotal:tot,orphan,orphanHome:(orphan&&home)?home:null};});\n  const span={};mv.dest.forEach(s=>span[s]=(+(mv.baseMetrics[s]?.cbs||0))+inc[s]+orph[s]);\n  return {inc,gained,desloc,leaders:L2,span,orph,orphanTotal,orphanStranded};\n}\n\nasync function computeMovement(code,level,world){\n  level=level||'setor';\n  code=String(code);\n  const mv={sector:code,level,policy:'fora',view:'tobe',selMuni:null,optBadge:''};\n  const SNAP=SESS.snapLiteral;\n  // GV/mercado precisam da base ANTES de montar a query (pra saber quais CD_SETOR entram no IN);\n  // setor não precisa — mantém o timing original (a query dispara sem esperar o CSV).\n  let domBase=level==='setor'?null:await ensureDominantes();\n  const memberSectors=level==='setor'?[code]:memberSectorsOf(level,code,world);\n  if(!memberSectors.length) throw new Error(`${LEVELS[level].label} ${code} não existe na base de municípios dominantes (CSV) — atualize a base antes de fechar`);\n  const secList=memberSectors.join(',');\n\n  const mSQL=`SELECT DS_MUNICIPIO municipio, CD_SETOR setor, CD_GRUPO grupo, MAX(DS_LEADER_NAME) lider,\n     COUNT(DISTINCT CD_CONSULTORA) cbs, ROUND(SUM(VL_PEDIDOS_CICLO),0) receita,\n     ROUND(SUM(VL_PEDIDOS_NATURA_CICLO),0) rec_nat, ROUND(SUM(VL_PEDIDOS_AVON_CICLO),0) rec_avon,\n     ROUND(SUM(QT_PONTOS_CICLO),0) pontos, ROUND(SUM(QT_PEDIDOS_CICLO),0) pedidos,\n     SUM(CASE WHEN ST_FEZ_PED_CICLO_ATUAL THEN 1 ELSE 0 END) ativas\n    FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR IN (${secList}) AND DT_HISTORICO=${SNAP}\n    GROUP BY DS_MUNICIPIO, CD_SETOR, CD_GRUPO`;\n  const ufSQL=`SELECT DS_ESTADO uf, COUNT(*) n FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR IN (${secList}) AND DT_HISTORICO=${SNAP} GROUP BY DS_ESTADO ORDER BY n DESC`;\n  const trendSQL=`SELECT operational_cycle ciclo, COUNT(DISTINCT person_code) cbs,\n     COUNT(DISTINCT CASE WHEN registered_bc_ind=1 THEN person_code END) ativas,\n     ROUND(SUM(revenue_nat_ss_amt),0) receita, ROUND(SUM(points_nat_ss_amt),0) pontos\n    FROM ${ELO} WHERE country_code=1 AND sector_code IN (${secList}) AND operational_cycle<=${SESS.eloMaxCycle||999999} GROUP BY operational_cycle ORDER BY operational_cycle DESC LIMIT 8`;\n  const lvlSQL=`SELECT DS_NVL_PLAN_CRESC nivel, COUNT(DISTINCT CD_CONSULTORA) cbs,\n     ROUND(SUM(VL_PEDIDOS_NATURA_CICLO),0) rec_nat, ROUND(SUM(VL_PEDIDOS_AVON_CICLO),0) rec_avon\n    FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR IN (${secList}) AND DS_NVL_PLAN_CRESC IS NOT NULL AND DT_HISTORICO=${SNAP} GROUP BY DS_NVL_PLAN_CRESC ORDER BY cbs DESC`;\n  const lvlMuniSQL=`SELECT DS_MUNICIPIO municipio, CD_SETOR setor, DS_NVL_PLAN_CRESC nivel, COUNT(DISTINCT CD_CONSULTORA) cbs\n    FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR IN (${secList}) AND DS_NVL_PLAN_CRESC IS NOT NULL AND DT_HISTORICO=${SNAP} GROUP BY DS_MUNICIPIO, CD_SETOR, DS_NVL_PLAN_CRESC`;\n  const [mR,ufR,tR,lR,lmR]=await Promise.all([q(mSQL),q(ufSQL),q(trendSQL),q(lvlSQL),q(lvlMuniSQL)]);\n\n  const ownMatrix=rows(mR).filter(r=>+r.cbs>0);\n  mv.pureOwnMetrics=blankM();\n  ownMatrix.forEach(r=>{ mv.pureOwnMetrics.cbs+=+r.cbs; mv.pureOwnMetrics.receita+=+r.receita||0; mv.pureOwnMetrics.rec_nat+=+r.rec_nat||0; mv.pureOwnMetrics.rec_avon+=+r.rec_avon||0; mv.pureOwnMetrics.pontos+=+r.pontos||0; mv.pureOwnMetrics.pedidos+=+r.pedidos||0; mv.pureOwnMetrics.ativas+=+r.ativas||0; });\n\n  mv.levelByMuni={};\n  if(level==='setor') Object.entries(world.muniLevel||{}).forEach(([m,lv])=>{ if(world.muniOverride[m]===code) mv.levelByMuni[m]={...lv}; });\n\n  mv.trend=rows(tR).map(r=>({...r,cbs:+r.cbs,ativas:+r.ativas,receita:+r.receita,pontos:+r.pontos})).filter(r=>r.cbs>10).reverse();\n  mv.levels=rows(lR);\n\n  let absorbedRows=[],inheritedOrphanRows=[];\n  if(level==='setor'){\n    Object.entries(world.muniOverride).forEach(([m,destSec])=>{ if(destSec===code && world.muniRow[m]) absorbedRows.push(...world.muniRow[m]); });\n    inheritedOrphanRows=(world.sectorOrphanRows&&world.sectorOrphanRows[code])||[];\n  }\n  mv.matrix=ownMatrix.concat(absorbedRows,inheritedOrphanRows);\n\n  const ufList=rows(ufR).map(r=>r.uf).filter(Boolean);\n  const domUF=ufList[0]||'PR';\n  mv.domUF=domUF;\n  domBase=domBase||await ensureDominantes();\n  // Uma GV ou mercado pode espalhar por mais UFs do que \"a UF dominante + suas vizinhas\" cobre —\n  // toda UF que aparece na base de dominantes de QUALQUER setor-membro entra na janela de shapes.\n  const memberUFs=new Set([domUF]);\n  memberSectors.forEach(s=>{ (domBase[String(s)]||new Set()).forEach(entry=>{ const u=mUf(entry); if(u) memberUFs.add(u); }); });\n  const ufSet=new Set(memberUFs);\n  memberUFs.forEach(u=>(UF_BORDERS[u]||[]).forEach(b=>ufSet.add(b)));\n  const geos=await Promise.all([...ufSet].map(u=>geoUF(u).catch(()=>null)));\n  const allFeat=geos.filter(Boolean).flatMap(g=>g.features);\n  const adj=buildAdj(allFeat);\n\n  // A UF só vem da base de dominantes (setor real da linha × município), nunca de \"esse nome só\n  // apareceu numa UF carregada\" ou de um chute pra UF dominante do fechamento inteiro. Os dois\n  // eram seguros quando só 1-3 UFs entravam na janela (fechamento de setor); GV e principalmente\n  // mercado carregam dezenas de UFs de uma vez, então \"único entre as UFs carregadas\" deixa de\n  // significar \"único no Brasil\" — era exatamente esse chute que colocava um homônimo de outra UF\n  // espalhado longe do resto do mapa. Sem entrada na base, o município fica sem UF (mesmo\n  // tratamento de \"sem shape\" que já existe) em vez de arriscar aparecer no lugar errado.\n  const ufGuessed={};\n  const ufFor=(setorOf,muni)=>{const nm=norm(muni);\n    return (DOM.ufBySetorMuni&&DOM.ufBySetorMuni[String(setorOf)+'|'+nm])||'';};\n  mv.matrix.forEach(r=>{ if(!r.uf) r.uf=ufFor(r.setor,r.municipio); });\n  rows(lmR).forEach(r=>{ const k=mkey(r.municipio,ufFor(r.setor,r.municipio)); (mv.levelByMuni[k]=mv.levelByMuni[k]||{})[r.nivel]=+r.cbs; });\n\n  const totBy={}; mv.matrix.forEach(r=>{const n=mkey(r.municipio,r.uf); totBy[n]=(totBy[n]||0)+ +r.cbs;});\n  const footprint=new Set(Object.entries(totBy).filter(([,c])=>c>0).map(([m])=>m));\n  const withShape=[...footprint].filter(n=>adj.feat[n]||world.muniGeo[n]);\n  mv.cbsByMuni={...totBy}; mv.shapeMunis=withShape.slice();\n  mv.noShapeMunis=[...footprint].filter(n=>!(adj.feat[n]||world.muniGeo[n])).map(n=>({muni:n,cbs:totBy[n]||0})).sort((a,b)=>b.cbs-a.cbs);\n  mv.noShapeCbs=mv.noShapeMunis.reduce((a,x)=>a+x.cbs,0);\n\n  // ---- RULE: quais municípios pertencem a este fechamento ----\n  // setor: exatamente a regra de hoje. GV/mercado: união da base de TODOS os setores-membro — a\n  // base já garante que um setor pertence a uma única GV/mercado, então não existe aqui o spillover\n  // fuzzy que município tem contra setor (por isso o orphan-handling abaixo é pulado nesses níveis).\n  let domOwn;\n  if(level==='setor'){\n    domOwn=domBase[code]||new Set();\n  } else {\n    domOwn=new Set();\n    memberSectors.forEach(s=>(domBase[String(s)]||new Set()).forEach(n=>domOwn.add(n)));\n  }\n  const inherited=level==='setor'?new Set(Object.keys(world.muniOverride||{}).filter(m=>world.muniOverride[m]===code)):new Set();\n  if(!domOwn.size && !inherited.size) throw new Error(`${LEVELS[level].label} ${code} não existe na base de municípios dominantes (CSV) — atualize a base antes de fechar`);\n  const belongs=n=>domOwn.has(n)||(!DOM.hasUf&&domOwn.has(mName(n)))||inherited.has(n);\n  mv.domCsvMunis=domOwn.size;\n  const dropped=level==='setor'?withShape.filter(n=>!belongs(n)):[];\n  if(withShape.length && dropped.length===withShape.length) throw new Error(`${LEVELS[level].label} ${code}: nenhum dos municípios com CBs está na base de dominantes — nada pra realocar`);\n  const droppedSet=new Set(dropped);\n  mv.excludedMunis=dropped.map(n=>({muni:n,cbs:totBy[n]||0})).sort((a,b)=>b.cbs-a.cbs);\n  mv.excludedCbs=dropped.reduce((a,n)=>a+(totBy[n]||0),0);\n\n  const closingNames=withShape.filter(n=>!droppedSet.has(n));\n  const closingSet=new Set(closingNames);\n  mv.geoFeat={}; closingNames.forEach(n=>{ mv.geoFeat[n]=(adj.feat[n]&&adj.feat[n].f)||world.muniGeo[n]; });\n\n  // ---- unidade de realocação: a geometria é sempre município; a UNIDADE que troca de dono é o\n  // próprio município (setor fecha), o setor inteiro (GV fecha) ou a GV inteira (mercado fecha).\n  const municipioSetor={}; mv.matrix.forEach(r=>{ const n=mkey(r.municipio,r.uf); if(!municipioSetor[n]) municipioSetor[n]=String(r.setor); });\n  const resolveUnit=n=>{\n    if(level==='setor') return n;\n    const sOf=municipioSetor[n]; if(!sOf) return '';\n    return level==='gv'?sOf:(DOM.gvBySetor[sOf]||'');\n  };\n  mv.unitOfMuni={}; closingNames.forEach(n=>{ mv.unitOfMuni[n]=resolveUnit(n); });\n  mv.unitMunis={}; closingNames.forEach(n=>{ const u=mv.unitOfMuni[n]; if(!u) return; (mv.unitMunis[u]=mv.unitMunis[u]||[]).push(n); });\n  const units=level==='setor'?closingNames:Object.keys(mv.unitMunis);\n\n  const drawnCsv=new Set(closingNames.map(n=>DOM.hasUf?n:mName(n)));\n  const footKeyOf=k=>DOM.hasUf?(footprint.has(k)?k:null):([...footprint].find(x=>mName(x)===k)||null);\n  mv.csvMunisTotal=domOwn.size;\n  mv.ufGuessed={...ufGuessed};\n  if(level==='setor'){\n    mv.missingMunis=[...domOwn].filter(k=>!drawnCsv.has(k)).map(k=>{\n      const fk=footKeyOf(k);\n      const hasShape=!!(adj.feat[fk||k]||world.muniGeo[fk||k]);\n      const alias=[...footprint].filter(x=>x!==k&&mName(x)===mName(k));\n      let reason;\n      if(!fk&&alias.length) reason=`UF divergente — as CBs entraram na chave ${alias.join(' / ')} e a base diz ${k}`;\n      else if(!fk) reason=hasShape?'sem CBs neste setor no snapshot — desenhado como vizinho':'sem CBs neste setor no snapshot';\n      else if(!hasShape) reason='sem shape nas UFs carregadas';\n      else reason='chave não casou com a base de dominantes';\n      return {muni:k,cbs:(fk?totBy[fk]:alias.reduce((a,x)=>a+(totBy[x]||0),0))||0,reason:reason};\n    });\n  } else {\n    mv.missingMunis=[];\n  }\n\n  // ---- HARD RULE: destino tem de compartilhar a fronteira certa acima do que está fechando ----\n  // setor → mesma GV; GV → mesmo mercado; mercado → nada acima, qualquer vizinho vale.\n  const ownParent=parentOf(level,code);\n  if(level!=='mercado' && !ownParent) throw new Error(`${LEVELS[level].label} ${code} não tem ${level==='setor'?'CD_GV':'MERCADO'} na base de municípios dominantes — sem essa fronteira não há como garantir que os destinos ficam do lado certo da hierarquia`);\n  const sameParent=destCode=>!ownParent||parentOf(level,destCode)===ownParent;\n  mv.gv=ownParent;\n  const alreadyClosed=destCode=>level==='setor'?world.closedSectors.has(destCode):(level==='gv'?(world.closedGvs||new Set()).has(destCode):(world.closedMercados||new Set()).has(destCode));\n\n  const destRule=(SESS.settings&&SESS.settings.destRule)||DEFAULT_SETTINGS.destRule;\n  const destMinCbs=Math.max(1,Math.round(+((SESS.settings||{}).destMinCbs)||DEFAULT_SETTINGS.destMinCbs));\n  mv.destRule=destRule; mv.destMinCbs=destMinCbs; mv.destRuleFallback=false;\n  mv.allowed={}; mv.allowedRaw={};\n  units.forEach(u=>{ mv.allowed[u]={}; mv.allowedRaw[u]={}; });\n\n  const extVotes={}; const nbrNames=new Set(); let domSecOf={};\n  if(level==='setor'){\n    // setor: destino descoberto por ADJACÊNCIA GEOGRÁFICA de município — uma query ao vivo por\n    // vizinho, mas o perímetro de UM setor é pequeno o bastante pra valer a pena.\n    closingNames.forEach(n=>{\n      if(!adj.feat[n]) return;\n      adj.nbrs(n).forEach(({o,w})=>{ if(!closingSet.has(o) && !droppedSet.has(o)){ nbrNames.add(o); (extVotes[n]=extVotes[n]||[]).push({o,w}); } });\n    });\n    let neigh=[];\n    if(nbrNames.size){\n      const inList=[...new Set([...nbrNames].map(n=>mName(n)))].map(n=>`'${n.replace(/'/g,\"''\")}'`).join(',');\n      const nSQL=`SELECT DS_MUNICIPIO municipio, CD_SETOR setor, COUNT(DISTINCT CD_CONSULTORA) cbs\n        FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR NOT IN (${secList}) AND CD_SETOR>0 AND DT_HISTORICO=${SNAP} AND DS_MUNICIPIO IN (${inList}) GROUP BY DS_MUNICIPIO, CD_SETOR`;\n      neigh=rows(await q(nSQL));\n    }\n    neigh.forEach(r=>{ if(!r.uf) r.uf=ufFor(r.setor,r.municipio); });\n    const byM={}; neigh.forEach(r=>{const m=mkey(r.municipio,r.uf); if(!nbrNames.has(m)) return; (byM[m]=byM[m]||[]).push(r);});\n    Object.entries(byM).forEach(([m,rs])=>{ rs.sort((a,b)=>+b.cbs-+a.cbs); domSecOf[m]=String(rs[0].setor); });\n    nbrNames.forEach(n=>{ if(world.muniOverride && world.muniOverride[n]) domSecOf[n]=world.muniOverride[n]; });\n\n    mv.nbrCurrentSector={};\n    mv.gvRejected=[];\n    const gvHidden=new Set();\n    nbrNames.forEach(n=>{\n      const destCode=destUnitOfSector(level,domSecOf[n],world);\n      if(destCode && !sameParent(destCode)){ gvHidden.add(n); if(mv.gvRejected.indexOf(destCode)<0) mv.gvRejected.push(destCode); return; }\n      if(domSecOf[n]) mv.nbrCurrentSector[n]=destCode;\n    });\n    gvHidden.forEach(n=>{ nbrNames.delete(n); delete domSecOf[n]; delete mv.nbrCurrentSector[n]; });\n    Object.keys(extVotes).forEach(n=>{ extVotes[n]=extVotes[n].filter(v=>!gvHidden.has(v.o)); });\n\n    const isBridge=n=>destRule!=='dominant'||(totBy[n]||0)>=destMinCbs;\n    mv.bridgeMunis=closingNames.filter(isBridge);\n    mv.ignoredBridges=closingNames.filter(n=>!isBridge(n));\n\n    const wAny={}, wDom={};\n    closingNames.forEach(n=>{\n      const u=n;\n      if(!mv.allowed[u]) return;\n      const bridge=isBridge(n);\n      (extVotes[n]||[]).forEach(({o,w})=>{\n        const destCode=mv.nbrCurrentSector[o];\n        if(!destCode || destCode===code || alreadyClosed(destCode)) return;\n        mv.allowed[u][destCode]=(mv.allowed[u][destCode]||0)+w;\n        mv.allowedRaw[u][destCode]=(mv.allowedRaw[u][destCode]||0)+w;\n        wAny[destCode]=(wAny[destCode]||0)+w;\n        if(bridge) wDom[destCode]=(wDom[destCode]||0)+w;\n      });\n    });\n    let secWeight=wAny;\n    if(destRule==='dominant'){\n      if(Object.keys(wDom).length) secWeight=wDom;\n      else { secWeight=wAny; mv.destRuleFallback=true; }\n    }\n    mv.dest=Object.keys(secWeight).sort((a,b)=>secWeight[b]-secWeight[a]).slice(0,6);\n    if(!mv.dest.length){\n      mv.dest=[...new Set(Object.values(mv.nbrCurrentSector))].filter(destCode=>destCode&&destCode!==code&&!alreadyClosed(destCode)&&sameParent(destCode)).slice(0,6);\n      units.forEach(u=>{ if(mv.allowed[u]&&!Object.keys(mv.allowed[u]).length){ mv.dest.forEach(destCode=>mv.allowed[u][destCode]=1); } });\n    }\n  } else {\n    // GV/mercado: destino é SEMPRE todo irmão válido na hierarquia — NUNCA descoberto por\n    // adjacência geográfica de município. Uma GV/mercado pode ter território espalhado por\n    // dezenas de UFs sem qualquer conexão física entre as partes (a hierarquia aqui é\n    // organizacional, não geográfica) — \"vizinho por fronteira de município\" não é só caro (a\n    // query ao vivo vira um IN-list de centenas de municípios e estoura timeout: foi exatamente\n    // isso que quebrou o fechamento de um mercado espalhado) — é a pergunta errada. A fronteira que\n    // já importa (mesma GV / mesmo mercado) é imposta pela regra de parentesco logo acima; dentro\n    // dela QUALQUER irmão é candidato, e o otimizador decide pelo equilíbrio de span e continuidade\n    // de líder, nunca por proximidade física — geografia não pesa aqui.\n    mv.nbrCurrentSector={};\n    mv.gvRejected=[];\n    mv.bridgeMunis=closingNames.slice();\n    mv.ignoredBridges=[];\n    const siblings=level==='gv'\n      ? [...(DOM.gvsByMercado[ownParent]||[])]\n      : Object.keys(DOM.sectorsByMercado||{});\n    mv.dest=siblings.filter(destCode=>destCode!==code && !alreadyClosed(destCode) && sameParent(destCode));\n    units.forEach(u=>{ mv.dest.forEach(destCode=>{ mv.allowed[u][destCode]=1; mv.allowedRaw[u][destCode]=1; }); });\n  }\n  mv.dest=mv.dest.filter(sameParent);\n\n  // ---- O QUE É DESENHADO: território COMPLETO de cada destino (não só a borda), sempre lido da\n  // mesma base de dominantes já usada pro lado que fecha.\n  const territoryOf=destCode=>{\n    const secs=memberSectorsOf(level,destCode,world);\n    const out=new Set();\n    secs.forEach(s=>(domBase[String(s)]||new Set()).forEach(n=>out.add(n)));\n    return out;\n  };\n  const drawSet=new Set(mv.dest);\n  mv.dest.forEach(destCode=>{\n    territoryOf(destCode).forEach(n=>{\n      if(nbrNames.has(n)) return;\n      nbrNames.add(n);\n      mv.nbrCurrentSector[n]=(level==='setor'&&world.muniOverride&&world.muniOverride[n])?world.muniOverride[n]:destCode;\n    });\n  });\n  mv.nbrFeat=[...nbrNames].filter(n=>drawSet.has(mv.nbrCurrentSector[n])).map(n=>adj.feat[n]&&adj.feat[n].f).filter(Boolean);\n  units.forEach(u=>{ Object.keys(mv.allowed[u]||{}).forEach(destCode=>{ if(!mv.dest.includes(destCode)) delete mv.allowed[u][destCode]; }); });\n  mv.color={}; mv.dest.forEach((destCode,i)=>mv.color[destCode]=PALETTE[i%PALETTE.length]);\n\n  const accC={}; Object.entries(mv.nbrCurrentSector).forEach(([nb,destCode])=>{ if(!mv.dest.includes(destCode))return; const f=(adj.feat[nb]&&adj.feat[nb].f)||world.muniGeo[nb]; if(!f)return; const c=centroidLL(f); accC[destCode]=accC[destCode]||[0,0,0]; accC[destCode][0]+=c[0]; accC[destCode][1]+=c[1]; accC[destCode][2]++; });\n  mv.secCentroid={}; mv.dest.forEach(destCode=>{ if(accC[destCode]) mv.secCentroid[destCode]=[accC[destCode][0]/accC[destCode][2],accC[destCode][1]/accC[destCode][2]]; });\n\n  if(level==='setor'){\n    mv.muniCentroid={}; closingNames.forEach(n=>{ if(mv.geoFeat[n]) mv.muniCentroid[n]=centroidLL(mv.geoFeat[n]); });\n    mv.closeAdj={}; closingNames.forEach(n=>{ mv.closeAdj[n]=adj.feat[n]?adj.nbrs(n).filter(({o})=>closingSet.has(o)).map(({o})=>o):[]; });\n  } else {\n    mv.muniCentroid={};\n    Object.entries(mv.unitMunis).forEach(([u,ms])=>{\n      const cs=ms.map(n=>mv.geoFeat[n]&&centroidLL(mv.geoFeat[n])).filter(Boolean);\n      if(cs.length) mv.muniCentroid[u]=[cs.reduce((a,c)=>a+c[0],0)/cs.length,cs.reduce((a,c)=>a+c[1],0)/cs.length];\n    });\n    mv.closeAdj={};\n    const unitSet=new Set(units);\n    Object.entries(mv.unitMunis).forEach(([u,ms])=>{\n      const touch=new Set();\n      ms.forEach(n=>{ if(!adj.feat[n]) return; adj.nbrs(n).forEach(({o})=>{ const ou=mv.unitOfMuni[o]; if(ou&&ou!==u&&unitSet.has(ou)) touch.add(ou); }); });\n      mv.closeAdj[u]=[...touch];\n    });\n  }\n  const comp={}; let ci=0; units.forEach(n=>{ if(comp[n]!=null)return; const st=[n]; comp[n]=ci; while(st.length){ const x=st.pop(); (mv.closeAdj[x]||[]).forEach(o=>{ if(comp[o]==null){ comp[o]=ci; st.push(o); } }); } ci++; });\n  const compAllowed={}; units.forEach(n=>{ const cid=comp[n]; (compAllowed[cid]=compAllowed[cid]||new Set()); Object.keys(mv.allowed[n]||{}).forEach(s=>compAllowed[cid].add(s)); });\n  mv.reachable={}; units.forEach(n=>{ mv.reachable[n]=[...(compAllowed[comp[n]]||[])].filter(s=>mv.dest.includes(s)); });\n\n  if(mv.dest.length){\n    const destSectorMap={}; mv.dest.forEach(destCode=>{ destSectorMap[destCode]=memberSectorsOf(level,destCode,world); });\n    const allDestSecs=[...new Set(Object.values(destSectorMap).flat())];\n    const rList=allDestSecs.join(',');\n    const bSQL=`SELECT CD_SETOR setor, COUNT(DISTINCT CD_CONSULTORA) cbs,\n       SUM(CASE WHEN ST_FEZ_PED_CICLO_ATUAL THEN 1 ELSE 0 END) ativas,\n       ROUND(SUM(VL_PEDIDOS_CICLO),0) receita, ROUND(SUM(VL_PEDIDOS_NATURA_CICLO),0) rec_nat,\n       ROUND(SUM(VL_PEDIDOS_AVON_CICLO),0) rec_avon, ROUND(SUM(QT_PONTOS_CICLO),0) pontos, ROUND(SUM(QT_PEDIDOS_CICLO),0) pedidos\n      FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR IN (${rList}) AND DT_HISTORICO=${SNAP} GROUP BY CD_SETOR`;\n    const blSQL=`SELECT CD_SETOR setor, DS_NVL_PLAN_CRESC nivel, COUNT(DISTINCT CD_CONSULTORA) cbs\n      FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR IN (${rList}) AND DS_NVL_PLAN_CRESC IS NOT NULL AND DT_HISTORICO=${SNAP} GROUP BY CD_SETOR, DS_NVL_PLAN_CRESC`;\n    const [bR,blR]=await Promise.all([q(bSQL),q(blSQL)]);\n    const secMetrics={}; rows(bR).forEach(r=>{ secMetrics[String(r.setor)]=r; if(!SESS.sectorBaseCache[String(r.setor)]) SESS.sectorBaseCache[String(r.setor)]=r; });\n    const secLevel={}; rows(blR).forEach(r=>{ const s=String(r.setor); (secLevel[s]=secLevel[s]||{})[r.nivel]=+r.cbs; });\n    mv.baseMetrics={}; mv.baseLevel={};\n    mv.dest.forEach(destCode=>{\n      const secs=destSectorMap[destCode];\n      const acc=blankM(); acc.setor=destCode;\n      secs.forEach(s=>{ const r=secMetrics[String(s)]; if(!r) return; Object.keys(blankM()).forEach(k=>{ acc[k]=(+acc[k]||0)+(+r[k]||0); }); });\n      mv.baseMetrics[destCode]=acc;\n      const lv={}; secs.forEach(s=>{ const l=secLevel[String(s)]; if(!l) return; Object.entries(l).forEach(([nv,c])=>{ lv[nv]=(lv[nv]||0)+c; }); });\n      mv.baseLevel[destCode]=lv;\n    });\n  } else { mv.baseMetrics={}; mv.baseLevel={}; }\n\n  mv.dest.forEach(destCode=>{\n    if(!mv.baseMetrics[destCode]) mv.baseMetrics[destCode]={setor:destCode,cbs:0,ativas:0,receita:0,rec_nat:0,rec_avon:0,pontos:0,pedidos:0};\n    const inflowSrc=level==='setor'?world.sectorInflow:(level==='gv'?world.gvInflow:world.mercadoInflow);\n    const infl=inflowSrc&&inflowSrc[destCode];\n    if(infl) Object.keys(blankM()).forEach(k=>{ mv.baseMetrics[destCode][k]=(+mv.baseMetrics[destCode][k]||0)+(infl[k]||0); });\n    if(level==='setor'){\n      const inflLv=world.sectorInflowLevel&&world.sectorInflowLevel[destCode];\n      if(inflLv){ mv.baseLevel[destCode]=mv.baseLevel[destCode]||{}; Object.entries(inflLv).forEach(([nv,c])=>{ mv.baseLevel[destCode][nv]=(mv.baseLevel[destCode][nv]||0)+c; }); }\n    }\n  });\n\n  aggregateMovement(mv);\n  mv.assign=optimizeFor(mv);\n  return mv;\n}\n\n// ---------- cascade engine ----------\nasync function computeAt(i){\n  await ensurePinned();\n  const world=foldWorldState(SESS.timeline,i);\n  const sec=SESS.timeline[i].sector;\n  const level=SESS.timeline[i].level||'setor';\n  const mv=await computeMovement(sec,level,world);\n  SESS.timeline[i]=mv;\n}\nasync function recomputeFrom(i){\n  for(let k=i;k<SESS.timeline.length;k++){\n    loader(true,`recalculando etapa ${k+1} de ${SESS.timeline.length}…`);\n    try{ await computeAt(k); }\n    catch(e){\n      // A stage that failed to recompute still holds its PREVIOUS result, so the timeline would\n      // silently mix pre- and post-change etapas. Flag this stage and everything after it as stale\n      // (dashed chip + ⟳) so the state is visible and flushDirty retries from here.\n      SESS.dirtyFrom = SESS.dirtyFrom==null ? k : Math.min(SESS.dirtyFrom,k);\n      throw e;\n    }\n  }\n}\nasync function flushDirty(){\n  if(SESS.dirtyFrom==null) return;\n  const from=SESS.dirtyFrom; SESS.dirtyFrom=null;\n  loader(true,'recalculando etapas seguintes…');\n  try{ await recomputeFrom(from); }\n  catch(e){ $('#ds').textContent='erro ao recalcular cadeia: '+e.message; $('#ds').classList.add('err'); }\n  finally{ loader(false); }\n}\nasync function addMovement(level,sec){\n  level=level||'setor';\n  sec=(sec==null?'':String(sec)).trim();\n  if(!sec) return;\n  if(!movementAvailable(level)){ $('#ds').textContent=`Fechar ${LEVELS[level].label} ainda não está disponível.`; $('#ds').classList.add('err'); return; }\n  if(!hierarchyAllows(level)){ const minLabel=LEVELS[Object.keys(LEVEL_RANK).find(k=>LEVEL_RANK[k]===sessionMinRank())].label; $('#ds').textContent=`esta sessão já fechou um nível mais alto — só \"${minLabel}\" (ou acima) fica disponível.`; $('#ds').classList.add('err'); return; }\n  const closedNow=new Set(SESS.timeline.filter(mv=>(mv.level||'setor')===level).map(mv=>mv.sector));\n  if(closedNow.has(sec)){ $('#ds').textContent=LEVELS[level].label+' '+sec+' já fechado(a) nesta timeline.'; $('#ds').classList.add('err'); return; }\n  if(level==='setor' && !SESS.sectorsList.some(s=>s.setor===sec)){ $('#ds').textContent='setor \"'+sec+'\" não existe no snapshot congelado.'; $('#ds').classList.add('err'); return; }\n  await flushDirty();\n  loader(true,`fechando ${lc(LEVELS[level].label)} `+sec+' — puxando dado do snapshot congelado…');\n  $('#liveState').classList.remove('err');\n  try{\n    SESS.timeline.push({sector:String(sec),level:level});\n    await computeAt(SESS.timeline.length-1);\n    SESS.selected=SESS.timeline.length-1;\n    $('#ds').classList.remove('err'); $('#ds').textContent='';\n  }catch(e){\n    SESS.timeline.pop();\n    $('#ds').textContent=`erro ao fechar ${lc(LEVELS[level].label)} `+sec+': '+e.message; $('#ds').classList.add('err');\n  } finally { loader(false); renderAll(); }\n}\nfunction removeFrom(i){\n  SESS.timeline.length=i;\n  SESS.selected=Math.min(SESS.selected,Math.max(0,SESS.timeline.length-1));\n  if(SESS.dirtyFrom!=null && SESS.dirtyFrom>=SESS.timeline.length) SESS.dirtyFrom=null;\n  renderAll();\n}\nasync function editSelected(mutator){\n  const mv=SESS.timeline[SESS.selected]; if(!mv) return;\n  mutator(mv);\n  if(SESS.selected<SESS.timeline.length-1){\n    SESS.dirtyFrom = SESS.dirtyFrom==null ? SESS.selected+1 : Math.min(SESS.dirtyFrom, SESS.selected+1);\n  }\n  renderAll();\n}\n\n// ---------- sectors list / picker ----------\nasync function loadSectors(){\n  const sql=`SELECT CD_SETOR setor, MAX(DS_ESTADO) uf, COUNT(DISTINCT CD_CONSULTORA) cbs, COUNT(DISTINCT DS_MUNICIPIO) munis\n    FROM ${T} WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR>0 AND DT_HISTORICO=(SELECT MAX(DT_HISTORICO) FROM ${T} WHERE CD_PAIS=1) GROUP BY CD_SETOR ORDER BY CD_SETOR`;\n  SESS.sectorsList=rows(await q(sql)).map(r=>({setor:String(r.setor),uf:r.uf,cbs:+r.cbs,munis:+r.munis}));\n}\nfunction renderSectorPicker(){\n  const ready=SESS.stage==='main';\n  const ob=$('#openMove'); if(ob) ob.disabled=!ready;\n}\n\n// ---------- movement modal (setor / GV / mercado) ----------\n// Hierarquia mercado > GV > setor: a sessão trava no nível da primeira movimentação. Misturar\n// níveis quebraria a leitura de \"antes/depois\" da cadeia — fechar uma GV já redistribui setores\n// inteiros pra outras GVs; fechar um setor isolado depois não bate mais com o mundo que sobrou.\n// de/a/no: contrações de \"de\"/\"a\"/\"em\" com o artigo de cada nível — GV é feminina (a Gerência de\n// Vendas), setor e mercado são masculinos. Errar o gênero aqui é o tipo de coisa que grita \"isto foi\n// feito pra setor e só remendado pros outros níveis\", exatamente o que este objeto existe pra evitar.\nconst LEVELS={\n  setor:{label:'Setor',codeLbl:'Setor a fechar',placeholder:'código do setor',childLabel:'Município',destLabel:'Setor',de:'do',a:'ao',no:'no',parentLabel:'GV',parentPhrase:'da mesma GV',parentWord:'gerência'},\n  gv:{label:'GV',codeLbl:'GV a fechar',placeholder:'código da GV',childLabel:'Setor',destLabel:'GV',de:'da',a:'à',no:'na',parentLabel:'Mercado',parentPhrase:'do mesmo mercado',parentWord:'mercado'},\n  mercado:{label:'Mercado',codeLbl:'Mercado a fechar',placeholder:'nome do mercado',childLabel:'GV',destLabel:'Mercado',de:'do',a:'ao',no:'no',parentLabel:null,parentPhrase:null,parentWord:null},\n};\n// GV é sigla — .toLowerCase() a transformaria em \"gv\", errado em qualquer posição da frase. Palavras\n// normais (Setor/Mercado/Município) minúsculam à vontade no meio de uma frase; GV nunca.\nconst LOWER={Setor:'setor',Mercado:'mercado',Município:'município',GV:'GV'};\nconst lc=w=>LOWER[w]||w.toLowerCase();\n// Hierarquia é uma catraca, não um cadeado: mercado(0) > GV(1) > setor(2). Fechar um nível mais\n// alto (número menor) trava PRA SEMPRE nesta sessão qualquer nível mais baixo (número maior) —\n// mas o próprio nível, ou um ainda mais alto, continua liberado. É assim que \"posso fechar setores\n// até fechar uma GV; posso fechar GVs até fechar um mercado\" funciona: nunca destrava de volta.\nconst LEVEL_RANK={mercado:0,gv:1,setor:2};\nfunction sessionMinRank(){\n  let r=LEVEL_RANK.setor;\n  SESS.timeline.forEach(mv=>{ const rk=LEVEL_RANK[mv.level||'setor']; if(rk<r) r=rk; });\n  return r;\n}\nfunction hierarchyAllows(lvl){ return LEVEL_RANK[lvl]<=sessionMinRank(); }\nfunction movementAvailable(lvl){ return lvl==='setor'||lvl==='gv'||lvl==='mercado'; }\n// ---------- hierarquia: setor ⊂ GV ⊂ mercado — tudo derivado da base de dominantes (DOM) ----------\n// memberSectors: o escopo de CD_SETOR que a query no CRM precisa cobrir pra fechar este código, em\n// qualquer nível — um setor é ele mesmo; uma GV é todo setor que a base lhe atribui; um mercado é\n// todo setor de toda GV que a base atribui a ele.\n// membros ATUAIS de um GV/mercado, um nível abaixo (setores de uma GV; GVs de um mercado) — nunca\n// só a foto estática do CSV: uma etapa anterior NESTA MESMA sessão pode já ter movido um filho pra\n// dentro ou pra fora deste código, e um fechamento seguinte tem de enxergar o mundo como ele está\n// agora, não como o CSV descreveu antes de qualquer movimentação.\nfunction currentMembersOf(level,code,world){\n  code=String(code);\n  // \"gv\": setores da GV (DOM.sectorsByGv). \"mercado\": GVs do mercado (DOM.gvsByMercado) — NUNCA\n  // sectorsByMercado, que pula a camada de GV inteira e faz memberSectorsOf tratar códigos de\n  // setor como se fossem códigos de GV (não batem em DOM.sectorsByGv, e o fechamento morre com\n  // \"não existe na base\" mesmo quando o mercado está lá).\n  const staticMembers=level==='gv'?(DOM.sectorsByGv[code]||new Set()):(DOM.gvsByMercado[code]||new Set());\n  const overrideMap=level==='gv'?(world&&world.secOverride):(world&&world.gvOverride);\n  const out=new Set(staticMembers);\n  if(overrideMap){\n    Object.entries(overrideMap).forEach(([child,dest])=>{\n      if(dest===code) out.add(child);\n      else if(staticMembers.has(child)) out.delete(child);\n    });\n  }\n  return [...out];\n}\n// setores que a query no CRM precisa cobrir pra fechar este código, em qualquer nível — setor é\n// ele mesmo; GV é seus setores ATUAIS; mercado é todo setor de toda GV ATUALMENTE sua (setor não\n// troca de GV sozinho numa sessão de mercado — só GV inteira troca de mercado).\nfunction memberSectorsOf(level,code,world){\n  code=String(code);\n  if(level==='setor') return [code];\n  if(level==='gv') return currentMembersOf('gv',code,world);\n  const gvs=currentMembersOf('mercado',code,world);\n  const out=new Set();\n  gvs.forEach(gv=>(DOM.sectorsByGv[gv]||new Set()).forEach(s=>out.add(s)));\n  return [...out];\n}\n// fronteira que um destino tem de respeitar: GV do setor que fecha, mercado da GV que fecha —\n// mercado não tem nada acima, então não existe regra pra ele. Estática de propósito: um setor não\n// troca de GV nem uma GV troca de mercado só por existirem etapas anteriores nesta sessão — quem\n// muda de dono é o NÍVEL ABAIXO do que está fechando, nunca o próprio código sendo avaliado aqui.\nfunction parentOf(level,code){\n  code=String(code);\n  if(level==='setor') return DOM.gvBySetor[code]||'';\n  if(level==='gv') return DOM.mercadoByGv[code]||'';\n  return '';\n}\n// dado o setor que uma município vizinha atualmente pertence (fato ao vivo do CRM, nunca muda de\n// verdade), a que CANDIDATO A DESTINO isso corresponde neste nível — considerando que uma etapa\n// anterior desta sessão pode já ter movido esse setor (GV fechando) ou essa GV (mercado fechando)\n// pra outro dono, o que a foto estática do CSV sozinha não enxergaria.\nfunction destUnitOfSector(level,setorCode,world){\n  setorCode=String(setorCode);\n  if(level==='setor') return setorCode;\n  if(level==='gv'){ const ov=world&&world.secOverride&&world.secOverride[setorCode]; return ov||DOM.gvBySetor[setorCode]||''; }\n  const gv=DOM.gvBySetor[setorCode]||'';\n  const ov=world&&world.gvOverride&&world.gvOverride[gv];\n  return ov||DOM.mercadoBySetor[setorCode]||'';\n}\nfunction currentMoveLevel(){ const r=root.querySelector('input[name=\"moveLevel\"]:checked'); return (r&&r.value)||'setor'; }\nfunction openMove(){\n  const minRank=sessionMinRank();\n  const lastLevel=SESS.timeline.length?(SESS.timeline[SESS.timeline.length-1].level||'setor'):'setor';\n  root.querySelectorAll('input[name=\"moveLevel\"]').forEach(r=>{\n    const lvl=r.value;\n    r.disabled=!movementAvailable(lvl)||!hierarchyAllows(lvl);\n    r.checked=hierarchyAllows(lastLevel)?lvl===lastLevel:lvl===Object.keys(LEVEL_RANK).find(k=>LEVEL_RANK[k]===minRank);\n  });\n  const note=$('#moveLockNote');\n  const minLabel=LEVELS[Object.keys(LEVEL_RANK).find(k=>LEVEL_RANK[k]===minRank)].label;\n  if(note) note.textContent=minRank<LEVEL_RANK.setor\n    ? `Esta sessão já fechou um nível mais alto na hierarquia — só \"${minLabel}\" (ou acima) continua disponível daqui pra frente.`\n    : 'Escolha o nível a fechar. Você pode fechar setores à vontade até fechar uma GV; aí só GV (ou mercado) daqui pra frente. Fechar um mercado trava a sessão em mercado.';\n  $('#moveCode').value='';\n  const err=$('#moveErr'); if(err){ err.textContent=''; err.classList.add('hidden'); }\n  const st=$('#moveStatus'); if(st) st.textContent='';\n  $('#moveBg').classList.remove('hidden');\n  renderMoveForm();\n  const c=$('#moveCancel'); if(c) c.focus();\n}\nfunction closeMove(){ const b=$('#moveBg'); if(b) b.classList.add('hidden'); }\nfunction renderMoveForm(){\n  root.querySelectorAll('#moveBg .opt-row').forEach(r=>r.classList.toggle('on',r.dataset.lvl===currentMoveLevel()));\n  const lvl=LEVELS[currentMoveLevel()];\n  $('#moveCodeLbl').textContent=lvl.codeLbl;\n  $('#moveCode').placeholder=lvl.placeholder;\n  loadMoveOptions();\n}\nasync function loadMoveOptions(){\n  const lvl=currentMoveLevel();\n  const dl=$('#moveCodeList'); if(!dl) return;\n  const closedSet=new Set(SESS.timeline.filter(mv=>(mv.level||'setor')===lvl).map(mv=>mv.sector));\n  if(lvl==='setor'){\n    dl.innerHTML=SESS.sectorsList.filter(s=>!closedSet.has(s.setor))\n      .map(s=>`<option value=\"${s.setor}\">${s.setor} · ${s.uf||'?'} · ${fmt(s.cbs)} CBs · ${s.munis} munic.</option>`).join('');\n    return;\n  }\n  dl.innerHTML='';\n  try{ await ensureDominantes(); }catch(e){ return; }\n  if(lvl==='gv'){\n    const gvs=Object.keys(DOM.sectorsByGv||{}).filter(g=>!closedSet.has(g)).sort();\n    dl.innerHTML=gvs.map(g=>`<option value=\"${g}\">${g}${DOM.gvLabel[g]?' · '+esc(DOM.gvLabel[g]):''} · ${DOM.sectorsByGv[g].size} setor(es)</option>`).join('');\n  } else if(lvl==='mercado'){\n    const mks=Object.keys(DOM.sectorsByMercado||{}).filter(m=>!closedSet.has(m)).sort();\n    dl.innerHTML=mks.map(m=>`<option value=\"${m}\">${m} · ${(DOM.gvsByMercado[m]||new Set()).size} GV(s) · ${DOM.sectorsByMercado[m].size} setor(es)</option>`).join('');\n  }\n}\nfunction moveRandPick(){\n  const opts=[...($('#moveCodeList').options||[])].map(o=>o.value);\n  if(!opts.length) return;\n  $('#moveCode').value=opts[Math.floor(Math.random()*opts.length)];\n}\nasync function submitMove(){\n  const lvl=currentMoveLevel();\n  const code=($('#moveCode').value||'').trim();\n  const err=$('#moveErr');\n  const fail=msg=>{ if(err){ err.textContent=msg; err.classList.remove('hidden'); } };\n  if(err){ err.textContent=''; err.classList.add('hidden'); }\n  if(!movementAvailable(lvl)) return fail(`Fechar ${LEVELS[lvl].label} ainda não está disponível.`);\n  if(!hierarchyAllows(lvl)){ const minLabel=LEVELS[Object.keys(LEVEL_RANK).find(k=>LEVEL_RANK[k]===sessionMinRank())].label; return fail(`Esta sessão já fechou um nível mais alto — só \"${minLabel}\" (ou acima) fica disponível.`); }\n  if(!code) return fail('Informe um código.');\n  closeMove();\n  await addMovement(lvl,code);\n}\nfunction renderStage(){\n  const isMain=SESS.stage==='main';\n  const cc=$('#confirmCard'), mw=$('#mainWrap');\n  const hdr=$('#topHeader'), rl=$('#timelineRail');\n  if(hdr) hdr.classList.toggle('hidden', !isMain);\n  if(rl) rl.classList.toggle('hidden', !isMain);\n  if(cc) cc.classList.toggle('hidden', isMain);\n  if(mw) mw.classList.toggle('hidden', !isMain);\n  const cb=$('#confirmBody');\n  if(cb && !isMain) cb.innerHTML = SESS.snapshotRaw\n    ? `Snapshot congelado · atualizado em <b>${fmtSyncedAt(SESS.snapshotSyncedAt)}</b> · <b>${SESS.sectorsList.length}</b> setor(es) disponível(eis) pra fechar. Nenhuma consulta de detalhe roda até você confirmar e escolher o primeiro setor.`\n    : 'congelando snapshot…';\n}\n\n// ---------- session persistence ----------\n// ONE table (`timeline-shared-sessions`) holds BOTH kinds of row, so SESSIONS_DS and SHARED_DS\n// deliberately resolve to the SAME DataSet — the two names mark intent, not two stores:\n//   · working session  — carries `movements`; saveSession updates it in place\n//   · shared snapshot  — carries `sharedAt` + `stages`; doShare CREATES it and nothing updates it\n// listSessions MUST exclude the shared rows. They are write-once by contract, and if one showed\n// up in the picker, loading it and pressing Salvar would fire ds.update() straight at a frozen\n// snapshot. Filtering here is what keeps that unreachable — it is the guard, not a cosmetic.\n// Both lookups stay because a policy-gated DataSet's Process resolves late; same race the reader\n// component polls for. SESSIONS_DS lives at module scope so no call site can hit it in the TDZ.\nasync function listSessions(){\n  const ds=(d2.data('sessionsDataset')||d2.data(SESSIONS_DS)); if(!ds) return [];\n  await ds.refresh();\n  const recs=ds.records()||[];\n  return [...recs].filter(r=>!r.sharedAt).sort((a,b)=>new Date(b.updatedAt||0)-new Date(a.updatedAt||0));\n}\nasync function refreshSessionPicker(){\n  const list=await listSessions().catch(()=>[]);\n  SESS.sessionsList=list;\n  const opts=list.map(s=>`<option value=\"${s._id}\">${esc(s.label||'sem nome')} · ${fmt((s.movements||[]).length)} etapa(s)</option>`).join('')+`<option value=\"\">+ Nova sessão</option>`;\n  const sel=$('#sessionPick'); if(sel){ sel.innerHTML=opts; sel.value=SESS.sessionId||''; }\n  const csel=$('#confirmSessionPick'); if(csel){ csel.innerHTML=opts; csel.value=SESS.sessionId||''; }\n}\nasync function saveSession(){\n  const ds=(d2.data('sessionsDataset')||d2.data(SESSIONS_DS));\n  if(!ds){ $('#sessStatus').textContent='dataset de sessões indisponível'; return; }\n  if(!SESS.timeline.length){ $('#sessStatus').textContent='nada pra salvar ainda'; return; }\n  await flushDirty();\n  const label=SESS.sessionLabel||('Sessão '+new Date().toLocaleString('pt-BR'));\n  const nowIso=new Date().toISOString();\n  const payload={\n    label,\n    settings:{...DEFAULT_SETTINGS,...(SESS.settings||{})},\n    snapshotRaw:SESS.snapshotRaw, snapshotSyncedAt:SESS.snapshotSyncedAt, snapLiteral:SESS.snapLiteral, eloMaxCycle:SESS.eloMaxCycle,\n    movements:SESS.timeline.map(mv=>({\n      sector:mv.sector, level:mv.level||'setor', assign:mv.assign, policy:mv.policy,\n      matrix:mv.matrix, trend:mv.trend, levels:mv.levels, levelByMuni:mv.levelByMuni,\n      pureOwnMetrics:mv.pureOwnMetrics, domUF:mv.domUF, dest:mv.dest, color:mv.color,\n      gv:mv.gv, gvRejected:mv.gvRejected,\n      missingMunis:mv.missingMunis, csvMunisTotal:mv.csvMunisTotal, ufGuessed:mv.ufGuessed,\n      baseMetrics:mv.baseMetrics, baseLevel:mv.baseLevel, geoFeat:mv.geoFeat, nbrFeat:mv.nbrFeat,\n      nbrCurrentSector:mv.nbrCurrentSector, allowed:mv.allowed, allowedRaw:mv.allowedRaw, reachable:mv.reachable,\n      destRule:mv.destRule, destMinCbs:mv.destMinCbs, destRuleFallback:mv.destRuleFallback, optTier:mv.optTier,\n      cbsByMuni:mv.cbsByMuni, shapeMunis:mv.shapeMunis, excludedMunis:mv.excludedMunis, domCsvMunis:mv.domCsvMunis,\n      excludedCbs:mv.excludedCbs, noShapeMunis:mv.noShapeMunis, noShapeCbs:mv.noShapeCbs,\n      secCentroid:mv.secCentroid, muniCentroid:mv.muniCentroid, closeAdj:mv.closeAdj, optBadge:mv.optBadge,\n    })),\n    updatedAt:nowIso,\n  };\n  $('#sessStatus').textContent='salvando…';\n  try{\n    if(SESS.sessionId){\n      await ds.update({_id:SESS.sessionId,...payload});\n    } else {\n      payload.createdAt=nowIso;\n      const created=await ds.create(payload);\n      SESS.sessionId=(created&&created._id)||(created&&created.data&&created.data._id)||(ds.selected&&ds.selected()&&ds.selected()._id)||null;\n    }\n    SESS.sessionLabel=label;\n    await refreshSessionPicker();\n    $('#sessStatus').textContent='salvo ✓';\n  }catch(e){ $('#sessStatus').textContent='erro ao salvar: '+e.message; }\n  setTimeout(()=>{ if($('#sessStatus')) $('#sessStatus').textContent=''; },2200);\n}\n// Duplicate = drop sessionId so saveSession takes its CREATE branch instead of its update branch.\n// The source record is never written to, the copy gets a fresh _id and its own createdAt, and the\n// copy becomes the active session (so the next Salvar edits the copy, not the original).\nasync function duplicateSession(){\n  if(!SESS.timeline.length){ $('#sessStatus').textContent='nada pra duplicar ainda'; return; }\n  const prevId=SESS.sessionId, prevLabel=SESS.sessionLabel;\n  SESS.sessionId=null;\n  SESS.sessionLabel=(SESS.sessionLabel||'Sessão')+' (cópia)';\n  await saveSession();\n  if(!SESS.sessionId){\n    // saveSession swallows its own errors into #sessStatus, so a still-null id after the await is\n    // the only failure signal we get. Put the original identity back — otherwise a failed copy\n    // silently leaves the session detached, and the next Salvar would fork a new record instead\n    // of updating the one the user thought they were editing.\n    SESS.sessionId=prevId; SESS.sessionLabel=prevLabel;\n    await refreshSessionPicker().catch(()=>{});\n    return;\n  }\n  if($('#sessStatus')) $('#sessStatus').textContent='duplicado ✓';\n}\nasync function loadSession(id){\n  if(!id) return newSession();\n  const list=(SESS.sessionsList&&SESS.sessionsList.length)?SESS.sessionsList:await listSessions().catch(()=>[]);\n  const rec=list.find(s=>String(s._id)===String(id));\n  if(!rec) return newSession();\n  loader(true,'carregando sessão…');\n  SESS.sessionId=rec._id; SESS.sessionLabel=rec.label;\n  SESS.snapshotRaw=rec.snapshotRaw; SESS.snapshotSyncedAt=rec.snapshotSyncedAt||null; SESS.snapLiteral=rec.snapLiteral; SESS.eloMaxCycle=rec.eloMaxCycle;\n  SESS.settings={...DEFAULT_SETTINGS,...(rec.settings||{})};\n  SESS.timeline=(rec.movements||[]).map(m=>({sector:String(m.sector),level:m.level||'setor'}));\n  SESS.selected=0; SESS.sectorBaseCache={}; SESS.stage='main'; SESS.dirtyFrom=null;\n  try{\n    for(let i=0;i<SESS.timeline.length;i++){\n      const saved=(rec.movements||[])[i]||{};\n      // Sessions saved before the UF became part of the key hold bare-name keys in matrix rows,\n      // assign, geoFeat and closeAdj alike. Restoring that cache would mix key shapes the moment the\n      // stage is recomputed — and it would preserve the very collision this fixes — so those stages\n      // are replayed against the pinned snapshot and the manual assignment is remapped by name.\n      const legacyKeys=!!(saved.matrix&&saved.matrix.length&&saved.matrix.every(r=>r&&r.uf==null));\n      // Sessões salvas antes da regra de gerência podem carregar um destino de outra GV no cache.\n      // Restaurar esse cache manteria o setor proibido na tela para sempre, então essas etapas são\n      // reprocessadas contra o snapshot fixado — igual ao tratamento das chaves legadas.\n      const crossGv=await savedCrossesGv(saved);\n      if(saved.matrix&&!legacyKeys&&!crossGv){\n        loader(true,`restaurando etapa ${i+1}/${SESS.timeline.length} — setor ${SESS.timeline[i].sector} (cache, sem consulta)…`);\n        const mv={sector:String(saved.sector), level:saved.level||'setor', policy:saved.policy||'fora', view:'tobe', selMuni:null, optBadge:saved.optBadge||''};\n        mv.matrix=saved.matrix; mv.trend=saved.trend||[]; mv.levels=saved.levels||[]; mv.levelByMuni=saved.levelByMuni||{};\n        mv.pureOwnMetrics=saved.pureOwnMetrics||blankM(); mv.domUF=saved.domUF; mv.dest=saved.dest||[]; mv.color=saved.color||{};\n        mv.baseMetrics=saved.baseMetrics||{}; mv.baseLevel=saved.baseLevel||{}; mv.geoFeat=saved.geoFeat||{}; mv.nbrFeat=saved.nbrFeat||[];\n        mv.nbrCurrentSector=saved.nbrCurrentSector||{}; mv.allowed=saved.allowed||{}; mv.reachable=saved.reachable||{};\n        mv.allowedRaw=saved.allowedRaw||saved.allowed||{};\n        mv.destRule=saved.destRule||SESS.settings.destRule; mv.destMinCbs=saved.destMinCbs||SESS.settings.destMinCbs; mv.destRuleFallback=!!saved.destRuleFallback;\n        mv.optTier=(saved.optTier==null?0:saved.optTier);\n        mv.gv=saved.gv||''; mv.gvRejected=saved.gvRejected||[];\n        mv.missingMunis=saved.missingMunis||[]; mv.csvMunisTotal=saved.csvMunisTotal||0;\n        mv.ufGuessed=saved.ufGuessed||{};\n        mv.cbsByMuni=saved.cbsByMuni||{}; mv.shapeMunis=saved.shapeMunis||[];\n        mv.excludedMunis=saved.excludedMunis||[]; mv.excludedCbs=saved.excludedCbs||0; mv.domCsvMunis=saved.domCsvMunis||0;\n        mv.noShapeMunis=saved.noShapeMunis||[]; mv.noShapeCbs=saved.noShapeCbs||0;\n        mv.secCentroid=saved.secCentroid||{}; mv.muniCentroid=saved.muniCentroid||{}; mv.closeAdj=saved.closeAdj||{};\n        aggregateMovement(mv);\n        mv.assign=saved.assign||{};\n        if((mv.level||'setor')==='setor') mv.dest.forEach(s=>{ if(!SESS.sectorBaseCache[s]) SESS.sectorBaseCache[s]=mv.baseMetrics[s]; });\n        SESS.timeline[i]=mv;\n      } else {\n        loader(true,`replay ${i+1}/${SESS.timeline.length} — setor ${SESS.timeline[i].sector}…`);\n        await computeAt(i);\n        if(saved.assign) SESS.timeline[i].assign=legacyKeys?remapAssign(SESS.timeline[i],saved.assign):saved.assign;\n        if(saved.policy) SESS.timeline[i].policy=saved.policy;\n      }\n    }\n    await loadSectors();\n  }catch(e){ $('#ds').textContent='erro ao carregar sessão: '+e.message; $('#ds').classList.add('err'); }\n  finally{ loader(false); }\n  renderAll();\n}\n// Re-points a legacy bare-name assignment at the NAME/UF key it can only mean. When a name resolves\n// to more than one município in the recomputed stage the manual choice is genuinely ambiguous —\n// dropping it lets the optimizer allocate instead of guessing on the operator's behalf.\n// True when a cached stage names a destination outside the closing sector's gerência de vendas.\n// Judges the cache by TODAY's rule, reading the (memoised) dominantes base rather than trusting what\n// the session was saved with. Unknown GV on the closing sector answers false: the stage then loads\n// from cache instead of being replayed into the hard throw in computeMovement, which would leave the\n// operator staring at a broken session with no way back.\nasync function savedCrossesGv(saved){\n  if(!saved||!saved.sector||!(saved.dest||[]).length) return false;\n  let gvBy={};\n  try{ await ensureDominantes(); gvBy=DOM.gvBySetor||{}; }catch(e){ return false; }\n  const own=gvBy[String(saved.sector)]||'';\n  if(!own) return false;\n  if(saved.dest.some(s=>(gvBy[String(s)]||'')!==own)) return true;\n  // A stage saved before foreign-GV neighbours stopped being drawn can hold a perfectly clean dest and\n  // STILL carry their shapes in nbrFeat/nbrCurrentSector — it would repaint the old map straight from\n  // cache. An unknown gerência is not evidence of a foreign one, so only a known, differing GV replays.\n  return Object.values(saved.nbrCurrentSector||{}).some(s=>{ const g=gvBy[String(s)]||''; return g&&g!==own; });\n}\nfunction remapAssign(mv,savedAssign){\n  const keys=Object.keys(mv.munis||{}).filter(k=>k!=='__OUTROS__');\n  const out={};\n  Object.entries(savedAssign||{}).forEach(([k,v])=>{\n    if(keys.indexOf(k)>=0){ out[k]=v; return; }\n    const cand=keys.filter(x=>mName(x)===mName(k));\n    if(cand.length===1) out[cand[0]]=v;\n  });\n  return out;\n}\nfunction newSession(){\n  SESS.sessionId=null; SESS.sessionLabel=null; SESS.timeline=[]; SESS.selected=0; SESS.sectorBaseCache={};\n  SESS.settings={...DEFAULT_SETTINGS};\n  SESS.snapshotRaw=null; SESS.snapshotSyncedAt=null; SESS.snapLiteral=null; SESS.eloMaxCycle=null; SESS.stage='loading'; SESS.dirtyFrom=null;\n  (async()=>{\n    loader(true,'iniciando nova sessão…');\n    try{ await Promise.all([ensurePinned(), loadSectors()]); SESS.stage='confirm'; }\n    catch(e){ setError('erro init: '+e.message); }\n    finally{ loader(false); renderAll(); }\n  })();\n}\n\n// ---------- snapshot refresh ----------\n// Deliberately breaks the frozen-snapshot guarantee, on demand: re-resolves DT_HISTORICO and\n// replays the whole timeline against the new one. Skips the replay when the snapshot has not\n// actually moved, so a stray click on a long timeline costs one cheap probe instead of ~8 queries\n// per etapa.\nasync function refreshSnapshot(){\n  if(SESS.stage!=='main' || SESS.snapBusy) return;\n  SESS.snapBusy=true;\n  const prevRaw=SESS.snapshotRaw;\n  const pill=$('#liveState'); if(pill){ pill.classList.add('busy'); pill.textContent='◌ atualizando snapshot…'; }\n  loader(true,'buscando o snapshot mais recente…');\n  let ok=false;\n  try{\n    const p=await resolveSnapshotPin();\n    if(!p.snapshotRaw) throw new Error('não foi possível resolver DT_HISTORICO');\n    const same=String(p.snapshotRaw)===String(prevRaw);\n    SESS.snapshotRaw=p.snapshotRaw; SESS.snapshotSyncedAt=p.syncedAt; SESS.snapLiteral=p.snapLiteral; SESS.eloMaxCycle=p.eloMaxCycle;\n    await loadSectors();   // the sector list follows the live max, so it can have moved too\n    if(same){\n      $('#ds').textContent=`snapshot já era o mais recente · atualizado em ${fmtSyncedAt(p.syncedAt)} — nada recalculado`;\n    } else if(SESS.timeline.length){\n      SESS.dirtyFrom=null;\n      SESS.sectorBaseCache={};   // baselines come from the snapshot, so every one of them changed\n      loader(true,'snapshot novo — recalculando a timeline…');\n      await recomputeFrom(0);\n      $('#ds').textContent=`snapshot atualizado em ${fmtSyncedAt(p.syncedAt)} · ${fmt(SESS.timeline.length)} etapa(s) recalculada(s)`;\n    } else {\n      $('#ds').textContent=`snapshot atualizado em ${fmtSyncedAt(p.syncedAt)}`;\n    }\n    $('#ds').classList.remove('err');\n    ok=true;\n  }catch(e){\n    const at=(SESS.dirtyFrom==null?null:SESS.dirtyFrom+1);\n    $('#ds').textContent='erro ao atualizar o snapshot'+(at?` na etapa ${at} — etapa ${at} em diante ficou desatualizada (⟳)`:'')+': '+e.message;\n    $('#ds').classList.add('err');\n  }finally{\n    SESS.snapBusy=false;\n    if(pill) pill.classList.remove('busy');\n    loader(false); renderAll();\n    if(ok) setTimeout(()=>{ const d=$('#ds'); if(d&&!d.classList.contains('err')) d.textContent=''; },7000);\n  }\n}\n\n// ---------- session options ----------\nfunction previewDest(mv,rule,minCbs){\n  if(!mv||!mv.allowedRaw||!mv.munis) return null;\n  const w={}; let relaxed=false;\n  const cbsOf=m=>(mv.cbsByMuni&&mv.cbsByMuni[m]!=null)?mv.cbsByMuni[m]:((mv.munis[m]&&mv.munis[m].cbs)||0);\n  const add=m=>Object.entries(mv.allowedRaw[m]||{}).forEach(([s,v])=>{ w[s]=(w[s]||0)+v; });\n  // allowedRaw only carries municipalities already inside the sector's dominance base, so there is\n  // nothing left to filter out here beyond the destination rule itself.\n  Object.keys(mv.allowedRaw).forEach(m=>{ const cbs=cbsOf(m);\n    if(rule==='dominant'&&cbs<minCbs) return; add(m); });\n  if(rule==='dominant'&&!Object.keys(w).length){ Object.keys(mv.allowedRaw).forEach(add); relaxed=true; }\n  return {dest:Object.keys(w).sort((a,b)=>w[b]-w[a]).slice(0,6),relaxed};\n}\nfunction readOptForm(){\n  const r=root.querySelector('input[name=\"destRule\"]:checked');\n  let n=Math.round(+$('#optMinCbs').value);\n  if(!(n>0)) n=DEFAULT_SETTINGS.destMinCbs;\n  return {destRule:(r&&r.value)||DEFAULT_SETTINGS.destRule, destMinCbs:n,\n          targetSpan:numOrNull($('#optTargetSpan').value),\n          maxSpan:numOrNull($('#optMaxSpan').value),\n          minSpan:numOrNull($('#optMinSpan').value)};\n}\nfunction spanFormError(f){\n  if(f.minSpan&&f.maxSpan&&f.minSpan>f.maxSpan) return `Span mínimo (${fmt(f.minSpan)}) não pode ser maior que o máximo (${fmt(f.maxSpan)}).`;\n  if(f.targetSpan&&f.maxSpan&&f.targetSpan>f.maxSpan) return `Span alvo (${fmt(f.targetSpan)}) não pode passar do máximo (${fmt(f.maxSpan)}).`;\n  if(f.targetSpan&&f.minSpan&&f.targetSpan<f.minSpan) return `Span alvo (${fmt(f.targetSpan)}) não pode ficar abaixo do mínimo (${fmt(f.minSpan)}).`;\n  return '';\n}\nfunction renderOptPreview(){\n  const el=$('#optPreview'); if(!el) return;\n  const f=readOptForm();\n  root.querySelectorAll('.opt-row').forEach(r=>{\n    if(r.dataset.r!=null) r.classList.toggle('on',r.dataset.r===f.destRule);\n  });\n  const wrap=$('#optMinCbsWrap'); if(wrap) wrap.classList.toggle('off',f.destRule!=='dominant');\n  const err=spanFormError(f), ee=$('#optSpanErr');\n  if(ee){ ee.textContent=err; ee.classList.toggle('hidden',!err); }\n  const ap=$('#optApply'); if(ap) ap.disabled=!!err;\n  const mv=SESS.timeline[SESS.selected];\n  // Prévia inteira é sobre conceitos de setor (ponte por município, span alvo/máx/mín) que não\n  // existem em GV/mercado — mostrar aqui só confundiria com números que não valem nada.\n  if(mv && (mv.level||'setor')!=='setor'){ el.innerHTML=''; return; }\n  if(!mv||!mv.munis){ el.innerHTML='Nenhuma etapa calculada ainda — as regras passam a valer no próximo fechamento.'; return; }\n  const cbsOf=m=>(mv.cbsByMuni&&mv.cbsByMuni[m]!=null)?mv.cbsByMuni[m]:((mv.munis[m]&&mv.munis[m].cbs)||0);\n  const ms=Object.keys(mv.geoFeat||{});\n  const ig=f.destRule==='dominant'?ms.filter(m=>cbsOf(m)<f.destMinCbs):[];\n  const pv=previewDest(mv,f.destRule,f.destMinCbs);\n  let h=`<b style=\"color:var(--ink)\">Prévia — etapa ${SESS.selected+1}, setor ${mv.sector}</b><br>`;\n  const exN=(mv.excludedMunis||[]).length;\n  if(exN) h+=`Base de dominantes: <b>${fmt(ms.length)}</b> município(s) no mapa · <span style=\"color:var(--closing)\">${fmt(exN)} fora da base — ${fmt(mv.excludedCbs||0)} CBs seguem suas líderes</span><br>`;\n  h+=`${fmt(ms.length-ig.length)} de ${fmt(ms.length)} município(s) valem como ponte`;\n  if(ig.length) h+=` · <span style=\"color:var(--closing)\">ignorados:</span> ${ig.slice(0,8).join(', ')}${ig.length>8?' +'+(ig.length-8):''}`;\n  if(pv){\n    h+=`<br>Setores destino com esta regra: <b style=\"color:var(--ink)\">${pv.dest.join(', ')||'–'}</b>`;\n    const cur=(mv.dest||[]).join(', ');\n    if(pv.dest.join(',')!==(mv.dest||[]).join(',')) h+=` <span style=\"color:var(--closing)\">(hoje: ${cur||'–'})</span>`;\n    if(pv.relaxed) h+=`<br><b style=\"color:var(--closing)\">⚠ nenhum município dominante nesta etapa — a regra relaxa pra \"qualquer município\" pra não deixar a etapa sem destino.</b>`;\n  }\n  if(f.targetSpan||f.maxSpan||f.minSpan){\n    const sp=spanMapFor(mv,mv.assign||{}), v=spanViolationsOf(sp,{target:f.targetSpan,max:f.maxSpan,min:f.minSpan});\n    h+=`<br><br>Span dos destinos como está hoje: ${mv.dest.map(s=>s+' <b>'+fmt(sp[s])+'</b>').join(' · ')||'–'}`;\n    if(v.over.length||v.under.length) h+=`<br><span style=\"color:var(--closing)\">Fora dos limites: ${[...v.over.map(s=>s+' ▲ acima do máx'),...v.under.map(s=>s+' ▼ abaixo do mín')].join(', ')}</span> — o modelo ÓTIMO tenta corrigir no recálculo.`;\n    else h+=` <span style=\"color:var(--ok)\">— já dentro dos limites</span>`;\n  }\n  if(SESS.timeline.length) h+=`<br><span style=\"margin-top:4px;display:inline-block\">Aplicar <b>recalcula as ${fmt(SESS.timeline.length)} etapa(s)</b> contra o snapshot congelado — os destinos ajustados à mão serão refeitos pelo modelo ÓTIMO.</span>`;\n  el.innerHTML=h;\n}\nfunction openOptions(){\n  const st={...DEFAULT_SETTINGS,...(SESS.settings||{})};\n  root.querySelectorAll('input[name=\"destRule\"]').forEach(r=>{ r.checked=(r.value===st.destRule); });\n  $('#optMinCbs').value=st.destMinCbs;\n  $('#optTargetSpan').value=st.targetSpan||'';\n  $('#optMaxSpan').value=st.maxSpan||'';\n  $('#optMinSpan').value=st.minSpan||'';\n  $('#optApply').disabled=false;\n  $('#optSessName').textContent=SESS.sessionLabel||'sessão não salva';\n  $('#optStatus').textContent='';\n  $('#optionsBg').classList.remove('hidden');\n  renderOptPreview();\n  const c=$('#optCancel'); if(c) c.focus();\n}\nfunction closeOptions(){ const b=$('#optionsBg'); if(b) b.classList.add('hidden'); }\nasync function applyOptions(){\n  const f=readOptForm();\n  if(spanFormError(f)) return;\n  const prev={...DEFAULT_SETTINGS,...(SESS.settings||{})};\n  const changed = prev.destRule!==f.destRule\n    || (f.destRule==='dominant' && prev.destMinCbs!==f.destMinCbs)\n    || numOrNull(prev.targetSpan)!==f.targetSpan\n    || numOrNull(prev.maxSpan)!==f.maxSpan\n    || numOrNull(prev.minSpan)!==f.minSpan;\n  SESS.settings={...prev,...f};\n  closeOptions();\n  if(!changed || !SESS.timeline.length){ renderAll(); return; }\n  SESS.dirtyFrom=null;\n  SESS.sectorBaseCache={};   // the recompute re-derives every baseline; keeping the old ones would\n                             // leave \"Impacto acumulado\" comparing against pre-change numbers\n  loader(true,'aplicando nova regra de destino — recalculando timeline…');\n  try{\n    await recomputeFrom(0);\n    $('#ds').textContent=''; $('#ds').classList.remove('err');\n  }catch(e){\n    const at=(SESS.dirtyFrom==null?0:SESS.dirtyFrom)+1;\n    $('#ds').textContent=`erro ao aplicar a regra na etapa ${at}: ${e.message} — etapa ${at} em diante ficou desatualizada (⟳)`;\n    $('#ds').classList.add('err');\n  }finally{ loader(false); renderAll(); }\n}\n\nconst SHARED_DS='timeline-shared-sessionsDataSet';\nconst AUTH_REF='timelineSimAuthFinal';   // single source of truth for the auth strategy reference\nlet SHARE={busy:false,url:null,last:null};\n// Serialise a PRESENTATION model, not the raw session, so the reader stays purely presentational\n// and never re-derives spans/desloc/orphans — no second copy of this engine to keep in sync.\n// NOTE: METRICS_DEF[2] is the money marker; read it as !!md[2] (a literal dollar sign in this\n// position trips the upsert's parse check).\nfunction buildShareStages(){\n  return SESS.timeline.map((mv,i)=>{\n    const c=computeDerived(mv);\n    const incBy={};\n    mv.dest.forEach(s=>{ incBy[s]=Object.fromEntries(METRICS_DEF.map(md=>[md[0],0])); });\n    Object.entries(mv.munis).forEach(([m,o])=>{\n      if(m==='__OUTROS__') return;\n      const s=mv.assign[m]; if(!s||!incBy[s]) return;\n      METRICS_DEF.forEach(md=>{ incBy[s][md[0]]+=o[md[0]]||0; });\n    });\n    const saiTot={};\n    METRICS_DEF.forEach(md=>{\n      const k=md[0];\n      saiTot[k]=Object.entries(mv.munis).filter(([m])=>m!=='__OUTROS__').reduce((a,p)=>a+((p[1][k])||0),0);\n    });\n    // orphans follow their leader's home: they enter that sector AND leave the closing one\n    c.leaders.forEach(L=>{\n      const om=mv.orphanMetricsByGroup&&mv.orphanMetricsByGroup[L.grupo];\n      if(!om||!L.home) return;\n      METRICS_DEF.forEach(md=>{ const k=md[0];\n        if(incBy[L.home]) incBy[L.home][k]+=om[k]||0;\n        saiTot[k]+=om[k]||0; });\n    });\n    const ms=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__').sort((a,b)=>mv.munis[b].cbs-mv.munis[a].cbs);\n    const sv=mv.dest.map(s=>c.span[s]);\n    const baseOf=(s,k)=>{ const b=mv.baseMetrics[s]||{}; return +(b[k]||0); };\n    return {\n      i:i, sector:mv.sector, level:mv.level||'setor', unitOfMuni:mv.unitOfMuni||{}, policy:mv.policy, domUF:mv.domUF,\n      optTier:(mv.optTier==null?0:mv.optTier),\n      destRuleFallback:!!mv.destRuleFallback,\n      dest:mv.dest.slice(), color:Object.assign({},mv.color), assign:Object.assign({},mv.assign),\n      kpis:{ cbsRealocadas:closingCbsOf(mv), desloc:c.desloc,\n             spread:(sv.length?Math.max.apply(null,sv)-Math.min.apply(null,sv):0),\n             municipios:ms.length, lideres:mv.leaders.length },\n      destinos:mv.dest.map(s=>({ s:s, base:baseOf(s,'cbs'), inc:c.inc[s]||0, orph:c.orph[s]||0, span:c.span[s]||0, gained:c.gained[s]||0 })),\n      municipios:ms.map(m=>(mv.level&&mv.level!=='setor')?{ nome:m, uf:'', cbs:mv.munis[m].cbs, destino:mv.assign[m]||null }:{ nome:mName(m), uf:mUf(m), cbs:mv.munis[m].cbs, destino:mv.assign[m]||null }),\n      excluidos:(mv.excludedMunis||[]).map(x=>({ muni:x.muni, cbs:x.cbs })),\n      orphanTotal:c.orphanTotal||0, orphanStranded:c.orphanStranded||0, noShapeCbs:mv.noShapeCbs||0,\n      lideres:c.leaders.map(L=>({ lider:(L.lider||'').split(' ').slice(0,2).join(' '), grupo:L.grupo,\n        total:L.total, home:L.home, desloc:L.desloc, orphan:L.orphan||0 })),\n      metricas:METRICS_DEF.map(md=>{ const k=md[0];\n        return { key:k, label:md[1], money:!!md[2],\n          rows:mv.dest.map(s=>({ s:s, antes:baseOf(s,k), depois:baseOf(s,k)+((incBy[s]&&incBy[s][k])||0) })),\n          sai:saiTot[k]||0 }; }),\n      geoFeat:mv.geoFeat, nbrFeat:mv.nbrFeat, excludedFeat:[]\n    };\n  });\n}\nfunction buildShareSummary(stages){\n  const world=foldWorldState(SESS.timeline,SESS.timeline.length);\n  const receivers=[];\n  SESS.timeline.forEach((mv,i)=>{\n    const own=mv.pureOwnMetrics||{};\n    receivers.push({ s:mv.sector, situacao:'fechado (etapa '+(i+1)+')', antes:+(own.cbs||0), depois:0 });\n  });\n  const seen={};\n  Object.values(world.muniOverride).forEach(s=>{\n    if(seen[s]) return; seen[s]=1;\n    const base=SESS.sectorBaseCache[s]||{}, infl=world.sectorInflow[s]||{};\n    receivers.push({ s:s, situacao:'recebeu território', antes:+(base.cbs||0), depois:(+(base.cbs||0))+(infl.cbs||0) });\n  });\n  return { stages:stages.length, sectors:SESS.timeline.map(mv=>mv.sector),\n    totalCbs:stages.reduce((a,s)=>a+(s.kpis.cbsRealocadas||0),0),\n    totalDesloc:stages.reduce((a,s)=>a+(s.kpis.desloc||0),0), receivers:receivers };\n}\nfunction renderShareBody(){\n  const el=$('#shareBody'); if(!el) return;\n  const go=$('#shareGo'), cp=$('#shareCopy'), op=$('#shareOpen'), cc=$('#shareCancel');\n  if(SHARE.url){\n    el.innerHTML=`<div class=\"opt-note\" style=\"margin-top:0\"><b style=\"color:var(--ink)\">Sessão compartilhada ✓</b><br>\n      Link de leitura desta simulação congelada. Quem abrir precisa ter login no simulador.\n      <div class=\"shareurl\">${esc(SHARE.url)}</div></div>`;\n    if(go) go.classList.add('hidden');\n    if(cp) cp.classList.remove('hidden');\n    if(op) op.classList.remove('hidden');\n    if(cc) cc.textContent='Fechar';\n    return;\n  }\n  if(go) go.classList.remove('hidden');\n  if(cp) cp.classList.add('hidden');\n  if(op) op.classList.add('hidden');\n  if(cc) cc.textContent='Cancelar';\n  const st={...DEFAULT_SETTINGS,...(SESS.settings||{})};\n  const desloc=SESS.timeline.reduce((a,mv)=>a+(mv.munis?computeDerived(mv).desloc:0),0);\n  const destTxt=st.destRule==='dominant'?('dominantes ≥'+fmt(st.destMinCbs)+' CBs'):'qualquer município';\n  el.innerHTML=`<div class=\"opt-lbl\">Confirmar compartilhamento</div>\n    <div class=\"opt-sub\">Publica uma <b>cópia congelada</b> desta sessão, exatamente no estado atual.</div>\n    <div class=\"opt-note\" style=\"margin-top:0\">\n      · <b>${fmt(SESS.timeline.length)}</b> etapa(s) — ${esc(SESS.timeline.map(mv=>mv.sector).join(' → '))}<br>\n      · snapshot atualizado em <b>${esc(fmtSyncedAt(SESS.snapshotSyncedAt))}</b><br>\n      · base: <b>municípios dominantes (CSV)</b> · destino: <b>${esc(destTxt)}</b> · span: <b>${esc(spanShort(st))}</b><br>\n      · <b>${fmt(desloc)}</b> CBs deslocadas somando a cadeia\n    </div>\n    <div class=\"opt-note\">A cópia <b>não</b> acompanha edições posteriores desta sessão — pra atualizar, compartilhe de novo e use o link novo. O link exige login no simulador; não é público.</div>\n    ${SHARE.last?`<div class=\"opt-note\"><b style=\"color:var(--ink)\">Último link gerado nesta sessão</b> — aponta pro estado de <b>antes</b> das edições feitas depois dele.<div class=\"shareurl\">${esc(SHARE.last)}</div></div>`:''}`;\n}\nasync function openShare(){\n  if(!SESS.timeline.length){ $('#ds').textContent='nada pra compartilhar — feche pelo menos um setor primeiro.'; $('#ds').classList.add('err'); return; }\n  await flushDirty();\n  SHARE.url=null;\n  const s=$('#shareStatus'); if(s){ s.textContent=''; s.classList.remove('err'); }\n  renderShareBody();\n  $('#shareBg').classList.remove('hidden');\n  const b=$('#shareCancel'); if(b) b.focus();\n}\nfunction closeShare(){ const b=$('#shareBg'); if(b) b.classList.add('hidden'); }\nasync function doShare(){\n  if(SHARE.busy) return;\n  const go=$('#shareGo'), stx=$('#shareStatus');\n  SHARE.busy=true;\n  if(go){ go.disabled=true; go.textContent='Compartilhando…'; }\n  if(stx){ stx.textContent=''; stx.classList.remove('err'); }\n  try{\n    // Resolved as a GLOBAL PROCESS, not a declared param — which only works because the block\n    // instance on the `main` artboard binds `sharedDataset: @timeline-shared-sessionsDataSet`.\n    // That binding is load-bearing: a Process is only define()d once something on the rendering\n    // tree references it, so without it this lookup returns null and sharing dies on the guard\n    // below. Do NOT remove the instance param because this file never reads d2.params.sharedDataset.\n    const ds=d2.data(SHARED_DS);\n    if(!ds) throw new Error('dataset de sessões compartilhadas indisponível');\n    await flushDirty();\n    const stages=buildShareStages();\n    const summary=buildShareSummary(stages);\n    let who='';\n    try{ const a=d2.auth(AUTH_REF); who=(a&&a.user&&(a.user.email||a.user.nome))||''; }catch(e){}\n    const created=await ds.create({\n      label:SESS.sessionLabel||('Sessão '+new Date().toLocaleString('pt-BR')),\n      snapshotRaw:SESS.snapshotRaw, snapshotSyncedAt:SESS.snapshotSyncedAt,\n      settings:{...DEFAULT_SETTINGS,...(SESS.settings||{})},\n      stages:stages, summary:summary, sharedBy:who, sharedAt:new Date().toISOString()\n    });\n    const id=(created&&created._id)||(created&&created.data&&created.data._id)||(ds.selected&&ds.selected()&&ds.selected()._id)||null;\n    if(!id) throw new Error('registro gravado, mas sem _id na resposta — não foi possível montar o link');\n    SHARE.url=window.location.origin+'/sessions/'+id;\n    SHARE.last=SHARE.url;\n    renderShareBody();\n  }catch(e){\n    if(stx){ stx.textContent='erro ao compartilhar: '+e.message; stx.classList.add('err'); }\n  }finally{\n    SHARE.busy=false;\n    if(go){ go.disabled=false; go.textContent='Compartilhar'; }\n  }\n}\n\n// ---------- rendering ----------\nfunction renderTimeline(){\n  const el=$('#movementChips'); if(!el) return;\n  if(!SESS.timeline.length){ el.innerHTML='<span class=\"empty\">Nenhuma etapa ainda — use \"Adicionar movimentação\" à direita.</span>'; return; }\n  el.innerHTML=SESS.timeline.map((mv,i)=>{\n    const ready=mv.dest!==undefined;\n    const c=ready?computeDerived(mv):null;\n    const stale=SESS.dirtyFrom!=null && i>=SESS.dirtyFrom;\n    return `<div class=\"tchip ${i===SESS.selected?'on':''} ${stale?'stale':''}\" data-i=\"${i}\">\n      <span class=\"tnum\">${i+1}</span><span class=\"tsec\">${LEVELS[mv.level||'setor'].label} ${mv.sector}</span>\n      <span class=\"tstat\">${ready?((mv.level||'setor')==='setor'?fmt(c.desloc)+' desloc.':fmt(closingCbsOf(mv))+' CBs'):'…'}</span>\n      ${stale?'<span class=\"tstale\" title=\"recalcula ao selecionar outra etapa\">⟳</span>':''}\n      <span class=\"trm\" data-rm=\"${i}\" title=\"remover esta etapa e as seguintes\">✕</span>\n    </div>`;\n  }).join('');\n  el.querySelectorAll('.tchip').forEach(ch=>{\n    ch.addEventListener('click',async (e)=>{\n      if(e.target.dataset.rm!=null && e.target.dataset.rm!==''){ removeFrom(+e.target.dataset.rm); return; }\n      const i=+ch.dataset.i;\n      if(i!==SESS.selected) await flushDirty();\n      SESS.selected=i; renderAll();\n    });\n  });\n}\nfunction renderRuleNote(){\n  const el=$('#ruleNote'); if(!el) return;\n  const st={...DEFAULT_SETTINGS,...(SESS.settings||{})};\n  const mv=SESS.timeline[SESS.selected];\n  const lvl=LEVELS[(mv&&mv.level)||'setor'];\n  let h='';\n  if(!mv || (mv.level||'setor')==='setor'){\n    h+=`<b style=\"color:var(--ink)\">Base de municípios dominantes:</b> só os municípios que a base (CSV) atribui ao setor entram no mapa e na alocação`;\n    if(mv&&mv.domCsvMunis) h+=` · <b>${fmt(mv.domCsvMunis)}</b> na base do setor ${mv.sector}`;\n    if(mv&&mv.excludedCbs) h+=` · <b style=\"color:var(--closing)\">${fmt(mv.excludedMunis.length)} município(s) / ${fmt(mv.excludedCbs)} CBs</b> fora da base nesta etapa — não aparecem no mapa e as CBs seguem suas líderes (quebra de vínculo)`;\n  } else {\n    // GV/mercado não têm spillover (todo setor pertence a exatamente uma GV/mercado na base), então\n    // não existe \"excluído\" pra reportar aqui — só o tamanho da base e em quantas unidades ela se agrupa.\n    h+=`<b style=\"color:var(--ink)\">Base de ${lc(lvl.childLabel)}s dominantes:</b> ${mv.domCsvMunis!=null?`<b>${fmt(mv.domCsvMunis)}</b> município(s) `:''}na base ${lvl.de} ${lc(lvl.label)} ${mv.sector}, agrupados em <b>${fmt(Object.keys(mv.unitMunis||{}).length)}</b> ${lc(lvl.childLabel)}(s)`;\n  }\n  if(DOM.error) h+=` · <b style=\"color:var(--closing)\">⚠ base indisponível: ${esc(DOM.error)}</b>`;\n  h+=`<br>`;\n  h+=`<b style=\"color:var(--ink)\">Regra de destino:</b> `;\n  h+= st.destRule==='dominant'\n    ? `só municípios com <b>≥${fmt(st.destMinCbs)} CBs</b> trazem ${lc(lvl.destLabel)} pra lista de destinos`\n    : `qualquer município ${lvl.de} ${lc(lvl.label)} fechad${lvl.a==='à'?'a':'o'} vale como ponte <span style=\"opacity:.7\">(padrão)</span>`;\n  if(mv&&st.destRule==='dominant'){\n    // A ponte é sempre por MUNICÍPIO, em qualquer nível — mv.ignoredBridges já é a lista definitiva\n    // que computeMovement calculou, então lê-la aqui em vez de recalcular contra mv.munis, que em\n    // GV/mercado está no grão de setor/GV e daria o número errado.\n    const ig=mv.ignoredBridges||[];\n    if(ig.length) h+=` · <b style=\"color:var(--closing)\">${fmt(ig.length)}</b> ignorado(s) como ponte (ainda redistribuído(s)): ${ig.slice(0,5).join(', ')}${ig.length>5?' +'+(ig.length-5):''}`;\n    if(mv.destRuleFallback) h+=`<br><b style=\"color:var(--closing)\">⚠ nenhum município dominante nesta etapa — regra relaxada pra \"qualquer município\".</b>`;\n  }\n  el.innerHTML=h;\n}\nfunction renderSpanRule(){\n  const el=$('#spanRule'); if(!el) return;\n  const mv=SESS.timeline[SESS.selected], lim=spanLimits(mv);\n  if(!mv||!mv.munis||mv.view==='asis'||!spanLimitsOn(lim)){ el.innerHTML=''; return; }\n  const sp=spanMapFor(mv,mv.assign||{}), v=spanViolationsOf(sp,lim);\n  const bits=[];\n  if(lim.target) bits.push(`alvo <b>${fmt(lim.target)}</b>`);\n  if(lim.max) bits.push(`máx <b>${fmt(lim.max)}</b>`);\n  if(lim.min) bits.push(`mín <b>${fmt(lim.min)}</b>`);\n  let h=`Pré-requisito de span: ${bits.join(' · ')} CBs — `;\n  if(v.over.length||v.under.length){\n    h+=`<b style=\"color:var(--closing)\">⚠ `;\n    if(v.over.length) h+=`acima do máximo: ${v.over.map(s=>s+' ('+fmt(sp[s])+')').join(', ')}`;\n    if(v.over.length&&v.under.length) h+=' · ';\n    if(v.under.length) h+=`abaixo do mínimo: ${v.under.map(s=>s+' ('+fmt(sp[s])+')').join(', ')}`;\n    h+=`</b>`;\n    if(mv.optTier===1) h+=`<br><span style=\"opacity:.85\">Nenhuma alocação conectada respeita o span mínimo nesta etapa — o modelo relaxou essa exigência.</span>`;\n    else if(mv.optTier===2) h+=`<br><span style=\"opacity:.85\">Nenhuma alocação conectada respeita os limites nesta etapa — o modelo relaxou essa exigência.</span>`;\n    else if(mv.optTier===-1) h+=`<br><span style=\"opacity:.85\">Etapa resolvida por heurística — os limites não são garantidos.</span>`;\n  } else h+=`<b style=\"color:var(--ok)\">✓ todos os setores receptores dentro dos limites</b>`;\n  el.innerHTML=`<div class=\"note\" style=\"margin:-2px 0 6px\">${h}</div>`;\n}\nfunction renderContig(){const mv=SESS.timeline[SESS.selected];const el=$('#contig');if(!el||!mv)return;\n  if(mv.view==='asis'){el.innerHTML='';return;}\n  const lvl=LEVELS[mv.level||'setor'];\n  // Indicador de conectividade geográfica só se aplica a fechamento de setor — ver contigBadFor.\n  if((mv.level||'setor')!=='setor'){ el.innerHTML=''; return; }\n  const bad=contigBadFor(mv,mv.assign);\n  el.innerHTML=bad.length\n    ?`<div class=\"note\" style=\"color:var(--closing);font-weight:600;margin:-2px 0 6px\">⚠ Território desconectado em ${bad.join(', ')} — ${lc(lvl.childLabel)}(s) desconectado(s) do território ${lvl.de} ${lc(lvl.label)}. Use ★ ÓTIMO ou reassocie no mapa.</div>`\n    :`<div class=\"note\" style=\"color:var(--ok);margin:-2px 0 6px\">✓ Sem quebras — cada ${lc(lvl.label)} forma uma região conectada.</div>`;\n}\nfunction closingCbsOf(mv){ return Object.entries(mv.munis).filter(([m])=>m!=='__OUTROS__').reduce((a,[,o])=>a+o.cbs,0); }\nfunction sectorTotalCbs(mv){ return Object.values(mv.munis).reduce((a,o)=>a+o.cbs,0); }\nfunction renderKpis(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const c=computeDerived(mv); const lvl=LEVELS[mv.level||'setor'];\n  const childPlural=lvl.childLabel==='Setor'?'Setores':(lvl.childLabel==='GV'?'GVs':'Municípios');\n  if(mv.view==='asis'){const mc=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__').length;\n    $('#kpis').innerHTML=[\n      {n:fmt(sectorTotalCbs(mv)),l:`CBs ${lvl.no} ${lc(lvl.label)} ${mv.sector} (antes desta etapa)`,t:`Total de CBs ${lvl.no} ${lc(lvl.label)} hoje — já considerando o que etapas anteriores da timeline mandaram pra cá.`},\n      {n:mv.csvMunisTotal?`${fmt(mc)}/${fmt(mv.csvMunisTotal)}`:fmt(mc),l:`${childPlural} ${lvl.de} ${lc(lvl.label)}`,t:`${lvl.childLabel}(s) desenhados nesta etapa${mv.csvMunisTotal?` de ${fmt(mv.csvMunisTotal)} que a base de dominantes atribui ${lvl.a} ${lc(lvl.label)}`:''}.${(mv.missingMunis||[]).length?' Fora do mapa: '+mv.missingMunis.map(x=>x.muni+' ('+x.reason+')').join(' · '):''}${Object.keys(mv.ufGuessed||{}).length?' UF inferida da UF dominante do setor (nome repetido em outra UF carregada): '+Object.entries(mv.ufGuessed).map(([nm,u])=>nm+'→'+u).join(', '):''}`},\n      {n:fmt(mv.leaders.length),l:'Líderes (grupos)',t:`Líderes presentes ${lvl.no} ${lc(lvl.label)} nesta etapa.`},\n      {n:fmt(mv.dest.length),l:`${lvl.destLabel}s adjacentes`,t:`${lvl.destLabel}s vizinh${lvl.destLabel==='GV'?'as':'os'} (ainda abertas)${lvl.parentPhrase?` ${lvl.parentPhrase}`:''}${mv.gv?` (${mv.gv})`:''} que poderiam receber os ${lc(lvl.childLabel)}s.${(mv.gvRejected||[]).length&&lvl.parentWord?' Fora do mapa, por serem de outr'+(lvl.parentWord==='gerência'?'a':'o')+' '+lvl.parentWord+': '+mv.gvRejected.join(', ')+'.':''}`},\n    ].map(k=>`<div class=\"kpi\" title=\"${k.t}\"><div class=\"n\">${k.n}</div><div class=\"l\">${k.l}</div></div>`).join('');\n    return;}\n  const sv=mv.dest.map(s=>c.span[s]);const spread=sv.length?Math.max(...sv)-Math.min(...sv):0;\n  const zero=mv.dest.filter(s=>c.gained[s]===0);const totCbs=closingCbsOf(mv);\n  $('#kpis').innerHTML=[\n    // \"CBs fora do X\" só faz sentido pra fechamento de setor — a mecânica de vínculo (CBs que\n    // seguem a líder pra fora do território) é uma coisa de setor/orphan, não de GV/mercado.\n    (mv.level||'setor')==='setor'?{n:fmt(c.desloc),l:mv.policy==='fora'?`CBs fora ${lvl.de} ${lc(lvl.destLabel)}`:'CBs c/ quebra de relação',cls:'warn',t:`CBs cuja líder acabou noutr${lvl.a==='à'?'a':'o'} ${lc(lvl.destLabel)} nesta etapa.`}:null,\n    {n:fmt(spread),l:'Desequilíbrio (máx−mín CBs)',cls:spread>800?'warn':'ok',t:`Diferença de tamanho entre ${lvl.destLabel==='GV'?'a maior e a menor':'o maior e o menor'} ${lc(lvl.destLabel)} depois desta etapa.`},\n    {n:fmt(totCbs),l:'CBs realocadas',cls:'',t:`Total de CBs ${lvl.de} ${lc(lvl.label)} ${mv.sector} sendo redistribuídas nesta etapa.`},\n    (mv.level||'setor')==='setor'?{n:zero.length?zero.join(', '):'nenhum',l:`${lvl.destLabel} sem líder herdada`,cls:zero.length?'warn':'ok',t:`${lvl.destLabel} que recebe ${lc(lvl.childLabel)}(s) mas nenhuma líder nesta etapa.`}:null,\n  ].filter(Boolean).concat(mv.excludedCbs?[{n:fmt(mv.excludedCbs),l:`CBs fora do setor · ${fmt(mv.excludedMunis.length)} município(s) fora da base`,cls:'warn',t:'CBs em municípios que a base de dominantes não atribui a este setor: ficam fora do mapa e da alocação geográfica e seguem a líder do seu grupo.'}]:[])\n   .concat((mv.missingMunis||[]).length?[{n:fmt(mv.missingMunis.length),l:`Município(s) da base fora do mapa · ${fmt(mv.csvMunisTotal)} na base`,cls:'warn',t:`A base de dominantes atribui ${fmt(mv.csvMunisTotal)} município(s) ao setor ${mv.sector} e ${fmt(mv.csvMunisTotal-mv.missingMunis.length)} chegaram ao mapa. Fora: ${mv.missingMunis.map(x=>x.muni+' — '+x.reason+(x.cbs?' ('+fmt(x.cbs)+' CBs)':'')).join(' · ')}`}]:[])\n   .map(k=>`<div class=\"kpi ${k.cls}\" title=\"${k.t}\"><div class=\"n\">${k.n}</div><div class=\"l\">${k.l}</div></div>`).join('');\n}\nfunction renderSpans(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const c=computeDerived(mv); const lvl=LEVELS[mv.level||'setor'];\n  if(mv.view==='asis'){const items=[{s:mv.sector,val:sectorTotalCbs(mv),color:CLOSE_COLOR}].concat(mv.dest.map(s=>({s,val:+(mv.baseMetrics[s]?.cbs||0),color:mv.color[s]})));\n    const max=Math.max(...items.map(x=>x.val),1);\n    $('#spans').innerHTML=items.map(x=>`<div class=\"bar-row\"><div class=\"tag\" style=\"color:${x.color}\">${x.s}</div><div class=\"bar-track\">\n      <div class=\"bar-inc\" style=\"width:${x.val/max*100}%;background:${x.color}\"></div></div>\n      <div class=\"bar-val\">${fmt(x.val)}</div></div>`).join('')\n      +`<div class=\"note\">Estrutura antes desta etapa — ${lvl.a} ${lc(lvl.label)} <b>${mv.sector}</b> ainda existe. Alterne pra <b>TOBE</b> pra ver a redistribuição.</div>`;\n    return;}\n  const lim=spanLimits(mv),on=spanLimitsOn(lim);\n  const rawMax=Math.max(...mv.dest.map(s=>c.span[s]),lim.target||0,lim.max||0,1);\n  const max=on?rawMax*1.04:rawMax;   // headroom so a marker sitting at the scale top stays visible\n  const marks='';\n  $('#spans').innerHTML=mv.dest.map(s=>{const base=+(mv.baseMetrics[s]?.cbs||0),i=c.inc[s];\n    const over=lim.max&&c.span[s]>lim.max,under=lim.min&&c.span[s]<lim.min;\n    return `<div class=\"bar-row\"><div class=\"tag\" style=\"color:${mv.color[s]}\">${s}</div><div class=\"bar-track\">\n      <div class=\"bar-base\" style=\"width:${base/max*100}%;background:${mv.color[s]}\"></div>\n      <div class=\"bar-inc\" style=\"width:${i/max*100}%;background:${mv.color[s]}\"></div>${marks}</div>\n      <div class=\"bar-val\" style=\"${over?'color:var(--closing);font-weight:700':(under?'color:#ff9500;font-weight:700':'')}\">${fmt(c.span[s])} <span style=\"opacity:.6\">(+${fmt(i)})</span>${over?' ▲':''}${under?' ▼':''}</div></div>`;}).join('')\n    +`<div class=\"note\">Claro = base (já incluindo etapas anteriores) · cheio = CBs entrantes ${lvl.de} ${mv.sector} nesta etapa.${c.orphanTotal?` Inclui <b>${fmt(c.orphanTotal-c.orphanStranded)}</b> CB(s) de municípios fora da base de dominantes que seguiram suas líderes.`:''}</div>`;\n}\n// Two very different reasons land rows in the __OUTROS__ bucket — no IBGE shape, or outside the\n// sector's dominance base. Same bucket computationally, but they must not read as the same thing.\nfunction outsideNote(mv){\n  const bits=[];\n  if(mv.noShapeCbs) bits.push(`<b>${fmt(mv.noShapeCbs)}</b> CBs em ${fmt(mv.noShapeMunis.length)} município(s) sem shape na UF`);\n  if(mv.excludedCbs) bits.push(`<b>${fmt(mv.excludedCbs)}</b> CBs em ${fmt(mv.excludedMunis.length)} município(s) <b>fora da base de dominantes</b> deste setor — <b style=\"color:var(--closing)\">quebra de vínculo</b>`);\n  if(!bits.length) return '';\n  let h=`<div class=\"note\">Fora do mapa e da alocação geográfica: ${bits.join(' · ')}.`;\n  if(mv.excludedCbs){\n    const c=computeDerived(mv);\n    h+=` As <b>${fmt(mv.excludedCbs)}</b> CBs em quebra de vínculo <b>seguem a líder do seu grupo</b>`;\n    const byS=mv.dest.filter(s=>c.orph[s]).map(s=>`<b style=\"color:${mv.color[s]}\">${s}</b> (${fmt(c.orph[s])})`);\n    h+=byS.length?`: ${byS.join(' · ')}.`:'.';\n    if(c.orphanStranded) h+=` <b style=\"color:var(--closing)\">${fmt(c.orphanStranded)} CB(s) sem destino</b> — a líder não ficou com nenhum município realocado, então não há setor pra seguir.`;\n  }\n  if(mv.noShapeCbs) h+=` As CBs sem shape na UF continuam fora de qualquer setor destino.`;\n  if(mv.excludedMunis&&mv.excludedMunis.length) h+=`<br><span style=\"opacity:.85\">${mv.excludedMunis.slice(0,8).map(x=>x.muni+' ('+fmt(x.cbs)+')').join(', ')}${mv.excludedMunis.length>8?' +'+(mv.excludedMunis.length-8):''}</span>`;\n  return h+`</div>`;\n}\nfunction renderMuni(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const lvl=LEVELS[mv.level||'setor'];\n  const plural=lvl.childLabel==='Setor'?'Setores':(lvl.childLabel==='GV'?'GVs':'Municípios');\n  const fem=lvl.childLabel==='GV';\n  const t=$('#muniListTitle'); if(t) t.textContent=`${plural} → ${lc(lvl.destLabel)} destino`;\n  const nt=$('#muniListNote'); if(nt) nt.innerHTML=`Clique no <b>código ${lvl.a} ${lc(lvl.destLabel)}</b> pra mandar ${lvl.a} ${lc(lvl.childLabel)} <b>inteir${fem?'a':'o'}</b> pra lá (regra de negócio). A cor acompanha o mapa.`;\n  const ms=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__').sort((a,b)=>mv.munis[b].cbs-mv.munis[a].cbs);\n  if(mv.view==='asis'){$('#muniList').innerHTML=ms.map(m=>`<div class=\"muni-item\"><div class=\"nm\">${m}</div><div class=\"ct\">${fmt(mv.munis[m].cbs)} CBs</div><span class=\"badge\" style=\"background:${CLOSE_COLOR};color:#fff;border-color:${CLOSE_COLOR}\">${lc(lvl.label)} ${mv.sector}</span></div>`).join('')\n      +`<div class=\"note\">Hoje tod${fem?'as':'os'} pertencem ${lvl.a} ${lc(lvl.label)} <b>${mv.sector}</b>. No <b>TOBE</b> cada um vira botões de destino.</div>`+outsideNote(mv);return;}\n  $('#muniList').innerHTML=ms.map(m=>`<div class=\"muni-item\"><div class=\"nm\">${m}</div><div class=\"ct\">${fmt(mv.munis[m].cbs)} CBs</div>\n    <div class=\"seg\" data-m=\"${m}\">${mv.dest.map(s=>`<button data-s=\"${s}\" class=\"${mv.assign[m]===s?'on':''}\" style=\"${mv.assign[m]===s?'background:'+mv.color[s]:''}\">${s}</button>`).join('')}</div></div>`).join('')\n    +outsideNote(mv);\n  $('#muniList').querySelectorAll('.seg button').forEach(b=>b.onclick=()=>{const m=b.parentElement.dataset.m,s=b.dataset.s;editSelected(m2=>{m2.assign[m]=s;});});\n}\nfunction renderLeaders(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const c=computeDerived(mv);\n  if(mv.view==='asis'){$('#leaders').innerHTML=`<thead><tr><th>Líder</th><th>Grupo</th><th>CBs</th><th>${LEVELS[mv.level||'setor'].label}</th></tr></thead><tbody>`\n    +mv.leaders.map(L=>`<tr><td>${(L.lider||'').split(' ').slice(0,2).join(' ')}</td><td>${L.grupo}</td><td>${fmt(L.total)}</td><td><span class=\"home\" style=\"background:${CLOSE_COLOR}\"></span>${mv.sector}</td></tr>`).join('')\n    +`<tr style=\"font-weight:700\"><td>TOTAL</td><td></td><td>${fmt(mv.leaders.reduce((a,L)=>a+L.total,0))}</td><td></td></tr></tbody>`;return;}\n  const showOrph=c.orphanTotal>0;\n  $('#leaders').innerHTML=`<thead><tr><th>Líder</th><th>CBs</th><th>Home</th>${mv.dest.map(s=>`<th>${s}</th>`).join('')}${showOrph?'<th title=\"CBs em municípios fora da base de dominantes que seguiram esta líder\">Fora do setor</th>':''}<th>Desloc.</th></tr></thead><tbody>`\n   +c.leaders.map(L=>`<tr><td>${(L.lider||'').split(' ').slice(0,2).join(' ')}</td><td>${fmt(L.total)}</td>\n     <td>${L.home?`<span class=\"home\" style=\"background:${mv.color[L.home]}\"></span>${L.home}`:'–'}</td>\n     ${mv.dest.map(s=>`<td class=\"cell\" style=\"${s===L.home?'color:'+mv.color[s]+';font-weight:700':''}\">${L.byS[s]||'·'}</td>`).join('')}\n     ${showOrph?`<td class=\"cell\" style=\"${L.orphan&&!L.orphanHome?'color:var(--closing);font-weight:700':''}\" title=\"${L.orphan?(L.orphanHome?'seguem a líder para o setor '+L.orphanHome:'sem home — CBs sem setor pra seguir'):''}\">${L.orphan?fmt(L.orphan)+(L.orphanHome?'':' ⚠'):'·'}</td>`:''}\n     <td style=\"color:${L.desloc?'var(--closing)':'var(--mut)'};font-weight:${L.desloc?700:400}\">${L.desloc||'0'}</td></tr>`).join('')\n   +`<tr style=\"font-weight:700\"><td>TOTAL</td><td>${fmt(c.leaders.reduce((a,L)=>a+L.total,0))}</td><td></td>${mv.dest.map(s=>`<td>${fmt(c.leaders.reduce((a,L)=>a+L.byS[s],0))}</td>`).join('')}${showOrph?`<td>${fmt(c.orphanTotal)}</td>`:''}<td style=\"color:var(--closing)\">${fmt(c.desloc)}</td></tr></tbody>`;\n}\nfunction renderMatrix(){const mv=SESS.timeline[SESS.selected]; if(!mv) return;\n  // Esta matriz cruza LINHAS DO CRM (município x grupo) — no fechamento de GV/mercado a unidade\n  // que troca de dono é setor/GV, não município, e reconstruir a matriz nesse grão é trabalho ainda\n  // não feito; mostrar a tabela como se fosse por município aqui daria linhas vazias sem avisar.\n  if((mv.level||'setor')!=='setor'){ $('#matrix').innerHTML=`<tr><td class=\"note\" style=\"padding:10px\">Matriz por município × grupo ainda não disponível pra fechamento de ${LEVELS[mv.level].label} — use os KPIs, líderes e plano de migração acima.</td></tr>`; return; }\n  const ms=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__').sort((a,b)=>mv.munis[b].cbs-mv.munis[a].cbs);\n  // `_out` is a flag stamped on the ROW, and rows are shared between etapas (absorbed + inherited\n  // orphans), so the last etapa to aggregate wins and reading it here can describe the wrong etapa.\n  // Derive the bucket from THIS mv instead. Summing rather than .find() because several out-municípios\n  // of the same group all collapse into __OUTROS__, and only the first was being counted.\n  const outOf=x=>!mv.geoFeat[mkey(x.municipio,x.uf)];\n  const cell=(m,g)=>mv.matrix.reduce((a,x)=>a+((((outOf(x)?'__OUTROS__':mkey(x.municipio,x.uf))===m)&&String(x.grupo)===g)?+x.cbs:0),0);\n  const mx=Math.max(...ms.flatMap(m=>mv.leaders.map(L=>cell(m,L.grupo))),1);\n  // No destination column here. This is the AS-IS matrix: every município in it still belongs to the\n  // closing sector, so showing where it is HEADED mixed the two states of the world in one table and\n  // made the ASIS view read like a plan. The destination lives on the map and in \"Municípios → setor\n  // destino\", which are about the to-be.\n  $('#matrix').innerHTML=`<thead><tr><th>Município</th>${mv.leaders.map(L=>`<th title=\"${L.lider}\">${L.grupo}</th>`).join('')}<th>Tot</th></tr></thead><tbody>`\n   +ms.map(m=>`<tr><td>${m}</td>`\n     +mv.leaders.map(L=>{const v=cell(m,L.grupo);return `<td class=\"cell\" style=\"${v?`background:rgba(229,181,63,${.08+v/mx*.5})`:''}\">${v||'·'}</td>`;}).join('')\n     +`<td style=\"font-weight:700\">${fmt(mv.munis[m].cbs)}</td></tr>`).join('')+`</tbody>`;\n}\n// TOBE counterpart of the AS-IS matrix: the same município × grupo grid plus the two columns the AS-IS\n// view deliberately refuses to carry — where the município ends up, and under which líder.\n// \"Líder resultante\" is the líder holding the most CBs in that município. A município is served by several\n// grupos at once and the data names no single owner, so the dominant one is the honest answer and its\n// share is printed beside it instead of being hidden behind a single name.\nfunction renderMatrixTobe(){const mv=SESS.timeline[SESS.selected]; const el=$('#matrixTobe'); const nt=$('#tobeNote');\n  if(!el) return;\n  if(!mv||!mv.munis){ el.innerHTML=''; if(nt) nt.innerHTML=''; return; }\n  if((mv.level||'setor')!=='setor'){ el.innerHTML=`<tr><td class=\"note\" style=\"padding:10px\">Matriz por município × grupo ainda não disponível pra fechamento de ${LEVELS[mv.level].label} — use os KPIs, líderes e plano de migração acima.</td></tr>`; if(nt) nt.innerHTML=''; return; }\n  const c=computeDerived(mv);\n  const homeOf={}; c.leaders.forEach(L=>{ homeOf[L.grupo]=L.home; });\n  const ms=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__').sort((a,b)=>mv.munis[b].cbs-mv.munis[a].cbs);\n  // One pass over the matrix instead of a scan per cell: the AS-IS table can afford the naive version\n  // on six municípios, but this one asks for the dominant líder too, which multiplies the lookups.\n  const outOf=x=>!mv.geoFeat[mkey(x.municipio,x.uf)];\n  const cellBy={}; mv.matrix.forEach(x=>{ const k=(outOf(x)?'__OUTROS__':mkey(x.municipio,x.uf))+'|'+String(x.grupo);\n    cellBy[k]=(cellBy[k]||0)+ +x.cbs; });\n  const cell=(m,g)=>cellBy[m+'|'+g]||0;\n  const mx=Math.max(...ms.flatMap(m=>mv.leaders.map(L=>cell(m,L.grupo))),1);\n  const domLeader=m=>{ let best=null,bc=0;\n    mv.leaders.forEach(L=>{ const v=cell(m,L.grupo); if(v>bc){ bc=v; best=L; } });\n    return best?{L:best,cbs:bc}:null; };\n  const short=L=>(L.lider||'').split(' ').slice(0,2).join(' ')||('grupo '+L.grupo);\n  // NOT named `rows` — that is the module-level Databricks response helper, and shadowing it inside a\n  // render function is a trap for whoever adds a query here later.\n  // Off-mismatch ainda calculado pra alimentar a nota abaixo da tabela — só não vira mais coluna: o\n  // destino agora é \"Setor destino\" por GRUPO no rodapé, não mais por município na grade.\n  const recs=ms.map(m=>{ const d=mv.assign[m]||null, dl=domLeader(m);\n    const home=dl?(homeOf[dl.L.grupo]||null):null;\n    return {m:m,off:!!(dl&&home&&d&&home!==d)}; });\n  el.innerHTML=`<thead><tr><th>Município</th>${mv.leaders.map(L=>`<th title=\"${esc(L.lider||'')}\">${L.grupo}<br><span style=\"font-weight:400;font-size:10px;color:var(--mut)\">${esc(short(L))}</span></th>`).join('')}<th>Tot</th></tr></thead><tbody>`\n   +ms.map(m=>`<tr><td>${m}</td>`\n     +mv.leaders.map(L=>{const v=cell(m,L.grupo);return `<td class=\"cell\" style=\"${v?`background:rgba(229,181,63,${.08+v/mx*.5})`:''}\">${v||'·'}</td>`;}).join('')\n     +`<td style=\"font-weight:700\">${fmt(mv.munis[m].cbs)}</td></tr>`).join('')\n   // Um rótulo de destino por GRUPO (coluna), não por município (linha) — cada grupo tem UM home\n   // fixo (computeDerived já calculou), então ele mora uma vez no rodapé, igual o nome já morava.\n   +`<tr class=\"lider-foot\"><td>Setor destino</td>`\n     +mv.leaders.map(L=>{const h=homeOf[L.grupo]; return `<td>${h?`<span class=\"home\" style=\"background:${mv.color[h]}\"></span>${h}`:'–'}</td>`;}).join('')\n     +`<td></td></tr>`\n   +`</tbody>`;\n  if(nt){\n    const offN=recs.filter(r=>r.off).length;\n    nt.innerHTML=(mv.policy!=='fora')\n      ? `Política <b>quebrar relação</b>: as CBs deixam a líder atual e passam à estrutura do setor destino — o rodapé mostra pra onde cada grupo vai.`\n      : `<b>Setor destino</b> = o setor que recebe a maior parte das CBs de cada líder (rodapé, uma vez por grupo). `\n        +(offN?`<span style=\"color:var(--closing)\">${fmt(offN)} município(s) ⚠</span> têm a líder dominante indo para um setor diferente do dela — as CBs seguem a líder (é disso que o KPI “CBs fora do setor” é feito).`\n          :`Em todos os municípios a líder dominante termina no mesmo setor que recebe o território.`);\n  }\n}\nfunction renderPolicy(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const c=computeDerived(mv); const lvl=LEVELS[mv.level||'setor'];\n  // O toggle fora-do-setor/quebra-de-relação é uma decisão de setor fechando — em GV/mercado a\n  // seção some inteira em vez de mostrar um controle que não corresponde a nada calculado.\n  const sec=$('#policySection'); if(sec) sec.classList.toggle('hidden',(mv.level||'setor')!=='setor');\n  if((mv.level||'setor')!=='setor') return;\n  $('#policyNote').innerHTML=mv.policy==='fora'\n    ?`<b style=\"color:var(--acc)\">Mantendo vínculo:</b> ${fmt(c.desloc)} CBs seguem com a líder mas ficam <b>fisicamente noutr${lvl.a==='à'?'a':'o'} ${lc(lvl.destLabel)}</b>. Preserva relação; suja geografia.`\n    :`<b style=\"color:var(--acc)\">Quebrando vínculo:</b> ${fmt(c.desloc)} CBs <b>re-vinculam a uma líder d${lvl.a==='à'?'a':'o'} ${lc(lvl.destLabel)} destino</b>. Geografia limpa; rompe relação.`;\n}\nfunction renderPlan(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const c=computeDerived(mv); const lvl=LEVELS[mv.level||'setor']; const ms=Object.keys(mv.munis).filter(m=>m!=='__OUTROS__').sort((a,b)=>a.localeCompare(b));\n  // GV/mercado: a chave \"m\" aqui é um código de setor/GV, não uma chave município/UF — mName/mUf\n  // parseariam lixo, então o CSV de plano exporta o código cru nesses níveis.\n  mv._plan=ms.map(m=>(mv.level&&mv.level!=='setor')?{municipio:m,uf:'',cbs:mv.munis[m].cbs,destino:mv.assign[m]}:{municipio:mName(m),uf:mUf(m),cbs:mv.munis[m].cbs,destino:mv.assign[m]});\n  $('#plan').innerHTML=`Etapa ${SESS.selected+1} · ${lvl.label} <b>${mv.sector}</b> → ${ms.map(m=>`${m}→<b style=\"color:${mv.color[mv.assign[m]]}\">${mv.assign[m]||'–'}</b>`).join(' · ')}<br>\n   Política: <b>${mv.policy==='fora'?`manter vínculo (CBs fora ${lvl.de} ${lc(lvl.destLabel)})`:'quebrar relação'}</b> · ${fmt(c.desloc)} CBs impactadas nesta etapa.`\n   +(c.orphanTotal?`<br>Fora da base de dominantes: ${fmt(c.orphanTotal)} CB(s) seguem suas líderes — ${mv.dest.filter(s=>c.orph[s]).map(s=>`${s} (${fmt(c.orph[s])})`).join(' · ')||'–'}${c.orphanStranded?` · <b style=\"color:var(--closing)\">${fmt(c.orphanStranded)} sem líder com destino</b>`:''}. Não entram no CSV, que é por município.`:'');\n}\nfunction renderReport(){const mv=SESS.timeline[SESS.selected]; if(!mv) return; const c=computeDerived(mv);\n  mv.metric=mv.metric||'cbs';\n  const KEYS=METRICS_DEF.map(m=>m[0]);\n  const incBy={};mv.dest.forEach(s=>incBy[s]=Object.fromEntries(KEYS.map(k=>[k,0])));\n  Object.entries(mv.munis).forEach(([m,o])=>{if(m==='__OUTROS__')return;const s=mv.assign[m];if(!s||!incBy[s])return;KEYS.forEach(k=>incBy[s][k]+=o[k]||0);});\n  // orphan CBs land on their leader's home sector, not on a geographic destination\n  c.leaders.forEach(L=>{ const om=mv.orphanMetricsByGroup&&mv.orphanMetricsByGroup[L.grupo];\n    if(om&&L.home&&incBy[L.home]) KEYS.forEach(k=>incBy[L.home][k]+=om[k]||0); });\n  const closeTot={};KEYS.forEach(k=>closeTot[k]=Object.entries(mv.munis).filter(([m])=>m!=='__OUTROS__').reduce((a,[,o])=>a+(o[k]||0),0));\n  // they leave the closing sector too, so antes → depois still balances\n  c.leaders.forEach(L=>{ const om=mv.orphanMetricsByGroup&&mv.orphanMetricsByGroup[L.grupo];\n    if(om&&L.home) KEYS.forEach(k=>closeTot[k]+=om[k]||0); });\n  const trend=mv.trend.slice(-6);\n  const chartHTML=mk=>{\n    const isM=['receita','rec_nat','rec_avon'].includes(mk); const fN=isM?money:fmt;\n    const data=mv.dest.map(s=>({label:s,color:mv.color[s],antes:+(mv.baseMetrics[s]?.[mk]||0),depois:+(mv.baseMetrics[s]?.[mk]||0)+(incBy[s]?.[mk]||0)}));\n    data.push({label:mv.sector+'✕',color:'#ff3b30',antes:closeTot[mk]||0,depois:0});\n    const max=Math.max(...data.flatMap(d=>[d.antes,d.depois]),1);\n    const W=720,H=290,base=238,top=42,maxH=base-top,n=data.length,gw=(W-16)/n;\n    let g='';\n    data.forEach((d,i)=>{const cx=8+gw*i+gw/2,bw=Math.min(30,gw*0.30);\n      const ah=d.antes/max*maxH,dh=d.depois/max*maxH,ax=cx-bw-2,dx=cx+2;\n      g+=`<rect x=\"${ax.toFixed(1)}\" y=\"${(base-ah).toFixed(1)}\" width=\"${bw.toFixed(1)}\" height=\"${ah.toFixed(1)}\" rx=\"2.5\" fill=\"${d.color}\" opacity=\"0.35\"/>`;\n      g+=`<rect x=\"${dx.toFixed(1)}\" y=\"${(base-dh).toFixed(1)}\" width=\"${bw.toFixed(1)}\" height=\"${dh.toFixed(1)}\" rx=\"2.5\" fill=\"${d.color}\"/>`;\n      g+=`<text x=\"${(ax+bw/2).toFixed(1)}\" y=\"${(base-ah-4).toFixed(1)}\" text-anchor=\"middle\" font-size=\"9\" fill=\"#9a9aa8\">${fN(d.antes)}</text>`;\n      g+=`<text x=\"${(dx+bw/2).toFixed(1)}\" y=\"${(base-dh-4).toFixed(1)}\" text-anchor=\"middle\" font-size=\"9.5\" font-weight=\"700\" fill=\"${d.color}\">${fN(d.depois)}</text>`;\n      const dp=d.antes?((d.depois-d.antes)/d.antes*100):(d.depois?100:0);\n      g+=`<text x=\"${cx.toFixed(1)}\" y=\"16\" text-anchor=\"middle\" font-size=\"10.5\" font-weight=\"700\" fill=\"${dp>=0?'#34c759':'#ff3b30'}\">${dp>0?'+':''}${dp.toFixed(0)}%</text>`;\n      g+=`<text x=\"${cx.toFixed(1)}\" y=\"${base+16}\" text-anchor=\"middle\" font-size=\"10.5\" font-weight=\"700\" fill=\"#1c1c2b\">${d.label}</text>`;});\n    return `<svg viewBox=\"0 0 ${W} ${H}\" style=\"width:100%\"><line x1=\"8\" y1=\"${base}\" x2=\"${W-8}\" y2=\"${base}\" stroke=\"#e7e7ef\"/>${g}</svg>`;\n  };\n  let h=`<div style=\"display:flex;justify-content:space-between;align-items:center;gap:10px;flex-wrap:wrap\">\n      <h2 style=\"margin:0\">Impacto antes → depois desta etapa</h2>\n      <select id=\"metricSel\">${METRICS_DEF.map(m=>`<option value=\"${m[0]}\" ${m[0]===mv.metric?'selected':''}>${m[1]}</option>`).join('')}</select></div>\n    <div class=\"note\" style=\"margin:2px 0 4px\">Barra clara = <b>antes desta etapa</b> (já incluindo etapas anteriores) · barra cheia = <b>depois</b> · <b style=\"color:var(--acc)\">${mv.sector}✕</b> = ${lc(lvl.label)} fechad${lvl.a==='à'?'a':'o'} nesta etapa · % = variação</div>\n    ${chartHTML(mv.metric)}`;\n  h+=`<h2 style=\"margin-top:16px\">Antes → Depois por ${lc(lvl.destLabel)} receptor (snapshot congelado)</h2>\n    <div class=\"scroll\"><table><thead><tr><th>${lvl.destLabel}</th>${METRICS_DEF.map(m=>`<th>${m[1]}</th>`).join('')}</tr></thead><tbody>`;\n  mv.dest.forEach(s=>{const b=mv.baseMetrics[s]||{};const inc=incBy[s];\n    h+=`<tr><td><span class=\"home\" style=\"background:${mv.color[s]}\"></span>${s}</td>`+\n      METRICS_DEF.map(([k])=>{const bv=+b[k]||0,av=bv+(inc[k]||0);const d=bv?((av-bv)/bv*100):0;const f=METRICS_DEF.find(x=>x[0]===k)[2]==='$'?money:fmt;\n        return `<td>${f(av)}<div class=\"delta ${d>=0?'up':'dn'}\">${d>0?'+':''}${d.toFixed(0)}%</div></td>`;}).join('')+`</tr>`;});\n  h+=`<tr style=\"opacity:.8\"><td>${mv.sector} (sai)</td>`+METRICS_DEF.map(([k,,t])=>`<td>${(t==='$'?money:fmt)(closeTot[k]||0)}</td>`).join('')+`</tr>`;\n  h+=`</tbody></table></div>`;\n  const incLvl={};mv.dest.forEach(s=>incLvl[s]={});\n  Object.keys(mv.munis).forEach(m=>{if(m==='__OUTROS__')return;const s=mv.assign[m];if(!s||!incLvl[s])return;const lv=mv.levelByMuni[m]||{};for(const nv in lv)incLvl[s][nv]=(incLvl[s][nv]||0)+lv[nv];});\n  c.leaders.forEach(L=>{ const ol=mv.orphanLevelByGroup&&mv.orphanLevelByGroup[L.grupo];\n    if(ol&&L.home&&incLvl[L.home]) Object.entries(ol).forEach(([nv,n])=>incLvl[L.home][nv]=(incLvl[L.home][nv]||0)+n); });\n  h+=`<h2 style=\"margin-top:18px\">Consultoras por nível — antes → depois por ${lc(lvl.destLabel)} receptor</h2>\n    <div class=\"scroll\"><table><thead><tr><th>${lvl.destLabel}</th>${NIVEIS.map(n=>`<th>${n}</th>`).join('')}<th>Total</th></tr></thead><tbody>`;\n  mv.dest.forEach(s=>{const base=mv.baseLevel[s]||{},inc=incLvl[s]||{};let tb=0,ta=0;\n    h+=`<tr><td><span class=\"home\" style=\"background:${mv.color[s]}\"></span>${s}</td>`+\n      NIVEIS.map(nv=>{const b=base[nv]||0,i=inc[nv]||0,a=b+i;tb+=b;ta+=a;\n        return `<td>${a?fmt(a):'·'}${i?`<div class=\"delta up\">+${fmt(i)}</div>`:''}</td>`;}).join('')+\n      `<td style=\"font-weight:700\">${fmt(ta)}${ta-tb?`<div class=\"delta up\">+${fmt(ta-tb)}</div>`:''}</td></tr>`;});\n  h+=`</tbody></table></div><div class=\"note\">Número = CBs por nível <b>depois</b> desta etapa · <span style=\"color:var(--ok)\">+N</span> = entrantes do ${mv.sector}.</div>`;\n  const spk=(key)=>{const vals=trend.map(t=>+t[key]||0);const mx=Math.max(...vals,1);\n    return `<div class=\"spark\">${vals.map(v=>`<div class=\"b\" style=\"height:${(v/mx*100).toFixed(0)}%\" title=\"${fmt(v)}\"></div>`).join('')}</div>\n      <div class=\"note\">${trend.map(t=>String(t.ciclo).slice(-2)).join(' · ')}</div>`;};\n  h+=`<h2 style=\"margin-top:18px\">Setor ${mv.sector} — últimos ${trend.length} ciclos até o snapshot congelado</h2>\n    <div class=\"note\" style=\"margin:-4px 0 8px\">Tendência histórica <b>do próprio setor</b> — não ajustada pela absorção hipotética de etapas anteriores (limitação conhecida: tendência é por setor, não decomponível por município).</div>\n    <div style=\"display:grid;grid-template-columns:repeat(4,1fr);gap:10px\">\n    ${[['cbs','CBs'],['ativas','Ativas'],['receita','Receita'],['pontos','Pontos']].map(([k,l])=>`<div><div class=\"note\" style=\"margin:0 0 3px;font-weight:600;color:var(--ink)\">${l}</div>${spk(k)}</div>`).join('')}</div>`;\n  $('#tab-report').innerHTML=h;\n  const sel=$('#metricSel'); if(sel) sel.onchange=()=>{mv.metric=sel.value; renderReport();};\n}\nfunction renderCumulative(){\n  const el=$('#tab-cumulative'); if(!el) return;\n  // Esta view soma a cadeia inteira via foldWorldState().muniOverride/sectorBaseCache — hoje só\n  // populados pelo fechamento de setor. GV/mercado têm o rastro equivalente (secOverride/gvOverride),\n  // mas essa agregação ainda não foi refeita nesse grão; melhor avisar do que mostrar tabela vazia.\n  const lockLvl=SESS.timeline.length?(SESS.timeline[0].level||'setor'):'setor';\n  if(lockLvl!=='setor'){ el.innerHTML=`<div class=\"note\">Impacto acumulado da cadeia ainda não disponível pra sessões de ${lc(LEVELS[lockLvl].label)} — use o relatório da etapa (aba anterior) etapa a etapa.</div>`; return; }\n  if(!SESS.timeline.length){ el.innerHTML='<div class=\"note\">Nenhuma etapa na timeline ainda.</div>'; return; }\n  const ready=SESS.timeline.every(mv=>mv.munis);\n  if(!ready){ el.innerHTML='<div class=\"note\">Aguardando etapas terminarem de calcular…</div>'; return; }\n  const finalWorld=foldWorldState(SESS.timeline,SESS.timeline.length);\n  const openSectors=[...new Set(Object.values(finalWorld.muniOverride))];\n  let h=`<h2 style=\"margin:0 0 8px\">Linha do tempo — ${SESS.timeline.length} fechamento(s)</h2>\n    <div class=\"note\" style=\"margin:-2px 0 10px\">Setores fechados, em ordem: ${SESS.timeline.map(mv=>mv.sector).join(' → ')}. Cada linha abaixo soma o efeito de <b>toda a cadeia</b>, não apenas da última etapa.</div>`;\n  h+=`<div class=\"scroll\"><table><thead><tr><th>Setor</th><th>Situação</th>${METRICS_DEF.map(([,l])=>`<th>${l}</th>`).join('')}</tr></thead><tbody>`;\n  SESS.timeline.forEach((mv,i)=>{\n    h+=`<tr style=\"opacity:.75\"><td>${mv.sector}</td><td>fechado (etapa ${i+1})</td>`+METRICS_DEF.map(([k,,t])=>`<td>${(t==='$'?money:fmt)(mv.pureOwnMetrics?.[k]||0)}</td>`).join('')+`</tr>`;\n  });\n  openSectors.forEach(s=>{\n    const base=SESS.sectorBaseCache[s]||{};\n    const infl=finalWorld.sectorInflow[s]||{};\n    h+=`<tr><td>${s}</td><td>recebeu território</td>`+METRICS_DEF.map(([k,,t])=>{\n      const bv=+base[k]||0, av=bv+(infl[k]||0); const d=bv?((av-bv)/bv*100):0; const f=(t==='$'?money:fmt);\n      return `<td>${f(av)}<div class=\"delta ${d>=0?'up':'dn'}\">${d>0?'+':''}${d.toFixed(0)}%</div></td>`;\n    }).join('')+`</tr>`;\n  });\n  h+=`</tbody></table></div><div class=\"note\">\"Antes\" de um setor receptor é o snapshot congelado (sem nenhum fechamento aplicado); \"depois\" soma tudo que a cadeia inteira jogou pra ele.</div>`;\n  el.innerHTML=h;\n}\nfunction project(feats){let mnx=1/0,mny=1/0,mxx=-1/0,mxy=-1/0;\n  const each=cb=>feats.forEach(f=>{const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];ps.forEach(p=>p.forEach(r=>r.forEach(cb)));});\n  each(p=>{mnx=Math.min(mnx,p[0]);mxx=Math.max(mxx,p[0]);mny=Math.min(mny,p[1]);mxy=Math.max(mxy,p[1]);});\n  const mlat=(mny+mxy)/2,kx=Math.cos(mlat*Math.PI/180),W=700,H=500,pad=22;\n  const gw=(mxx-mnx)*kx,gh=(mxy-mny),sc=Math.min((W-2*pad)/gw,(H-2*pad)/gh);\n  const ox=(W-gw*sc)/2,oy=(H-gh*sc)/2;\n  return p=>[ox+(p[0]-mnx)*kx*sc, oy+(mxy-p[1])*sc];\n}\nfunction pathFor(f,pr){const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];\n  return ps.map(poly=>poly.map(r=>'M'+r.map(p=>{const q=pr(p);return q[0].toFixed(1)+','+q[1].toFixed(1);}).join('L')+'Z').join('')).join('');}\nfunction cxy(f,pr){let x=0,y=0,n=0;const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];ps.forEach(poly=>poly[0].forEach(p=>{const q=pr(p);x+=q[0];y+=q[1];n++;}));return[x/n,y/n];}\n// ---------- label placement ----------\n// Pole of inaccessibility: the interior point farthest from ANY boundary of the dissolved area. A\n// centroid is only a mean — on a concave sector, one split across a river, or a member whose vertex\n// average falls in a bay, it lands outside the very territory it is supposed to name, which is what\n// pushed the sector numbers off their own shapes. Even-odd across every ring of every member is a\n// correct union test here because municipalities tile rather than overlap.\n// The search box is clipped to the viewBox, so the result is inside the territory AND on screen.\n// Rings are decimated first — this is a label, not a measurement — which keeps a 20-município sector\n// to a few million ops, and the result is cached per stage: geometry never changes between renders,\n// only the fill does.\nfunction labelPointFor(fs,pr){\n  const rings=[];\n  (fs||[]).forEach(f=>{ if(!f||!f.geometry) return;\n    const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];\n    ps.forEach(poly=>poly.forEach(r=>{\n      if(!r||r.length<4) return;\n      const step=Math.max(1,Math.floor(r.length/120)),pts=[];\n      for(let i=0;i<r.length;i+=step) pts.push(pr(r[i]));\n      if(pts.length>3) rings.push(pts);\n    }));});\n  if(!rings.length) return null;\n  let mnx=1/0,mny=1/0,mxx=-1/0,mxy=-1/0;\n  rings.forEach(r=>r.forEach(p=>{ if(p[0]<mnx)mnx=p[0]; if(p[0]>mxx)mxx=p[0]; if(p[1]<mny)mny=p[1]; if(p[1]>mxy)mxy=p[1]; }));\n  mnx=Math.max(mnx,2); mny=Math.max(mny,2); mxx=Math.min(mxx,698); mxy=Math.min(mxy,498);\n  if(!(mxx>mnx&&mxy>mny)) return null;\n  const inside=(x,y)=>{ let c=false;\n    for(const r of rings) for(let i=0,j=r.length-1;i<r.length;j=i++){ const a=r[i],b=r[j];\n      if(((a[1]>y)!==(b[1]>y)) && (x<(b[0]-a[0])*(y-a[1])/(b[1]-a[1])+a[0])) c=!c; }\n    return c; };\n  const edgeDist=(x,y)=>{ let m=Infinity;\n    for(const r of rings) for(let i=0,j=r.length-1;i<r.length;j=i++){ const a=r[i],b=r[j];\n      const dx=b[0]-a[0],dy=b[1]-a[1],L=dx*dx+dy*dy;\n      let t=L?(((x-a[0])*dx+(y-a[1])*dy)/L):0; t=t<0?0:(t>1?1:t);\n      const ex=a[0]+t*dx-x,ey=a[1]+t*dy-y,d=ex*ex+ey*ey; if(d<m)m=d; }\n    return Math.sqrt(m); };\n  const W=mxx-mnx,H=mxy-mny,N=26;\n  let best=null,bd=-1;\n  for(let i=0;i<=N;i++) for(let j=0;j<=N;j++){\n    const x=mnx+W*i/N,y=mny+H*j/N;\n    if(!inside(x,y)) continue;\n    const d=edgeDist(x,y); if(d>bd){ bd=d; best=[x,y]; }\n  }\n  if(!best) return null;\n  // Hill-climb off the coarse grid: the grid only has to land somewhere in the right lobe, the\n  // refinement finds the deep point inside it — halving the step whenever no neighbour improves.\n  let step=Math.max(W,H)/N/2;\n  for(let k=0;k<7;k++){\n    let moved=false;\n    for(const o of [[1,0],[-1,0],[0,1],[0,-1],[1,1],[1,-1],[-1,1],[-1,-1]]){\n      const x=best[0]+o[0]*step,y=best[1]+o[1]*step;\n      if(x<mnx||x>mxx||y<mny||y>mxy||!inside(x,y)) continue;\n      const d=edgeDist(x,y); if(d>bd){ bd=d; best=[x,y]; moved=true; }\n    }\n    if(!moved) step/=2;\n  }\n  // The clearance travels with the point: it is the radius of the largest circle that fits inside the\n  // territory there, which is exactly the budget a caller needs to decide how much text will fit.\n  return {p:best,r:bd};\n}\nfunction labelPointOf(mv,key,fs,pr){\n  if(!mv._lbl) mv._lbl={};\n  if(!(key in mv._lbl)) mv._lbl[key]=labelPointFor(fs,pr);\n  return mv._lbl[key];\n}\n// ---------- map zoom/pan ----------\n// Zoom é feito manipulando o viewBox, nunca um transform CSS — assim rótulos e polígonos vivem no\n// MESMO sistema de coordenadas e escalam juntos automaticamente (texto tem font-size em unidades do\n// viewBox, então encolher o viewBox amplia tudo por igual, sem lógica extra pro tamanho da fonte).\nconst MAP_W=700, MAP_H=500, MAP_ZOOM_MAX=8;\nlet mapView={x:0,y:0,w:MAP_W,h:MAP_H};\nfunction applyMapView(){\n  const svg=$('#map'); if(!svg) return;\n  svg.setAttribute('viewBox', mapView.x.toFixed(2)+' '+mapView.y.toFixed(2)+' '+mapView.w.toFixed(2)+' '+mapView.h.toFixed(2));\n  // Rótulo tem font-size em unidades do viewBox, então sem isso ele cresceria junto com o zoom até\n  // virar um borrão — encolhendo o font-size na mesma proporção que o viewBox encolhe cancela\n  // exatamente o zoom, e o texto fica do MESMO tamanho na tela em qualquer nível de zoom.\n  const fsScale=mapView.w/MAP_W;\n  svg.querySelectorAll('text[data-fs]').forEach(t=>{\n    const base=+t.getAttribute('data-fs')||8;\n    t.setAttribute('font-size',(base*fsScale).toFixed(2));\n  });\n  // Mesmo raciocínio pro halo do texto e pro fio que liga um rótulo deslocado ao seu município —\n  // os dois têm largura de traço fixa em unidades do viewBox, então sem reescalar iam virar uma\n  // mancha grossa (halo) ou uma barra (fio) no zoom alto em vez de ficarem do mesmo tamanho na tela.\n  svg.querySelectorAll('[data-sw]').forEach(el=>{\n    const base=+el.getAttribute('data-sw')||1;\n    el.style.strokeWidth=(base*fsScale).toFixed(3)+'px';\n  });\n}\nfunction zoomMapBy(factor){\n  const cx=mapView.x+mapView.w/2, cy=mapView.y+mapView.h/2;\n  let w=mapView.w/factor, h=mapView.h/factor;\n  w=Math.min(MAP_W, Math.max(MAP_W/MAP_ZOOM_MAX, w));\n  h=Math.min(MAP_H, Math.max(MAP_H/MAP_ZOOM_MAX, h));\n  let x=cx-w/2, y=cy-h/2;\n  x=Math.min(MAP_W-w, Math.max(0,x));\n  y=Math.min(MAP_H-h, Math.max(0,y));\n  mapView={x,y,w,h};\n  applyMapView();\n}\n// Arrastar sempre fica DENTRO do canvas de 700x500 (clamp em [0, MAP_W-w] / [0, MAP_H-h]) — nunca\n// existe um x/y que deixa o viewBox parcialmente fora da área com conteúdo, então o mapa nunca\n// \"some\" da tela, só pode chegar até a borda do que existe pra ver.\nlet mapDrag=null, mapDidDrag=false;\nfunction mapPointerDown(e){\n  const svg=$('#map'); if(!svg) return;\n  mapDrag={x0:e.clientX,y0:e.clientY,vx0:mapView.x,vy0:mapView.y,rect:svg.getBoundingClientRect()};\n  mapDidDrag=false;\n  svg.classList.add('dragging');\n  // NÃO setPointerCapture aqui: capturar o ponteiro no <svg> reencaminha o click resultante pro\n  // próprio <svg> em vez do <path> do município embaixo do cursor — todo clique parava de chegar\n  // no onclick de reatribuição, não só depois de um arrasto de verdade. move/up escutam em `root`\n  // (nunca substituído por renderAll) em vez de no <svg>, então o arrasto continua funcionando\n  // mesmo se o ponteiro sair da área do mapa no meio do gesto.\n}\nfunction mapPointerMove(e){\n  if(!mapDrag) return;\n  const dxPix=e.clientX-mapDrag.x0, dyPix=e.clientY-mapDrag.y0;\n  if(!mapDidDrag && Math.hypot(dxPix,dyPix)>4) mapDidDrag=true;\n  if(!mapDrag.rect.width||!mapDrag.rect.height) return;\n  const sx=mapView.w/mapDrag.rect.width, sy=mapView.h/mapDrag.rect.height;\n  let x=mapDrag.vx0-dxPix*sx, y=mapDrag.vy0-dyPix*sy;\n  x=Math.min(MAP_W-mapView.w, Math.max(0,x));\n  y=Math.min(MAP_H-mapView.h, Math.max(0,y));\n  mapView={...mapView,x,y};\n  applyMapView();\n}\nfunction mapPointerUp(){\n  if(!mapDrag) return;\n  mapDrag=null;\n  const svg=$('#map'); if(svg) svg.classList.remove('dragging');\n}\nfunction drawMap(){\n  const mv=SESS.timeline[SESS.selected]; const svg=$('#map'); const ignNote=$('#mapIgnoredNote');\n  if(!mv){ svg.innerHTML=''; if(ignNote) ignNote.innerHTML=''; return; }\n  const level=mv.level||'setor';\n  // setor fecha: a unidade É o município. GV/mercado fecham: cada município herda a atribuição do\n  // setor/GV a que pertence — municípios do mesmo setor sempre têm a MESMA cor e giram JUNTOS no\n  // clique, porque é o setor inteiro (não o município) que troca de dono nesses níveis.\n  const unitAssign=m=>level==='setor'?mv.assign[m]:mv.assign[(mv.unitOfMuni||{})[m]];\n  const c=computeDerived(mv);const NS='http://www.w3.org/2000/svg'; svg.innerHTML='';\n  const feats=[...mv.nbrFeat,...Object.values(mv.geoFeat)]; if(!feats.length) return;\n  const pr=project(feats);\n  const world=foldWorldState(SESS.timeline,SESS.selected);\n  // The context layer is ONE area per SECTOR, not one shape per município. The unit of this decision\n  // is the destination sector; a scatter of individually outlined municipalities carrying their own\n  // names invited exactly the wrong reading of the map. Members of a sector are filled AND stroked in\n  // the same colour, so the shared borders vanish and the group reads as a single dissolved\n  // territory — the IBGE shapes do not share vertices precisely enough to extract a clean union\n  // outline, and carrying a real polygon-clipping union for a context layer is not worth it.\n  // Labels are COLLECTED here and drawn last, after every path. Drawn inline they were buried by the\n  // next sector's fill, and placement cannot avoid a collision it has not seen yet.\n  const labels=[],placed=[];\n  const textW=(s,fs)=>String(s).length*fs*0.56;\n  // WCAG relative luminance of the fill a label sits on, so ink and halo can invert per label. \"Would\n  // white be better?\" has no single answer on this map: white reads on #5856d6 (L≈0.14) and disappears\n  // on #ff9500 and #34c759 (both L≈0.43, where black wins ~9:1 against white's ~2.2:1) and on every\n  // context fill, which is .32 opacity over white. Decided per label, never globally.\n  const lum=col=>{let h=String(col||'').replace('#','');\n    if(h.length===3) h=h[0]+h[0]+h[1]+h[1]+h[2]+h[2];\n    if(h.length!==6) return 1;\n    const c=[0,2,4].map(i=>parseInt(h.slice(i,i+2),16)/255)\n      .map(v=>v<=0.03928?v/12.92:Math.pow((v+0.055)/1.055,2.4));\n    return 0.2126*c[0]+0.7152*c[1]+0.0722*c[2];};\n  // Centred on (x,y) in BOTH axes. The old box hung off the first line's baseline, so every two-line\n  // label sat half its own height below the point it was supposed to mark.\n  const rectOf=(x,y,lines)=>{const w=Math.max.apply(null,lines.map(l=>textW(l.t,l.size)));\n    const h=lines.reduce((a,l)=>a+l.size*1.2,0);\n    return {x1:x-w/2-2.5,x2:x+w/2+2.5,y1:y-h/2-1.5,y2:y+h/2+1.5};};\n  const nbrBySec={};\n  mv.nbrFeat.forEach(f=>{\n    const nm=mkey(f.properties.name||f.properties.NOME||f.properties.nome||'',f.__uf);\n    const s=String((mv.nbrCurrentSector&&mv.nbrCurrentSector[nm])||'');\n    (nbrBySec[s]=nbrBySec[s]||[]).push(f);\n  });\n  Object.keys(nbrBySec).forEach(s=>{\n    const fs=nbrBySec[s];\n    const isDest=!!s&&mv.dest.includes(s);\n    const closedCtx=!!s&&world.closedSectors.has(s);\n    const col=isDest?(mv.color[s]||null):null;\n    fs.forEach(f=>{\n      const p=document.createElementNS(NS,'path');\n      p.setAttribute('d',pathFor(f,pr));\n      p.setAttribute('class','sect'+(isDest?'':(closedCtx?' closed-ctx':' plain')));\n      // isDest: NO stroke at all, fill only. Matching stroke to fill (even at the same opacity)\n      // still doubles up at every shared município edge — two adjacent members each paint their own\n      // translucent stroke on top of the shared line, so it composites darker than the interior even\n      // when both strokes are the exact fill colour. Only an absent stroke truly stops compositing.\n      if(col){ p.setAttribute('fill',col); }\n      svg.appendChild(p);\n    });\n    if(!s) return;\n    // One number per sector, at the pole of inaccessibility of its DISSOLVED area — the whole group\n    // of members at once, not a representative member, so the number sits in the visual middle of the\n    // territory the operator actually sees.\n    const lp=labelPointOf(mv,'s:'+s,fs,pr);\n    // Context areas always read LIGHT — .sect paints dest colours at fill-opacity .32 over white, and\n    // plain/closed-ctx are near-white greys — so a sector number never wants white ink, whatever colour\n    // the sector itself was assigned.\n    if(lp&&lp.p) labels.push({anchor:lp.p,big:true,dark:false,lines:[{t:s,size:11.5,weight:700}]});\n  });\n  const asis=mv.view==='asis';\n  // The UF prefix is information only when the stage actually straddles a border. On a single-UF setor\n  // it is the same three characters repeated on every label — a large share of the clutter and none of\n  // the meaning. The hover tooltip carries the UF either way.\n  const showUf=new Set(Object.keys(mv.geoFeat).map(k=>mUf(k)).filter(Boolean)).size>1;\n  if(level==='setor'){\n    // Setor fechando: a UNIDADE é o próprio município — cada um se comporta, colore e rotula\n    // individualmente, exatamente como sempre foi.\n    Object.entries(mv.geoFeat).forEach(([m,f])=>{const p=document.createElementNS(NS,'path');p.setAttribute('d',pathFor(f,pr));\n      const fillCol=asis?CLOSE_COLOR:(mv.color[unitAssign(m)]||'#444');\n      p.setAttribute('class','muni');p.setAttribute('fill',fillCol);\n      if(!asis) p.onclick=()=>{editSelected(m2=>{const i=m2.dest.indexOf(m2.assign[m]);if(m2.dest.length)m2.assign[m]=m2.dest[(i+1)%m2.dest.length];m2.selMuni=m;});};\n      p.style.cursor=asis?'default':'pointer';\n      p.onmousemove=e=>{const t=$('#tip');t.style.opacity=1;t.style.left=(e.clientX+12)+'px';t.style.top=(e.clientY+12)+'px';\n        t.innerHTML=asis?`<b>${mDisp(m)}</b><br>${fmt(mv.cbsByMuni[m]||0)} CBs · setor ${mv.sector}`:`<b>${mDisp(m)}</b><br>${fmt(mv.cbsByMuni[m]||0)} CBs → ${unitAssign(m)||'–'}<br><span style=\"color:var(--mut)\">clique p/ trocar</span>`;};\n      p.onmouseleave=()=>$('#tip').style.opacity=0;svg.appendChild(p);\n      const lp=labelPointOf(mv,'m:'+m,[f],pr);\n      const at=(lp&&lp.p)||cxy(f,pr);\n      const nmFull=(showUf&&mUf(m)?mUf(m)+'-':'')+mName(m);\n      const num=fmt(mv.cbsByMuni[m]||0)+(asis?'':'·'+(unitAssign(m)||'–'));\n      labels.push({anchor:at,cbs:+(mv.cbsByMuni[m]||0),dark:lum(fillCol)<0.18,\n        lines:[{t:nmFull,size:8.2,weight:700},{t:num,size:7,weight:500,mut:true}]});\n    });\n  } else {\n    // GV/mercado fechando: a UNIDADE é o setor (ou a GV) inteiro, nunca o município isolado. Ao\n    // contrário do contexto vizinho (que dissolve pra virar UMA área lisa), o lado que está fechando\n    // continua BORDADO — é nele que o operador enxerga onde um setor/GV termina e o próximo começa,\n    // mesmo quando os dois caem no mesmo destino e por isso têm a mesma cor. Cada município aqui usa\n    // a borda branca padrão de .muni (sem stroke = fill inline): só o alvo dissolve, quem fecha nunca.\n    // UM rótulo só por unidade, no ponto de inacessibilidade da área do grupo, nunca um rótulo por município.\n    Object.entries(mv.unitMunis||{}).forEach(([u,ms])=>{\n      const fillCol=asis?CLOSE_COLOR:(mv.color[mv.assign[u]]||'#444');\n      const feats=ms.map(m=>mv.geoFeat[m]).filter(Boolean);\n      // Todo município deste u é UMA unidade só na tela — passar o mouse sobre qualquer pedaço tem\n      // que acender o grupo inteiro, não só o pedaço que o cursor está tocando. :hover no CSS só\n      // sabe acender o próprio <path>; o grupo inteiro precisa de JS guardando os irmãos.\n      const els=[];\n      ms.forEach(m=>{\n        const f=mv.geoFeat[m]; if(!f) return;\n        const p=document.createElementNS(NS,'path');p.setAttribute('d',pathFor(f,pr));\n        p.setAttribute('class','muni');p.setAttribute('fill',fillCol);\n        els.push(p);\n        if(!asis) p.onclick=()=>{editSelected(m2=>{const i=m2.dest.indexOf(m2.assign[u]);if(m2.dest.length)m2.assign[u]=m2.dest[(i+1)%m2.dest.length];m2.selMuni=u;});};\n        p.style.cursor=asis?'default':'pointer';\n        p.onmouseenter=()=>{ els.forEach(e=>e.classList.add('munihl')); };\n        p.onmousemove=e=>{const t=$('#tip');t.style.opacity=1;t.style.left=(e.clientX+12)+'px';t.style.top=(e.clientY+12)+'px';\n          t.innerHTML=asis?`<b>${LEVELS[level].childLabel} ${u}</b><br>${fmt(mv.munis[u]?.cbs||0)} CBs · ${LEVELS[level].label} ${mv.sector}`:`<b>${LEVELS[level].childLabel} ${u}</b><br>${fmt(mv.munis[u]?.cbs||0)} CBs → ${mv.assign[u]||'–'}<br><span style=\"color:var(--mut)\">clique p/ trocar</span>`;};\n        p.onmouseleave=()=>{ els.forEach(e=>e.classList.remove('munihl')); $('#tip').style.opacity=0; };svg.appendChild(p);\n      });\n      const lp=labelPointOf(mv,'u:'+u,feats,pr);\n      const at=(lp&&lp.p)||(feats[0]&&cxy(feats[0],pr));\n      if(at){\n        const num=fmt(mv.munis[u]?.cbs||0)+(asis?'':'·'+(mv.assign[u]||'–'));\n        labels.push({anchor:at,big:true,cbs:+(mv.munis[u]?.cbs||0),dark:lum(fillCol)<0.18,\n          lines:[{t:`${LEVELS[level].childLabel} ${u}`,size:9,weight:700},{t:num,size:7.5,weight:500,mut:true}]});\n      }\n    });\n  }\n  // Placement, not de-cluttering. Every label IS drawn: it starts at its anchor and, if the text does\n  // not fit the territory or the slot is already taken, walks outward ring by ring until it finds\n  // clear canvas, trailing a hairline leader back to the shape it names. The previous pass dropped the\n  // loser of every collision outright, which is why municípios silently had no name at all.\n  // Order still matters — sector numbers first, then municípios by CB weight — because the earlier a\n  // label is placed the closer to home it lands.\n  const CW=700,CH=500,CPAD=2;\n  const inBounds=r=>r.x1>=CPAD&&r.x2<=CW-CPAD&&r.y1>=CPAD&&r.y2<=CH-CPAD;\n  const hits=r=>placed.reduce((a,q)=>a+((r.x2<q.x1||r.x1>q.x2||r.y2<q.y1||r.y1>q.y2)?0:1),0);\n  // Ring 0 is the anchor itself. Rings step 9u out over 16 directions, stretched horizontally because\n  // a label is wider than it is tall and sideways room is the room it actually needs.\n  const CAND=[[0,0]];\n  for(let ring=1;ring<=7;ring++){ const d=ring*9;\n    for(let a=0;a<16;a++){ const th=a*Math.PI/8; CAND.push([Math.cos(th)*d*1.35,Math.sin(th)*d]); } }\n  labels.sort((a,b)=>(b.big?1:0)-(a.big?1:0)||((b.cbs||0)-(a.cbs||0)));\n  labels.forEach(L=>{\n    let chosen=null,best=null,bestN=Infinity;\n    // Centred on the anchor is ALWAYS the first choice. An earlier cut here refused the anchor whenever\n    // the text was wider than the município's inscribed circle — true of almost every real name at this\n    // scale (BA-SAO SEBASTIAO DO PASSE is ~140u against ~80u of clearance), so every single label got\n    // nudged outside and nothing ended up centred on anything. Spilling past a border is normal on a\n    // choropleth and the halo keeps it readable; only a genuine COLLISION earns a move.\n    for(const off of CAND){\n      const x=L.anchor[0]+off[0], y=L.anchor[1]+off[1];\n      const r=rectOf(x,y,L.lines);\n      if(!inBounds(r)) continue;\n      const n=hits(r);\n      if(!n){ chosen={x,y,r,off}; break; }\n      // No clear slot yet — remember the LEAST crowded one. Falling back to the first in-bounds\n      // candidate meant falling back to the anchor every time, so a crowded map piled every loser onto\n      // the same point. CAND is ordered nearest-first and the compare is strict, so ties keep the\n      // closest slot.\n      if(n<bestN){ bestN=n; best={x,y,r,off}; }\n    }\n    // Canvas genuinely full: take the nearest in-bounds slot and accept the overlap. A label sitting\n    // on top of another is recoverable by eye; a name that was never drawn is not.\n    if(!chosen) chosen=best||{x:L.anchor[0],y:L.anchor[1],r:rectOf(L.anchor[0],L.anchor[1],L.lines),off:[0,0]};\n    placed.push(chosen.r);\n    const g=document.createElementNS(NS,'g'); g.setAttribute('class','lbl'+(L.big?' big':''));\n    if(Math.abs(chosen.off[0])>0.5||Math.abs(chosen.off[1])>0.5){\n      // The leader stops at the label's edge rather than its centre, so it never runs under the glyphs.\n      const cx=(chosen.r.x1+chosen.r.x2)/2, cy=(chosen.r.y1+chosen.r.y2)/2;\n      const hw=(chosen.r.x2-chosen.r.x1)/2, hh=(chosen.r.y2-chosen.r.y1)/2;\n      const dx=L.anchor[0]-cx, dy=L.anchor[1]-cy;\n      const tt=Math.min(dx?hw/Math.abs(dx):Infinity, dy?hh/Math.abs(dy):Infinity);\n      const ln=document.createElementNS(NS,'line'); ln.setAttribute('class','lead');\n      ln.style.stroke=L.dark?'#fff':'#1c1c1e';\n      // A largura do fio também é fixa em unidades do viewBox, igual o halo do texto — sem\n      // reescalar junto, no zoom alto ela vira uma barra grossa em vez de um fio fino.\n      ln.setAttribute('data-sw','0.8'); ln.style.strokeWidth='0.8px';\n      ln.setAttribute('x1',L.anchor[0].toFixed(1)); ln.setAttribute('y1',L.anchor[1].toFixed(1));\n      ln.setAttribute('x2',(cx+dx*tt).toFixed(1)); ln.setAttribute('y2',(cy+dy*tt).toFixed(1));\n      g.appendChild(ln);\n    }\n    const hTot=L.lines.reduce((a,l)=>a+l.size*1.2,0);\n    let ty=chosen.y-hTot/2+L.lines[0].size*0.86;\n    // Inline style rather than a class: a stylesheet rule would outrank a presentation attribute and\n    // undo the per-label contrast decision made above.\n    const ink=L.dark?'#fff':'#1c1c1e', inkMut=L.dark?'rgba(255,255,255,.85)':'#48484d';\n    const halo=L.dark?'rgba(0,0,0,.6)':'#fff';\n    // Halo do texto (o \"contorno\" que garante legibilidade sobre qualquer cor de fundo) também é\n    // fixo em unidades do viewBox via .lbl text{stroke-width}/.lbl.big text{stroke-width} — sem\n    // reescalar junto com o font-size, no zoom alto ele vira uma mancha escura cobrindo a letra\n    // inteira em vez de um contorno fino, exatamente o \"Setor 3570\" ilegível reportado.\n    const swBase=L.big?2.9:2.2;\n    L.lines.forEach(l=>{ const t=document.createElementNS(NS,'text');\n      t.setAttribute('x',chosen.x.toFixed(1)); t.setAttribute('y',ty.toFixed(1));\n      t.setAttribute('font-size',l.size); t.setAttribute('data-fs',l.size); t.setAttribute('font-weight',l.weight||600);\n      t.setAttribute('data-sw',swBase); t.style.strokeWidth=swBase+'px';\n      t.style.fill=l.mut?inkMut:ink; t.style.stroke=halo;\n      t.textContent=l.t; g.appendChild(t); ty+=l.size*1.2; });\n    svg.appendChild(g);\n  });\n  $('#legend').innerHTML=asis\n    ?`<span><b style=\"background:${CLOSE_COLOR}\"></b>${LEVELS[level].label} ${mv.sector} (estrutura antes desta etapa — ${level==='setor'?Object.keys(mv.geoFeat).length+' municípios':Object.keys(mv.unitMunis||{}).length+' '+LEVELS[level].childLabel.toLowerCase()+'(s)'})</span>`\n    // No \"vizinhos (contexto)\" or \"setor já fechado antes\" entry any more: every feature still drawn\n    // belongs to a destination sector, so .sect.plain and .sect.closed-ctx can no longer be produced\n    // and a legend key for them would point at nothing on the map.\n    :mv.dest.map(s=>`<span><b style=\"background:${mv.color[s]}\"></b>${LEVELS[level].destLabel} ${s} — ${c.gained[s]} líder(es)</span>`).join('');\n  // Municipalities outside the dominance base are deliberately NOT drawn — no shape, no hover, no\n  // legend entry. They are reported in the panel instead, so the map only ever shows territory that\n  // is actually being reallocated.\n  if(ignNote) ignNote.innerHTML=(mv.excludedMunis&&mv.excludedMunis.length)\n    ? `<b style=\"color:var(--closing)\">${fmt(mv.excludedMunis.length)} município(s) / ${fmt(mv.excludedCbs||0)} CBs</b> fora da base de dominantes deste setor não são desenhados no mapa — as CBs seguem a líder do seu grupo (detalhe em “Municípios → setor destino”).`\n    : '';\n  applyMapView();\n}\nasync function runSql(){const sql=$('#sqlIn').value.trim();$('#sqlStatus').textContent='rodando…';$('#sqlStatus').classList.remove('err');\n  try{ await ensurePinned(); const resp=await q(sql);const rs=rows(resp);const cols=(resp.manifest?.schema?.columns||[]).map(c=>c.name);\n    $('#sqlOut').innerHTML=`<thead><tr>${cols.map(c=>`<th>${c}</th>`).join('')}</tr></thead><tbody>`+rs.slice(0,200).map(r=>`<tr>${cols.map(c=>`<td>${r[c]??'·'}</td>`).join('')}</tr>`).join('')+`</tbody>`;\n    $('#sqlStatus').textContent=rs.length+' linha(s)';}\n  catch(e){$('#sqlStatus').textContent='bloqueado/erro: '+e.message;$('#sqlStatus').classList.add('err');}\n}\nfunction renderAll(){\n  renderStage();\n  renderTimeline(); renderSectorPicker();\n  const shb=$('#openShare'); if(shb) shb.disabled=!SESS.timeline.length;\n  const dpb=$('#dupSession'); if(dpb) dpb.disabled=!SESS.timeline.length;\n  const mv=SESS.timeline[SESS.selected];\n  // resolveSnapshotPin falls back to a live sub-select when it cannot pin a literal; saying\n  // \"congelado\" in that case would be a lie, so the pill reports what is actually in the SQL.\n  const pinned=SESS.snapLiteral && !/^\\(SELECT/i.test(SESS.snapLiteral);\n  $('#liveState').textContent = SESS.snapshotRaw\n    ? (pinned?'● snapshot congelado · ':'◍ snapshot ao vivo (não fixado) · ')+'atualizado em '+fmtSyncedAt(SESS.snapshotSyncedAt)+' · ↻'\n    : '● iniciando';\n  const mp=$('#basePill');\n  if(mp){\n    const warn=[];\n    if(DOM.bySetor&&!DOM.hasUf) warn.push('⚠ sem coluna UF');\n    if(DOM.badUf) warn.push('⚠ '+fmt(DOM.badUf)+' UF não reconhecida(s)');\n    if(DOM.clashes) warn.push('⚠ '+fmt(DOM.clashes)+' homônimo(s) no mesmo setor');\n    mp.textContent=DOM.bySetor?('◇ base dominantes: '+fmt(DOM.setores)+' setores · '+fmt(DOM.rows)+' municípios'+(warn.length?' · '+warn.join(' · '):'')):(DOM.error?'◇ base dominantes: indisponível':'◇ base dominantes: carregando…');\n    mp.title=DOM.error||(DOM.bySetor?((DOM.hasUf\n        ?('Coluna de UF usada: \"'+DOM.ufCol+'\".')\n        :('SEM coluna de UF. Colunas lidas: '+((DOM.headers||[]).join(' | ')||'?')+'. A UF de cada município vem desta base — sem ela, homônimos voltam a ser casados só pelo nome.'))\n      +(DOM.badUf?('\\n'+DOM.badUf+' linha(s) com UF irreconhecível — tratadas como desconhecida.'):'')\n      +(DOM.clashes?('\\n'+DOM.clashes+' município(s) aparecem no mesmo setor com UFs diferentes. O SQL agrupa só por DS_MUNICIPIO, então esses chegam somados numa linha única e não há como separá-los.'):'')\n      ):'')||DOM.url||''; }\n  const rp=$('#rulePill'); if(rp) rp.textContent='◈ destino: '+ruleShort(SESS.settings);\n  const sp=$('#spanPill'); if(sp) sp.textContent='◎ span: '+spanShort(SESS.settings);\n  renderRuleNote(); renderSpanRule();\n  if(!mv){ ['#map','#matrix','#matrixTobe','#tobeNote','#leaders'].forEach(s=>{const el=$(s);if(el)el.innerHTML='';}); $('#kpis').innerHTML=''; $('#spans').innerHTML=''; $('#muniList').innerHTML=''; $('#plan').innerHTML=''; return; }\n  $('#mapTitle').textContent=`Etapa ${SESS.selected+1}/${SESS.timeline.length} — fechando ${lc(LEVELS[mv.level||'setor'].label)} ${mv.sector}`;\n  $('#viewToggle').querySelectorAll('button').forEach(b=>b.classList.toggle('on',b.dataset.v===mv.view));\n  $('#policy').querySelectorAll('button').forEach(b=>b.classList.toggle('on',b.dataset.p===mv.policy));\n  $('#optBadge').textContent=mv.optBadge||'';\n  drawMap(); renderContig(); renderSpanRule(); renderKpis(); renderSpans(); renderMuni(); renderLeaders(); renderMatrix(); renderMatrixTobe(); renderPolicy(); renderPlan(); renderReport(); renderCumulative();\n}\n\n// ---------- event wiring ----------\n$('#confirmSnap').onclick=()=>{ SESS.stage='main'; renderAll(); };\n$('#openMove').onclick=openMove;\n$('#moveClose').onclick=closeMove;\n$('#moveCancel').onclick=closeMove;\n$('#moveBg').addEventListener('click',e=>{ if(e.target.id==='moveBg') closeMove(); });\nroot.querySelectorAll('input[name=\"moveLevel\"]').forEach(r=>r.addEventListener('change',renderMoveForm));\n$('#moveRand').onclick=moveRandPick;\n$('#moveGo').onclick=submitMove;\n$('#moveCode').addEventListener('keydown',e=>{ if(e.key==='Enter') submitMove(); });\n$('#confirmSessionPick').onchange=()=>loadSession($('#confirmSessionPick').value);\n$('#optim').onclick=()=>editSelected(mv=>{ mv.assign=optimizeFor(mv); });\n$('#autoTobe').onclick=()=>editSelected(mv=>{ mv.assign=autoAssignFor(mv); mv.optBadge='TOBE por adjacência'; });\n$('#viewToggle').querySelectorAll('button').forEach(b=>b.onclick=()=>{const mv=SESS.timeline[SESS.selected];if(!mv)return;mv.view=b.dataset.v;renderAll();});\n$('#mapZoomIn').onclick=()=>zoomMapBy(1.4);\n$('#mapZoomOut').onclick=()=>zoomMapBy(1/1.4);\n$('#map').addEventListener('pointerdown',mapPointerDown);\nroot.addEventListener('pointermove',mapPointerMove);\nroot.addEventListener('pointerup',mapPointerUp);\nroot.addEventListener('pointerleave',mapPointerUp);\n// Arrastar não pode virar \"cliquei num município e troquei o destino sem querer\": se o ponteiro se\n// moveu além do limiar de arrasto, este clique (capture, antes de chegar no <path>) é engolido.\n$('#map').addEventListener('click',e=>{ if(mapDidDrag){ e.stopPropagation(); e.preventDefault(); mapDidDrag=false; } },true);\n$('#policy').querySelectorAll('button').forEach(b=>b.onclick=()=>{const mv=SESS.timeline[SESS.selected];if(!mv)return;mv.policy=b.dataset.p;renderKpis();renderPolicy();renderPlan();});\nroot.querySelectorAll('.tabs button').forEach(b=>b.onclick=()=>{root.querySelectorAll('.tabs button').forEach(x=>x.classList.toggle('on',x===b));\n  ['matrix','tobe','report','cumulative','sql'].forEach(t=>$('#tab-'+t).classList.toggle('hidden',t!==b.dataset.tab));});\n$('#runSql').onclick=runSql;\n$('#copyPlan').onclick=()=>{const mv=SESS.timeline[SESS.selected];if(!mv)return;navigator.clipboard.writeText(JSON.stringify({setor:mv.sector,politica:mv.policy,plano:mv._plan},null,2));$('#copyPlan').textContent='copiado ✓';setTimeout(()=>$('#copyPlan').textContent='Copiar',1500);};\n$('#csvPlan').onclick=()=>{const mv=SESS.timeline[SESS.selected];if(!mv)return;const csv='municipio,uf,cbs,setor_destino\\n'+mv._plan.map(p=>`${p.municipio},${p.uf||''},${p.cbs},${p.destino}`).join('\\n');\n  const a=document.createElement('a');a.href=URL.createObjectURL(new Blob([csv],{type:'text/csv'}));a.download=`plano_migracao_setor_${mv.sector}.csv`;a.click();};\n$('#saveSession').onclick=saveSession;\n$('#dupSession').onclick=duplicateSession;\n$('#sessionPick').onchange=()=>loadSession($('#sessionPick').value);\n$('#liveState').onclick=refreshSnapshot;\n$('#liveState').addEventListener('keydown',e=>{ if(e.key==='Enter'||e.key===' '){ e.preventDefault(); refreshSnapshot(); } });\n$('#openOptions').onclick=openOptions;\n$('#optClose').onclick=closeOptions;\n$('#optCancel').onclick=closeOptions;\n$('#optApply').onclick=applyOptions;\n$('#optMinCbs').addEventListener('input',renderOptPreview);\n['#optTargetSpan','#optMaxSpan','#optMinSpan'].forEach(id=>$(id).addEventListener('input',renderOptPreview));\nroot.querySelectorAll('input[name=\"destRule\"]').forEach(r=>r.addEventListener('change',renderOptPreview));\n$('#optionsBg').addEventListener('click',e=>{ if(e.target.id==='optionsBg') closeOptions(); });\nroot.addEventListener('keydown',e=>{ if(e.key==='Escape'){ closeOptions(); closeShare(); closeMove(); } });\n\n$('#openShare').onclick=openShare;\n$('#shareX').onclick=closeShare;\n$('#shareCancel').onclick=closeShare;\n$('#shareGo').onclick=doShare;\n$('#shareCopy').onclick=()=>{ if(!SHARE.url) return; navigator.clipboard.writeText(SHARE.url);\n  const b=$('#shareCopy'); if(b){ b.textContent='copiado ✓'; setTimeout(()=>{ const x=$('#shareCopy'); if(x) x.textContent='Copiar link'; },1500); } };\n$('#shareOpen').onclick=()=>{ if(SHARE.url) window.open(SHARE.url,'_blank'); };\n$('#shareBg').addEventListener('click',e=>{ if(e.target.id==='shareBg') closeShare(); });\n\n// ---------- init ----------\n(async()=>{\n  loader(true,'congelando snapshot da sessão…');\n  try{\n    await Promise.all([ensurePinned(), loadSectors(), refreshSessionPicker()]);\n    SESS.stage='confirm';\n  }catch(e){ setError('erro init: '+e.message); }\n  finally{ loader(false); renderAll(); const rd=$('#ready'); if(rd) rd.setAttribute('data-loaded','1'); }\n})();\n\n  }\n}\n","at":"2026-08-14T16:48:39.548Z"}},"updatedAt":"2026-08-14T16:48:39.676Z","createdAt":"2026-08-14T15:07:41.590Z"},{"_id":"6a7f3001bbce4725b9b8a950","component":"data2-core-types@Component","system":"6a57cfe9673eb7e3c5e57784","params":{"component":"CNL_4z20SJcX0NMp2I2vz","package":"natura-geomarketing","title":"Ventura — Leitor de Cenários","extends":"data2-core-primitives@Block","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"shared":{"component":"data2-core-types@InteractiveModuleReference"}}}},"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"const NIVEIS=['Bronze','Cristal','Prata','Ouro','Diamante','Diamante+'];\n\nexport default {\n  css: `\n  :host{display:block;height:100%}\n  *{box-sizing:border-box}\n  .rroot{--bg:#f5f5f7;--panel:#ffffff;--panel2:#f2f2f7;--line:#e5e5ea;--ink:#1c1c1e;--mut:#6e6e73;--acc:#007aff;--closing:#ff3b30;--ok:#34c759;--warn:#ff9500;\n    height:100%;overflow:auto;background:var(--bg);color:var(--ink);\n    font:13px/1.5 -apple-system,BlinkMacSystemFont,\"SF Pro Text\",\"Segoe UI\",Roboto,sans-serif;-webkit-font-smoothing:antialiased}\n  .shell{max-width:1080px;margin:0 auto;padding:26px 22px 70px}\n  header.top{margin-bottom:20px}\n  .eyebrow{font-size:11px;text-transform:uppercase;letter-spacing:.5px;color:var(--mut);font-weight:600}\n  h1{font-size:25px;font-weight:600;letter-spacing:-.5px;margin:7px 0 10px}\n  .pills{display:flex;gap:7px;flex-wrap:wrap;align-items:center}\n  .pill{font-size:10.5px;padding:3px 9px;border-radius:99px;border:1px solid var(--line);color:var(--mut);background:var(--panel)}\n  .pill b{color:var(--ink);font-weight:600}\n  .pill.go{cursor:pointer;border-color:var(--acc);color:var(--acc);background:#eaf3ff;font-weight:600}\n  .pill.go:hover{background:#dbe9ff}\n  .goact{margin-top:15px;background:var(--acc);color:#fff;border:1px solid transparent;border-radius:8px;\n    padding:9px 16px;font:inherit;font-size:12.5px;font-weight:600;cursor:pointer}\n  .goact:hover{background:#0060df}\n  .strip{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:10px;margin:18px 0 22px}\n  .st{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:12px 14px;box-shadow:0 1px 2px rgba(0,0,0,.04)}\n  .st .n{font-size:23px;font-weight:700;letter-spacing:-.5px}\n  .st .l{font-size:10.5px;color:var(--mut);margin-top:3px;line-height:1.4}\n  .st.warn .n{color:var(--closing)}\n  .stepper{position:sticky;top:0;z-index:5;display:flex;gap:7px;overflow-x:auto;padding:11px 0;margin-bottom:6px;\n    background:rgba(245,245,247,.9);backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);border-bottom:1px solid var(--line)}\n  .sc{flex:0 0 auto;display:flex;align-items:center;gap:7px;background:var(--panel);border:1px solid var(--line);\n    border-radius:99px;padding:5px 12px 5px 6px;cursor:pointer;font-size:12px}\n  .sc:hover{border-color:var(--acc)}\n  .sc .k{width:19px;height:19px;border-radius:99px;background:var(--ink);color:#fff;font-size:10px;font-weight:700;\n    display:flex;align-items:center;justify-content:center}\n  .sc .arrow{color:var(--mut)}\n  .card{background:var(--panel);border:1px solid var(--line);border-radius:14px;padding:20px;margin-bottom:16px;box-shadow:0 1px 2px rgba(0,0,0,.04)}\n  .card > h2{font-size:15px;font-weight:600;letter-spacing:-.2px;margin:0 0 3px}\n  .card .sub{font-size:11.5px;color:var(--mut);margin:0 0 15px}\n  h3{font-size:11px;text-transform:uppercase;letter-spacing:.4px;color:var(--mut);margin:20px 0 9px;font-weight:600}\n  h3:first-of-type{margin-top:0}\n  .split{display:grid;grid-template-columns:minmax(0,1.15fr) minmax(0,1fr);gap:20px;align-items:start}\n  @media(max-width:820px){.split{grid-template-columns:1fr}}\n  svg.map{width:100%;height:auto;display:block;background:var(--panel2);border-radius:10px;border:1px solid var(--line);cursor:grab;touch-action:none}\n  svg.map.dragging{cursor:grabbing}\n  .map-wrap{position:relative}\n  .zoom-pill{position:absolute;left:10px;bottom:10px;display:flex;align-items:stretch;background:var(--panel);border:1px solid var(--line);border-radius:99px;box-shadow:0 2px 8px rgba(0,0,0,.14);overflow:hidden;z-index:3}\n  .zoom-pill button{width:30px;height:30px;border:0;background:transparent;color:var(--ink);font:16px/1 -apple-system,BlinkMacSystemFont,sans-serif;font-weight:600;cursor:pointer;display:flex;align-items:center;justify-content:center}\n  .zoom-pill button:hover{background:var(--panel2)}\n  .zoom-pill button:active{background:#e5e5ea}\n  .zoom-pill .zoom-div{width:1px;background:var(--line)}\n  .muni{stroke:#fff;stroke-width:1.1}\n  .nbr{fill:#e8e8ec;stroke:#d4d4d9;stroke-width:.7}\n  .exc{fill:#f7e7d0;stroke:var(--warn);stroke-width:.9;stroke-dasharray:2 2}\n  .mlabel{fill:#1c1c1e;font-size:9.5px;font-weight:600;text-anchor:middle;paint-order:stroke;stroke:rgba(255,255,255,.7);stroke-width:2.4px}\n  .nlabel{fill:#9a9aa0;font-size:7.5px;text-anchor:middle}\n  .legend{display:flex;gap:11px;flex-wrap:wrap;margin-top:9px;font-size:11px;color:var(--mut)}\n  .legend i{display:inline-block;width:10px;height:10px;border-radius:3px;margin-right:5px;vertical-align:-1px}\n  .bar{display:flex;align-items:center;gap:9px;margin:7px 0}\n  .bar .tag{width:46px;font-weight:600;font-size:12px}\n  .bar .track{flex:1;height:17px;background:var(--panel2);border-radius:5px;overflow:hidden;display:flex}\n  .bar .b1{height:100%;opacity:.38}.bar .b2{height:100%}.bar .b3{height:100%;opacity:.7}\n  .bar .v{width:120px;text-align:right;font-size:11px;color:var(--mut);font-variant-numeric:tabular-nums}\n  .mrow{display:flex;align-items:center;gap:9px;background:var(--panel2);border:1px solid var(--line);border-radius:9px;padding:6px 10px;margin-bottom:5px}\n  .mrow .nm{flex:1;font-weight:600;font-size:12px;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n  .mrow .cb{color:var(--mut);font-size:11px;font-variant-numeric:tabular-nums}\n  .chip{font-size:11px;font-weight:700;color:#fff;border-radius:6px;padding:2px 8px}\n  table{border-collapse:collapse;width:100%;font-size:11.5px}\n  th,td{padding:6px 7px;text-align:right;border-bottom:1px solid var(--line);font-variant-numeric:tabular-nums}\n  th:first-child,td:first-child{text-align:left}\n  thead th{color:var(--mut);font-weight:600;font-size:10.5px}\n  .dot{display:inline-block;width:9px;height:9px;border-radius:2px;margin-right:5px}\n  .delta{font-size:10px}.delta.up{color:var(--ok)}.delta.dn{color:var(--closing)}\n  .note{font-size:10.5px;color:var(--mut);line-height:1.55;margin-top:9px}\n  .flag{margin-top:11px;padding:9px 11px;border-radius:9px;font-size:11.5px;line-height:1.55;background:#fff8ef;border:1px solid #ffe0bd;color:#8a5200}\n  .scroll{max-height:300px;overflow:auto}\n  .center{display:flex;align-items:center;justify-content:center;height:100%;padding:40px}\n  .msg{max-width:420px;text-align:center}\n  .msg h2{font-size:17px;font-weight:600;margin:0 0 7px}\n  .msg p{font-size:12.5px;color:var(--mut);margin:0;line-height:1.55}\n`,\n  render(d2){\n    // Hierarquia mercado > GV > setor, espelhando o simulador ao vivo. Tudo pré-computado (label,\n    // minúscula, plural, gênero) pra nunca minusculizar \"GV\" (sigla) virando \"gv\", e pra concordar\n    // gênero certo em cada frase — GV é feminina (a Gerência de Vendas), o resto é masculino.\n    const LVL={\n      setor:{label:'Setor',low:'setor',fem:false, child:'Município',childLow:'município',childPlural:'Municípios',childFem:false, dest:'Setor',destLow:'setor'},\n      gv:{label:'GV',low:'GV',fem:true, child:'Setor',childLow:'setor',childPlural:'Setores',childFem:false, dest:'GV',destLow:'GV'},\n      mercado:{label:'Mercado',low:'mercado',fem:false, child:'GV',childLow:'GV',childPlural:'GVs',childFem:true, dest:'Mercado',destLow:'mercado'},\n    };\n    const lv=s=>LVL[(s&&s.level)||'setor'];\n    const esc=s=>(s==null?'':String(s)).replace(/[&<>\"]/g,c=>({'&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;'}[c]));\n    const fmt=n=>n==null?'–':Math.round(+n).toLocaleString('pt-BR');\n    const money=n=>{n=+n||0;return n>=1e6?'R$'+(n/1e6).toFixed(1)+'M':n>=1e3?'R$'+(n/1e3).toFixed(0)+'k':'R$'+Math.round(n)};\n    const msg=(t,b,act)=>`<div class=\"rroot\"><div class=\"center\"><div class=\"msg\"><h2>${t}</h2><p>${b}</p>${act?`<button class=\"goact\" id=\"goSim\">Abrir o simulador</button>`:''}</div></div></div>`;\n\n    if(d2.state.error) return msg('Não foi possível abrir a sessão',esc(d2.state.error),true);\n    if(!d2.state.ready) return msg('Carregando sessão…','Buscando o registro compartilhado.');\n    const r=d2.state.rec;\n    if(!r) return msg('Sessão não encontrada','O link pode ter expirado ou o registro foi removido. Peça um novo link a quem compartilhou.',true);\n\n    const stages=Array.isArray(r.stages)?r.stages:[];\n    const sm=r.summary||{};\n    const st=r.settings||{};\n    const ruleDest=st.destRule==='dominant'?`destino: dominantes ≥${fmt(st.destMinCbs)} CBs`:'destino: qualquer município';\n    const ruleReal=st.realocRule==='relevant'?`realocação: ≥${fmt(st.realocMinCbs)} CBs`:'realocação: todos';\n    const spanBits=[];\n    if(st.targetSpan)spanBits.push('alvo '+fmt(st.targetSpan));\n    if(st.maxSpan)spanBits.push('máx '+fmt(st.maxSpan));\n    if(st.minSpan)spanBits.push('mín '+fmt(st.minSpan));\n\n    let h=`<div class=\"rroot\"><div class=\"shell\">\n      <header class=\"top\">\n        <div class=\"eyebrow\">Simulador de timeline de fechamentos · sessão compartilhada</div>\n        <h1>${esc(r.label||'Sessão sem nome')}</h1>\n        <div class=\"pills\">\n          <span class=\"pill\">● snapshot congelado · <b>${esc(r.snapshotRaw||'—')}</b></span>\n          <span class=\"pill\">◇ ${esc(ruleReal)}</span>\n          <span class=\"pill\">◈ ${esc(ruleDest)}</span>\n          <span class=\"pill\">◎ span: <b>${spanBits.length?esc(spanBits.join(' · ')):'livre'}</b></span>\n          ${r.sharedBy?`<span class=\"pill\">por <b>${esc(r.sharedBy)}</b></span>`:''}\n          ${r.sharedAt?`<span class=\"pill\">${esc(new Date(r.sharedAt).toLocaleString('pt-BR'))}</span>`:''}\n          <span class=\"pill go\" id=\"goSim\" role=\"button\" tabindex=\"0\" title=\"Ir para o simulador\">↗ abrir o simulador</span>\n        </div>\n      </header>`;\n\n    const sessLevel=(stages[0]&&stages[0].level)||'setor';\n    h+=`<div class=\"strip\">\n      <div class=\"st\"><div class=\"n\">${fmt(stages.length)}</div><div class=\"l\">Etapa(s) de fechamento</div></div>\n      <div class=\"st\"><div class=\"n\">${fmt(sm.totalCbs)}</div><div class=\"l\">CBs realocadas na cadeia</div></div>\n      ${sessLevel==='setor'?`<div class=\"st warn\"><div class=\"n\">${fmt(sm.totalDesloc)}</div><div class=\"l\">CBs deslocadas (quebra de relação)</div></div>`:`<div class=\"st\"><div class=\"n\">${fmt(sm.totalDesloc)}</div><div class=\"l\">CBs com líder dividida entre destinos</div></div>`}\n      <div class=\"st\"><div class=\"n\" style=\"font-size:15px;line-height:1.5;font-weight:600\">${esc((sm.sectors||[]).join(' → ')||'—')}</div><div class=\"l\">Ordem de fechamento</div></div>\n    </div>`;\n\n    if(stages.length>1){\n      h+=`<div class=\"stepper\">`+stages.map((s,i)=>`<div class=\"sc\" data-goto=\"stage-${i}\"><span class=\"k\">${i+1}</span>${lv(s).label} ${esc(s.sector)}<span class=\"arrow\">→</span>${esc((s.dest||[]).join(', ')||'–')}</div>`).join('')+`</div>`;\n    }\n\n    // ---- projection helpers (pure; mirrors the simulator's) ----\n    const project=feats=>{let mnx=1/0,mny=1/0,mxx=-1/0,mxy=-1/0;\n      feats.forEach(f=>{const g=f&&f.geometry;if(!g)return;const ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];\n        ps.forEach(p=>p.forEach(rg=>rg.forEach(pt=>{mnx=Math.min(mnx,pt[0]);mxx=Math.max(mxx,pt[0]);mny=Math.min(mny,pt[1]);mxy=Math.max(mxy,pt[1]);})));});\n      if(!isFinite(mnx)) return null;\n      const mlat=(mny+mxy)/2,kx=Math.cos(mlat*Math.PI/180),W=680,H=440,pad=16;\n      const gw=Math.max((mxx-mnx)*kx,1e-9),gh=Math.max(mxy-mny,1e-9),sc=Math.min((W-2*pad)/gw,(H-2*pad)/gh);\n      const ox=(W-gw*sc)/2,oy=(H-gh*sc)/2;\n      return {W,H,f:pt=>[ox+(pt[0]-mnx)*kx*sc, oy+(mxy-pt[1])*sc]};};\n    const pathFor=(f,pr)=>{const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];\n      return ps.map(poly=>poly.map(rg=>'M'+rg.map(pt=>{const q=pr(pt);return q[0].toFixed(1)+','+q[1].toFixed(1);}).join('L')+'Z').join('')).join('');};\n    const cxy=(f,pr)=>{let x=0,y=0,n=0;const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];\n      ps.forEach(poly=>poly[0].forEach(pt=>{const q=pr(pt);x+=q[0];y+=q[1];n++;}));return n?[x/n,y/n]:[0,0];};\n\n    stages.forEach((s,i)=>{\n      const color=s.color||{};\n      const k=s.kpis||{};\n      const LV=lv(s);\n      h+=`<div class=\"card\" id=\"stage-${i}\" data-key=\"stage-${i}\">\n        <h2>Etapa ${i+1} · ${LV.low} <b>${esc(s.sector)}</b> fechad${LV.fem?'a':'o'}</h2>\n        <p class=\"sub\">Território redistribuído para ${esc((s.dest||[]).join(', ')||'—')}${s.domUF?' · '+esc(s.domUF):''}${s.policy?' · política: '+(s.policy==='fora'?'manter vínculo':'quebrar relação'):''}</p>\n        <div class=\"strip\" style=\"margin:0 0 18px\">\n          <div class=\"st\"><div class=\"n\">${fmt(k.cbsRealocadas)}</div><div class=\"l\">CBs realocadas</div></div>\n          ${LV.label==='Setor'?`<div class=\"st warn\"><div class=\"n\">${fmt(k.desloc)}</div><div class=\"l\">CBs deslocadas</div></div>`:`<div class=\"st\"><div class=\"n\">${fmt(k.desloc)}</div><div class=\"l\">CBs com líder dividida</div></div>`}\n          <div class=\"st\"><div class=\"n\">${fmt(k.municipios)}</div><div class=\"l\">${LV.childPlural} movid${LV.childFem?'as':'os'}</div></div>\n          <div class=\"st\"><div class=\"n\">${fmt(k.lideres)}</div><div class=\"l\">Líderes envolvidas</div></div>\n        </div>\n        <div class=\"split\"><div>`;\n\n      // map\n      const gf=s.geoFeat||{}, nb=Array.isArray(s.nbrFeat)?s.nbrFeat:[], ex=Array.isArray(s.excludedFeat)?s.excludedFeat:[];\n      const all=[...nb,...ex,...Object.values(gf)].filter(Boolean);\n      const P=project(all);\n      const unitOf=m=>LV.label==='Setor'?m:((s.unitOfMuni||{})[m]||m);\n      if(P){\n        let g='';\n        nb.forEach(f=>{ if(!f||!f.geometry)return; g+=`<path class=\"nbr\" d=\"${pathFor(f,P.f)}\"/>`;\n          const c=cxy(f,P.f);const nm=(f.properties&&f.properties.name)||'';\n          if(nm) g+=`<text class=\"nlabel\" data-fs=\"7.5\" x=\"${c[0].toFixed(1)}\" y=\"${c[1].toFixed(1)}\">${esc(nm.slice(0,13))}</text>`; });\n        ex.forEach(f=>{ if(!f||!f.geometry)return; g+=`<path class=\"exc\" d=\"${pathFor(f,P.f)}\"/>`; });\n        if(LV.label==='Setor'){\n          Object.entries(gf).forEach(([m,f])=>{ if(!f||!f.geometry)return;\n            const dest=(s.assign||{})[m];\n            g+=`<path class=\"muni\" d=\"${pathFor(f,P.f)}\" fill=\"${esc(color[dest]||'#8e8e93')}\"/>`;\n            const c=cxy(f,P.f);\n            g+=`<text class=\"mlabel\" data-fs=\"9.5\" data-sw=\"2.4\" x=\"${c[0].toFixed(1)}\" y=\"${c[1].toFixed(1)}\">${esc(m.slice(0,14))}<tspan data-fs=\"8\" x=\"${c[0].toFixed(1)}\" dy=\"10\" font-size=\"8\">${esc(dest||'–')}</tspan></text>`; });\n        } else {\n          // GV/mercado: vários municípios do mesmo setor/GV são UMA unidade só na tela — mesma cor,\n          // mesmo stroke (a costura entre elas some), um rótulo só no centro do grupo em vez de um\n          // por município. Espelha o mapa ao vivo do simulador.\n          const groups={};\n          Object.entries(gf).forEach(([m,f])=>{ if(!f||!f.geometry)return; const u=unitOf(m); (groups[u]=groups[u]||[]).push(f); });\n          Object.entries(groups).forEach(([u,feats])=>{\n            const dest=(s.assign||{})[u]; const col=esc(color[dest]||'#8e8e93');\n            let cx=0,cy=0,n=0;\n            feats.forEach(f=>{ g+=`<path class=\"muni\" d=\"${pathFor(f,P.f)}\" fill=\"${col}\" stroke=\"${col}\"/>`;\n              const c=cxy(f,P.f); cx+=c[0]; cy+=c[1]; n++; });\n            if(n){ cx/=n; cy/=n;\n              g+=`<text class=\"mlabel\" data-fs=\"9.5\" data-sw=\"2.4\" x=\"${cx.toFixed(1)}\" y=\"${cy.toFixed(1)}\">${esc(u)}<tspan data-fs=\"8\" x=\"${cx.toFixed(1)}\" dy=\"10\" font-size=\"8\">${esc(dest||'–')}</tspan></text>`;\n            }\n          });\n        }\n        h+=`<h3>Mapa da redistribuição</h3><div class=\"map-wrap\">\n          <svg class=\"map\" id=\"map-${i}\" data-w=\"${P.W}\" data-h=\"${P.H}\" viewBox=\"0 0 ${P.W} ${P.H}\" preserveAspectRatio=\"xMidYMid meet\">${g}</svg>\n          <div class=\"zoom-pill\"><button type=\"button\" data-zoom=\"out\" data-i=\"${i}\" title=\"Diminuir zoom\">−</button><span class=\"zoom-div\"></span><button type=\"button\" data-zoom=\"in\" data-i=\"${i}\" title=\"Aumentar zoom\">+</button></div>\n          </div>\n          <div class=\"legend\">${(s.dest||[]).map(d=>`<span><i style=\"background:${esc(color[d]||'#8e8e93')}\"></i>${LV.dest} ${esc(d)}</span>`).join('')}\n          <span><i style=\"background:#e8e8ec;border:1px solid #d4d4d9\"></i>vizinhos (contexto)</span>\n          ${ex.length?`<span><i style=\"background:#f7e7d0;border:1px dashed #ff9500\"></i>fora da realocação</span>`:''}</div>`;\n      }\n      h+=`<h3>${LV.childPlural} → ${LV.destLow} destino</h3>`;\n      h+=(s.municipios||[]).map(m=>`<div class=\"mrow\"><span class=\"nm\">${esc(m.nome)}</span><span class=\"cb\">${fmt(m.cbs)} CBs</span>\n        <span class=\"chip\" style=\"background:${esc(color[m.destino]||'#8e8e93')}\">${esc(m.destino||'–')}</span></div>`).join('')||`<div class=\"note\">Nenhum${LV.childFem?'a':''} ${LV.childLow} realocad${LV.childFem?'a':'o'} nesta etapa.</div>`;\n\n      h+=`</div><div>`;\n      // spans\n      const ds=s.destinos||[];\n      const mx=Math.max(...ds.map(d=>+d.span||0),1);\n      h+=`<h3>Tamanho d${LV.fem?'a':'o'} ${LV.destLow} depois da etapa</h3>`;\n      h+=ds.map(d=>{const base=+d.base||0,inc=+d.inc||0,orph=+d.orph||0;\n        return `<div class=\"bar\"><span class=\"tag\" style=\"color:${esc(color[d.s]||'#8e8e93')}\">${esc(d.s)}</span>\n          <span class=\"track\"><span class=\"b1\" style=\"width:${(base/mx*100).toFixed(1)}%;background:${esc(color[d.s]||'#8e8e93')}\"></span><span class=\"b2\" style=\"width:${(inc/mx*100).toFixed(1)}%;background:${esc(color[d.s]||'#8e8e93')}\"></span>${orph?`<span class=\"b3\" style=\"width:${(orph/mx*100).toFixed(1)}%;background:${esc(color[d.s]||'#8e8e93')}\"></span>`:''}</span>\n          <span class=\"v\">${fmt(d.span)} <span style=\"opacity:.6\">(+${fmt(inc+orph)})</span></span></div>`;}).join('')||`<div class=\"note\">Sem ${LV.destLow} destino nesta etapa.</div>`;\n      h+=`<div class=\"note\">Claro = base antes da etapa · cheio = CBs entrantes${(s.orphanTotal?' · faixa final = CBs que seguiram suas líderes':'')}.</div>`;\n\n      // leaders\n      const L=s.lideres||[];\n      if(L.length){\n        const showOrph=L.some(x=>+x.orphan>0);\n        h+=`<h3>Líderes</h3><div class=\"scroll\"><table><thead><tr><th>Líder</th><th>CBs</th><th>${LV.dest} final</th>${showOrph?'<th>Órfãs</th>':''}<th>Desloc.</th></tr></thead><tbody>`\n          +L.map(x=>`<tr><td>${esc(x.lider||'—')}</td><td>${fmt(x.total)}</td>\n            <td>${x.home?`<span class=\"dot\" style=\"background:${esc(color[x.home]||'#8e8e93')}\"></span>${esc(x.home)}`:'–'}</td>\n            ${showOrph?`<td>${x.orphan?fmt(x.orphan):'·'}</td>`:''}\n            <td style=\"color:${+x.desloc?'var(--closing)':'var(--mut)'};font-weight:${+x.desloc?700:400}\">${fmt(x.desloc||0)}</td></tr>`).join('')\n          +`</tbody></table></div>`;\n      }\n      h+=`</div></div>`;\n\n      // antes -> depois\n      const M=s.metricas||[];\n      if(M.length){\n        h+=`<h3>Impacto antes → depois por ${LV.destLow} ${LV.fem?'receptora':'receptor'}</h3><div class=\"scroll\"><table><thead><tr><th>${LV.dest}</th>${M.map(m=>`<th>${esc(m.label)}</th>`).join('')}</tr></thead><tbody>`;\n        (s.dest||[]).forEach(sec=>{\n          h+=`<tr><td><span class=\"dot\" style=\"background:${esc(color[sec]||'#8e8e93')}\"></span>${esc(sec)}</td>`;\n          h+=M.map(m=>{const row=(m.rows||[]).find(x=>String(x.s)===String(sec))||{};\n            const a=+row.antes||0,b=+row.depois||0,d=a?((b-a)/a*100):0;const f=m.money?money:fmt;\n            return `<td>${f(b)}<div class=\"delta ${d>=0?'up':'dn'}\">${d>0?'+':''}${d.toFixed(0)}%</div></td>`;}).join('')+`</tr>`;\n        });\n        h+=`<tr style=\"opacity:.75\"><td>${esc(s.sector)} (sai)</td>`+M.map(m=>`<td>${(m.money?money:fmt)(m.sai||0)}</td>`).join('')+`</tr>`;\n        h+=`</tbody></table></div>`;\n      }\n\n      // caveats\n      const fl=[];\n      if(s.excluidos&&s.excluidos.length) fl.push(`<b>${fmt(s.excluidos.length)} município(s)</b> com poucas CBs ficaram fora da realocação geográfica (quebra de vínculo): ${esc(s.excluidos.slice(0,6).map(x=>x.muni+' ('+x.cbs+')').join(', '))}${s.excluidos.length>6?' +'+(s.excluidos.length-6):''}. As CBs seguiram a líder do seu grupo.`);\n      if(s.orphanStranded) fl.push(`<b>${fmt(s.orphanStranded)} CB(s)</b> sem setor a seguir — a líder não ficou com nenhum município realocado.`);\n      if(s.noShapeCbs) fl.push(`<b>${fmt(s.noShapeCbs)} CB(s)</b> em municípios sem shape na UF, fora do mapa e de qualquer setor destino.`);\n      if(s.optTier===1) fl.push(`O span mínimo não era atingível nesta etapa e foi relaxado pelo modelo.`);\n      if(s.optTier===2) fl.push(`Os limites de span não eram atingíveis nesta etapa e foram relaxados pelo modelo.`);\n      if(s.optTier===-1) fl.push(`Etapa resolvida por heurística (espaço de busca grande) — os limites de span não são garantidos.`);\n      if(s.destRuleFallback) fl.push(`Nenhum município dominante nesta etapa: a regra de destino foi relaxada para \"qualquer município\".`);\n      if(s.realocFallback) fl.push(`Todos os municípios ficariam abaixo do limite: a regra de realocação foi relaxada para \"realocar todos\".`);\n      if(fl.length) h+=`<div class=\"flag\">⚠ ${fl.join('<br>')}</div>`;\n      h+=`</div>`;\n    });\n\n    // cumulative\n    // Este resumo é calculado no rastro de município (world.muniOverride) — hoje só existe pro\n    // fechamento de setor; GV/mercado têm o rastro equivalente (secOverride/gvOverride) mas essa\n    // agregação ainda não foi refeita nesse grão, então avisa em vez de mostrar tabela vazia.\n    const rc=sm.receivers||[];\n    if(!rc.length && sessLevel!=='setor'){\n      h+=`<div class=\"card\"><h2>Impacto acumulado da cadeia</h2>\n        <p class=\"note\" style=\"margin-top:0\">Ainda não disponível pra sessões de ${sessLevel==='gv'?'GV':'mercado'} — veja o relatório de cada etapa acima.</p></div>`;\n    }\n    if(rc.length){\n      h+=`<div class=\"card\"><h2>Impacto acumulado da cadeia</h2>\n        <p class=\"sub\">Efeito de <b>todas</b> as ${fmt(stages.length)} etapa(s) somadas, contra o snapshot congelado sem nenhum fechamento aplicado.</p>\n        <div class=\"scroll\"><table><thead><tr><th>Setor</th><th>Situação</th><th>CBs antes</th><th>CBs depois</th><th>Variação</th></tr></thead><tbody>`\n        +rc.map(x=>{const a=+x.antes||0,b=+x.depois||0,d=a?((b-a)/a*100):0;\n          return `<tr><td>${esc(x.s)}</td><td>${esc(x.situacao||'recebeu território')}</td><td>${fmt(a)}</td><td>${fmt(b)}</td>\n            <td class=\"delta ${d>=0?'up':'dn'}\" style=\"font-size:11.5px\">${d>0?'+':''}${d.toFixed(0)}%</td></tr>`;}).join('')\n        +`</tbody></table></div></div>`;\n    }\n\n    h+=`<div class=\"note\" style=\"text-align:center;margin-top:22px\">Visualização somente leitura de uma simulação congelada. Os números refletem o snapshot <b>${esc(r.snapshotRaw||'—')}</b> e as regras vigentes no momento do compartilhamento — não acompanham o dado ao vivo.</div>`;\n    return h+`</div></div>`;\n  },\n  mounted(d2, root){\n    d2.on('#goSim','click',()=>{\n      try{ (d2.router('timelineSimRouter')||d2.router()).goTo('/'); }catch(e){ try{ d2.router().goTo('/'); }catch(e2){} }\n    });\n    d2.on('.sc','click',e=>{\n      const el=e.target.closest('.sc'); if(!el) return;\n      const t=d2.$('#'+el.dataset.goto); if(t) t.scrollIntoView({behavior:'smooth',block:'start'});\n    });\n    // ---- map zoom/pan (viewBox só — texto e polígonos vivem no mesmo sistema de coordenadas, então\n    // escalam juntos automaticamente ao encolher/esticar o viewBox, sem lógica extra pra fonte).\n    // Delegado em `root` (nunca substituído por re-render) em vez de nos <svg> por id, porque cada\n    // atualização de estado reconstrói o HTML das etapas do zero.\n    const mapViews={};\n    const getMapView=(i,W,H)=>mapViews[i]||(mapViews[i]={x:0,y:0,w:W,h:H});\n    const applyMapView=(svg,i)=>{ const v=mapViews[i]; if(!v) return;\n      svg.setAttribute('viewBox', v.x.toFixed(2)+' '+v.y.toFixed(2)+' '+v.w.toFixed(2)+' '+v.h.toFixed(2));\n      // Rótulo tem tamanho em unidades do viewBox — sem isso ele cresceria junto com o zoom até virar\n      // um borrão. Encolher na mesma proporção que o viewBox encolhe cancela o zoom: o texto fica do\n      // mesmo tamanho na tela em qualquer nível. style.fontSize (não o atributo) porque uma regra de\n      // classe como .mlabel{font-size:...} outrankaria um atributo comum.\n      const W=+svg.dataset.w||700;\n      const fsScale=v.w/W;\n      svg.querySelectorAll('[data-fs]').forEach(t=>{\n        const base=+t.getAttribute('data-fs')||8;\n        t.style.fontSize=(base*fsScale).toFixed(2)+'px';\n      });\n      // Halo do texto (contorno branco que garante legibilidade sobre qualquer cor de fundo) tem\n      // largura de traço fixa em unidades do viewBox — sem reescalar junto, no zoom alto ele vira\n      // uma mancha cobrindo a letra inteira em vez de um contorno fino.\n      svg.querySelectorAll('[data-sw]').forEach(t=>{\n        const base=+t.getAttribute('data-sw')||1;\n        t.style.strokeWidth=(base*fsScale).toFixed(3)+'px';\n      });\n    };\n    const zoomStageMap=(i,factor)=>{\n      const svg=root.querySelector('#map-'+i); if(!svg) return;\n      const W=+svg.dataset.w||700, H=+svg.dataset.h||500;\n      const v=getMapView(i,W,H);\n      const cx=v.x+v.w/2, cy=v.y+v.h/2;\n      let w=v.w/factor, h=v.h/factor;\n      w=Math.min(W, Math.max(W/8, w)); h=Math.min(H, Math.max(H/8, h));\n      let x=cx-w/2, y=cy-h/2;\n      x=Math.min(W-w, Math.max(0,x)); y=Math.min(H-h, Math.max(0,y));\n      mapViews[i]={x,y,w,h};\n      applyMapView(svg,i);\n    };\n    d2.on('.zoom-pill button','click',e=>{\n      const b=e.target.closest('button'); if(!b) return;\n      zoomStageMap(b.dataset.i, b.dataset.zoom==='in'?1.4:1/1.4);\n    });\n    let mapDrag=null;\n    root.addEventListener('pointerdown',e=>{\n      const svg=e.target.closest('svg.map'); if(!svg) return;\n      const i=svg.id.replace('map-',''); const W=+svg.dataset.w||700, H=+svg.dataset.h||500;\n      const v=getMapView(i,W,H);\n      mapDrag={svg,i,W,H,x0:e.clientX,y0:e.clientY,vx0:v.x,vy0:v.y,rect:svg.getBoundingClientRect()};\n      svg.classList.add('dragging');\n    });\n    root.addEventListener('pointermove',e=>{\n      if(!mapDrag||!mapDrag.rect.width||!mapDrag.rect.height) return;\n      const dxPix=e.clientX-mapDrag.x0, dyPix=e.clientY-mapDrag.y0;\n      const v=getMapView(mapDrag.i,mapDrag.W,mapDrag.H);\n      const sx=v.w/mapDrag.rect.width, sy=v.h/mapDrag.rect.height;\n      let x=mapDrag.vx0-dxPix*sx, y=mapDrag.vy0-dyPix*sy;\n      x=Math.min(mapDrag.W-v.w, Math.max(0,x)); y=Math.min(mapDrag.H-v.h, Math.max(0,y));\n      mapViews[mapDrag.i]={...v,x,y};\n      applyMapView(mapDrag.svg,mapDrag.i);\n    });\n    const endMapDrag=()=>{ if(mapDrag){ mapDrag.svg.classList.remove('dragging'); mapDrag=null; } };\n    root.addEventListener('pointerup',endMapDrag);\n    root.addEventListener('pointerleave',endMapDrag);\n    (async()=>{\n      try{\n        // RACE, not a missing dataset. This DataSet is gated by timelineSimAuthFinal, so its\n        // Process is only define()d once the auth session resolves — a Process waits for its\n        // dependencies' setup before its own fires. In the field the auth lookup lands ~200ms\n        // and this DataSet's first fetch ~700-900ms, while mounted() runs immediately. d2.data()\n        // returns null for a module that is not defined YET, so bailing on the first miss threw\n        // \"dataset não disponível\" on every share link even though nothing was wrong.\n        // Poll briefly instead. Two lookups because either may win: the declared `shared` param,\n        // or the global-process path via the reference the instance binds — keep that binding.\n        let dead=false; d2.onUnmount(()=>{ dead=true; });\n        let ds=null;\n        for(let i=0;i<40 && !ds && !dead;i++){\n          ds=d2.data('shared')||d2.data('timeline-shared-sessionsDataSet');\n          if(!ds) await new Promise(r=>setTimeout(r,100));\n        }\n        if(dead) return;\n        if(!ds){ d2.setState({error:'Dataset de sessões compartilhadas não disponível.',ready:true}); return; }\n        // Name the router explicitly. Bare d2.router() looks for the conventional\n        // 'Router'/'MainRouter'; this one is 'timelineSimRouter', so the bare call can hand back a\n        // handle whose .params is empty — which is how a valid /sessions/<id> link ended up\n        // reporting \"o link não traz o identificador\". The goSim handler below already passes the\n        // ref for the same reason.\n        const rt=d2.router('timelineSimRouter')||d2.router();\n        const p=(rt&&rt.params)||{};\n        // ?id= lets the artboard be opened directly, outside the route.\n        let q=null;\n        try{ q=new URLSearchParams(window.location.search).get('id'); }catch(e){}\n        // Last resort, and the only one that cannot fail: the id is sitting in the path. Route\n        // params need the Router handle to resolve AND to have matched by the time mounted() runs\n        // (.params is a reactive getter, read once here); the pathname needs neither. Matches the\n        // current /sessions/:session_id route and the legacy /sessao/:id one.\n        let seg=null;\n        try{ const m=window.location.pathname.match(/\\/sess(?:ions|ao)\\/([^/?#]+)/); seg=m&&m[1]; }catch(e){}\n        const id=p.session_id||p.id||p.sessao||p.session||seg||q;\n        if(!id){ d2.setState({error:'O link não traz o identificador da sessão.',ready:true}); return; }\n        // .query() is a direct read and returns the rows — no refresh/loadAll ordering trap here\n        const rows=await ds.query({_id:id});\n        const rec=Array.isArray(rows)?rows[0]:(rows&&rows.data&&rows.data[0]);\n        d2.setState({rec:rec||null,ready:true,error:''});\n      }catch(err){\n        d2.setState({error:(err&&err.message)||'Falha ao carregar a sessão compartilhada.',ready:true});\n      }\n    })();\n  }\n}"}},"shared":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"shared"}}}}}}}},"__d2PrevCode":{"code":"const NIVEIS=['Bronze','Cristal','Prata','Ouro','Diamante','Diamante+'];\n\nexport default {\n  css: `\n  :host{display:block;height:100%}\n  *{box-sizing:border-box}\n  .rroot{--bg:#f5f5f7;--panel:#ffffff;--panel2:#f2f2f7;--line:#e5e5ea;--ink:#1c1c1e;--mut:#6e6e73;--acc:#007aff;--closing:#ff3b30;--ok:#34c759;--warn:#ff9500;\n    height:100%;overflow:auto;background:var(--bg);color:var(--ink);\n    font:13px/1.5 -apple-system,BlinkMacSystemFont,\"SF Pro Text\",\"Segoe UI\",Roboto,sans-serif;-webkit-font-smoothing:antialiased}\n  .shell{max-width:1080px;margin:0 auto;padding:26px 22px 70px}\n  header.top{margin-bottom:20px}\n  .eyebrow{font-size:11px;text-transform:uppercase;letter-spacing:.5px;color:var(--mut);font-weight:600}\n  h1{font-size:25px;font-weight:600;letter-spacing:-.5px;margin:7px 0 10px}\n  .pills{display:flex;gap:7px;flex-wrap:wrap;align-items:center}\n  .pill{font-size:10.5px;padding:3px 9px;border-radius:99px;border:1px solid var(--line);color:var(--mut);background:var(--panel)}\n  .pill b{color:var(--ink);font-weight:600}\n  .pill.go{cursor:pointer;border-color:var(--acc);color:var(--acc);background:#eaf3ff;font-weight:600}\n  .pill.go:hover{background:#dbe9ff}\n  .goact{margin-top:15px;background:var(--acc);color:#fff;border:1px solid transparent;border-radius:8px;\n    padding:9px 16px;font:inherit;font-size:12.5px;font-weight:600;cursor:pointer}\n  .goact:hover{background:#0060df}\n  .strip{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:10px;margin:18px 0 22px}\n  .st{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:12px 14px;box-shadow:0 1px 2px rgba(0,0,0,.04)}\n  .st .n{font-size:23px;font-weight:700;letter-spacing:-.5px}\n  .st .l{font-size:10.5px;color:var(--mut);margin-top:3px;line-height:1.4}\n  .st.warn .n{color:var(--closing)}\n  .stepper{position:sticky;top:0;z-index:5;display:flex;gap:7px;overflow-x:auto;padding:11px 0;margin-bottom:6px;\n    background:rgba(245,245,247,.9);backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);border-bottom:1px solid var(--line)}\n  .sc{flex:0 0 auto;display:flex;align-items:center;gap:7px;background:var(--panel);border:1px solid var(--line);\n    border-radius:99px;padding:5px 12px 5px 6px;cursor:pointer;font-size:12px}\n  .sc:hover{border-color:var(--acc)}\n  .sc .k{width:19px;height:19px;border-radius:99px;background:var(--ink);color:#fff;font-size:10px;font-weight:700;\n    display:flex;align-items:center;justify-content:center}\n  .sc .arrow{color:var(--mut)}\n  .card{background:var(--panel);border:1px solid var(--line);border-radius:14px;padding:20px;margin-bottom:16px;box-shadow:0 1px 2px rgba(0,0,0,.04)}\n  .card > h2{font-size:15px;font-weight:600;letter-spacing:-.2px;margin:0 0 3px}\n  .card .sub{font-size:11.5px;color:var(--mut);margin:0 0 15px}\n  h3{font-size:11px;text-transform:uppercase;letter-spacing:.4px;color:var(--mut);margin:20px 0 9px;font-weight:600}\n  h3:first-of-type{margin-top:0}\n  .split{display:grid;grid-template-columns:minmax(0,1.15fr) minmax(0,1fr);gap:20px;align-items:start}\n  @media(max-width:820px){.split{grid-template-columns:1fr}}\n  svg.map{width:100%;height:auto;display:block;background:var(--panel2);border-radius:10px;border:1px solid var(--line);cursor:grab;touch-action:none}\n  svg.map.dragging{cursor:grabbing}\n  .map-wrap{position:relative}\n  .zoom-pill{position:absolute;left:10px;bottom:10px;display:flex;align-items:stretch;background:var(--panel);border:1px solid var(--line);border-radius:99px;box-shadow:0 2px 8px rgba(0,0,0,.14);overflow:hidden;z-index:3}\n  .zoom-pill button{width:30px;height:30px;border:0;background:transparent;color:var(--ink);font:16px/1 -apple-system,BlinkMacSystemFont,sans-serif;font-weight:600;cursor:pointer;display:flex;align-items:center;justify-content:center}\n  .zoom-pill button:hover{background:var(--panel2)}\n  .zoom-pill button:active{background:#e5e5ea}\n  .zoom-pill .zoom-div{width:1px;background:var(--line)}\n  .muni{stroke:#fff;stroke-width:1.1}\n  .nbr{fill:#e8e8ec;stroke:#d4d4d9;stroke-width:.7}\n  .exc{fill:#f7e7d0;stroke:var(--warn);stroke-width:.9;stroke-dasharray:2 2}\n  .mlabel{fill:#1c1c1e;font-size:9.5px;font-weight:600;text-anchor:middle;paint-order:stroke;stroke:rgba(255,255,255,.7);stroke-width:2.4px}\n  .nlabel{fill:#9a9aa0;font-size:7.5px;text-anchor:middle}\n  .legend{display:flex;gap:11px;flex-wrap:wrap;margin-top:9px;font-size:11px;color:var(--mut)}\n  .legend i{display:inline-block;width:10px;height:10px;border-radius:3px;margin-right:5px;vertical-align:-1px}\n  .bar{display:flex;align-items:center;gap:9px;margin:7px 0}\n  .bar .tag{width:46px;font-weight:600;font-size:12px}\n  .bar .track{flex:1;height:17px;background:var(--panel2);border-radius:5px;overflow:hidden;display:flex}\n  .bar .b1{height:100%;opacity:.38}.bar .b2{height:100%}.bar .b3{height:100%;opacity:.7}\n  .bar .v{width:120px;text-align:right;font-size:11px;color:var(--mut);font-variant-numeric:tabular-nums}\n  .mrow{display:flex;align-items:center;gap:9px;background:var(--panel2);border:1px solid var(--line);border-radius:9px;padding:6px 10px;margin-bottom:5px}\n  .mrow .nm{flex:1;font-weight:600;font-size:12px;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n  .mrow .cb{color:var(--mut);font-size:11px;font-variant-numeric:tabular-nums}\n  .chip{font-size:11px;font-weight:700;color:#fff;border-radius:6px;padding:2px 8px}\n  table{border-collapse:collapse;width:100%;font-size:11.5px}\n  th,td{padding:6px 7px;text-align:right;border-bottom:1px solid var(--line);font-variant-numeric:tabular-nums}\n  th:first-child,td:first-child{text-align:left}\n  thead th{color:var(--mut);font-weight:600;font-size:10.5px}\n  .dot{display:inline-block;width:9px;height:9px;border-radius:2px;margin-right:5px}\n  .delta{font-size:10px}.delta.up{color:var(--ok)}.delta.dn{color:var(--closing)}\n  .note{font-size:10.5px;color:var(--mut);line-height:1.55;margin-top:9px}\n  .flag{margin-top:11px;padding:9px 11px;border-radius:9px;font-size:11.5px;line-height:1.55;background:#fff8ef;border:1px solid #ffe0bd;color:#8a5200}\n  .scroll{max-height:300px;overflow:auto}\n  .center{display:flex;align-items:center;justify-content:center;height:100%;padding:40px}\n  .msg{max-width:420px;text-align:center}\n  .msg h2{font-size:17px;font-weight:600;margin:0 0 7px}\n  .msg p{font-size:12.5px;color:var(--mut);margin:0;line-height:1.55}\n`,\n  render(d2){\n    // Hierarquia mercado > GV > setor, espelhando o simulador ao vivo. Tudo pré-computado (label,\n    // minúscula, plural, gênero) pra nunca minusculizar \"GV\" (sigla) virando \"gv\", e pra concordar\n    // gênero certo em cada frase — GV é feminina (a Gerência de Vendas), o resto é masculino.\n    const LVL={\n      setor:{label:'Setor',low:'setor',fem:false, child:'Município',childLow:'município',childPlural:'Municípios',childFem:false, dest:'Setor',destLow:'setor'},\n      gv:{label:'GV',low:'GV',fem:true, child:'Setor',childLow:'setor',childPlural:'Setores',childFem:false, dest:'GV',destLow:'GV'},\n      mercado:{label:'Mercado',low:'mercado',fem:false, child:'GV',childLow:'GV',childPlural:'GVs',childFem:true, dest:'Mercado',destLow:'mercado'},\n    };\n    const lv=s=>LVL[(s&&s.level)||'setor'];\n    const esc=s=>(s==null?'':String(s)).replace(/[&<>\"]/g,c=>({'&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;'}[c]));\n    const fmt=n=>n==null?'–':Math.round(+n).toLocaleString('pt-BR');\n    const money=n=>{n=+n||0;return n>=1e6?'R$'+(n/1e6).toFixed(1)+'M':n>=1e3?'R$'+(n/1e3).toFixed(0)+'k':'R$'+Math.round(n)};\n    const msg=(t,b,act)=>`<div class=\"rroot\"><div class=\"center\"><div class=\"msg\"><h2>${t}</h2><p>${b}</p>${act?`<button class=\"goact\" id=\"goSim\">Abrir o simulador</button>`:''}</div></div></div>`;\n\n    if(d2.state.error) return msg('Não foi possível abrir a sessão',esc(d2.state.error),true);\n    if(!d2.state.ready) return msg('Carregando sessão…','Buscando o registro compartilhado.');\n    const r=d2.state.rec;\n    if(!r) return msg('Sessão não encontrada','O link pode ter expirado ou o registro foi removido. Peça um novo link a quem compartilhou.',true);\n\n    const stages=Array.isArray(r.stages)?r.stages:[];\n    const sm=r.summary||{};\n    const st=r.settings||{};\n    const ruleDest=st.destRule==='dominant'?`destino: dominantes ≥${fmt(st.destMinCbs)} CBs`:'destino: qualquer município';\n    const ruleReal=st.realocRule==='relevant'?`realocação: ≥${fmt(st.realocMinCbs)} CBs`:'realocação: todos';\n    const spanBits=[];\n    if(st.targetSpan)spanBits.push('alvo '+fmt(st.targetSpan));\n    if(st.maxSpan)spanBits.push('máx '+fmt(st.maxSpan));\n    if(st.minSpan)spanBits.push('mín '+fmt(st.minSpan));\n\n    let h=`<div class=\"rroot\"><div class=\"shell\">\n      <header class=\"top\">\n        <div class=\"eyebrow\">Simulador de timeline de fechamentos · sessão compartilhada</div>\n        <h1>${esc(r.label||'Sessão sem nome')}</h1>\n        <div class=\"pills\">\n          <span class=\"pill\">● snapshot congelado · <b>${esc(r.snapshotRaw||'—')}</b></span>\n          <span class=\"pill\">◇ ${esc(ruleReal)}</span>\n          <span class=\"pill\">◈ ${esc(ruleDest)}</span>\n          <span class=\"pill\">◎ span: <b>${spanBits.length?esc(spanBits.join(' · ')):'livre'}</b></span>\n          ${r.sharedBy?`<span class=\"pill\">por <b>${esc(r.sharedBy)}</b></span>`:''}\n          ${r.sharedAt?`<span class=\"pill\">${esc(new Date(r.sharedAt).toLocaleString('pt-BR'))}</span>`:''}\n          <span class=\"pill go\" id=\"goSim\" role=\"button\" tabindex=\"0\" title=\"Ir para o simulador\">↗ abrir o simulador</span>\n        </div>\n      </header>`;\n\n    const sessLevel=(stages[0]&&stages[0].level)||'setor';\n    h+=`<div class=\"strip\">\n      <div class=\"st\"><div class=\"n\">${fmt(stages.length)}</div><div class=\"l\">Etapa(s) de fechamento</div></div>\n      <div class=\"st\"><div class=\"n\">${fmt(sm.totalCbs)}</div><div class=\"l\">CBs realocadas na cadeia</div></div>\n      ${sessLevel==='setor'?`<div class=\"st warn\"><div class=\"n\">${fmt(sm.totalDesloc)}</div><div class=\"l\">CBs deslocadas (quebra de relação)</div></div>`:`<div class=\"st\"><div class=\"n\">${fmt(sm.totalDesloc)}</div><div class=\"l\">CBs com líder dividida entre destinos</div></div>`}\n      <div class=\"st\"><div class=\"n\" style=\"font-size:15px;line-height:1.5;font-weight:600\">${esc((sm.sectors||[]).join(' → ')||'—')}</div><div class=\"l\">Ordem de fechamento</div></div>\n    </div>`;\n\n    if(stages.length>1){\n      h+=`<div class=\"stepper\">`+stages.map((s,i)=>`<div class=\"sc\" data-goto=\"stage-${i}\"><span class=\"k\">${i+1}</span>${lv(s).label} ${esc(s.sector)}<span class=\"arrow\">→</span>${esc((s.dest||[]).join(', ')||'–')}</div>`).join('')+`</div>`;\n    }\n\n    // ---- projection helpers (pure; mirrors the simulator's) ----\n    const project=feats=>{let mnx=1/0,mny=1/0,mxx=-1/0,mxy=-1/0;\n      feats.forEach(f=>{const g=f&&f.geometry;if(!g)return;const ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];\n        ps.forEach(p=>p.forEach(rg=>rg.forEach(pt=>{mnx=Math.min(mnx,pt[0]);mxx=Math.max(mxx,pt[0]);mny=Math.min(mny,pt[1]);mxy=Math.max(mxy,pt[1]);})));});\n      if(!isFinite(mnx)) return null;\n      const mlat=(mny+mxy)/2,kx=Math.cos(mlat*Math.PI/180),W=680,H=440,pad=16;\n      const gw=Math.max((mxx-mnx)*kx,1e-9),gh=Math.max(mxy-mny,1e-9),sc=Math.min((W-2*pad)/gw,(H-2*pad)/gh);\n      const ox=(W-gw*sc)/2,oy=(H-gh*sc)/2;\n      return {W,H,f:pt=>[ox+(pt[0]-mnx)*kx*sc, oy+(mxy-pt[1])*sc]};};\n    const pathFor=(f,pr)=>{const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];\n      return ps.map(poly=>poly.map(rg=>'M'+rg.map(pt=>{const q=pr(pt);return q[0].toFixed(1)+','+q[1].toFixed(1);}).join('L')+'Z').join('')).join('');};\n    const cxy=(f,pr)=>{let x=0,y=0,n=0;const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];\n      ps.forEach(poly=>poly[0].forEach(pt=>{const q=pr(pt);x+=q[0];y+=q[1];n++;}));return n?[x/n,y/n]:[0,0];};\n\n    stages.forEach((s,i)=>{\n      const color=s.color||{};\n      const k=s.kpis||{};\n      const LV=lv(s);\n      h+=`<div class=\"card\" id=\"stage-${i}\" data-key=\"stage-${i}\">\n        <h2>Etapa ${i+1} · ${LV.low} <b>${esc(s.sector)}</b> fechad${LV.fem?'a':'o'}</h2>\n        <p class=\"sub\">Território redistribuído para ${esc((s.dest||[]).join(', ')||'—')}${s.domUF?' · '+esc(s.domUF):''}${s.policy?' · política: '+(s.policy==='fora'?'manter vínculo':'quebrar relação'):''}</p>\n        <div class=\"strip\" style=\"margin:0 0 18px\">\n          <div class=\"st\"><div class=\"n\">${fmt(k.cbsRealocadas)}</div><div class=\"l\">CBs realocadas</div></div>\n          ${LV.label==='Setor'?`<div class=\"st warn\"><div class=\"n\">${fmt(k.desloc)}</div><div class=\"l\">CBs deslocadas</div></div>`:`<div class=\"st\"><div class=\"n\">${fmt(k.desloc)}</div><div class=\"l\">CBs com líder dividida</div></div>`}\n          <div class=\"st\"><div class=\"n\">${fmt(k.municipios)}</div><div class=\"l\">${LV.childPlural} movid${LV.childFem?'as':'os'}</div></div>\n          <div class=\"st\"><div class=\"n\">${fmt(k.lideres)}</div><div class=\"l\">Líderes envolvidas</div></div>\n        </div>\n        <div class=\"split\"><div>`;\n\n      // map\n      const gf=s.geoFeat||{}, nb=Array.isArray(s.nbrFeat)?s.nbrFeat:[], ex=Array.isArray(s.excludedFeat)?s.excludedFeat:[];\n      const all=[...nb,...ex,...Object.values(gf)].filter(Boolean);\n      const P=project(all);\n      const unitOf=m=>LV.label==='Setor'?m:((s.unitOfMuni||{})[m]||m);\n      if(P){\n        let g='';\n        nb.forEach(f=>{ if(!f||!f.geometry)return; g+=`<path class=\"nbr\" d=\"${pathFor(f,P.f)}\"/>`;\n          const c=cxy(f,P.f);const nm=(f.properties&&f.properties.name)||'';\n          if(nm) g+=`<text class=\"nlabel\" data-fs=\"7.5\" x=\"${c[0].toFixed(1)}\" y=\"${c[1].toFixed(1)}\">${esc(nm.slice(0,13))}</text>`; });\n        ex.forEach(f=>{ if(!f||!f.geometry)return; g+=`<path class=\"exc\" d=\"${pathFor(f,P.f)}\"/>`; });\n        if(LV.label==='Setor'){\n          Object.entries(gf).forEach(([m,f])=>{ if(!f||!f.geometry)return;\n            const dest=(s.assign||{})[m];\n            g+=`<path class=\"muni\" d=\"${pathFor(f,P.f)}\" fill=\"${esc(color[dest]||'#8e8e93')}\"/>`;\n            const c=cxy(f,P.f);\n            g+=`<text class=\"mlabel\" data-fs=\"9.5\" x=\"${c[0].toFixed(1)}\" y=\"${c[1].toFixed(1)}\">${esc(m.slice(0,14))}<tspan data-fs=\"8\" x=\"${c[0].toFixed(1)}\" dy=\"10\" font-size=\"8\">${esc(dest||'–')}</tspan></text>`; });\n        } else {\n          // GV/mercado: vários municípios do mesmo setor/GV são UMA unidade só na tela — mesma cor,\n          // mesmo stroke (a costura entre elas some), um rótulo só no centro do grupo em vez de um\n          // por município. Espelha o mapa ao vivo do simulador.\n          const groups={};\n          Object.entries(gf).forEach(([m,f])=>{ if(!f||!f.geometry)return; const u=unitOf(m); (groups[u]=groups[u]||[]).push(f); });\n          Object.entries(groups).forEach(([u,feats])=>{\n            const dest=(s.assign||{})[u]; const col=esc(color[dest]||'#8e8e93');\n            let cx=0,cy=0,n=0;\n            feats.forEach(f=>{ g+=`<path class=\"muni\" d=\"${pathFor(f,P.f)}\" fill=\"${col}\" stroke=\"${col}\"/>`;\n              const c=cxy(f,P.f); cx+=c[0]; cy+=c[1]; n++; });\n            if(n){ cx/=n; cy/=n;\n              g+=`<text class=\"mlabel\" data-fs=\"9.5\" x=\"${cx.toFixed(1)}\" y=\"${cy.toFixed(1)}\">${esc(u)}<tspan data-fs=\"8\" x=\"${cx.toFixed(1)}\" dy=\"10\" font-size=\"8\">${esc(dest||'–')}</tspan></text>`;\n            }\n          });\n        }\n        h+=`<h3>Mapa da redistribuição</h3><div class=\"map-wrap\">\n          <svg class=\"map\" id=\"map-${i}\" data-w=\"${P.W}\" data-h=\"${P.H}\" viewBox=\"0 0 ${P.W} ${P.H}\" preserveAspectRatio=\"xMidYMid meet\">${g}</svg>\n          <div class=\"zoom-pill\"><button type=\"button\" data-zoom=\"out\" data-i=\"${i}\" title=\"Diminuir zoom\">−</button><span class=\"zoom-div\"></span><button type=\"button\" data-zoom=\"in\" data-i=\"${i}\" title=\"Aumentar zoom\">+</button></div>\n          </div>\n          <div class=\"legend\">${(s.dest||[]).map(d=>`<span><i style=\"background:${esc(color[d]||'#8e8e93')}\"></i>${LV.dest} ${esc(d)}</span>`).join('')}\n          <span><i style=\"background:#e8e8ec;border:1px solid #d4d4d9\"></i>vizinhos (contexto)</span>\n          ${ex.length?`<span><i style=\"background:#f7e7d0;border:1px dashed #ff9500\"></i>fora da realocação</span>`:''}</div>`;\n      }\n      h+=`<h3>${LV.childPlural} → ${LV.destLow} destino</h3>`;\n      h+=(s.municipios||[]).map(m=>`<div class=\"mrow\"><span class=\"nm\">${esc(m.nome)}</span><span class=\"cb\">${fmt(m.cbs)} CBs</span>\n        <span class=\"chip\" style=\"background:${esc(color[m.destino]||'#8e8e93')}\">${esc(m.destino||'–')}</span></div>`).join('')||`<div class=\"note\">Nenhum${LV.childFem?'a':''} ${LV.childLow} realocad${LV.childFem?'a':'o'} nesta etapa.</div>`;\n\n      h+=`</div><div>`;\n      // spans\n      const ds=s.destinos||[];\n      const mx=Math.max(...ds.map(d=>+d.span||0),1);\n      h+=`<h3>Tamanho d${LV.fem?'a':'o'} ${LV.destLow} depois da etapa</h3>`;\n      h+=ds.map(d=>{const base=+d.base||0,inc=+d.inc||0,orph=+d.orph||0;\n        return `<div class=\"bar\"><span class=\"tag\" style=\"color:${esc(color[d.s]||'#8e8e93')}\">${esc(d.s)}</span>\n          <span class=\"track\"><span class=\"b1\" style=\"width:${(base/mx*100).toFixed(1)}%;background:${esc(color[d.s]||'#8e8e93')}\"></span><span class=\"b2\" style=\"width:${(inc/mx*100).toFixed(1)}%;background:${esc(color[d.s]||'#8e8e93')}\"></span>${orph?`<span class=\"b3\" style=\"width:${(orph/mx*100).toFixed(1)}%;background:${esc(color[d.s]||'#8e8e93')}\"></span>`:''}</span>\n          <span class=\"v\">${fmt(d.span)} <span style=\"opacity:.6\">(+${fmt(inc+orph)})</span></span></div>`;}).join('')||`<div class=\"note\">Sem ${LV.destLow} destino nesta etapa.</div>`;\n      h+=`<div class=\"note\">Claro = base antes da etapa · cheio = CBs entrantes${(s.orphanTotal?' · faixa final = CBs que seguiram suas líderes':'')}.</div>`;\n\n      // leaders\n      const L=s.lideres||[];\n      if(L.length){\n        const showOrph=L.some(x=>+x.orphan>0);\n        h+=`<h3>Líderes</h3><div class=\"scroll\"><table><thead><tr><th>Líder</th><th>CBs</th><th>${LV.dest} final</th>${showOrph?'<th>Órfãs</th>':''}<th>Desloc.</th></tr></thead><tbody>`\n          +L.map(x=>`<tr><td>${esc(x.lider||'—')}</td><td>${fmt(x.total)}</td>\n            <td>${x.home?`<span class=\"dot\" style=\"background:${esc(color[x.home]||'#8e8e93')}\"></span>${esc(x.home)}`:'–'}</td>\n            ${showOrph?`<td>${x.orphan?fmt(x.orphan):'·'}</td>`:''}\n            <td style=\"color:${+x.desloc?'var(--closing)':'var(--mut)'};font-weight:${+x.desloc?700:400}\">${fmt(x.desloc||0)}</td></tr>`).join('')\n          +`</tbody></table></div>`;\n      }\n      h+=`</div></div>`;\n\n      // antes -> depois\n      const M=s.metricas||[];\n      if(M.length){\n        h+=`<h3>Impacto antes → depois por ${LV.destLow} ${LV.fem?'receptora':'receptor'}</h3><div class=\"scroll\"><table><thead><tr><th>${LV.dest}</th>${M.map(m=>`<th>${esc(m.label)}</th>`).join('')}</tr></thead><tbody>`;\n        (s.dest||[]).forEach(sec=>{\n          h+=`<tr><td><span class=\"dot\" style=\"background:${esc(color[sec]||'#8e8e93')}\"></span>${esc(sec)}</td>`;\n          h+=M.map(m=>{const row=(m.rows||[]).find(x=>String(x.s)===String(sec))||{};\n            const a=+row.antes||0,b=+row.depois||0,d=a?((b-a)/a*100):0;const f=m.money?money:fmt;\n            return `<td>${f(b)}<div class=\"delta ${d>=0?'up':'dn'}\">${d>0?'+':''}${d.toFixed(0)}%</div></td>`;}).join('')+`</tr>`;\n        });\n        h+=`<tr style=\"opacity:.75\"><td>${esc(s.sector)} (sai)</td>`+M.map(m=>`<td>${(m.money?money:fmt)(m.sai||0)}</td>`).join('')+`</tr>`;\n        h+=`</tbody></table></div>`;\n      }\n\n      // caveats\n      const fl=[];\n      if(s.excluidos&&s.excluidos.length) fl.push(`<b>${fmt(s.excluidos.length)} município(s)</b> com poucas CBs ficaram fora da realocação geográfica (quebra de vínculo): ${esc(s.excluidos.slice(0,6).map(x=>x.muni+' ('+x.cbs+')').join(', '))}${s.excluidos.length>6?' +'+(s.excluidos.length-6):''}. As CBs seguiram a líder do seu grupo.`);\n      if(s.orphanStranded) fl.push(`<b>${fmt(s.orphanStranded)} CB(s)</b> sem setor a seguir — a líder não ficou com nenhum município realocado.`);\n      if(s.noShapeCbs) fl.push(`<b>${fmt(s.noShapeCbs)} CB(s)</b> em municípios sem shape na UF, fora do mapa e de qualquer setor destino.`);\n      if(s.optTier===1) fl.push(`O span mínimo não era atingível nesta etapa e foi relaxado pelo modelo.`);\n      if(s.optTier===2) fl.push(`Os limites de span não eram atingíveis nesta etapa e foram relaxados pelo modelo.`);\n      if(s.optTier===-1) fl.push(`Etapa resolvida por heurística (espaço de busca grande) — os limites de span não são garantidos.`);\n      if(s.destRuleFallback) fl.push(`Nenhum município dominante nesta etapa: a regra de destino foi relaxada para \"qualquer município\".`);\n      if(s.realocFallback) fl.push(`Todos os municípios ficariam abaixo do limite: a regra de realocação foi relaxada para \"realocar todos\".`);\n      if(fl.length) h+=`<div class=\"flag\">⚠ ${fl.join('<br>')}</div>`;\n      h+=`</div>`;\n    });\n\n    // cumulative\n    // Este resumo é calculado no rastro de município (world.muniOverride) — hoje só existe pro\n    // fechamento de setor; GV/mercado têm o rastro equivalente (secOverride/gvOverride) mas essa\n    // agregação ainda não foi refeita nesse grão, então avisa em vez de mostrar tabela vazia.\n    const rc=sm.receivers||[];\n    if(!rc.length && sessLevel!=='setor'){\n      h+=`<div class=\"card\"><h2>Impacto acumulado da cadeia</h2>\n        <p class=\"note\" style=\"margin-top:0\">Ainda não disponível pra sessões de ${sessLevel==='gv'?'GV':'mercado'} — veja o relatório de cada etapa acima.</p></div>`;\n    }\n    if(rc.length){\n      h+=`<div class=\"card\"><h2>Impacto acumulado da cadeia</h2>\n        <p class=\"sub\">Efeito de <b>todas</b> as ${fmt(stages.length)} etapa(s) somadas, contra o snapshot congelado sem nenhum fechamento aplicado.</p>\n        <div class=\"scroll\"><table><thead><tr><th>Setor</th><th>Situação</th><th>CBs antes</th><th>CBs depois</th><th>Variação</th></tr></thead><tbody>`\n        +rc.map(x=>{const a=+x.antes||0,b=+x.depois||0,d=a?((b-a)/a*100):0;\n          return `<tr><td>${esc(x.s)}</td><td>${esc(x.situacao||'recebeu território')}</td><td>${fmt(a)}</td><td>${fmt(b)}</td>\n            <td class=\"delta ${d>=0?'up':'dn'}\" style=\"font-size:11.5px\">${d>0?'+':''}${d.toFixed(0)}%</td></tr>`;}).join('')\n        +`</tbody></table></div></div>`;\n    }\n\n    h+=`<div class=\"note\" style=\"text-align:center;margin-top:22px\">Visualização somente leitura de uma simulação congelada. Os números refletem o snapshot <b>${esc(r.snapshotRaw||'—')}</b> e as regras vigentes no momento do compartilhamento — não acompanham o dado ao vivo.</div>`;\n    return h+`</div></div>`;\n  },\n  mounted(d2, root){\n    d2.on('#goSim','click',()=>{\n      try{ (d2.router('timelineSimRouter')||d2.router()).goTo('/'); }catch(e){ try{ d2.router().goTo('/'); }catch(e2){} }\n    });\n    d2.on('.sc','click',e=>{\n      const el=e.target.closest('.sc'); if(!el) return;\n      const t=d2.$('#'+el.dataset.goto); if(t) t.scrollIntoView({behavior:'smooth',block:'start'});\n    });\n    // ---- map zoom/pan (viewBox só — texto e polígonos vivem no mesmo sistema de coordenadas, então\n    // escalam juntos automaticamente ao encolher/esticar o viewBox, sem lógica extra pra fonte).\n    // Delegado em `root` (nunca substituído por re-render) em vez de nos <svg> por id, porque cada\n    // atualização de estado reconstrói o HTML das etapas do zero.\n    const mapViews={};\n    const getMapView=(i,W,H)=>mapViews[i]||(mapViews[i]={x:0,y:0,w:W,h:H});\n    const applyMapView=(svg,i)=>{ const v=mapViews[i]; if(!v) return;\n      svg.setAttribute('viewBox', v.x.toFixed(2)+' '+v.y.toFixed(2)+' '+v.w.toFixed(2)+' '+v.h.toFixed(2));\n      // Rótulo tem tamanho em unidades do viewBox — sem isso ele cresceria junto com o zoom até virar\n      // um borrão. Encolher na mesma proporção que o viewBox encolhe cancela o zoom: o texto fica do\n      // mesmo tamanho na tela em qualquer nível. style.fontSize (não o atributo) porque uma regra de\n      // classe como .mlabel{font-size:...} outrankaria um atributo comum.\n      const W=+svg.dataset.w||700;\n      const fsScale=v.w/W;\n      svg.querySelectorAll('[data-fs]').forEach(t=>{\n        const base=+t.getAttribute('data-fs')||8;\n        t.style.fontSize=(base*fsScale).toFixed(2)+'px';\n      });\n    };\n    const zoomStageMap=(i,factor)=>{\n      const svg=root.querySelector('#map-'+i); if(!svg) return;\n      const W=+svg.dataset.w||700, H=+svg.dataset.h||500;\n      const v=getMapView(i,W,H);\n      const cx=v.x+v.w/2, cy=v.y+v.h/2;\n      let w=v.w/factor, h=v.h/factor;\n      w=Math.min(W, Math.max(W/8, w)); h=Math.min(H, Math.max(H/8, h));\n      let x=cx-w/2, y=cy-h/2;\n      x=Math.min(W-w, Math.max(0,x)); y=Math.min(H-h, Math.max(0,y));\n      mapViews[i]={x,y,w,h};\n      applyMapView(svg,i);\n    };\n    d2.on('.zoom-pill button','click',e=>{\n      const b=e.target.closest('button'); if(!b) return;\n      zoomStageMap(b.dataset.i, b.dataset.zoom==='in'?1.4:1/1.4);\n    });\n    let mapDrag=null;\n    root.addEventListener('pointerdown',e=>{\n      const svg=e.target.closest('svg.map'); if(!svg) return;\n      const i=svg.id.replace('map-',''); const W=+svg.dataset.w||700, H=+svg.dataset.h||500;\n      const v=getMapView(i,W,H);\n      mapDrag={svg,i,W,H,x0:e.clientX,y0:e.clientY,vx0:v.x,vy0:v.y,rect:svg.getBoundingClientRect()};\n      svg.classList.add('dragging');\n    });\n    root.addEventListener('pointermove',e=>{\n      if(!mapDrag||!mapDrag.rect.width||!mapDrag.rect.height) return;\n      const dxPix=e.clientX-mapDrag.x0, dyPix=e.clientY-mapDrag.y0;\n      const v=getMapView(mapDrag.i,mapDrag.W,mapDrag.H);\n      const sx=v.w/mapDrag.rect.width, sy=v.h/mapDrag.rect.height;\n      let x=mapDrag.vx0-dxPix*sx, y=mapDrag.vy0-dyPix*sy;\n      x=Math.min(mapDrag.W-v.w, Math.max(0,x)); y=Math.min(mapDrag.H-v.h, Math.max(0,y));\n      mapViews[mapDrag.i]={...v,x,y};\n      applyMapView(mapDrag.svg,mapDrag.i);\n    });\n    const endMapDrag=()=>{ if(mapDrag){ mapDrag.svg.classList.remove('dragging'); mapDrag=null; } };\n    root.addEventListener('pointerup',endMapDrag);\n    root.addEventListener('pointerleave',endMapDrag);\n    (async()=>{\n      try{\n        // RACE, not a missing dataset. This DataSet is gated by timelineSimAuthFinal, so its\n        // Process is only define()d once the auth session resolves — a Process waits for its\n        // dependencies' setup before its own fires. In the field the auth lookup lands ~200ms\n        // and this DataSet's first fetch ~700-900ms, while mounted() runs immediately. d2.data()\n        // returns null for a module that is not defined YET, so bailing on the first miss threw\n        // \"dataset não disponível\" on every share link even though nothing was wrong.\n        // Poll briefly instead. Two lookups because either may win: the declared `shared` param,\n        // or the global-process path via the reference the instance binds — keep that binding.\n        let dead=false; d2.onUnmount(()=>{ dead=true; });\n        let ds=null;\n        for(let i=0;i<40 && !ds && !dead;i++){\n          ds=d2.data('shared')||d2.data('timeline-shared-sessionsDataSet');\n          if(!ds) await new Promise(r=>setTimeout(r,100));\n        }\n        if(dead) return;\n        if(!ds){ d2.setState({error:'Dataset de sessões compartilhadas não disponível.',ready:true}); return; }\n        // Name the router explicitly. Bare d2.router() looks for the conventional\n        // 'Router'/'MainRouter'; this one is 'timelineSimRouter', so the bare call can hand back a\n        // handle whose .params is empty — which is how a valid /sessions/<id> link ended up\n        // reporting \"o link não traz o identificador\". The goSim handler below already passes the\n        // ref for the same reason.\n        const rt=d2.router('timelineSimRouter')||d2.router();\n        const p=(rt&&rt.params)||{};\n        // ?id= lets the artboard be opened directly, outside the route.\n        let q=null;\n        try{ q=new URLSearchParams(window.location.search).get('id'); }catch(e){}\n        // Last resort, and the only one that cannot fail: the id is sitting in the path. Route\n        // params need the Router handle to resolve AND to have matched by the time mounted() runs\n        // (.params is a reactive getter, read once here); the pathname needs neither. Matches the\n        // current /sessions/:session_id route and the legacy /sessao/:id one.\n        let seg=null;\n        try{ const m=window.location.pathname.match(/\\/sess(?:ions|ao)\\/([^/?#]+)/); seg=m&&m[1]; }catch(e){}\n        const id=p.session_id||p.id||p.sessao||p.session||seg||q;\n        if(!id){ d2.setState({error:'O link não traz o identificador da sessão.',ready:true}); return; }\n        // .query() is a direct read and returns the rows — no refresh/loadAll ordering trap here\n        const rows=await ds.query({_id:id});\n        const rec=Array.isArray(rows)?rows[0]:(rows&&rows.data&&rows.data[0]);\n        d2.setState({rec:rec||null,ready:true,error:''});\n      }catch(err){\n        d2.setState({error:(err&&err.message)||'Falha ao carregar a sessão compartilhada.',ready:true});\n      }\n    })();\n  }\n}","at":"2026-08-13T14:21:53.099Z"}},"updatedAt":"2026-08-14T15:11:33.136Z","createdAt":"2026-08-14T15:10:57.232Z"},{"_id":"6a7f3024f798d7d41c74440f","component":"data2-core-types@Component","system":"6a57cfe9673eb7e3c5e57784","params":{"component":"Y7eEvdJeC4azwvfDtwrYP","package":"natura-geomarketing","title":"Ventura DEV — Leitor de Cenários","extends":"data2-core-primitives@Block","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{"shared":{"component":"data2-core-types@InteractiveModuleReference"}}}},"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"const NIVEIS=['Bronze','Cristal','Prata','Ouro','Diamante','Diamante+'];\n\nexport default {\n  css: `\n  :host{display:block;height:100%}\n  *{box-sizing:border-box}\n  .rroot{--bg:#f5f5f7;--panel:#ffffff;--panel2:#f2f2f7;--line:#e5e5ea;--ink:#1c1c1e;--mut:#6e6e73;--acc:#007aff;--closing:#ff3b30;--ok:#34c759;--warn:#ff9500;\n    height:100%;overflow:auto;background:var(--bg);color:var(--ink);\n    font:13px/1.5 -apple-system,BlinkMacSystemFont,\"SF Pro Text\",\"Segoe UI\",Roboto,sans-serif;-webkit-font-smoothing:antialiased}\n  .shell{max-width:1080px;margin:0 auto;padding:26px 22px 70px}\n  header.top{margin-bottom:20px}\n  .eyebrow{font-size:11px;text-transform:uppercase;letter-spacing:.5px;color:var(--mut);font-weight:600}\n  h1{font-size:25px;font-weight:600;letter-spacing:-.5px;margin:7px 0 10px}\n  .pills{display:flex;gap:7px;flex-wrap:wrap;align-items:center}\n  .pill{font-size:10.5px;padding:3px 9px;border-radius:99px;border:1px solid var(--line);color:var(--mut);background:var(--panel)}\n  .pill b{color:var(--ink);font-weight:600}\n  .pill.go{cursor:pointer;border-color:var(--acc);color:var(--acc);background:#eaf3ff;font-weight:600}\n  .pill.go:hover{background:#dbe9ff}\n  .goact{margin-top:15px;background:var(--acc);color:#fff;border:1px solid transparent;border-radius:8px;\n    padding:9px 16px;font:inherit;font-size:12.5px;font-weight:600;cursor:pointer}\n  .goact:hover{background:#0060df}\n  .strip{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:10px;margin:18px 0 22px}\n  .st{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:12px 14px;box-shadow:0 1px 2px rgba(0,0,0,.04)}\n  .st .n{font-size:23px;font-weight:700;letter-spacing:-.5px}\n  .st .l{font-size:10.5px;color:var(--mut);margin-top:3px;line-height:1.4}\n  .st.warn .n{color:var(--closing)}\n  .stepper{position:sticky;top:0;z-index:5;display:flex;gap:7px;overflow-x:auto;padding:11px 0;margin-bottom:6px;\n    background:rgba(245,245,247,.9);backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);border-bottom:1px solid var(--line)}\n  .sc{flex:0 0 auto;display:flex;align-items:center;gap:7px;background:var(--panel);border:1px solid var(--line);\n    border-radius:99px;padding:5px 12px 5px 6px;cursor:pointer;font-size:12px}\n  .sc:hover{border-color:var(--acc)}\n  .sc .k{width:19px;height:19px;border-radius:99px;background:var(--ink);color:#fff;font-size:10px;font-weight:700;\n    display:flex;align-items:center;justify-content:center}\n  .sc .arrow{color:var(--mut)}\n  .card{background:var(--panel);border:1px solid var(--line);border-radius:14px;padding:20px;margin-bottom:16px;box-shadow:0 1px 2px rgba(0,0,0,.04)}\n  .card > h2{font-size:15px;font-weight:600;letter-spacing:-.2px;margin:0 0 3px}\n  .card .sub{font-size:11.5px;color:var(--mut);margin:0 0 15px}\n  h3{font-size:11px;text-transform:uppercase;letter-spacing:.4px;color:var(--mut);margin:20px 0 9px;font-weight:600}\n  h3:first-of-type{margin-top:0}\n  .split{display:grid;grid-template-columns:minmax(0,1.15fr) minmax(0,1fr);gap:20px;align-items:start}\n  @media(max-width:820px){.split{grid-template-columns:1fr}}\n  svg.map{width:100%;height:auto;display:block;background:var(--panel2);border-radius:10px;border:1px solid var(--line);cursor:grab;touch-action:none}\n  svg.map.dragging{cursor:grabbing}\n  .map-wrap{position:relative}\n  .zoom-pill{position:absolute;left:10px;bottom:10px;display:flex;align-items:stretch;background:var(--panel);border:1px solid var(--line);border-radius:99px;box-shadow:0 2px 8px rgba(0,0,0,.14);overflow:hidden;z-index:3}\n  .zoom-pill button{width:30px;height:30px;border:0;background:transparent;color:var(--ink);font:16px/1 -apple-system,BlinkMacSystemFont,sans-serif;font-weight:600;cursor:pointer;display:flex;align-items:center;justify-content:center}\n  .zoom-pill button:hover{background:var(--panel2)}\n  .zoom-pill button:active{background:#e5e5ea}\n  .zoom-pill .zoom-div{width:1px;background:var(--line)}\n  .muni{stroke:#fff;stroke-width:1.1}\n  .nbr{fill:#e8e8ec;stroke:#d4d4d9;stroke-width:.7}\n  .exc{fill:#f7e7d0;stroke:var(--warn);stroke-width:.9;stroke-dasharray:2 2}\n  .mlabel{fill:#1c1c1e;font-size:9.5px;font-weight:600;text-anchor:middle;paint-order:stroke;stroke:rgba(255,255,255,.7);stroke-width:2.4px}\n  .nlabel{fill:#9a9aa0;font-size:7.5px;text-anchor:middle}\n  .legend{display:flex;gap:11px;flex-wrap:wrap;margin-top:9px;font-size:11px;color:var(--mut)}\n  .legend i{display:inline-block;width:10px;height:10px;border-radius:3px;margin-right:5px;vertical-align:-1px}\n  .bar{display:flex;align-items:center;gap:9px;margin:7px 0}\n  .bar .tag{width:46px;font-weight:600;font-size:12px}\n  .bar .track{flex:1;height:17px;background:var(--panel2);border-radius:5px;overflow:hidden;display:flex}\n  .bar .b1{height:100%;opacity:.38}.bar .b2{height:100%}.bar .b3{height:100%;opacity:.7}\n  .bar .v{width:120px;text-align:right;font-size:11px;color:var(--mut);font-variant-numeric:tabular-nums}\n  .mrow{display:flex;align-items:center;gap:9px;background:var(--panel2);border:1px solid var(--line);border-radius:9px;padding:6px 10px;margin-bottom:5px}\n  .mrow .nm{flex:1;font-weight:600;font-size:12px;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n  .mrow .cb{color:var(--mut);font-size:11px;font-variant-numeric:tabular-nums}\n  .chip{font-size:11px;font-weight:700;color:#fff;border-radius:6px;padding:2px 8px}\n  table{border-collapse:collapse;width:100%;font-size:11.5px}\n  th,td{padding:6px 7px;text-align:right;border-bottom:1px solid var(--line);font-variant-numeric:tabular-nums}\n  th:first-child,td:first-child{text-align:left}\n  thead th{color:var(--mut);font-weight:600;font-size:10.5px}\n  .dot{display:inline-block;width:9px;height:9px;border-radius:2px;margin-right:5px}\n  .delta{font-size:10px}.delta.up{color:var(--ok)}.delta.dn{color:var(--closing)}\n  .note{font-size:10.5px;color:var(--mut);line-height:1.55;margin-top:9px}\n  .flag{margin-top:11px;padding:9px 11px;border-radius:9px;font-size:11.5px;line-height:1.55;background:#fff8ef;border:1px solid #ffe0bd;color:#8a5200}\n  .scroll{max-height:300px;overflow:auto}\n  .center{display:flex;align-items:center;justify-content:center;height:100%;padding:40px}\n  .msg{max-width:420px;text-align:center}\n  .msg h2{font-size:17px;font-weight:600;margin:0 0 7px}\n  .msg p{font-size:12.5px;color:var(--mut);margin:0;line-height:1.55}\n`,\n  render(d2){\n    // Hierarquia mercado > GV > setor, espelhando o simulador ao vivo. Tudo pré-computado (label,\n    // minúscula, plural, gênero) pra nunca minusculizar \"GV\" (sigla) virando \"gv\", e pra concordar\n    // gênero certo em cada frase — GV é feminina (a Gerência de Vendas), o resto é masculino.\n    const LVL={\n      setor:{label:'Setor',low:'setor',fem:false, child:'Município',childLow:'município',childPlural:'Municípios',childFem:false, dest:'Setor',destLow:'setor'},\n      gv:{label:'GV',low:'GV',fem:true, child:'Setor',childLow:'setor',childPlural:'Setores',childFem:false, dest:'GV',destLow:'GV'},\n      mercado:{label:'Mercado',low:'mercado',fem:false, child:'GV',childLow:'GV',childPlural:'GVs',childFem:true, dest:'Mercado',destLow:'mercado'},\n    };\n    const lv=s=>LVL[(s&&s.level)||'setor'];\n    const esc=s=>(s==null?'':String(s)).replace(/[&<>\"]/g,c=>({'&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;'}[c]));\n    const fmt=n=>n==null?'–':Math.round(+n).toLocaleString('pt-BR');\n    const money=n=>{n=+n||0;return n>=1e6?'R$'+(n/1e6).toFixed(1)+'M':n>=1e3?'R$'+(n/1e3).toFixed(0)+'k':'R$'+Math.round(n)};\n    const msg=(t,b,act)=>`<div class=\"rroot\"><div class=\"center\"><div class=\"msg\"><h2>${t}</h2><p>${b}</p>${act?`<button class=\"goact\" id=\"goSim\">Abrir o simulador</button>`:''}</div></div></div>`;\n\n    if(d2.state.error) return msg('Não foi possível abrir a sessão',esc(d2.state.error),true);\n    if(!d2.state.ready) return msg('Carregando sessão…','Buscando o registro compartilhado.');\n    const r=d2.state.rec;\n    if(!r) return msg('Sessão não encontrada','O link pode ter expirado ou o registro foi removido. Peça um novo link a quem compartilhou.',true);\n\n    const stages=Array.isArray(r.stages)?r.stages:[];\n    const sm=r.summary||{};\n    const st=r.settings||{};\n    const ruleDest=st.destRule==='dominant'?`destino: dominantes ≥${fmt(st.destMinCbs)} CBs`:'destino: qualquer município';\n    const ruleReal=st.realocRule==='relevant'?`realocação: ≥${fmt(st.realocMinCbs)} CBs`:'realocação: todos';\n    const spanBits=[];\n    if(st.targetSpan)spanBits.push('alvo '+fmt(st.targetSpan));\n    if(st.maxSpan)spanBits.push('máx '+fmt(st.maxSpan));\n    if(st.minSpan)spanBits.push('mín '+fmt(st.minSpan));\n\n    let h=`<div class=\"rroot\"><div class=\"shell\">\n      <header class=\"top\">\n        <div class=\"eyebrow\">Simulador de timeline de fechamentos · sessão compartilhada</div>\n        <h1>${esc(r.label||'Sessão sem nome')}</h1>\n        <div class=\"pills\">\n          <span class=\"pill\">● snapshot congelado · <b>${esc(r.snapshotRaw||'—')}</b></span>\n          <span class=\"pill\">◇ ${esc(ruleReal)}</span>\n          <span class=\"pill\">◈ ${esc(ruleDest)}</span>\n          <span class=\"pill\">◎ span: <b>${spanBits.length?esc(spanBits.join(' · ')):'livre'}</b></span>\n          ${r.sharedBy?`<span class=\"pill\">por <b>${esc(r.sharedBy)}</b></span>`:''}\n          ${r.sharedAt?`<span class=\"pill\">${esc(new Date(r.sharedAt).toLocaleString('pt-BR'))}</span>`:''}\n          <span class=\"pill go\" id=\"goSim\" role=\"button\" tabindex=\"0\" title=\"Ir para o simulador\">↗ abrir o simulador</span>\n        </div>\n      </header>`;\n\n    const sessLevel=(stages[0]&&stages[0].level)||'setor';\n    h+=`<div class=\"strip\">\n      <div class=\"st\"><div class=\"n\">${fmt(stages.length)}</div><div class=\"l\">Etapa(s) de fechamento</div></div>\n      <div class=\"st\"><div class=\"n\">${fmt(sm.totalCbs)}</div><div class=\"l\">CBs realocadas na cadeia</div></div>\n      ${sessLevel==='setor'?`<div class=\"st warn\"><div class=\"n\">${fmt(sm.totalDesloc)}</div><div class=\"l\">CBs deslocadas (quebra de relação)</div></div>`:`<div class=\"st\"><div class=\"n\">${fmt(sm.totalDesloc)}</div><div class=\"l\">CBs com líder dividida entre destinos</div></div>`}\n      <div class=\"st\"><div class=\"n\" style=\"font-size:15px;line-height:1.5;font-weight:600\">${esc((sm.sectors||[]).join(' → ')||'—')}</div><div class=\"l\">Ordem de fechamento</div></div>\n    </div>`;\n\n    if(stages.length>1){\n      h+=`<div class=\"stepper\">`+stages.map((s,i)=>`<div class=\"sc\" data-goto=\"stage-${i}\"><span class=\"k\">${i+1}</span>${lv(s).label} ${esc(s.sector)}<span class=\"arrow\">→</span>${esc((s.dest||[]).join(', ')||'–')}</div>`).join('')+`</div>`;\n    }\n\n    // ---- projection helpers (pure; mirrors the simulator's) ----\n    const project=feats=>{let mnx=1/0,mny=1/0,mxx=-1/0,mxy=-1/0;\n      feats.forEach(f=>{const g=f&&f.geometry;if(!g)return;const ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];\n        ps.forEach(p=>p.forEach(rg=>rg.forEach(pt=>{mnx=Math.min(mnx,pt[0]);mxx=Math.max(mxx,pt[0]);mny=Math.min(mny,pt[1]);mxy=Math.max(mxy,pt[1]);})));});\n      if(!isFinite(mnx)) return null;\n      const mlat=(mny+mxy)/2,kx=Math.cos(mlat*Math.PI/180),W=680,H=440,pad=16;\n      const gw=Math.max((mxx-mnx)*kx,1e-9),gh=Math.max(mxy-mny,1e-9),sc=Math.min((W-2*pad)/gw,(H-2*pad)/gh);\n      const ox=(W-gw*sc)/2,oy=(H-gh*sc)/2;\n      return {W,H,f:pt=>[ox+(pt[0]-mnx)*kx*sc, oy+(mxy-pt[1])*sc]};};\n    const pathFor=(f,pr)=>{const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];\n      return ps.map(poly=>poly.map(rg=>'M'+rg.map(pt=>{const q=pr(pt);return q[0].toFixed(1)+','+q[1].toFixed(1);}).join('L')+'Z').join('')).join('');};\n    const cxy=(f,pr)=>{let x=0,y=0,n=0;const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];\n      ps.forEach(poly=>poly[0].forEach(pt=>{const q=pr(pt);x+=q[0];y+=q[1];n++;}));return n?[x/n,y/n]:[0,0];};\n\n    stages.forEach((s,i)=>{\n      const color=s.color||{};\n      const k=s.kpis||{};\n      const LV=lv(s);\n      h+=`<div class=\"card\" id=\"stage-${i}\" data-key=\"stage-${i}\">\n        <h2>Etapa ${i+1} · ${LV.low} <b>${esc(s.sector)}</b> fechad${LV.fem?'a':'o'}</h2>\n        <p class=\"sub\">Território redistribuído para ${esc((s.dest||[]).join(', ')||'—')}${s.domUF?' · '+esc(s.domUF):''}${s.policy?' · política: '+(s.policy==='fora'?'manter vínculo':'quebrar relação'):''}</p>\n        <div class=\"strip\" style=\"margin:0 0 18px\">\n          <div class=\"st\"><div class=\"n\">${fmt(k.cbsRealocadas)}</div><div class=\"l\">CBs realocadas</div></div>\n          ${LV.label==='Setor'?`<div class=\"st warn\"><div class=\"n\">${fmt(k.desloc)}</div><div class=\"l\">CBs deslocadas</div></div>`:`<div class=\"st\"><div class=\"n\">${fmt(k.desloc)}</div><div class=\"l\">CBs com líder dividida</div></div>`}\n          <div class=\"st\"><div class=\"n\">${fmt(k.municipios)}</div><div class=\"l\">${LV.childPlural} movid${LV.childFem?'as':'os'}</div></div>\n          <div class=\"st\"><div class=\"n\">${fmt(k.lideres)}</div><div class=\"l\">Líderes envolvidas</div></div>\n        </div>\n        <div class=\"split\"><div>`;\n\n      // map\n      const gf=s.geoFeat||{}, nb=Array.isArray(s.nbrFeat)?s.nbrFeat:[], ex=Array.isArray(s.excludedFeat)?s.excludedFeat:[];\n      const all=[...nb,...ex,...Object.values(gf)].filter(Boolean);\n      const P=project(all);\n      const unitOf=m=>LV.label==='Setor'?m:((s.unitOfMuni||{})[m]||m);\n      if(P){\n        let g='';\n        nb.forEach(f=>{ if(!f||!f.geometry)return; g+=`<path class=\"nbr\" d=\"${pathFor(f,P.f)}\"/>`;\n          const c=cxy(f,P.f);const nm=(f.properties&&f.properties.name)||'';\n          if(nm) g+=`<text class=\"nlabel\" data-fs=\"7.5\" x=\"${c[0].toFixed(1)}\" y=\"${c[1].toFixed(1)}\">${esc(nm.slice(0,13))}</text>`; });\n        ex.forEach(f=>{ if(!f||!f.geometry)return; g+=`<path class=\"exc\" d=\"${pathFor(f,P.f)}\"/>`; });\n        if(LV.label==='Setor'){\n          Object.entries(gf).forEach(([m,f])=>{ if(!f||!f.geometry)return;\n            const dest=(s.assign||{})[m];\n            g+=`<path class=\"muni\" d=\"${pathFor(f,P.f)}\" fill=\"${esc(color[dest]||'#8e8e93')}\"/>`;\n            const c=cxy(f,P.f);\n            g+=`<text class=\"mlabel\" data-fs=\"9.5\" data-sw=\"2.4\" x=\"${c[0].toFixed(1)}\" y=\"${c[1].toFixed(1)}\">${esc(m.slice(0,14))}<tspan data-fs=\"8\" x=\"${c[0].toFixed(1)}\" dy=\"10\" font-size=\"8\">${esc(dest||'–')}</tspan></text>`; });\n        } else {\n          // GV/mercado: vários municípios do mesmo setor/GV são UMA unidade só na tela — mesma cor,\n          // mesmo stroke (a costura entre elas some), um rótulo só no centro do grupo em vez de um\n          // por município. Espelha o mapa ao vivo do simulador.\n          const groups={};\n          Object.entries(gf).forEach(([m,f])=>{ if(!f||!f.geometry)return; const u=unitOf(m); (groups[u]=groups[u]||[]).push(f); });\n          Object.entries(groups).forEach(([u,feats])=>{\n            const dest=(s.assign||{})[u]; const col=esc(color[dest]||'#8e8e93');\n            let cx=0,cy=0,n=0;\n            feats.forEach(f=>{ g+=`<path class=\"muni\" d=\"${pathFor(f,P.f)}\" fill=\"${col}\" stroke=\"${col}\"/>`;\n              const c=cxy(f,P.f); cx+=c[0]; cy+=c[1]; n++; });\n            if(n){ cx/=n; cy/=n;\n              g+=`<text class=\"mlabel\" data-fs=\"9.5\" data-sw=\"2.4\" x=\"${cx.toFixed(1)}\" y=\"${cy.toFixed(1)}\">${esc(u)}<tspan data-fs=\"8\" x=\"${cx.toFixed(1)}\" dy=\"10\" font-size=\"8\">${esc(dest||'–')}</tspan></text>`;\n            }\n          });\n        }\n        h+=`<h3>Mapa da redistribuição</h3><div class=\"map-wrap\">\n          <svg class=\"map\" id=\"map-${i}\" data-w=\"${P.W}\" data-h=\"${P.H}\" viewBox=\"0 0 ${P.W} ${P.H}\" preserveAspectRatio=\"xMidYMid meet\">${g}</svg>\n          <div class=\"zoom-pill\"><button type=\"button\" data-zoom=\"out\" data-i=\"${i}\" title=\"Diminuir zoom\">−</button><span class=\"zoom-div\"></span><button type=\"button\" data-zoom=\"in\" data-i=\"${i}\" title=\"Aumentar zoom\">+</button></div>\n          </div>\n          <div class=\"legend\">${(s.dest||[]).map(d=>`<span><i style=\"background:${esc(color[d]||'#8e8e93')}\"></i>${LV.dest} ${esc(d)}</span>`).join('')}\n          <span><i style=\"background:#e8e8ec;border:1px solid #d4d4d9\"></i>vizinhos (contexto)</span>\n          ${ex.length?`<span><i style=\"background:#f7e7d0;border:1px dashed #ff9500\"></i>fora da realocação</span>`:''}</div>`;\n      }\n      h+=`<h3>${LV.childPlural} → ${LV.destLow} destino</h3>`;\n      h+=(s.municipios||[]).map(m=>`<div class=\"mrow\"><span class=\"nm\">${esc(m.nome)}</span><span class=\"cb\">${fmt(m.cbs)} CBs</span>\n        <span class=\"chip\" style=\"background:${esc(color[m.destino]||'#8e8e93')}\">${esc(m.destino||'–')}</span></div>`).join('')||`<div class=\"note\">Nenhum${LV.childFem?'a':''} ${LV.childLow} realocad${LV.childFem?'a':'o'} nesta etapa.</div>`;\n\n      h+=`</div><div>`;\n      // spans\n      const ds=s.destinos||[];\n      const mx=Math.max(...ds.map(d=>+d.span||0),1);\n      h+=`<h3>Tamanho d${LV.fem?'a':'o'} ${LV.destLow} depois da etapa</h3>`;\n      h+=ds.map(d=>{const base=+d.base||0,inc=+d.inc||0,orph=+d.orph||0;\n        return `<div class=\"bar\"><span class=\"tag\" style=\"color:${esc(color[d.s]||'#8e8e93')}\">${esc(d.s)}</span>\n          <span class=\"track\"><span class=\"b1\" style=\"width:${(base/mx*100).toFixed(1)}%;background:${esc(color[d.s]||'#8e8e93')}\"></span><span class=\"b2\" style=\"width:${(inc/mx*100).toFixed(1)}%;background:${esc(color[d.s]||'#8e8e93')}\"></span>${orph?`<span class=\"b3\" style=\"width:${(orph/mx*100).toFixed(1)}%;background:${esc(color[d.s]||'#8e8e93')}\"></span>`:''}</span>\n          <span class=\"v\">${fmt(d.span)} <span style=\"opacity:.6\">(+${fmt(inc+orph)})</span></span></div>`;}).join('')||`<div class=\"note\">Sem ${LV.destLow} destino nesta etapa.</div>`;\n      h+=`<div class=\"note\">Claro = base antes da etapa · cheio = CBs entrantes${(s.orphanTotal?' · faixa final = CBs que seguiram suas líderes':'')}.</div>`;\n\n      // leaders\n      const L=s.lideres||[];\n      if(L.length){\n        const showOrph=L.some(x=>+x.orphan>0);\n        h+=`<h3>Líderes</h3><div class=\"scroll\"><table><thead><tr><th>Líder</th><th>CBs</th><th>${LV.dest} final</th>${showOrph?'<th>Órfãs</th>':''}<th>Desloc.</th></tr></thead><tbody>`\n          +L.map(x=>`<tr><td>${esc(x.lider||'—')}</td><td>${fmt(x.total)}</td>\n            <td>${x.home?`<span class=\"dot\" style=\"background:${esc(color[x.home]||'#8e8e93')}\"></span>${esc(x.home)}`:'–'}</td>\n            ${showOrph?`<td>${x.orphan?fmt(x.orphan):'·'}</td>`:''}\n            <td style=\"color:${+x.desloc?'var(--closing)':'var(--mut)'};font-weight:${+x.desloc?700:400}\">${fmt(x.desloc||0)}</td></tr>`).join('')\n          +`</tbody></table></div>`;\n      }\n      h+=`</div></div>`;\n\n      // antes -> depois\n      const M=s.metricas||[];\n      if(M.length){\n        h+=`<h3>Impacto antes → depois por ${LV.destLow} ${LV.fem?'receptora':'receptor'}</h3><div class=\"scroll\"><table><thead><tr><th>${LV.dest}</th>${M.map(m=>`<th>${esc(m.label)}</th>`).join('')}</tr></thead><tbody>`;\n        (s.dest||[]).forEach(sec=>{\n          h+=`<tr><td><span class=\"dot\" style=\"background:${esc(color[sec]||'#8e8e93')}\"></span>${esc(sec)}</td>`;\n          h+=M.map(m=>{const row=(m.rows||[]).find(x=>String(x.s)===String(sec))||{};\n            const a=+row.antes||0,b=+row.depois||0,d=a?((b-a)/a*100):0;const f=m.money?money:fmt;\n            return `<td>${f(b)}<div class=\"delta ${d>=0?'up':'dn'}\">${d>0?'+':''}${d.toFixed(0)}%</div></td>`;}).join('')+`</tr>`;\n        });\n        h+=`<tr style=\"opacity:.75\"><td>${esc(s.sector)} (sai)</td>`+M.map(m=>`<td>${(m.money?money:fmt)(m.sai||0)}</td>`).join('')+`</tr>`;\n        h+=`</tbody></table></div>`;\n      }\n\n      // caveats\n      const fl=[];\n      if(s.excluidos&&s.excluidos.length) fl.push(`<b>${fmt(s.excluidos.length)} município(s)</b> com poucas CBs ficaram fora da realocação geográfica (quebra de vínculo): ${esc(s.excluidos.slice(0,6).map(x=>x.muni+' ('+x.cbs+')').join(', '))}${s.excluidos.length>6?' +'+(s.excluidos.length-6):''}. As CBs seguiram a líder do seu grupo.`);\n      if(s.orphanStranded) fl.push(`<b>${fmt(s.orphanStranded)} CB(s)</b> sem setor a seguir — a líder não ficou com nenhum município realocado.`);\n      if(s.noShapeCbs) fl.push(`<b>${fmt(s.noShapeCbs)} CB(s)</b> em municípios sem shape na UF, fora do mapa e de qualquer setor destino.`);\n      if(s.optTier===1) fl.push(`O span mínimo não era atingível nesta etapa e foi relaxado pelo modelo.`);\n      if(s.optTier===2) fl.push(`Os limites de span não eram atingíveis nesta etapa e foram relaxados pelo modelo.`);\n      if(s.optTier===-1) fl.push(`Etapa resolvida por heurística (espaço de busca grande) — os limites de span não são garantidos.`);\n      if(s.destRuleFallback) fl.push(`Nenhum município dominante nesta etapa: a regra de destino foi relaxada para \"qualquer município\".`);\n      if(s.realocFallback) fl.push(`Todos os municípios ficariam abaixo do limite: a regra de realocação foi relaxada para \"realocar todos\".`);\n      if(fl.length) h+=`<div class=\"flag\">⚠ ${fl.join('<br>')}</div>`;\n      h+=`</div>`;\n    });\n\n    // cumulative\n    // Este resumo é calculado no rastro de município (world.muniOverride) — hoje só existe pro\n    // fechamento de setor; GV/mercado têm o rastro equivalente (secOverride/gvOverride) mas essa\n    // agregação ainda não foi refeita nesse grão, então avisa em vez de mostrar tabela vazia.\n    const rc=sm.receivers||[];\n    if(!rc.length && sessLevel!=='setor'){\n      h+=`<div class=\"card\"><h2>Impacto acumulado da cadeia</h2>\n        <p class=\"note\" style=\"margin-top:0\">Ainda não disponível pra sessões de ${sessLevel==='gv'?'GV':'mercado'} — veja o relatório de cada etapa acima.</p></div>`;\n    }\n    if(rc.length){\n      h+=`<div class=\"card\"><h2>Impacto acumulado da cadeia</h2>\n        <p class=\"sub\">Efeito de <b>todas</b> as ${fmt(stages.length)} etapa(s) somadas, contra o snapshot congelado sem nenhum fechamento aplicado.</p>\n        <div class=\"scroll\"><table><thead><tr><th>Setor</th><th>Situação</th><th>CBs antes</th><th>CBs depois</th><th>Variação</th></tr></thead><tbody>`\n        +rc.map(x=>{const a=+x.antes||0,b=+x.depois||0,d=a?((b-a)/a*100):0;\n          return `<tr><td>${esc(x.s)}</td><td>${esc(x.situacao||'recebeu território')}</td><td>${fmt(a)}</td><td>${fmt(b)}</td>\n            <td class=\"delta ${d>=0?'up':'dn'}\" style=\"font-size:11.5px\">${d>0?'+':''}${d.toFixed(0)}%</td></tr>`;}).join('')\n        +`</tbody></table></div></div>`;\n    }\n\n    h+=`<div class=\"note\" style=\"text-align:center;margin-top:22px\">Visualização somente leitura de uma simulação congelada. Os números refletem o snapshot <b>${esc(r.snapshotRaw||'—')}</b> e as regras vigentes no momento do compartilhamento — não acompanham o dado ao vivo.</div>`;\n    return h+`</div></div>`;\n  },\n  mounted(d2, root){\n    d2.on('#goSim','click',()=>{\n      try{ (d2.router('timelineSimRouter')||d2.router()).goTo('/'); }catch(e){ try{ d2.router().goTo('/'); }catch(e2){} }\n    });\n    d2.on('.sc','click',e=>{\n      const el=e.target.closest('.sc'); if(!el) return;\n      const t=d2.$('#'+el.dataset.goto); if(t) t.scrollIntoView({behavior:'smooth',block:'start'});\n    });\n    // ---- map zoom/pan (viewBox só — texto e polígonos vivem no mesmo sistema de coordenadas, então\n    // escalam juntos automaticamente ao encolher/esticar o viewBox, sem lógica extra pra fonte).\n    // Delegado em `root` (nunca substituído por re-render) em vez de nos <svg> por id, porque cada\n    // atualização de estado reconstrói o HTML das etapas do zero.\n    const mapViews={};\n    const getMapView=(i,W,H)=>mapViews[i]||(mapViews[i]={x:0,y:0,w:W,h:H});\n    const applyMapView=(svg,i)=>{ const v=mapViews[i]; if(!v) return;\n      svg.setAttribute('viewBox', v.x.toFixed(2)+' '+v.y.toFixed(2)+' '+v.w.toFixed(2)+' '+v.h.toFixed(2));\n      // Rótulo tem tamanho em unidades do viewBox — sem isso ele cresceria junto com o zoom até virar\n      // um borrão. Encolher na mesma proporção que o viewBox encolhe cancela o zoom: o texto fica do\n      // mesmo tamanho na tela em qualquer nível. style.fontSize (não o atributo) porque uma regra de\n      // classe como .mlabel{font-size:...} outrankaria um atributo comum.\n      const W=+svg.dataset.w||700;\n      const fsScale=v.w/W;\n      svg.querySelectorAll('[data-fs]').forEach(t=>{\n        const base=+t.getAttribute('data-fs')||8;\n        t.style.fontSize=(base*fsScale).toFixed(2)+'px';\n      });\n      // Halo do texto (contorno branco que garante legibilidade sobre qualquer cor de fundo) tem\n      // largura de traço fixa em unidades do viewBox — sem reescalar junto, no zoom alto ele vira\n      // uma mancha cobrindo a letra inteira em vez de um contorno fino.\n      svg.querySelectorAll('[data-sw]').forEach(t=>{\n        const base=+t.getAttribute('data-sw')||1;\n        t.style.strokeWidth=(base*fsScale).toFixed(3)+'px';\n      });\n    };\n    const zoomStageMap=(i,factor)=>{\n      const svg=root.querySelector('#map-'+i); if(!svg) return;\n      const W=+svg.dataset.w||700, H=+svg.dataset.h||500;\n      const v=getMapView(i,W,H);\n      const cx=v.x+v.w/2, cy=v.y+v.h/2;\n      let w=v.w/factor, h=v.h/factor;\n      w=Math.min(W, Math.max(W/8, w)); h=Math.min(H, Math.max(H/8, h));\n      let x=cx-w/2, y=cy-h/2;\n      x=Math.min(W-w, Math.max(0,x)); y=Math.min(H-h, Math.max(0,y));\n      mapViews[i]={x,y,w,h};\n      applyMapView(svg,i);\n    };\n    d2.on('.zoom-pill button','click',e=>{\n      const b=e.target.closest('button'); if(!b) return;\n      zoomStageMap(b.dataset.i, b.dataset.zoom==='in'?1.4:1/1.4);\n    });\n    let mapDrag=null;\n    root.addEventListener('pointerdown',e=>{\n      const svg=e.target.closest('svg.map'); if(!svg) return;\n      const i=svg.id.replace('map-',''); const W=+svg.dataset.w||700, H=+svg.dataset.h||500;\n      const v=getMapView(i,W,H);\n      mapDrag={svg,i,W,H,x0:e.clientX,y0:e.clientY,vx0:v.x,vy0:v.y,rect:svg.getBoundingClientRect()};\n      svg.classList.add('dragging');\n    });\n    root.addEventListener('pointermove',e=>{\n      if(!mapDrag||!mapDrag.rect.width||!mapDrag.rect.height) return;\n      const dxPix=e.clientX-mapDrag.x0, dyPix=e.clientY-mapDrag.y0;\n      const v=getMapView(mapDrag.i,mapDrag.W,mapDrag.H);\n      const sx=v.w/mapDrag.rect.width, sy=v.h/mapDrag.rect.height;\n      let x=mapDrag.vx0-dxPix*sx, y=mapDrag.vy0-dyPix*sy;\n      x=Math.min(mapDrag.W-v.w, Math.max(0,x)); y=Math.min(mapDrag.H-v.h, Math.max(0,y));\n      mapViews[mapDrag.i]={...v,x,y};\n      applyMapView(mapDrag.svg,mapDrag.i);\n    });\n    const endMapDrag=()=>{ if(mapDrag){ mapDrag.svg.classList.remove('dragging'); mapDrag=null; } };\n    root.addEventListener('pointerup',endMapDrag);\n    root.addEventListener('pointerleave',endMapDrag);\n    (async()=>{\n      try{\n        // RACE, not a missing dataset. This DataSet is gated by timelineSimAuthFinal, so its\n        // Process is only define()d once the auth session resolves — a Process waits for its\n        // dependencies' setup before its own fires. In the field the auth lookup lands ~200ms\n        // and this DataSet's first fetch ~700-900ms, while mounted() runs immediately. d2.data()\n        // returns null for a module that is not defined YET, so bailing on the first miss threw\n        // \"dataset não disponível\" on every share link even though nothing was wrong.\n        // Poll briefly instead. Two lookups because either may win: the declared `shared` param,\n        // or the global-process path via the reference the instance binds — keep that binding.\n        let dead=false; d2.onUnmount(()=>{ dead=true; });\n        let ds=null;\n        for(let i=0;i<40 && !ds && !dead;i++){\n          ds=d2.data('shared')||d2.data('timeline-shared-sessionsDataSet');\n          if(!ds) await new Promise(r=>setTimeout(r,100));\n        }\n        if(dead) return;\n        if(!ds){ d2.setState({error:'Dataset de sessões compartilhadas não disponível.',ready:true}); return; }\n        // Name the router explicitly. Bare d2.router() looks for the conventional\n        // 'Router'/'MainRouter'; this one is 'timelineSimRouter', so the bare call can hand back a\n        // handle whose .params is empty — which is how a valid /sessions/<id> link ended up\n        // reporting \"o link não traz o identificador\". The goSim handler below already passes the\n        // ref for the same reason.\n        const rt=d2.router('timelineSimRouter')||d2.router();\n        const p=(rt&&rt.params)||{};\n        // ?id= lets the artboard be opened directly, outside the route.\n        let q=null;\n        try{ q=new URLSearchParams(window.location.search).get('id'); }catch(e){}\n        // Last resort, and the only one that cannot fail: the id is sitting in the path. Route\n        // params need the Router handle to resolve AND to have matched by the time mounted() runs\n        // (.params is a reactive getter, read once here); the pathname needs neither. Matches the\n        // current /sessions/:session_id route and the legacy /sessao/:id one.\n        let seg=null;\n        try{ const m=window.location.pathname.match(/\\/sess(?:ions|ao)\\/([^/?#]+)/); seg=m&&m[1]; }catch(e){}\n        const id=p.session_id||p.id||p.sessao||p.session||seg||q;\n        if(!id){ d2.setState({error:'O link não traz o identificador da sessão.',ready:true}); return; }\n        // .query() is a direct read and returns the rows — no refresh/loadAll ordering trap here\n        const rows=await ds.query({_id:id});\n        const rec=Array.isArray(rows)?rows[0]:(rows&&rows.data&&rows.data[0]);\n        d2.setState({rec:rec||null,ready:true,error:''});\n      }catch(err){\n        d2.setState({error:(err&&err.message)||'Falha ao carregar a sessão compartilhada.',ready:true});\n      }\n    })();\n  }\n}"}},"shared":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"shared"}}}}}}}},"__d2PrevCode":{"code":"const NIVEIS=['Bronze','Cristal','Prata','Ouro','Diamante','Diamante+'];\n\nexport default {\n  css: `\n  :host{display:block;height:100%}\n  *{box-sizing:border-box}\n  .rroot{--bg:#f5f5f7;--panel:#ffffff;--panel2:#f2f2f7;--line:#e5e5ea;--ink:#1c1c1e;--mut:#6e6e73;--acc:#007aff;--closing:#ff3b30;--ok:#34c759;--warn:#ff9500;\n    height:100%;overflow:auto;background:var(--bg);color:var(--ink);\n    font:13px/1.5 -apple-system,BlinkMacSystemFont,\"SF Pro Text\",\"Segoe UI\",Roboto,sans-serif;-webkit-font-smoothing:antialiased}\n  .shell{max-width:1080px;margin:0 auto;padding:26px 22px 70px}\n  header.top{margin-bottom:20px}\n  .eyebrow{font-size:11px;text-transform:uppercase;letter-spacing:.5px;color:var(--mut);font-weight:600}\n  h1{font-size:25px;font-weight:600;letter-spacing:-.5px;margin:7px 0 10px}\n  .pills{display:flex;gap:7px;flex-wrap:wrap;align-items:center}\n  .pill{font-size:10.5px;padding:3px 9px;border-radius:99px;border:1px solid var(--line);color:var(--mut);background:var(--panel)}\n  .pill b{color:var(--ink);font-weight:600}\n  .pill.go{cursor:pointer;border-color:var(--acc);color:var(--acc);background:#eaf3ff;font-weight:600}\n  .pill.go:hover{background:#dbe9ff}\n  .goact{margin-top:15px;background:var(--acc);color:#fff;border:1px solid transparent;border-radius:8px;\n    padding:9px 16px;font:inherit;font-size:12.5px;font-weight:600;cursor:pointer}\n  .goact:hover{background:#0060df}\n  .strip{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:10px;margin:18px 0 22px}\n  .st{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:12px 14px;box-shadow:0 1px 2px rgba(0,0,0,.04)}\n  .st .n{font-size:23px;font-weight:700;letter-spacing:-.5px}\n  .st .l{font-size:10.5px;color:var(--mut);margin-top:3px;line-height:1.4}\n  .st.warn .n{color:var(--closing)}\n  .stepper{position:sticky;top:0;z-index:5;display:flex;gap:7px;overflow-x:auto;padding:11px 0;margin-bottom:6px;\n    background:rgba(245,245,247,.9);backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);border-bottom:1px solid var(--line)}\n  .sc{flex:0 0 auto;display:flex;align-items:center;gap:7px;background:var(--panel);border:1px solid var(--line);\n    border-radius:99px;padding:5px 12px 5px 6px;cursor:pointer;font-size:12px}\n  .sc:hover{border-color:var(--acc)}\n  .sc .k{width:19px;height:19px;border-radius:99px;background:var(--ink);color:#fff;font-size:10px;font-weight:700;\n    display:flex;align-items:center;justify-content:center}\n  .sc .arrow{color:var(--mut)}\n  .card{background:var(--panel);border:1px solid var(--line);border-radius:14px;padding:20px;margin-bottom:16px;box-shadow:0 1px 2px rgba(0,0,0,.04)}\n  .card > h2{font-size:15px;font-weight:600;letter-spacing:-.2px;margin:0 0 3px}\n  .card .sub{font-size:11.5px;color:var(--mut);margin:0 0 15px}\n  h3{font-size:11px;text-transform:uppercase;letter-spacing:.4px;color:var(--mut);margin:20px 0 9px;font-weight:600}\n  h3:first-of-type{margin-top:0}\n  .split{display:grid;grid-template-columns:minmax(0,1.15fr) minmax(0,1fr);gap:20px;align-items:start}\n  @media(max-width:820px){.split{grid-template-columns:1fr}}\n  svg.map{width:100%;height:auto;display:block;background:var(--panel2);border-radius:10px;border:1px solid var(--line);cursor:grab;touch-action:none}\n  svg.map.dragging{cursor:grabbing}\n  .map-wrap{position:relative}\n  .zoom-pill{position:absolute;left:10px;bottom:10px;display:flex;align-items:stretch;background:var(--panel);border:1px solid var(--line);border-radius:99px;box-shadow:0 2px 8px rgba(0,0,0,.14);overflow:hidden;z-index:3}\n  .zoom-pill button{width:30px;height:30px;border:0;background:transparent;color:var(--ink);font:16px/1 -apple-system,BlinkMacSystemFont,sans-serif;font-weight:600;cursor:pointer;display:flex;align-items:center;justify-content:center}\n  .zoom-pill button:hover{background:var(--panel2)}\n  .zoom-pill button:active{background:#e5e5ea}\n  .zoom-pill .zoom-div{width:1px;background:var(--line)}\n  .muni{stroke:#fff;stroke-width:1.1}\n  .nbr{fill:#e8e8ec;stroke:#d4d4d9;stroke-width:.7}\n  .exc{fill:#f7e7d0;stroke:var(--warn);stroke-width:.9;stroke-dasharray:2 2}\n  .mlabel{fill:#1c1c1e;font-size:9.5px;font-weight:600;text-anchor:middle;paint-order:stroke;stroke:rgba(255,255,255,.7);stroke-width:2.4px}\n  .nlabel{fill:#9a9aa0;font-size:7.5px;text-anchor:middle}\n  .legend{display:flex;gap:11px;flex-wrap:wrap;margin-top:9px;font-size:11px;color:var(--mut)}\n  .legend i{display:inline-block;width:10px;height:10px;border-radius:3px;margin-right:5px;vertical-align:-1px}\n  .bar{display:flex;align-items:center;gap:9px;margin:7px 0}\n  .bar .tag{width:46px;font-weight:600;font-size:12px}\n  .bar .track{flex:1;height:17px;background:var(--panel2);border-radius:5px;overflow:hidden;display:flex}\n  .bar .b1{height:100%;opacity:.38}.bar .b2{height:100%}.bar .b3{height:100%;opacity:.7}\n  .bar .v{width:120px;text-align:right;font-size:11px;color:var(--mut);font-variant-numeric:tabular-nums}\n  .mrow{display:flex;align-items:center;gap:9px;background:var(--panel2);border:1px solid var(--line);border-radius:9px;padding:6px 10px;margin-bottom:5px}\n  .mrow .nm{flex:1;font-weight:600;font-size:12px;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n  .mrow .cb{color:var(--mut);font-size:11px;font-variant-numeric:tabular-nums}\n  .chip{font-size:11px;font-weight:700;color:#fff;border-radius:6px;padding:2px 8px}\n  table{border-collapse:collapse;width:100%;font-size:11.5px}\n  th,td{padding:6px 7px;text-align:right;border-bottom:1px solid var(--line);font-variant-numeric:tabular-nums}\n  th:first-child,td:first-child{text-align:left}\n  thead th{color:var(--mut);font-weight:600;font-size:10.5px}\n  .dot{display:inline-block;width:9px;height:9px;border-radius:2px;margin-right:5px}\n  .delta{font-size:10px}.delta.up{color:var(--ok)}.delta.dn{color:var(--closing)}\n  .note{font-size:10.5px;color:var(--mut);line-height:1.55;margin-top:9px}\n  .flag{margin-top:11px;padding:9px 11px;border-radius:9px;font-size:11.5px;line-height:1.55;background:#fff8ef;border:1px solid #ffe0bd;color:#8a5200}\n  .scroll{max-height:300px;overflow:auto}\n  .center{display:flex;align-items:center;justify-content:center;height:100%;padding:40px}\n  .msg{max-width:420px;text-align:center}\n  .msg h2{font-size:17px;font-weight:600;margin:0 0 7px}\n  .msg p{font-size:12.5px;color:var(--mut);margin:0;line-height:1.55}\n`,\n  render(d2){\n    // Hierarquia mercado > GV > setor, espelhando o simulador ao vivo. Tudo pré-computado (label,\n    // minúscula, plural, gênero) pra nunca minusculizar \"GV\" (sigla) virando \"gv\", e pra concordar\n    // gênero certo em cada frase — GV é feminina (a Gerência de Vendas), o resto é masculino.\n    const LVL={\n      setor:{label:'Setor',low:'setor',fem:false, child:'Município',childLow:'município',childPlural:'Municípios',childFem:false, dest:'Setor',destLow:'setor'},\n      gv:{label:'GV',low:'GV',fem:true, child:'Setor',childLow:'setor',childPlural:'Setores',childFem:false, dest:'GV',destLow:'GV'},\n      mercado:{label:'Mercado',low:'mercado',fem:false, child:'GV',childLow:'GV',childPlural:'GVs',childFem:true, dest:'Mercado',destLow:'mercado'},\n    };\n    const lv=s=>LVL[(s&&s.level)||'setor'];\n    const esc=s=>(s==null?'':String(s)).replace(/[&<>\"]/g,c=>({'&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;'}[c]));\n    const fmt=n=>n==null?'–':Math.round(+n).toLocaleString('pt-BR');\n    const money=n=>{n=+n||0;return n>=1e6?'R$'+(n/1e6).toFixed(1)+'M':n>=1e3?'R$'+(n/1e3).toFixed(0)+'k':'R$'+Math.round(n)};\n    const msg=(t,b,act)=>`<div class=\"rroot\"><div class=\"center\"><div class=\"msg\"><h2>${t}</h2><p>${b}</p>${act?`<button class=\"goact\" id=\"goSim\">Abrir o simulador</button>`:''}</div></div></div>`;\n\n    if(d2.state.error) return msg('Não foi possível abrir a sessão',esc(d2.state.error),true);\n    if(!d2.state.ready) return msg('Carregando sessão…','Buscando o registro compartilhado.');\n    const r=d2.state.rec;\n    if(!r) return msg('Sessão não encontrada','O link pode ter expirado ou o registro foi removido. Peça um novo link a quem compartilhou.',true);\n\n    const stages=Array.isArray(r.stages)?r.stages:[];\n    const sm=r.summary||{};\n    const st=r.settings||{};\n    const ruleDest=st.destRule==='dominant'?`destino: dominantes ≥${fmt(st.destMinCbs)} CBs`:'destino: qualquer município';\n    const ruleReal=st.realocRule==='relevant'?`realocação: ≥${fmt(st.realocMinCbs)} CBs`:'realocação: todos';\n    const spanBits=[];\n    if(st.targetSpan)spanBits.push('alvo '+fmt(st.targetSpan));\n    if(st.maxSpan)spanBits.push('máx '+fmt(st.maxSpan));\n    if(st.minSpan)spanBits.push('mín '+fmt(st.minSpan));\n\n    let h=`<div class=\"rroot\"><div class=\"shell\">\n      <header class=\"top\">\n        <div class=\"eyebrow\">Simulador de timeline de fechamentos · sessão compartilhada</div>\n        <h1>${esc(r.label||'Sessão sem nome')}</h1>\n        <div class=\"pills\">\n          <span class=\"pill\">● snapshot congelado · <b>${esc(r.snapshotRaw||'—')}</b></span>\n          <span class=\"pill\">◇ ${esc(ruleReal)}</span>\n          <span class=\"pill\">◈ ${esc(ruleDest)}</span>\n          <span class=\"pill\">◎ span: <b>${spanBits.length?esc(spanBits.join(' · ')):'livre'}</b></span>\n          ${r.sharedBy?`<span class=\"pill\">por <b>${esc(r.sharedBy)}</b></span>`:''}\n          ${r.sharedAt?`<span class=\"pill\">${esc(new Date(r.sharedAt).toLocaleString('pt-BR'))}</span>`:''}\n          <span class=\"pill go\" id=\"goSim\" role=\"button\" tabindex=\"0\" title=\"Ir para o simulador\">↗ abrir o simulador</span>\n        </div>\n      </header>`;\n\n    const sessLevel=(stages[0]&&stages[0].level)||'setor';\n    h+=`<div class=\"strip\">\n      <div class=\"st\"><div class=\"n\">${fmt(stages.length)}</div><div class=\"l\">Etapa(s) de fechamento</div></div>\n      <div class=\"st\"><div class=\"n\">${fmt(sm.totalCbs)}</div><div class=\"l\">CBs realocadas na cadeia</div></div>\n      ${sessLevel==='setor'?`<div class=\"st warn\"><div class=\"n\">${fmt(sm.totalDesloc)}</div><div class=\"l\">CBs deslocadas (quebra de relação)</div></div>`:`<div class=\"st\"><div class=\"n\">${fmt(sm.totalDesloc)}</div><div class=\"l\">CBs com líder dividida entre destinos</div></div>`}\n      <div class=\"st\"><div class=\"n\" style=\"font-size:15px;line-height:1.5;font-weight:600\">${esc((sm.sectors||[]).join(' → ')||'—')}</div><div class=\"l\">Ordem de fechamento</div></div>\n    </div>`;\n\n    if(stages.length>1){\n      h+=`<div class=\"stepper\">`+stages.map((s,i)=>`<div class=\"sc\" data-goto=\"stage-${i}\"><span class=\"k\">${i+1}</span>${lv(s).label} ${esc(s.sector)}<span class=\"arrow\">→</span>${esc((s.dest||[]).join(', ')||'–')}</div>`).join('')+`</div>`;\n    }\n\n    // ---- projection helpers (pure; mirrors the simulator's) ----\n    const project=feats=>{let mnx=1/0,mny=1/0,mxx=-1/0,mxy=-1/0;\n      feats.forEach(f=>{const g=f&&f.geometry;if(!g)return;const ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];\n        ps.forEach(p=>p.forEach(rg=>rg.forEach(pt=>{mnx=Math.min(mnx,pt[0]);mxx=Math.max(mxx,pt[0]);mny=Math.min(mny,pt[1]);mxy=Math.max(mxy,pt[1]);})));});\n      if(!isFinite(mnx)) return null;\n      const mlat=(mny+mxy)/2,kx=Math.cos(mlat*Math.PI/180),W=680,H=440,pad=16;\n      const gw=Math.max((mxx-mnx)*kx,1e-9),gh=Math.max(mxy-mny,1e-9),sc=Math.min((W-2*pad)/gw,(H-2*pad)/gh);\n      const ox=(W-gw*sc)/2,oy=(H-gh*sc)/2;\n      return {W,H,f:pt=>[ox+(pt[0]-mnx)*kx*sc, oy+(mxy-pt[1])*sc]};};\n    const pathFor=(f,pr)=>{const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];\n      return ps.map(poly=>poly.map(rg=>'M'+rg.map(pt=>{const q=pr(pt);return q[0].toFixed(1)+','+q[1].toFixed(1);}).join('L')+'Z').join('')).join('');};\n    const cxy=(f,pr)=>{let x=0,y=0,n=0;const g=f.geometry,ps=g.type==='MultiPolygon'?g.coordinates:[g.coordinates];\n      ps.forEach(poly=>poly[0].forEach(pt=>{const q=pr(pt);x+=q[0];y+=q[1];n++;}));return n?[x/n,y/n]:[0,0];};\n\n    stages.forEach((s,i)=>{\n      const color=s.color||{};\n      const k=s.kpis||{};\n      const LV=lv(s);\n      h+=`<div class=\"card\" id=\"stage-${i}\" data-key=\"stage-${i}\">\n        <h2>Etapa ${i+1} · ${LV.low} <b>${esc(s.sector)}</b> fechad${LV.fem?'a':'o'}</h2>\n        <p class=\"sub\">Território redistribuído para ${esc((s.dest||[]).join(', ')||'—')}${s.domUF?' · '+esc(s.domUF):''}${s.policy?' · política: '+(s.policy==='fora'?'manter vínculo':'quebrar relação'):''}</p>\n        <div class=\"strip\" style=\"margin:0 0 18px\">\n          <div class=\"st\"><div class=\"n\">${fmt(k.cbsRealocadas)}</div><div class=\"l\">CBs realocadas</div></div>\n          ${LV.label==='Setor'?`<div class=\"st warn\"><div class=\"n\">${fmt(k.desloc)}</div><div class=\"l\">CBs deslocadas</div></div>`:`<div class=\"st\"><div class=\"n\">${fmt(k.desloc)}</div><div class=\"l\">CBs com líder dividida</div></div>`}\n          <div class=\"st\"><div class=\"n\">${fmt(k.municipios)}</div><div class=\"l\">${LV.childPlural} movid${LV.childFem?'as':'os'}</div></div>\n          <div class=\"st\"><div class=\"n\">${fmt(k.lideres)}</div><div class=\"l\">Líderes envolvidas</div></div>\n        </div>\n        <div class=\"split\"><div>`;\n\n      // map\n      const gf=s.geoFeat||{}, nb=Array.isArray(s.nbrFeat)?s.nbrFeat:[], ex=Array.isArray(s.excludedFeat)?s.excludedFeat:[];\n      const all=[...nb,...ex,...Object.values(gf)].filter(Boolean);\n      const P=project(all);\n      const unitOf=m=>LV.label==='Setor'?m:((s.unitOfMuni||{})[m]||m);\n      if(P){\n        let g='';\n        nb.forEach(f=>{ if(!f||!f.geometry)return; g+=`<path class=\"nbr\" d=\"${pathFor(f,P.f)}\"/>`;\n          const c=cxy(f,P.f);const nm=(f.properties&&f.properties.name)||'';\n          if(nm) g+=`<text class=\"nlabel\" data-fs=\"7.5\" x=\"${c[0].toFixed(1)}\" y=\"${c[1].toFixed(1)}\">${esc(nm.slice(0,13))}</text>`; });\n        ex.forEach(f=>{ if(!f||!f.geometry)return; g+=`<path class=\"exc\" d=\"${pathFor(f,P.f)}\"/>`; });\n        if(LV.label==='Setor'){\n          Object.entries(gf).forEach(([m,f])=>{ if(!f||!f.geometry)return;\n            const dest=(s.assign||{})[m];\n            g+=`<path class=\"muni\" d=\"${pathFor(f,P.f)}\" fill=\"${esc(color[dest]||'#8e8e93')}\"/>`;\n            const c=cxy(f,P.f);\n            g+=`<text class=\"mlabel\" data-fs=\"9.5\" x=\"${c[0].toFixed(1)}\" y=\"${c[1].toFixed(1)}\">${esc(m.slice(0,14))}<tspan data-fs=\"8\" x=\"${c[0].toFixed(1)}\" dy=\"10\" font-size=\"8\">${esc(dest||'–')}</tspan></text>`; });\n        } else {\n          // GV/mercado: vários municípios do mesmo setor/GV são UMA unidade só na tela — mesma cor,\n          // mesmo stroke (a costura entre elas some), um rótulo só no centro do grupo em vez de um\n          // por município. Espelha o mapa ao vivo do simulador.\n          const groups={};\n          Object.entries(gf).forEach(([m,f])=>{ if(!f||!f.geometry)return; const u=unitOf(m); (groups[u]=groups[u]||[]).push(f); });\n          Object.entries(groups).forEach(([u,feats])=>{\n            const dest=(s.assign||{})[u]; const col=esc(color[dest]||'#8e8e93');\n            let cx=0,cy=0,n=0;\n            feats.forEach(f=>{ g+=`<path class=\"muni\" d=\"${pathFor(f,P.f)}\" fill=\"${col}\" stroke=\"${col}\"/>`;\n              const c=cxy(f,P.f); cx+=c[0]; cy+=c[1]; n++; });\n            if(n){ cx/=n; cy/=n;\n              g+=`<text class=\"mlabel\" data-fs=\"9.5\" x=\"${cx.toFixed(1)}\" y=\"${cy.toFixed(1)}\">${esc(u)}<tspan data-fs=\"8\" x=\"${cx.toFixed(1)}\" dy=\"10\" font-size=\"8\">${esc(dest||'–')}</tspan></text>`;\n            }\n          });\n        }\n        h+=`<h3>Mapa da redistribuição</h3><div class=\"map-wrap\">\n          <svg class=\"map\" id=\"map-${i}\" data-w=\"${P.W}\" data-h=\"${P.H}\" viewBox=\"0 0 ${P.W} ${P.H}\" preserveAspectRatio=\"xMidYMid meet\">${g}</svg>\n          <div class=\"zoom-pill\"><button type=\"button\" data-zoom=\"out\" data-i=\"${i}\" title=\"Diminuir zoom\">−</button><span class=\"zoom-div\"></span><button type=\"button\" data-zoom=\"in\" data-i=\"${i}\" title=\"Aumentar zoom\">+</button></div>\n          </div>\n          <div class=\"legend\">${(s.dest||[]).map(d=>`<span><i style=\"background:${esc(color[d]||'#8e8e93')}\"></i>${LV.dest} ${esc(d)}</span>`).join('')}\n          <span><i style=\"background:#e8e8ec;border:1px solid #d4d4d9\"></i>vizinhos (contexto)</span>\n          ${ex.length?`<span><i style=\"background:#f7e7d0;border:1px dashed #ff9500\"></i>fora da realocação</span>`:''}</div>`;\n      }\n      h+=`<h3>${LV.childPlural} → ${LV.destLow} destino</h3>`;\n      h+=(s.municipios||[]).map(m=>`<div class=\"mrow\"><span class=\"nm\">${esc(m.nome)}</span><span class=\"cb\">${fmt(m.cbs)} CBs</span>\n        <span class=\"chip\" style=\"background:${esc(color[m.destino]||'#8e8e93')}\">${esc(m.destino||'–')}</span></div>`).join('')||`<div class=\"note\">Nenhum${LV.childFem?'a':''} ${LV.childLow} realocad${LV.childFem?'a':'o'} nesta etapa.</div>`;\n\n      h+=`</div><div>`;\n      // spans\n      const ds=s.destinos||[];\n      const mx=Math.max(...ds.map(d=>+d.span||0),1);\n      h+=`<h3>Tamanho d${LV.fem?'a':'o'} ${LV.destLow} depois da etapa</h3>`;\n      h+=ds.map(d=>{const base=+d.base||0,inc=+d.inc||0,orph=+d.orph||0;\n        return `<div class=\"bar\"><span class=\"tag\" style=\"color:${esc(color[d.s]||'#8e8e93')}\">${esc(d.s)}</span>\n          <span class=\"track\"><span class=\"b1\" style=\"width:${(base/mx*100).toFixed(1)}%;background:${esc(color[d.s]||'#8e8e93')}\"></span><span class=\"b2\" style=\"width:${(inc/mx*100).toFixed(1)}%;background:${esc(color[d.s]||'#8e8e93')}\"></span>${orph?`<span class=\"b3\" style=\"width:${(orph/mx*100).toFixed(1)}%;background:${esc(color[d.s]||'#8e8e93')}\"></span>`:''}</span>\n          <span class=\"v\">${fmt(d.span)} <span style=\"opacity:.6\">(+${fmt(inc+orph)})</span></span></div>`;}).join('')||`<div class=\"note\">Sem ${LV.destLow} destino nesta etapa.</div>`;\n      h+=`<div class=\"note\">Claro = base antes da etapa · cheio = CBs entrantes${(s.orphanTotal?' · faixa final = CBs que seguiram suas líderes':'')}.</div>`;\n\n      // leaders\n      const L=s.lideres||[];\n      if(L.length){\n        const showOrph=L.some(x=>+x.orphan>0);\n        h+=`<h3>Líderes</h3><div class=\"scroll\"><table><thead><tr><th>Líder</th><th>CBs</th><th>${LV.dest} final</th>${showOrph?'<th>Órfãs</th>':''}<th>Desloc.</th></tr></thead><tbody>`\n          +L.map(x=>`<tr><td>${esc(x.lider||'—')}</td><td>${fmt(x.total)}</td>\n            <td>${x.home?`<span class=\"dot\" style=\"background:${esc(color[x.home]||'#8e8e93')}\"></span>${esc(x.home)}`:'–'}</td>\n            ${showOrph?`<td>${x.orphan?fmt(x.orphan):'·'}</td>`:''}\n            <td style=\"color:${+x.desloc?'var(--closing)':'var(--mut)'};font-weight:${+x.desloc?700:400}\">${fmt(x.desloc||0)}</td></tr>`).join('')\n          +`</tbody></table></div>`;\n      }\n      h+=`</div></div>`;\n\n      // antes -> depois\n      const M=s.metricas||[];\n      if(M.length){\n        h+=`<h3>Impacto antes → depois por ${LV.destLow} ${LV.fem?'receptora':'receptor'}</h3><div class=\"scroll\"><table><thead><tr><th>${LV.dest}</th>${M.map(m=>`<th>${esc(m.label)}</th>`).join('')}</tr></thead><tbody>`;\n        (s.dest||[]).forEach(sec=>{\n          h+=`<tr><td><span class=\"dot\" style=\"background:${esc(color[sec]||'#8e8e93')}\"></span>${esc(sec)}</td>`;\n          h+=M.map(m=>{const row=(m.rows||[]).find(x=>String(x.s)===String(sec))||{};\n            const a=+row.antes||0,b=+row.depois||0,d=a?((b-a)/a*100):0;const f=m.money?money:fmt;\n            return `<td>${f(b)}<div class=\"delta ${d>=0?'up':'dn'}\">${d>0?'+':''}${d.toFixed(0)}%</div></td>`;}).join('')+`</tr>`;\n        });\n        h+=`<tr style=\"opacity:.75\"><td>${esc(s.sector)} (sai)</td>`+M.map(m=>`<td>${(m.money?money:fmt)(m.sai||0)}</td>`).join('')+`</tr>`;\n        h+=`</tbody></table></div>`;\n      }\n\n      // caveats\n      const fl=[];\n      if(s.excluidos&&s.excluidos.length) fl.push(`<b>${fmt(s.excluidos.length)} município(s)</b> com poucas CBs ficaram fora da realocação geográfica (quebra de vínculo): ${esc(s.excluidos.slice(0,6).map(x=>x.muni+' ('+x.cbs+')').join(', '))}${s.excluidos.length>6?' +'+(s.excluidos.length-6):''}. As CBs seguiram a líder do seu grupo.`);\n      if(s.orphanStranded) fl.push(`<b>${fmt(s.orphanStranded)} CB(s)</b> sem setor a seguir — a líder não ficou com nenhum município realocado.`);\n      if(s.noShapeCbs) fl.push(`<b>${fmt(s.noShapeCbs)} CB(s)</b> em municípios sem shape na UF, fora do mapa e de qualquer setor destino.`);\n      if(s.optTier===1) fl.push(`O span mínimo não era atingível nesta etapa e foi relaxado pelo modelo.`);\n      if(s.optTier===2) fl.push(`Os limites de span não eram atingíveis nesta etapa e foram relaxados pelo modelo.`);\n      if(s.optTier===-1) fl.push(`Etapa resolvida por heurística (espaço de busca grande) — os limites de span não são garantidos.`);\n      if(s.destRuleFallback) fl.push(`Nenhum município dominante nesta etapa: a regra de destino foi relaxada para \"qualquer município\".`);\n      if(s.realocFallback) fl.push(`Todos os municípios ficariam abaixo do limite: a regra de realocação foi relaxada para \"realocar todos\".`);\n      if(fl.length) h+=`<div class=\"flag\">⚠ ${fl.join('<br>')}</div>`;\n      h+=`</div>`;\n    });\n\n    // cumulative\n    // Este resumo é calculado no rastro de município (world.muniOverride) — hoje só existe pro\n    // fechamento de setor; GV/mercado têm o rastro equivalente (secOverride/gvOverride) mas essa\n    // agregação ainda não foi refeita nesse grão, então avisa em vez de mostrar tabela vazia.\n    const rc=sm.receivers||[];\n    if(!rc.length && sessLevel!=='setor'){\n      h+=`<div class=\"card\"><h2>Impacto acumulado da cadeia</h2>\n        <p class=\"note\" style=\"margin-top:0\">Ainda não disponível pra sessões de ${sessLevel==='gv'?'GV':'mercado'} — veja o relatório de cada etapa acima.</p></div>`;\n    }\n    if(rc.length){\n      h+=`<div class=\"card\"><h2>Impacto acumulado da cadeia</h2>\n        <p class=\"sub\">Efeito de <b>todas</b> as ${fmt(stages.length)} etapa(s) somadas, contra o snapshot congelado sem nenhum fechamento aplicado.</p>\n        <div class=\"scroll\"><table><thead><tr><th>Setor</th><th>Situação</th><th>CBs antes</th><th>CBs depois</th><th>Variação</th></tr></thead><tbody>`\n        +rc.map(x=>{const a=+x.antes||0,b=+x.depois||0,d=a?((b-a)/a*100):0;\n          return `<tr><td>${esc(x.s)}</td><td>${esc(x.situacao||'recebeu território')}</td><td>${fmt(a)}</td><td>${fmt(b)}</td>\n            <td class=\"delta ${d>=0?'up':'dn'}\" style=\"font-size:11.5px\">${d>0?'+':''}${d.toFixed(0)}%</td></tr>`;}).join('')\n        +`</tbody></table></div></div>`;\n    }\n\n    h+=`<div class=\"note\" style=\"text-align:center;margin-top:22px\">Visualização somente leitura de uma simulação congelada. Os números refletem o snapshot <b>${esc(r.snapshotRaw||'—')}</b> e as regras vigentes no momento do compartilhamento — não acompanham o dado ao vivo.</div>`;\n    return h+`</div></div>`;\n  },\n  mounted(d2, root){\n    d2.on('#goSim','click',()=>{\n      try{ (d2.router('timelineSimRouter')||d2.router()).goTo('/'); }catch(e){ try{ d2.router().goTo('/'); }catch(e2){} }\n    });\n    d2.on('.sc','click',e=>{\n      const el=e.target.closest('.sc'); if(!el) return;\n      const t=d2.$('#'+el.dataset.goto); if(t) t.scrollIntoView({behavior:'smooth',block:'start'});\n    });\n    // ---- map zoom/pan (viewBox só — texto e polígonos vivem no mesmo sistema de coordenadas, então\n    // escalam juntos automaticamente ao encolher/esticar o viewBox, sem lógica extra pra fonte).\n    // Delegado em `root` (nunca substituído por re-render) em vez de nos <svg> por id, porque cada\n    // atualização de estado reconstrói o HTML das etapas do zero.\n    const mapViews={};\n    const getMapView=(i,W,H)=>mapViews[i]||(mapViews[i]={x:0,y:0,w:W,h:H});\n    const applyMapView=(svg,i)=>{ const v=mapViews[i]; if(!v) return;\n      svg.setAttribute('viewBox', v.x.toFixed(2)+' '+v.y.toFixed(2)+' '+v.w.toFixed(2)+' '+v.h.toFixed(2));\n      // Rótulo tem tamanho em unidades do viewBox — sem isso ele cresceria junto com o zoom até virar\n      // um borrão. Encolher na mesma proporção que o viewBox encolhe cancela o zoom: o texto fica do\n      // mesmo tamanho na tela em qualquer nível. style.fontSize (não o atributo) porque uma regra de\n      // classe como .mlabel{font-size:...} outrankaria um atributo comum.\n      const W=+svg.dataset.w||700;\n      const fsScale=v.w/W;\n      svg.querySelectorAll('[data-fs]').forEach(t=>{\n        const base=+t.getAttribute('data-fs')||8;\n        t.style.fontSize=(base*fsScale).toFixed(2)+'px';\n      });\n    };\n    const zoomStageMap=(i,factor)=>{\n      const svg=root.querySelector('#map-'+i); if(!svg) return;\n      const W=+svg.dataset.w||700, H=+svg.dataset.h||500;\n      const v=getMapView(i,W,H);\n      const cx=v.x+v.w/2, cy=v.y+v.h/2;\n      let w=v.w/factor, h=v.h/factor;\n      w=Math.min(W, Math.max(W/8, w)); h=Math.min(H, Math.max(H/8, h));\n      let x=cx-w/2, y=cy-h/2;\n      x=Math.min(W-w, Math.max(0,x)); y=Math.min(H-h, Math.max(0,y));\n      mapViews[i]={x,y,w,h};\n      applyMapView(svg,i);\n    };\n    d2.on('.zoom-pill button','click',e=>{\n      const b=e.target.closest('button'); if(!b) return;\n      zoomStageMap(b.dataset.i, b.dataset.zoom==='in'?1.4:1/1.4);\n    });\n    let mapDrag=null;\n    root.addEventListener('pointerdown',e=>{\n      const svg=e.target.closest('svg.map'); if(!svg) return;\n      const i=svg.id.replace('map-',''); const W=+svg.dataset.w||700, H=+svg.dataset.h||500;\n      const v=getMapView(i,W,H);\n      mapDrag={svg,i,W,H,x0:e.clientX,y0:e.clientY,vx0:v.x,vy0:v.y,rect:svg.getBoundingClientRect()};\n      svg.classList.add('dragging');\n    });\n    root.addEventListener('pointermove',e=>{\n      if(!mapDrag||!mapDrag.rect.width||!mapDrag.rect.height) return;\n      const dxPix=e.clientX-mapDrag.x0, dyPix=e.clientY-mapDrag.y0;\n      const v=getMapView(mapDrag.i,mapDrag.W,mapDrag.H);\n      const sx=v.w/mapDrag.rect.width, sy=v.h/mapDrag.rect.height;\n      let x=mapDrag.vx0-dxPix*sx, y=mapDrag.vy0-dyPix*sy;\n      x=Math.min(mapDrag.W-v.w, Math.max(0,x)); y=Math.min(mapDrag.H-v.h, Math.max(0,y));\n      mapViews[mapDrag.i]={...v,x,y};\n      applyMapView(mapDrag.svg,mapDrag.i);\n    });\n    const endMapDrag=()=>{ if(mapDrag){ mapDrag.svg.classList.remove('dragging'); mapDrag=null; } };\n    root.addEventListener('pointerup',endMapDrag);\n    root.addEventListener('pointerleave',endMapDrag);\n    (async()=>{\n      try{\n        // RACE, not a missing dataset. This DataSet is gated by timelineSimAuthFinal, so its\n        // Process is only define()d once the auth session resolves — a Process waits for its\n        // dependencies' setup before its own fires. In the field the auth lookup lands ~200ms\n        // and this DataSet's first fetch ~700-900ms, while mounted() runs immediately. d2.data()\n        // returns null for a module that is not defined YET, so bailing on the first miss threw\n        // \"dataset não disponível\" on every share link even though nothing was wrong.\n        // Poll briefly instead. Two lookups because either may win: the declared `shared` param,\n        // or the global-process path via the reference the instance binds — keep that binding.\n        let dead=false; d2.onUnmount(()=>{ dead=true; });\n        let ds=null;\n        for(let i=0;i<40 && !ds && !dead;i++){\n          ds=d2.data('shared')||d2.data('timeline-shared-sessionsDataSet');\n          if(!ds) await new Promise(r=>setTimeout(r,100));\n        }\n        if(dead) return;\n        if(!ds){ d2.setState({error:'Dataset de sessões compartilhadas não disponível.',ready:true}); return; }\n        // Name the router explicitly. Bare d2.router() looks for the conventional\n        // 'Router'/'MainRouter'; this one is 'timelineSimRouter', so the bare call can hand back a\n        // handle whose .params is empty — which is how a valid /sessions/<id> link ended up\n        // reporting \"o link não traz o identificador\". The goSim handler below already passes the\n        // ref for the same reason.\n        const rt=d2.router('timelineSimRouter')||d2.router();\n        const p=(rt&&rt.params)||{};\n        // ?id= lets the artboard be opened directly, outside the route.\n        let q=null;\n        try{ q=new URLSearchParams(window.location.search).get('id'); }catch(e){}\n        // Last resort, and the only one that cannot fail: the id is sitting in the path. Route\n        // params need the Router handle to resolve AND to have matched by the time mounted() runs\n        // (.params is a reactive getter, read once here); the pathname needs neither. Matches the\n        // current /sessions/:session_id route and the legacy /sessao/:id one.\n        let seg=null;\n        try{ const m=window.location.pathname.match(/\\/sess(?:ions|ao)\\/([^/?#]+)/); seg=m&&m[1]; }catch(e){}\n        const id=p.session_id||p.id||p.sessao||p.session||seg||q;\n        if(!id){ d2.setState({error:'O link não traz o identificador da sessão.',ready:true}); return; }\n        // .query() is a direct read and returns the rows — no refresh/loadAll ordering trap here\n        const rows=await ds.query({_id:id});\n        const rec=Array.isArray(rows)?rows[0]:(rows&&rows.data&&rows.data[0]);\n        d2.setState({rec:rec||null,ready:true,error:''});\n      }catch(err){\n        d2.setState({error:(err&&err.message)||'Falha ao carregar a sessão compartilhada.',ready:true});\n      }\n    })();\n  }\n}","at":"2026-08-13T14:21:53.099Z"}},"updatedAt":"2026-08-14T15:11:39.665Z","createdAt":"2026-08-14T15:11:32.969Z"},{"_id":"6a7f3140b7014a3fb17a76ce","component":"data2-core-types@Component","system":"6a57cfe9673eb7e3c5e57784","params":{"component":"ZbSMa0nRld-Ond2eo6tjs","package":"natura-geomarketing","title":"Ventura — Login","extends":"data2-core-primitives@Block","parameters":{"component":"data2-core-types@FieldSet","params":{"fields":{}}},"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"const AUTH='timelineSimAuthFinal';\n// SSP origin is derived at runtime from a known listener's resolved URL; this is only the fallback.\nconst SSP_FALLBACK='https://natura-geomarketing.data2apis.com';\nconst RUSH_REF='AwW_11Nkg-dKksP7ic8V8';\nconst ROUTER='timelineSimRouter';\n\nexport default {\n  css: `\n  :host{display:block;height:100%}\n  *{box-sizing:border-box}\n  .lroot{--bg:#f5f5f7;--panel:#ffffff;--panel2:#f2f2f7;--line:#e5e5ea;--ink:#1c1c1e;--mut:#6e6e73;--acc:#007aff;--acc2:#0060df;--closing:#ff3b30;--ok:#34c759;\n    min-height:100%;display:flex;align-items:center;justify-content:center;padding:36px 20px;background:var(--bg);\n    font:13px/1.45 -apple-system,BlinkMacSystemFont,\"SF Pro Text\",\"Segoe UI\",Roboto,sans-serif;color:var(--ink);-webkit-font-smoothing:antialiased}\n  .card{width:100%;max-width:400px;background:var(--panel);border:1px solid var(--line);border-radius:14px;\n    box-shadow:0 12px 34px rgba(0,0,0,.07),0 1px 2px rgba(0,0,0,.04);padding:26px 26px 22px}\n  .pill{display:inline-block;font-size:10.5px;padding:2.5px 9px;border-radius:99px;border:1px solid var(--line);color:var(--mut);background:var(--panel2)}\n  h1{font-size:17px;font-weight:600;letter-spacing:-.25px;margin:13px 0 5px}\n  .sub{font-size:12px;color:var(--mut);margin:0 0 20px;line-height:1.5}\n  .fl{display:block;font-size:11px;text-transform:uppercase;letter-spacing:.4px;color:var(--mut);font-weight:600;margin:0 0 5px}\n  .inp{width:100%;background:var(--panel);border:1px solid var(--line);color:var(--ink);border-radius:8px;padding:9px 11px;font:inherit;font-size:13px}\n  .inp:focus{outline:2px solid rgba(0,122,255,.32);outline-offset:0;border-color:var(--acc)}\n  .inp:disabled{opacity:.55}\n  .row{margin-bottom:14px}\n  .act{width:100%;background:var(--acc);color:#fff;border:1px solid transparent;border-radius:8px;padding:10px 14px;font:inherit;font-size:13px;font-weight:600;cursor:pointer;box-shadow:0 1px 1px rgba(0,0,0,.08);margin-top:4px}\n  .act:hover{background:var(--acc2)}\n  .act:disabled{opacity:.5;cursor:not-allowed}\n  .ghost{width:100%;background:var(--panel);color:var(--ink);border:1px solid var(--line);border-radius:8px;padding:9px 12px;font:inherit;font-size:12.5px;cursor:pointer;margin-top:8px}\n  .ghost:hover{background:var(--panel2)}\n  .okbox{margin:12px 0 0;padding:8px 10px;border-radius:8px;background:#eefaf0;border:1px solid #bdeecb;color:#1c7c33;font-size:11.5px;font-weight:600}\n  .err{margin:12px 0 0;padding:8px 10px;border-radius:8px;background:#fff1f0;border:1px solid #ffd1cc;color:var(--closing);font-size:11.5px;font-weight:600}\n  .who{font-size:12px;color:var(--mut);margin:0 0 16px}\n  .who b{color:var(--ink)}\n  .foot{margin-top:18px;padding-top:14px;border-top:1px solid var(--line);font-size:10.5px;color:var(--mut);line-height:1.55}\n`,\n  render(d2){\n    const esc=s=>(s==null?'':String(s)).replace(/[&<>\"]/g,c=>({'&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;'}[c]));\n    const busy=!!d2.state.busy;\n    const err=d2.state.error||'';\n    const a=d2.auth(AUTH);\n    if(!a){\n      return `<div class=\"lroot\"><div class=\"card\">\n        <span class=\"pill\">configuração</span>\n        <h1>Estratégia de autenticação não encontrada</h1>\n        <p class=\"sub\">Não foi possível resolver <b>${esc(AUTH)}</b>. Confirme a referência da AuthenticationStrategy do sistema.</p>\n      </div></div>`;\n    }\n    // Deliberately NOT branching on a.isAuthed. The Router renders this artboard ONLY from its\n    // `login` slot, i.e. only when the route policy rejected the caller — so anyone looking at it\n    // is unauthenticated by construction. isAuthed also reads TRUE under a builder token, which\n    // would show an \"already signed in\" card that bounces to / , gets rejected, and loops.\n    return `<div class=\"lroot\"><div class=\"card\">\n      <span class=\"pill\">acesso restrito</span>\n      <h1>Simulador de Timeline de Fechamentos</h1>\n      <p class=\"sub\">Entre com suas credenciais pra abrir a timeline de fechamentos de setores.</p>\n      <div class=\"row\">\n        <label class=\"fl\" for=\"em\">E-mail</label>\n        <input class=\"inp\" id=\"em\" type=\"email\" autocomplete=\"username\" autocapitalize=\"off\" autocorrect=\"off\" spellcheck=\"false\" placeholder=\"voce@natura.com.br\"${busy?' disabled':''}>\n      </div>\n      <div class=\"row\">\n        <label class=\"fl\" for=\"pw\">Senha</label>\n        <input class=\"inp\" id=\"pw\" type=\"password\" autocomplete=\"current-password\" placeholder=\"••••••••\"${busy?' disabled':''}>\n      </div>\n      <button class=\"act\" id=\"go\"${busy?' disabled':''}>${busy?'Entrando…':'Entrar'}</button>\n      ${err?`<div class=\"err\">⚠ ${esc(err)}</div>`:''}\n      ${d2.state.ok?`<div class=\"okbox\">✓ Autenticado. No app publicado o redirecionamento é automático.</div>`:''}\n      <div class=\"foot\">Geomarketing · Natura. O simulador é read-only sobre o Databricks — cada sessão salva fica presa ao snapshot congelado da simulação.</div>\n    </div></div>`;\n  },\n  mounted(d2, root){\n    // The router re-runs its policy hook when the session changes, so a successful login normally\n    // swaps the gated content on its own. If it does not (same path), reload as a last resort —\n    // cancelled on unmount, so the reload only ever fires when the swap did NOT happen.\n    // Login now runs through the strategy, so the runtime DOES hold the session in memory and the\n    // route policy would re-evaluate on its own. The hard navigation is kept deliberately: it is\n    // the one path that cannot land on stale client state. In the builder there is no app root to\n    // go to, so we just report success instead of navigating out of /preview/<ref>. [agent:ad78d19d]\n    const enter=()=>{\n      if(d2.context.isBuilder){ d2.setState({busy:false,error:'',ok:true}); return; }\n      try{ window.location.replace('/'); }\n      catch(e){ try{ window.location.reload(); }catch(e2){} }\n    };\n    // pt-BR (ABNT2) keyboards put ^ ~ ´ ¨ on DEAD keys: pressing one before a character that cannot\n    // take the accent (like @) emits the bare mark, or leaves a combining codepoint behind. Either\n    // way it must never reach /id/ln, so strip it plus zero-width paste junk and any whitespace.\n    // The PASSWORD is deliberately left untouched — these characters are legitimate in a password.\n    const cleanEmail=s=>String(s==null?'':s)\n      .normalize('NFKC')\n      .replace(/[̀-ͯ]/g,'')\n      .replace(/[​-‍﻿]/g,'')\n      .replace(/[\\^~´¨`]/g,'')\n      .replace(/\\s+/g,'');\n    // A failed login must NEVER navigate or reload: keep the card, keep what was typed (the morph\n    // patches in place so input values survive), show the error and put the cursor back in the\n    // password so it can be corrected immediately.\n    const failWith=msg=>{\n      d2.setState({busy:false,ok:false,error:msg});\n      setTimeout(()=>{ const p=d2.$('#pw'); if(p){ try{ p.focus(); p.select(); }catch(e){} } },0);\n    };\n    const submit=async()=>{\n      if(d2.state.busy) return;\n      const rawEm=(d2.$('#em')||{}).value||'';\n      const em=cleanEmail(rawEm);\n      if(em!==rawEm && d2.$('#em')) d2.$('#em').value=em;   // show the cleaned address back to the user\n      const pw=((d2.$('#pw')||{}).value||'');\n      if(!em||!pw){ failWith('Preencha e-mail e senha.'); return; }\n      d2.setState({busy:true,error:'',ok:false});\n      try{\n        // Direct interaction with the AuthenticationStrategy — no hand-rolled fetch. The runtime\n        // owns the session envelope, so IT attaches `authorization: Bearer <jwt>` (and the session\n        // cookie) to the login POST. The previous hand-rolled fetch could not: it derived the jwt\n        // from document.cookie on the APP origin while the cookie lives on the SSP origin, so the\n        // header was silently dropped on every attempt — the 401 in devtools. [agent:ad78d19d]\n        // ⚠️ `credentials` MUST stay NESTED — a flat {email,password} authenticates nobody and\n        // fails as an UNCATCHABLE 400/403 (no exception, no rejected promise).\n        // ⚠️ A rejected login is NOT an exception either — after the promise settles, read\n        // `isAuthed`. Do not gate the error UI on catch().\n        const a=d2.auth(AUTH);\n        if(!a){ failWith('Estratégia de autenticação não encontrada ('+AUTH+').'); return; }\n        await a.login({credentials:{email:em,password:pw}});\n        if(a.isAuthed){ enter(); return; }\n        failWith('E-mail ou senha inválidos.');\n      }catch(e){\n        failWith('Falha ao autenticar: '+((e&&e.message)||'erro desconhecido'));\n      }\n    };\n    d2.on('#go','click',submit);\n    d2.on('.inp','keydown',e=>{ if(e.key==='Enter'){ e.preventDefault(); submit(); } });\n  }\n}"}}}}}},"__d2PrevCode":{"code":"const AUTH='timelineSimAuthFinal';\n// SSP origin is derived at runtime from a known listener's resolved URL; this is only the fallback.\nconst SSP_FALLBACK='https://natura-geomarketing.data2apis.com';\nconst RUSH_REF='AwW_11Nkg-dKksP7ic8V8';\nconst ROUTER='timelineSimRouter';\n\nexport default {\n  css: `\n  :host{display:block;height:100%}\n  *{box-sizing:border-box}\n  .lroot{--bg:#f5f5f7;--panel:#ffffff;--panel2:#f2f2f7;--line:#e5e5ea;--ink:#1c1c1e;--mut:#6e6e73;--acc:#007aff;--acc2:#0060df;--closing:#ff3b30;--ok:#34c759;\n    min-height:100%;display:flex;align-items:center;justify-content:center;padding:36px 20px;background:var(--bg);\n    font:13px/1.45 -apple-system,BlinkMacSystemFont,\"SF Pro Text\",\"Segoe UI\",Roboto,sans-serif;color:var(--ink);-webkit-font-smoothing:antialiased}\n  .card{width:100%;max-width:400px;background:var(--panel);border:1px solid var(--line);border-radius:14px;\n    box-shadow:0 12px 34px rgba(0,0,0,.07),0 1px 2px rgba(0,0,0,.04);padding:26px 26px 22px}\n  .pill{display:inline-block;font-size:10.5px;padding:2.5px 9px;border-radius:99px;border:1px solid var(--line);color:var(--mut);background:var(--panel2)}\n  h1{font-size:17px;font-weight:600;letter-spacing:-.25px;margin:13px 0 5px}\n  .sub{font-size:12px;color:var(--mut);margin:0 0 20px;line-height:1.5}\n  .fl{display:block;font-size:11px;text-transform:uppercase;letter-spacing:.4px;color:var(--mut);font-weight:600;margin:0 0 5px}\n  .inp{width:100%;background:var(--panel);border:1px solid var(--line);color:var(--ink);border-radius:8px;padding:9px 11px;font:inherit;font-size:13px}\n  .inp:focus{outline:2px solid rgba(0,122,255,.32);outline-offset:0;border-color:var(--acc)}\n  .inp:disabled{opacity:.55}\n  .row{margin-bottom:14px}\n  .act{width:100%;background:var(--acc);color:#fff;border:1px solid transparent;border-radius:8px;padding:10px 14px;font:inherit;font-size:13px;font-weight:600;cursor:pointer;box-shadow:0 1px 1px rgba(0,0,0,.08);margin-top:4px}\n  .act:hover{background:var(--acc2)}\n  .act:disabled{opacity:.5;cursor:not-allowed}\n  .ghost{width:100%;background:var(--panel);color:var(--ink);border:1px solid var(--line);border-radius:8px;padding:9px 12px;font:inherit;font-size:12.5px;cursor:pointer;margin-top:8px}\n  .ghost:hover{background:var(--panel2)}\n  .okbox{margin:12px 0 0;padding:8px 10px;border-radius:8px;background:#eefaf0;border:1px solid #bdeecb;color:#1c7c33;font-size:11.5px;font-weight:600}\n  .err{margin:12px 0 0;padding:8px 10px;border-radius:8px;background:#fff1f0;border:1px solid #ffd1cc;color:var(--closing);font-size:11.5px;font-weight:600}\n  .who{font-size:12px;color:var(--mut);margin:0 0 16px}\n  .who b{color:var(--ink)}\n  .foot{margin-top:18px;padding-top:14px;border-top:1px solid var(--line);font-size:10.5px;color:var(--mut);line-height:1.55}\n`,\n  render(d2){\n    const esc=s=>(s==null?'':String(s)).replace(/[&<>\"]/g,c=>({'&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;'}[c]));\n    const busy=!!d2.state.busy;\n    const err=d2.state.error||'';\n    const a=d2.auth(AUTH);\n    if(!a){\n      return `<div class=\"lroot\"><div class=\"card\">\n        <span class=\"pill\">configuração</span>\n        <h1>Estratégia de autenticação não encontrada</h1>\n        <p class=\"sub\">Não foi possível resolver <b>${esc(AUTH)}</b>. Confirme a referência da AuthenticationStrategy do sistema.</p>\n      </div></div>`;\n    }\n    // Deliberately NOT branching on a.isAuthed. The Router renders this artboard ONLY from its\n    // `login` slot, i.e. only when the route policy rejected the caller — so anyone looking at it\n    // is unauthenticated by construction. isAuthed also reads TRUE under a builder token, which\n    // would show an \"already signed in\" card that bounces to / , gets rejected, and loops.\n    return `<div class=\"lroot\"><div class=\"card\">\n      <span class=\"pill\">acesso restrito</span>\n      <h1>Simulador de Timeline de Fechamentos</h1>\n      <p class=\"sub\">Entre com suas credenciais pra abrir a timeline de fechamentos de setores.</p>\n      <div class=\"row\">\n        <label class=\"fl\" for=\"em\">E-mail</label>\n        <input class=\"inp\" id=\"em\" type=\"email\" autocomplete=\"username\" autocapitalize=\"off\" autocorrect=\"off\" spellcheck=\"false\" placeholder=\"voce@natura.com.br\"${busy?' disabled':''}>\n      </div>\n      <div class=\"row\">\n        <label class=\"fl\" for=\"pw\">Senha</label>\n        <input class=\"inp\" id=\"pw\" type=\"password\" autocomplete=\"current-password\" placeholder=\"••••••••\"${busy?' disabled':''}>\n      </div>\n      <button class=\"act\" id=\"go\"${busy?' disabled':''}>${busy?'Entrando…':'Entrar'}</button>\n      ${err?`<div class=\"err\">⚠ ${esc(err)}</div>`:''}\n      ${d2.state.ok?`<div class=\"okbox\">✓ Autenticado. No app publicado o redirecionamento é automático.</div>`:''}\n      <div class=\"foot\">Geomarketing · Natura. O simulador é read-only sobre o Databricks — cada sessão salva fica presa ao snapshot congelado da simulação.</div>\n    </div></div>`;\n  },\n  mounted(d2, root){\n    // The router re-runs its policy hook when the session changes, so a successful login normally\n    // swaps the gated content on its own. If it does not (same path), reload as a last resort —\n    // cancelled on unmount, so the reload only ever fires when the swap did NOT happen.\n    // The direct POST sets the session COOKIE; the in-memory runtime never saw it, so a HARD\n    // navigation is required here — d2.router().goTo() would keep the stale client state and the\n    // route policy would reject again. In the builder there is no app root to go to, so we just\n    // report success instead of navigating out of /preview/<ref>.\n    const enter=()=>{\n      if(d2.context.isBuilder){ d2.setState({busy:false,error:'',ok:true}); return; }\n      try{ window.location.replace('/'); }\n      catch(e){ try{ window.location.reload(); }catch(e2){} }\n    };\n    // pt-BR (ABNT2) keyboards put ^ ~ ´ ¨ on DEAD keys: pressing one before a character that cannot\n    // take the accent (like @) emits the bare mark, or leaves a combining codepoint behind. Either\n    // way it must never reach /id/ln, so strip it plus zero-width paste junk and any whitespace.\n    // The PASSWORD is deliberately left untouched — these characters are legitimate in a password.\n    const cleanEmail=s=>String(s==null?'':s)\n      .normalize('NFKC')\n      .replace(/[̀-ͯ]/g,'')\n      .replace(/[​-‍﻿]/g,'')\n      .replace(/[\\^~´¨`]/g,'')\n      .replace(/\\s+/g,'');\n    // A failed login must NEVER navigate or reload: keep the card, keep what was typed (the morph\n    // patches in place so input values survive), show the error and put the cursor back in the\n    // password so it can be corrected immediately.\n    const failWith=msg=>{\n      d2.setState({busy:false,ok:false,error:msg});\n      setTimeout(()=>{ const p=d2.$('#pw'); if(p){ try{ p.focus(); p.select(); }catch(e){} } },0);\n    };\n    const submit=async()=>{\n      if(d2.state.busy) return;\n      const rawEm=(d2.$('#em')||{}).value||'';\n      const em=cleanEmail(rawEm);\n      if(em!==rawEm && d2.$('#em')) d2.$('#em').value=em;   // show the cleaned address back to the user\n      const pw=((d2.$('#pw')||{}).value||'');\n      if(!em||!pw){ failWith('Preencha e-mail e senha.'); return; }\n      d2.setState({busy:true,error:'',ok:false});\n      try{\n        // Direct interaction with the AuthenticationStrategy — no hand-rolled fetch. The runtime\n        // owns the session envelope, so IT attaches `authorization: Bearer <jwt>` (and the session\n        // cookie) to the login POST. The previous hand-rolled fetch could not: it derived the jwt\n        // from document.cookie on the APP origin while the cookie lives on the SSP origin, so the\n        // header was silently dropped on every attempt — the 401 in devtools. [agent:ad78d19d]\n        // ⚠️ `credentials` MUST stay NESTED — a flat {email,password} authenticates nobody and\n        // fails as an UNCATCHABLE 400/403 (no exception, no rejected promise).\n        // ⚠️ A rejected login is NOT an exception either — after the promise settles, read\n        // `isAuthed`. Do not gate the error UI on catch().\n        const a=d2.auth(AUTH);\n        if(!a){ failWith('Estratégia de autenticação não encontrada ('+AUTH+').'); return; }\n        await a.login({credentials:{email:em,password:pw}});\n        if(a.isAuthed){ enter(); return; }\n        failWith('E-mail ou senha inválidos.');\n      }catch(e){\n        failWith('Falha ao autenticar: '+((e&&e.message)||'erro desconhecido'));\n      }\n    };\n    d2.on('#go','click',submit);\n    d2.on('.inp','keydown',e=>{ if(e.key==='Enter'){ e.preventDefault(); submit(); } });\n  }\n}","at":"2026-08-06T19:07:41.976Z"}},"updatedAt":"2026-08-14T15:16:50.197Z","createdAt":"2026-08-14T15:16:16.662Z"}]}},{"reference":"ExternalComponentInstancesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"reference":"OrganizationsDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"_id":"5f060d9b1ca96def42f3c40a","displayName":"Builder AuthStrategy","component":"data2-core@AuthenticationStrategy","system":"5e3b796d6228227ca637d0f4","params":{"credentials":[{"component":"data2-core-types@DataSetColumnReference","params":{"column":"email"}},{"component":"data2-core-types@DataSetColumnReference","params":{"column":"password"}},{"component":"data2-core-types@DataSetColumnReference","params":{"column":"status"}}],"verifier":{"component":"data2-core-types@DataSetReference","params":{"reference":"UsersDataSet"}},"sessionShared":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"password":{"disabled":false,"component":"data2-core-types@DataSetColumnReference","params":{"column":"password"}},"email":{"disabled":false,"component":"data2-core-types@DataSetColumnReference","params":{"column":"email"}},"resetPassword":{"resetEmail":{"artboard":{"params":{"preventEvaluation":true,"reference":"nR6Q9d7qdaPtZhJ28Q8Dy"},"component":"data2-core-types@ArtboardReference"}},"resetSuccessEmail":{"artboard":{"params":{"preventEvaluation":true,"reference":"yPCJBTKo8q1Mw0B_3Kpwl"},"component":"data2-core-types@ArtboardReference"}}},"session":[{"component":"data2-core-types@DataSetColumnReference","params":{"column":"name"}},{"component":"data2-core-types@DataSetColumnReference","params":{"column":"email"}},{"component":"data2-core-types@DataSetColumnReference","params":{"column":"password"}},{"component":"data2-core-types@DataSetColumnReference","params":{"column":"status"}}],"sessionMetadata":{"params":{"actions":[{"params":{"compare":{"params":{"subject":{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$user._id"}}}},{"params":{"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"active"}},"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$user.status"}}}}},"component":"data2-core-comparison-operators@Equal","displayName":"is active user"}]},"component":"data2-core-logical-operators@And","displayName":"is active and has _id"}},"component":"data2-core-logical-operators@Not"},"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Invalid Credentials"}},"code":{"component":"data2-core-primitives@String","params":{"content":"401"}}},"component":"data2-core-types@Error"}},"component":"data2-core-flow@If","displayName":"check $user"},{"params":{"action":{"params":{"pattern":{"component":"data2-core-primitives@String","params":{"content":"@data2.app"}},"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$user.email"}}}}},"component":"data2-core-functions@Includes","displayName":"isData2User"},"resultName":{"component":"data2-core-primitives@String","params":{"content":"is_data2_user"}}},"component":"data2-core-flow@Step"},{"params":{"action":{"params":{"pattern":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$metadata.d2_app"}}}},"subject":[{"component":"data2-core-primitives@String","params":{"content":"management"}}]},"component":"data2-core-functions@Includes","displayName":"isData2App Exception"},"resultName":{"component":"data2-core-primitives@String","params":{"content":"is_data2_app_exception"}}},"component":"data2-core-flow@Step"},{"params":{"resultName":{"component":"data2-core-primitives@String","params":{"content":"has_access"}},"action":{"params":{"compare":{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"is_data2_user"}}}},{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"is_data2_app_exception"}}}}]},"component":"data2-core-logical-operators@Or"},"else":{"params":{"actions":[{"params":{"actions":[{"params":{"compare":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$metadata.system"}}}}},"component":"data2-core-logical-operators@Not"},"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Invalid Credentials"}},"code":{"component":"data2-core-primitives@String","params":{"content":"401"}}},"component":"data2-core-types@Error"}},"component":"data2-core-flow@If","displayName":"check $metadata.system"},{"params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"WuUa-VKHhW9uYU0E3-mJ8"}},"prop":"filter","args":[{"_id":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$metadata.system"}}}}}]},"component":"data2-core-types@Interaction"},{"params":{"compare":{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"WuUa-VKHhW9uYU0E3-mJ8"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records.length"}}}}},"component":"data2-core-logical-operators@Not","displayName":"systems not found"},"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Invalid Credentials"}},"code":{"component":"data2-core-primitives@String","params":{"content":"401"}}},"component":"data2-core-types@Error"}},"component":"data2-core-flow@If","displayName":"check system found"},{"params":{"actions":[{"params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Ok6Tsu5XkS7r8PyW_7TyW"}},"prop":"filter","args":[{"user":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$user._id"}}}},"organization":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"WuUa-VKHhW9uYU0E3-mJ8"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"cursor.current.organization._id"}}}}}]},"component":"data2-core-types@Interaction"},{"params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"NqKAY34n2ffFL64zamp7t"}},"prop":"filter","args":[{"user":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$user._id"}}}},"system":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$metadata.system"}}}}}]},"component":"data2-core-types@Interaction"}]},"component":"data2-core-flow@Parallel"}]},"component":"data2-core-flow@Series","displayName":"common setup"},{"params":{"then":{"params":{"content":true},"component":"data2-core-primitives@Boolean"},"else":{"params":{"content":false},"component":"data2-core-primitives@Boolean"},"compare":{"params":{"components":{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"WuUa-VKHhW9uYU0E3-mJ8"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"mapper":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"system"}}],"body":{"params":{"expression":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"system.visibility"}}}},"defaultCase":{"params":{"content":false},"component":"data2-core-primitives@Boolean"},"cases":[{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"public"}},"value":{"params":{"components":[{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Ok6Tsu5XkS7r8PyW_7TyW"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"member"}}],"body":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"member.organization._id"}}}},"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"system.organization._id"}}}}},"component":"data2-core-comparison-operators@Equal","displayName":"is org member"},{"params":{"pattern":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"member.role"}}}},"subject":[{"component":"data2-core-primitives@String","params":{"content":"owner"}},{"component":"data2-core-primitives@String","params":{"content":"billing-owner"}},{"component":"data2-core-primitives@String","params":{"content":"admin"}},{"component":"data2-core-primitives@String","params":{"content":"member"}}]},"component":"data2-core-functions@Includes","displayName":"has role with access"}]},"component":"data2-core-logical-operators@And","displayName":"has org member role with access"}}}},"component":"data2-core-functions@ArrayFind","displayName":"is org member"},{"params":{"components":[{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Ok6Tsu5XkS7r8PyW_7TyW"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"member"}}],"body":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"member.organization._id"}}}},"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"system.organization._id"}}}}},"component":"data2-core-comparison-operators@Equal","displayName":"is org member"},{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"member.role"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"collaborator"}}},"component":"data2-core-comparison-operators@Equal","displayName":"is collaborator"}]},"component":"data2-core-logical-operators@And","displayName":"is org member and collaborator"}}}},"component":"data2-core-functions@ArrayFind","displayName":"is collaborator"},{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"NqKAY34n2ffFL64zamp7t"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"access"}}],"body":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"access.system._id"}}}},"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"system._id"}}}}},"component":"data2-core-comparison-operators@Equal"}}}},"component":"data2-core-functions@ArrayFind","displayName":"has system access"}]},"component":"data2-core-logical-operators@And","displayName":"is collaborator and has system access"}]},"component":"data2-core-logical-operators@Or"}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"private"}},"value":{"params":{"components":[{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Ok6Tsu5XkS7r8PyW_7TyW"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"member"}}],"body":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"member.organization._id"}}}},"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"system.organization._id"}}}}},"component":"data2-core-comparison-operators@Equal","displayName":"is org member"},{"params":{"pattern":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"member.role"}}}},"subject":[{"component":"data2-core-primitives@String","params":{"content":"owner"}},{"component":"data2-core-primitives@String","params":{"content":"admin"}}]},"component":"data2-core-functions@Includes","displayName":"is owner/admin"}]},"component":"data2-core-logical-operators@And","displayName":"has org member role with access"}}}},"component":"data2-core-functions@ArrayFind","displayName":"is owner/admin"},{"params":{"components":[{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Ok6Tsu5XkS7r8PyW_7TyW"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"member"}}],"body":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"member.organization._id"}}}},"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"system.organization._id"}}}}},"component":"data2-core-comparison-operators@Equal"}}}},"component":"data2-core-functions@ArrayFind","displayName":"is org member"},{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"NqKAY34n2ffFL64zamp7t"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"access"}}],"body":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"access.system._id"}}}},"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"system._id"}}}}},"component":"data2-core-comparison-operators@Equal"}}}},"component":"data2-core-functions@ArrayFind","displayName":"has system access"}]},"component":"data2-core-logical-operators@And","displayName":"is member and has system access"}]},"component":"data2-core-logical-operators@Or","displayName":"is owner/admin or has system access"}}}]},"component":"data2-core-flow@Switch"}}}},"component":"data2-core-functions@ArrayMap"}},"component":"data2-core-logical-operators@And","displayName":"has org member for all systems in request"}},"component":"data2-core-flow@If"}]},"component":"data2-core-flow@Series"},"then":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-flow@If"}},"component":"data2-core-flow@Step"},{"params":{"then":{"system":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$metadata.system"}}}}},"else":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Invalid Credentials"}},"code":{"component":"data2-core-primitives@String","params":{"content":"401"}}},"component":"data2-core-types@Error"},"compare":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"has_access"}}}}},"component":"data2-core-flow@If"}]},"component":"data2-core-flow@Series"},"sessionExpiresIn":{"component":"data2-core-primitives@Number","params":{"content":604800}},"sessionRenewal":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"identityProviders":[{"provider":{"component":"data2-core-primitives@String","params":{"content":"GOOGLE"}},"clientId":{"component":"data2-core-primitives@String","params":{"content":"55470861603-22pvfc1t49lp8cjnbfk71s5ct9hp1q1v.apps.googleusercontent.com"}}}]},"reference":"Data2BuilderAuthentication","updatedAt":"2026-08-06T19:31:23.557Z"},{"_id":"5f060ee51ca96def42f3fbd1","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"UsersTableDataSource"}},"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":1}}}},"reference":"UsersDataSet","updatedAt":"2026-03-04T21:16:40.291Z"},{"_id":"64d15c2113c0d10caf6931ae","displayName":"AuthOrganizationMemberDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"OrganizationMemberDataSource"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"master":{"params":{"dataset":{"disabled":false,"component":"data2-core-types@DataSetReference","params":{"reference":"UsersDataSet"}},"masterField":{"disabled":false,"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}},"localField":{"disabled":false,"component":"data2-core-types@DataSetColumnReference","params":{"column":"user"}}},"component":"data2-core-types@DataSetMaster"}},"reference":"DhPJ44W3fVq4ylQlnQJ6M","updatedAt":"2023-08-07T21:04:52.974Z","createdAt":"2023-08-07T21:03:30.298Z"},{"_id":"64dd0ed019bc3a3249d4bdb6","displayName":"AuthOrganizationsDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"OrganizationsDataSource"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"filter":{"params":{"_id":{"component":"data2-core-primitives@String","params":{"content":"000000000000000000000000"}}},"component":"data2-core-types@DataSetFilter"}},"reference":"8RATUCjKQCm9C66SA4llO","updatedAt":"2023-08-16T18:01:09.405Z","createdAt":"2023-08-16T18:00:49.745Z"},{"_id":"68f938cf5fb002e33752a43d","displayName":"InternalApplicationsAuthenticationStrategy","component":"data2-core@AuthenticationStrategy","system":"5e3b796d6228227ca637d0f4","params":{"resetPassword":{"resetEmail":{"artboard":{"params":{"preventEvaluation":true},"component":"data2-core-types@ArtboardReference"}},"resetSuccessEmail":{"artboard":{"params":{"preventEvaluation":true},"component":"data2-core-types@ArtboardReference"}}},"verifier":{"disabled":false,"component":"data2-core-types@DataSetReference","params":{"reference":"InternalApplicationsVerifierDataSet"}},"password":{"disabled":false,"component":"data2-core-types@DataSetColumnReference","params":{"column":"secret"}},"credentials":[{"component":"data2-core-types@FieldReference","params":{"key":"application"}},{"component":"data2-core-types@FieldReference","params":{"key":"secret"}},{"component":"data2-core-types@FieldReference","params":{"key":"status"}}],"session":[{"component":"data2-core-types@FieldReference","params":{"key":"application"}},{"component":"data2-core-types@FieldReference","params":{"key":"secret"}},{"component":"data2-core-types@FieldReference","params":{"key":"status"}}]},"reference":"InternalApplicationsAuthenticationStrategy","updatedAt":"2025-10-22T20:08:54.442Z","createdAt":"2025-10-22T20:04:31.198Z"},{"component":"data2-core@DataSet","reference":"SessionsDataSet","params":{"requiresConfirmation":false,"pk":"key","datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"data2sessionsdatasource"}}}},{"reference":"UsersTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"reference":"OrganizationMemberDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"_id":"68f938ee5fb002e33752a43e","displayName":"InternalApplicationsVerifierDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"InternalApplicationsTableDataSource"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":1}}}},"reference":"InternalApplicationsVerifierDataSet","updatedAt":"2025-10-22T20:05:40.424Z","createdAt":"2025-10-22T20:05:03.038Z"},{"component":"data2-core@ServerSessionsDataSource","reference":"data2sessionsdatasource","params":{}},{"_id":"64de6f3d2ceda0be9d4a4a8f","displayName":"AuthUsersDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"UsersTableDataSource"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"filter":{"params":{"_id":{"component":"data2-core-primitives@String","params":{"content":"000000000000000000000000"}}},"component":"data2-core-types@DataSetFilter"}},"reference":"uWJ56eAjtxAUHTwOm6DfK","updatedAt":"2023-08-17T19:04:43.992Z","createdAt":"2023-08-17T19:04:43.992Z"},{"reference":"InternalApplicationsTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"_id":"5f1600b70528b92601890f75","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ServiceComponentInstancesTableDataSource"}},"pk":"_id","autoEdit":true,"master":{"params":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"component":"data2-core-types@DataSetMaster"},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"policies":{"params":{"allowGet":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"ServiceComponentInstancesDataSet","updatedAt":"2025-11-06T21:07:20.208Z","createdAt":"2020-07-20T20:38:15.436Z"},{"_id":"5f1602190528b92601890f7d","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"pagination":{"size":40000},"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ComponentInstancesTableDataSource"}},"sort":{"_id":1},"pk":"_id","autoEdit":true,"master":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"policies":{"params":{"allowGet":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"ComponentInstancesDataSet","updatedAt":"2025-11-06T21:07:07.089Z","createdAt":"2020-07-20T20:44:09.350Z"},{"_id":"5f16017f0528b92601890f7a","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"FileComponentInstancesTableDataSource"}},"pk":"_id","autoEdit":true,"filter":{"domain":{"component":"data2-core-types@Reference","params":{"reference":"clientApplicationDomain"}}},"master":{"params":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"component":"data2-core-types@DataSetMaster"},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}}},"reference":"FileComponentInstancesDataSet","updatedAt":"2023-08-03T16:08:18.193Z","createdAt":"2020-07-20T20:41:35.797Z"},{"_id":"5f1601990528b92601890f7b","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ApplicationsTableDataSource"}},"pk":"_id","autoEdit":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"master":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"params":{"column":"_id"},"component":"data2-core-types@DataSetColumnReference"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}}},"reference":"ApplicationsDataSet","updatedAt":"2022-12-13T21:51:13.995Z","createdAt":"2020-07-20T20:42:01.657Z"},{"_id":"5f16172a0528b92601890f85","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":10000}}},"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"DataComponentInstancesTableDataSource"}},"pk":"_id","autoEdit":true,"master":{"params":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"component":"data2-core-types@DataSetMaster"},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"policies":{"params":{"allowGet":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"DataComponentInstancesDataSet","updatedAt":"2025-11-06T21:07:12.831Z","createdAt":"2020-07-20T22:14:02.097Z"},{"_id":"5f9abd25c8da12be8bcfaa6a","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"UsersSystemsDataSource"}},"pagination":{"size":1000},"master":{"dataset":{"component":"data2-core-types@ProcessReference","params":{"reference":"SessionsDataSet"}},"localField":"user","masterField":"credentials._id"},"filter":{"params":{"system":"000000000000000000000000"},"component":"data2-core-types@DataSetFilter"}},"reference":"UsersSystemsDataSet","updatedAt":"2026-08-05T17:56:27.365Z","createdAt":"2020-10-29T13:00:05.344Z"},{"_id":"60ddc1bbda3861ca65407c5a","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"FileComponentInstancesTableDataSource"}},"pk":"_id","autoEdit":true,"filter":{"domain":{"component":"data2-core-types@Reference","params":{"reference":"clientApplicationDomain"}}},"pagination":{"size":1},"master":{"params":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"component":"data2-core-types@DataSetMaster"}},"reference":"OneFileComponentInstancesDataSet","updatedAt":"2022-02-09T19:44:38.036Z","createdAt":"2020-07-20T20:41:35.797Z"},{"_id":"61030b60f302195bad585a55","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"pagination":{"size":6000},"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ComponentInstancesTableDataSource"}},"pk":"_id","autoEdit":true,"visibilityMode":"only_show_deleted","sort":{"deletedAt":-1},"master":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"filter":{"params":{"deletedAt":{"$gte":{"params":{"count":{"component":"data2-core-primitives@Number","params":{"content":-30}},"date":{"params":{},"component":"data2-core-functions@DateNow"},"period":"days"},"component":"data2-core-functions@DateAdd"}}},"component":"data2-core-types@DataSetFilter"},"policies":{"params":{},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"DeletedComponentInstancesDataSet","updatedAt":"2025-11-05T22:41:18.708Z","createdAt":"2021-07-29T20:10:35.237Z"},{"_id":"61b8f4a354ea187f1491d4fe","displayName":"AllOrganizationsDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"OrganizationsDataSource"}}},"reference":"AllOrganizationsDataSet","updatedAt":"2023-01-05T19:51:21.819Z","createdAt":"2021-12-14T19:46:44.021Z"},{"_id":"61e1cd39ad6edf91c884c27a","displayName":"WorkspaceInstancesDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"WorkspaceInstancesTableDataSource"}},"master":{"params":{"dataset":{"disabled":false,"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"params":{"content":"system"},"component":"data2-core-primitives@String"},"masterField":{"params":{"content":"_id"},"component":"data2-core-primitives@String"}},"component":"data2-core-types@DataSetMaster"},"policies":{"params":{},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"WorkspaceInstancesDataSet","updatedAt":"2025-11-05T23:15:17.288Z","createdAt":"2022-01-14T19:21:29.400Z"},{"_id":"6215420815971c2c7d213f54","displayName":"AllOrganizationMemberDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"OrganizationMemberDataSource"}}},"reference":"AllOrganizationMemberDataSet","updatedAt":"2022-02-22T20:05:42.092Z","createdAt":"2022-02-22T20:05:28.735Z"},{"_id":"6227cb0236c086020d51f5e7","displayName":"AllSystemsDataSetByOrganization","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"SystemsTableDataSource"}},"master":{"params":{"dataset":{"disabled":false,"component":"data2-core-types@DataSetReference","params":{"reference":"AllOrganizationsDataSet"}},"masterField":{"params":{"content":"_id"},"component":"data2-core-primitives@String"},"localField":{"params":{"content":"organization"},"component":"data2-core-primitives@String"}},"component":"data2-core-types@DataSetMaster"},"policies":[{"params":{},"component":"data2-core-auth@BuilderPolicy"}]},"reference":"AllSystemsDataSetByOrganization","updatedAt":"2026-08-13T19:31:50.811Z","createdAt":"2022-03-08T21:30:44.011Z"},{"_id":"61b8f5bc54ea187f1491d500","displayName":"OrganizationMemberDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"OrganizationMemberDataSource"}},"master":{"params":{"dataset":{"disabled":false,"component":"data2-core-types@DataSetReference","params":{"reference":"SessionsDataSet"}},"localField":{"params":{"content":"user"},"component":"data2-core-primitives@String"},"masterField":{"params":{"content":"credentials._id"},"component":"data2-core-primitives@String"}},"component":"data2-core-types@DataSetMaster"},"filter":{"params":{"organization":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"SystemsDataSet"}},"prop":"cursor.current.organization"}}},"component":"data2-core-types@DataSetFilter"}},"reference":"OrganizationMemberDataSet","updatedAt":"2021-12-15T15:32:33.626Z","createdAt":"2021-12-14T19:51:24.802Z"},{"_id":"61e1ccdead6edf91c884c278","displayName":"WorkspacesDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"WorkspacesTableDataSource"}},"master":{"params":{"dataset":{"disabled":false,"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"params":{"content":"system"},"component":"data2-core-primitives@String"},"masterField":{"params":{"content":"_id"},"component":"data2-core-primitives@String"}},"component":"data2-core-types@DataSetMaster"},"sort":{"updatedAt":{"component":"data2-core-primitives@Number","params":{"content":-1}}},"requiresConfirmation":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"policies":{"params":{},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"WorkspacesDataSet","updatedAt":"2025-11-05T23:16:39.534Z","createdAt":"2022-01-14T19:19:58.344Z"},{"_id":"61e1de4bded80840e7a7dbac","displayName":"WorkspacesCreateDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"WorkspacesTableDataSource"}},"filter":{"_id":{"component":"data2-core-primitives@String","params":{"content":"000000000000000000000000"}}},"refreshOnEdit":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"requiresConfirmation":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"policies":{"params":{},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"WorkspacesCreateDataSet","updatedAt":"2025-11-05T23:16:39.302Z","createdAt":"2022-01-14T20:34:20.203Z"},{"_id":"61b8f65a54ea187f1491d502","displayName":"SystemAccessDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"SystemAccessDataSource"}},"master":{"params":{"dataset":{"disabled":false,"component":"data2-core-types@DataSetReference","params":{"reference":"OrganizationMemberDataSet"}},"masterField":{"params":{"content":"_id"},"component":"data2-core-primitives@String"},"localField":{"disabled":false,"component":"data2-core-types@DataSetColumnReference","params":{"column":"organizationMember"}}},"component":"data2-core-types@DataSetMaster"},"filter":{"params":{"system":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"SystemsDataSet"}},"prop":"cursor.current._id"}}},"component":"data2-core-types@DataSetFilter"}},"reference":"SystemAccessDataSet","updatedAt":"2023-01-24T02:32:28.703Z","createdAt":"2021-12-14T19:54:02.320Z"},{"_id":"62154aff15971c2c7d213f55","displayName":"AllSystemsDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"SystemsTableDataSource"}}},"reference":"AllSystemsDataSet","updatedAt":"2022-02-22T20:43:51.956Z","createdAt":"2022-02-22T20:43:44.259Z"},{"_id":"621541ee15971c2c7d213f53","displayName":"AllSystemAccessDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"SystemAccessDataSource"}}},"reference":"AllSystemAccessDataSet","updatedAt":"2023-01-24T02:48:31.439Z","createdAt":"2022-02-22T20:05:03.056Z"},{"_id":"6227c3acd2fe08fca4db99b7","displayName":"AllOrganizationMemberDataSetByOrganization","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"OrganizationMemberDataSource"}},"master":{"params":{"dataset":{"disabled":false,"component":"data2-core-types@DataSetReference","params":{"reference":"AllOrganizationsDataSet"}},"masterField":{"params":{"content":"_id"},"component":"data2-core-primitives@String"},"localField":{"params":{"content":"organization"},"component":"data2-core-primitives@String"}},"component":"data2-core-types@DataSetMaster"},"policies":[{"params":{},"component":"data2-core-auth@BuilderPolicy"}]},"reference":"AllOrganizationMemberDataSetByOrganization","updatedAt":"2026-08-13T19:32:29.482Z","createdAt":"2022-03-08T20:59:26.246Z"},{"_id":"622fae319701bc2d9ddba8cc","displayName":"SystemsPickerDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"SystemsTableDataSource"}},"filter":{"_id":{"component":"data2-core-primitives@String","params":{"content":"000000000000000000000000"}}}},"reference":"5ZQ1On0e2CS29zL4KwR8O","updatedAt":"2022-03-15T05:02:01.398Z","createdAt":"2022-03-14T21:05:54.258Z"},{"_id":"623ba4f04500c24e07cff6b9","displayName":"AllUsersDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"UsersTableDataSource"}},"policies":[{"params":{},"component":"data2-core-auth@RushPolicy"},{"params":{},"component":"data2-core-auth@BuilderPolicy"}]},"reference":"AllUsersDataSet","updatedAt":"2026-08-05T20:38:04.535Z","createdAt":"2022-03-23T22:53:37.273Z"},{"_id":"623cabc755e95757b9ecff4b","displayName":"OrganizationMemberDataSetByUser","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"OrganizationMemberDataSource"}},"master":{"params":{"dataset":{"disabled":false,"component":"data2-core-types@DataSetReference","params":{"reference":"SessionsDataSet"}},"localField":{"params":{"content":"user"},"component":"data2-core-primitives@String"},"masterField":{"params":{"content":"credentials._id"},"component":"data2-core-primitives@String"}},"component":"data2-core-types@DataSetMaster"}},"reference":"l4ThorGtbezVCZaU2BEdv","updatedAt":"2022-03-24T17:35:32.740Z","createdAt":"2022-03-24T17:35:04.349Z"},{"_id":"63b7236f60752d19fb0850e9","displayName":"AllDeletedSystemsDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"SystemsTableDataSource"}},"visibilityMode":"only_show_deleted"},"reference":"AllDeletedSystemsDataSet","updatedAt":"2023-01-05T19:47:43.928Z","createdAt":"2023-01-05T19:22:24.905Z"},{"_id":"63cf38e64dce774eead7c25c","displayName":"SystemAccessDataSetByUser","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"SystemAccessDataSource"}},"master":{"params":{"dataset":{"disabled":false,"component":"data2-core-types@DataSetReference","params":{"reference":"SessionsDataSet"}},"localField":{"params":{"content":"user"},"component":"data2-core-primitives@String"},"masterField":{"params":{"content":"credentials._id"},"component":"data2-core-primitives@String"}},"component":"data2-core-types@DataSetMaster"}},"reference":"Pbdn7ys5lXkZeEL1wXl0O","updatedAt":"2023-01-24T01:48:44.297Z","createdAt":"2023-01-24T01:48:25.424Z"},{"_id":"63cf4c8edc6d9c198fd16d9e","displayName":"FirstAccessUsersDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"UsersTableDataSource"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"filter":{"_id":{"component":"data2-core-primitives@String","params":{"content":"000000000000000000000000"}}},"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":1}}},"staticFilter":{"status":{"component":"data2-core-primitives@String","params":{"content":"pending"}}},"policies":[{"component":"data2-core-auth@Policy","params":{"allow":{"params":{"cases":[{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"find"}},"value":{"params":{"components":[{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$params.query.$and.0._id"}}},"component":"data2-core-types@Reference"},{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$params.query.$and.0.email"}}},"component":"data2-core-types@Reference"}]},"component":"data2-core-logical-operators@Or"}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"patch"}},"value":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}}}],"defaultCase":{"params":{},"component":"data2-core-primitives@Boolean"},"expression":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-flow@Switch"}}}]},"reference":"BhCMHF8FsJxFh9FLT_F4n","updatedAt":"2023-04-28T15:45:10.108Z","createdAt":"2023-01-24T03:12:18.593Z"},{"_id":"63ee3d38b8c9838c62fb05fb","displayName":"DriveFileComponentInstancesDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"FileComponentInstancesTableDataSource"}},"pk":"_id","autoEdit":true,"filter":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core@Drive"}}},"master":{"params":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"component":"data2-core-types@DataSetMaster"},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}}},"reference":"DriveFileComponentInstancesDataSet","updatedAt":"2025-12-04T21:58:32.367Z","createdAt":"2023-02-16T14:27:07.797Z"},{"_id":"644986ab4b9bcc50729af60b","displayName":"SelfSignUpUsersDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"UsersTableDataSource"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"filter":{"_id":{"component":"data2-core-primitives@String","params":{"content":"000000000000000000000000"}}},"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":1}}},"policies":[{"component":"data2-core-auth@Policy","params":{"allow":{"params":{"cases":[{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"find"}},"value":{"params":{"components":[{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$params.query.$and.0.email"}}},"component":"data2-core-types@Reference"},{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$params.query.$and.0._id"}}},"component":"data2-core-types@Reference"},{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$params.query.$and.0.activationToken"}}},"component":"data2-core-types@Reference"}]},"component":"data2-core-logical-operators@Or"}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"patch"}},"value":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"create"}},"value":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}}}],"defaultCase":{"component":"data2-core-primitives@Boolean"},"expression":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-flow@Switch"}}}]},"reference":"zmV7JfNmv2oDUtGKfSzNm","updatedAt":"2023-08-02T20:40:59.545Z","createdAt":"2023-04-26T20:16:44.411Z"},{"_id":"644bddc0a3c8c0f62d1df8fd","displayName":"SelfSignUpOrganizationsDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"OrganizationsDataSource"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"filter":{"_id":{"component":"data2-core-primitives@String","params":{"content":"000000000000000000000000"}}},"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":1}}},"policies":[{"component":"data2-core-auth@Policy","params":{"allow":{"params":{"cases":[{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"find"}},"value":{"params":{"components":[{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$params.query.$and.0.domain"}}},"component":"data2-core-types@Reference"},{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$params.query.$and.0._id"}}},"component":"data2-core-types@Reference"}]},"component":"data2-core-logical-operators@Or"}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"patch"}},"value":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"create"}},"value":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}}}],"defaultCase":{"component":"data2-core-primitives@Boolean"},"expression":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-flow@Switch"}}}]},"reference":"tXNGSE-imL6vW6JzWjaUz","updatedAt":"2023-10-02T22:24:43.668Z","createdAt":"2023-04-28T14:53:01.662Z"},{"_id":"644bde50a3c8c0f62d1df8fe","displayName":"SelfSignUpOrganizationMembersDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"OrganizationMemberDataSource"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"filter":{"_id":{"component":"data2-core-primitives@String","params":{"content":"000000000000000000000000"}}},"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":1}}},"policies":[{"component":"data2-core-auth@Policy","params":{"allow":{"params":{"cases":[{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"find"}},"value":{"params":{"components":[{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$params.query.$and.0.email"}}},"component":"data2-core-types@Reference"},{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$params.query.$and.0._id"}}},"component":"data2-core-types@Reference"}]},"component":"data2-core-logical-operators@Or"}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"patch"}},"value":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"create"}},"value":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}}}],"defaultCase":{"component":"data2-core-primitives@Boolean"},"expression":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-flow@Switch"}}}]},"reference":"rAiZhTj-HTUbW4nXvmQ7M","updatedAt":"2023-04-28T14:55:23.102Z","createdAt":"2023-04-28T14:55:23.102Z"},{"_id":"644bde68a3c8c0f62d1df900","displayName":"SelfSignUpSystemsDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"SystemsTableDataSource"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"filter":{"_id":{"component":"data2-core-primitives@String","params":{"content":"000000000000000000000000"}}},"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":1}}},"policies":[{"component":"data2-core-auth@Policy","params":{"allow":{"params":{"cases":[{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"find"}},"value":{"params":{"components":[{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$params.query.$and.0._id"}}},"component":"data2-core-types@Reference"}]},"component":"data2-core-logical-operators@Or"}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"patch"}},"value":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"create"}},"value":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}}}],"defaultCase":{"component":"data2-core-primitives@Boolean"},"expression":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-flow@Switch"}}}]},"reference":"0TySsxIHfD3304K2SnpgJ","updatedAt":"2023-08-02T20:41:18.206Z","createdAt":"2023-04-28T14:55:51.142Z"},{"_id":"64ca7438f3b573600050289a","displayName":"OneUsersDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"UsersTableDataSource"}},"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":1}}},"policies":[{"params":{},"component":"data2-core-auth@RushPolicy"},{"params":{},"component":"data2-core-auth@BuilderPolicy"}]},"reference":"q-u7iBUQvGVs7fbOh4ZHy","updatedAt":"2026-08-13T22:07:35.296Z","createdAt":"2023-08-02T15:20:28.898Z"},{"_id":"64cad30437d8eec3f02d03b9","displayName":"SelfSignUpSystemAccessDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"SystemAccessDataSource"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"filter":{"_id":{"component":"data2-core-primitives@String","params":{"content":"000000000000000000000000"}}},"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":1}}},"policies":[{"component":"data2-core-auth@Policy","params":{"allow":{"params":{"cases":[{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"find"}},"value":{"params":{"components":[{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$params.query.$and.0._id"}}},"component":"data2-core-types@Reference"}]},"component":"data2-core-logical-operators@Or"}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"patch"}},"value":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"create"}},"value":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}}}],"defaultCase":{"component":"data2-core-primitives@Boolean"},"expression":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-flow@Switch"}}}]},"reference":"Nd8VeTny2c0bm0lAaQejg","updatedAt":"2023-08-02T22:05:39.514Z","createdAt":"2023-08-02T22:05:39.514Z"},{"_id":"64d15bc413c0d10caf6931ac","displayName":"AuthSystemsDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"SystemsTableDataSource"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"filter":{"params":{"_id":{"component":"data2-core-primitives@String","params":{"content":"000000000000000000000000"}}},"component":"data2-core-types@DataSetFilter"}},"reference":"RdETEpX-dr2XT93VoG8st","updatedAt":"2023-08-16T17:59:38.814Z","createdAt":"2023-08-07T21:01:56.866Z"},{"_id":"64d15c5713c0d10caf6931af","displayName":"AuthSystemAccessDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"SystemAccessDataSource"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"master":{"params":{"dataset":{"disabled":false,"component":"data2-core-types@DataSetReference","params":{"reference":"UsersDataSet"}},"masterField":{"disabled":false,"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}},"localField":{"disabled":false,"component":"data2-core-types@DataSetColumnReference","params":{"column":"user"}}},"component":"data2-core-types@DataSetMaster"}},"reference":"TCMEQkmcrf52bJ7va8AD2","updatedAt":"2023-08-07T21:16:36.543Z","createdAt":"2023-08-07T21:04:24.312Z"},{"_id":"66a3d041f9ec92a3ff8a9bd8","displayName":"DeletedUserComponentsDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ComponentsTableDataSource"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":2000}}},"master":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"visibilityMode":"only_show_deleted","autoEdit":true,"filter":{"params":{"deletedAt":{"$gte":{"params":{"count":{"component":"data2-core-primitives@Number","params":{"content":-30}},"date":{"params":{},"component":"data2-core-functions@DateNow"},"period":"days"},"component":"data2-core-functions@DateAdd"}}},"component":"data2-core-types@DataSetFilter"},"policies":{"params":{},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"DeletedUserComponentsDataSet","updatedAt":"2025-11-05T22:40:42.230Z","createdAt":"2024-07-26T16:35:14.093Z"},{"_id":"66a3d085f9ec92a3ff8a9bd9","displayName":"DeletedDataComponentInstancesDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"DataComponentInstancesTableDataSource"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":10000}}},"master":{"params":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"component":"data2-core-types@DataSetMaster"},"autoEdit":true,"visibilityMode":"only_show_deleted","filter":{"params":{"deletedAt":{"$gte":{"params":{"count":{"component":"data2-core-primitives@Number","params":{"content":-30}},"date":{"params":{},"component":"data2-core-functions@DateNow"},"period":"days"},"component":"data2-core-functions@DateAdd"}}},"component":"data2-core-types@DataSetFilter"},"policies":{"params":{},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"DeletedDataComponentInstancesDataSet","updatedAt":"2025-11-05T22:41:21.030Z","createdAt":"2024-07-26T16:36:21.742Z"},{"_id":"66a3d0aef9ec92a3ff8a9bda","displayName":"DeletedServiceComponentInstancesDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ServiceComponentInstancesTableDataSource"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":2000}}},"master":{"params":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"component":"data2-core-types@DataSetMaster"},"visibilityMode":"only_show_deleted","filter":{"params":{"deletedAt":{"$gte":{"params":{"count":{"component":"data2-core-primitives@Number","params":{"content":-30}},"date":{"params":{},"component":"data2-core-functions@DateNow"},"period":"days"},"component":"data2-core-functions@DateAdd"}}},"component":"data2-core-types@DataSetFilter"},"policies":{"params":{},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"DeletedServiceComponentInstancesDataSet","updatedAt":"2025-11-05T22:41:29.920Z","createdAt":"2024-07-26T16:37:02.589Z"},{"_id":"66a3d120f9ec92a3ff8a9bdb","displayName":"DeletedFileComponentInstancesDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"FileComponentInstancesTableDataSource"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":2000}}},"visibilityMode":"only_show_deleted","master":{"params":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"component":"data2-core-types@DataSetMaster"},"filter":{"params":{"deletedAt":{"$gte":{"params":{"count":{"component":"data2-core-primitives@Number","params":{"content":-30}},"date":{"params":{},"component":"data2-core-functions@DateNow"},"period":"days"},"component":"data2-core-functions@DateAdd"}}},"component":"data2-core-types@DataSetFilter"},"policies":{"params":{},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"DeletedFileComponentInstancesDataSet","updatedAt":"2025-11-05T22:41:39.353Z","createdAt":"2024-07-26T16:38:56.521Z"},{"_id":"66a3d14ff9ec92a3ff8a9bdc","displayName":"DeletedApplicationsDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ApplicationsTableDataSource"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"master":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"params":{"column":"_id"},"component":"data2-core-types@DataSetColumnReference"}},"visibilityMode":"only_show_deleted","filter":{"params":{"deletedAt":{"$gte":{"params":{"count":{"component":"data2-core-primitives@Number","params":{"content":-30}},"date":{"params":{},"component":"data2-core-functions@DateNow"},"period":"days"},"component":"data2-core-functions@DateAdd"}}},"component":"data2-core-types@DataSetFilter"},"policies":{"params":{},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"DeletedApplicationsDataSet","updatedAt":"2025-11-05T22:42:34.171Z","createdAt":"2024-07-26T16:39:43.809Z"},{"_id":"66a3d2a8f9ec92a3ff8a9bdd","displayName":"DeletedExternalComponentInstancesDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ExternalComponentInstancesTableDataSource"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"pagination":{"size":1000},"master":{"params":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"component":"data2-core-types@DataSetMaster"},"visibilityMode":"only_show_deleted","filter":{"params":{"deletedAt":{"$gte":{"params":{"count":{"component":"data2-core-primitives@Number","params":{"content":-30}},"date":{"params":{},"component":"data2-core-functions@DateNow"},"period":"days"},"component":"data2-core-functions@DateAdd"}}},"component":"data2-core-types@DataSetFilter"},"policies":{"params":{},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"DeletedExternalComponentInstancesDataSet","updatedAt":"2025-11-05T22:41:50.074Z","createdAt":"2024-07-26T16:45:29.511Z"},{"_id":"68f9380b5fb002e33752a43c","displayName":"InternalApplicationsDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"InternalApplicationsTableDataSource"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"pagination":{"size":20}},"reference":"InternalApplicationsDataSet","updatedAt":"2025-10-22T20:05:29.352Z","createdAt":"2025-10-22T20:01:15.614Z"},{"_id":"68fa8c93955ba909c7a8f90b","displayName":"ForbiddenSystemsDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"SystemsTableDataSource"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"pagination":{"size":20},"policies":[{"component":"data2-core-auth@Policy","params":{"deny":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}}}]},"reference":"OcrE3Kw32Bxa6eFUddRVF","updatedAt":"2025-10-23T20:16:47.582Z","createdAt":"2025-10-23T20:14:11.720Z"},{"_id":"68ffe7c529094998d1e02a67","displayName":"ServerOrganizationMemberDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"OrganizationMemberDataSource"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"filter":{"params":{"_id":{"component":"data2-core-primitives@String","params":{"content":"000000000000000000000000"}}},"component":"data2-core-types@DataSetFilter"},"policies":[{"component":"data2-core-auth@Policy","params":{"allow":{"component":"data2-core-flow@Switch","params":{"expression":{"component":"data2-core-types@Reference","params":{"reference":"$method"}},"cases":[{"component":"data2-core-flow@Case","params":{"expression":"find","value":{"component":"data2-core-logical-operators@Or","params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":"$params.query.$and.0.user"}},{"component":"data2-core-types@Reference","params":{"reference":"$params.query.$and.0.organization"}}]}}}}],"defaultCase":{"component":"data2-core-primitives@Boolean","params":{}}}}}}]},"reference":"Ok6Tsu5XkS7r8PyW_7TyW","updatedAt":"2026-08-06T16:31:28.187Z","createdAt":"2025-10-27T21:45:29.721Z"},{"_id":"68ffe7fc29094998d1e02a69","displayName":"ServerSystemAccessDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"SystemAccessDataSource"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"filter":{"params":{"_id":{"component":"data2-core-primitives@String","params":{"content":"000000000000000000000000"}}},"component":"data2-core-types@DataSetFilter"},"policies":[{"component":"data2-core-auth@Policy","params":{"allow":{"component":"data2-core-flow@Switch","params":{"expression":{"component":"data2-core-types@Reference","params":{"reference":"$method"}},"cases":[{"component":"data2-core-flow@Case","params":{"expression":"find","value":{"component":"data2-core-logical-operators@Or","params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":"$params.query.$and.0.user"}},{"component":"data2-core-types@Reference","params":{"reference":"$params.query.$and.0.system"}}]}}}}],"defaultCase":{"component":"data2-core-primitives@Boolean","params":{}}}}}}]},"reference":"NqKAY34n2ffFL64zamp7t","updatedAt":"2026-08-06T16:31:31.213Z","createdAt":"2025-10-27T21:46:18.432Z"},{"_id":"68ffe94429094998d1e02a6b","displayName":"ServerSystemsDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"SystemsTableDataSource"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"filter":{"params":{"_id":{"component":"data2-core-primitives@String","params":{"content":"000000000000000000000000"}}},"component":"data2-core-types@DataSetFilter"},"policies":[{"component":"data2-core-auth@Policy","params":{"allow":{"component":"data2-core-flow@Switch","params":{"expression":{"component":"data2-core-types@Reference","params":{"reference":"$method"}},"cases":[{"component":"data2-core-flow@Case","params":{"expression":"find","value":{"component":"data2-core-logical-operators@Or","params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":"$params.query.$and.0._id"}}]}}}}],"defaultCase":{"component":"data2-core-primitives@Boolean","params":{}}}}}}]},"reference":"WuUa-VKHhW9uYU0E3-mJ8","updatedAt":"2026-08-06T16:31:25.528Z","createdAt":"2025-10-27T21:51:10.967Z"},{"_id":"690929670a52e3626623ddea","displayName":"ScriptsDataComponentInstancesDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"DataComponentInstancesTableDataSource"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":100}}},"filter":{"params":{"_id":{"component":"data2-core-primitives@String","params":{"content":"000000000000000000000000"}}},"component":"data2-core-types@DataSetFilter"},"policies":[{"component":"data2-core-auth@Policy","params":{"authenticationStrategy":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"InternalApplicationsAuthenticationStrategy"}}}}]},"reference":"L-EXs9glijE7K2YgujIlS","updatedAt":"2025-11-03T22:15:53.099Z","createdAt":"2025-11-03T22:15:03.714Z"},{"_id":"6909299d0a52e3626623ddec","displayName":"ScriptsServiceComponentInstancesDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ServiceComponentInstancesTableDataSource"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":100}}},"filter":{"params":{"_id":{"component":"data2-core-primitives@String","params":{"content":"000000000000000000000000"}}},"component":"data2-core-types@DataSetFilter"},"policies":[{"component":"data2-core-auth@Policy","params":{"authenticationStrategy":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"InternalApplicationsAuthenticationStrategy"}}}}]},"reference":"LKHfmyXPtNZcYN1uv6aDG","updatedAt":"2025-11-03T22:16:06.707Z","createdAt":"2025-11-03T22:16:06.707Z"},{"_id":"690a5881ebd6f337964e7327","displayName":"ScriptsFileComponentInstancesDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"FileComponentInstancesTableDataSource"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":100}}},"filter":{"params":{"_id":{"component":"data2-core-primitives@String","params":{"content":"000000000000000000000000"}}},"component":"data2-core-types@DataSetFilter"},"policies":[{"component":"data2-core-auth@Policy","params":{"authenticationStrategy":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"InternalApplicationsAuthenticationStrategy"}}}}]},"reference":"UTlWGA9nNlzd-N4y7ZQjI","updatedAt":"2025-11-04T19:48:26.302Z","createdAt":"2025-11-04T19:48:26.302Z"},{"reference":"ServiceComponentInstancesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[{"_id":"6a62597012863f7deaa6508a","component":"data2-core-connect@HttpClient","displayName":"Simulator requests","reference":"ewio0EIYg3yJnc_hTEwCc","system":"6a57cfe9673eb7e3c5e57784","params":{"policies":[{"component":"data2-core-types@PolicyReference","params":{"allow":{"component":"data2-core-auth@InvokedByBuilder","params":{}}}}]},"updatedAt":"2026-08-06T16:47:17.360Z","createdAt":"2026-07-23T18:12:34.571Z"},{"_id":"6a62597c12863f7deaa6508b","component":"data2-core-connect@HttpRequest","displayName":"get sectors","reference":"wd5dH7e2zdODGAOjXP6g7","system":"6a57cfe9673eb7e3c5e57784","params":{"useProxy":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"parent":{"component":"data2-core-types@InstanceReference","params":{"reference":"ewio0EIYg3yJnc_hTEwCc","component":"data2-core-connect@HttpClient"}},"url":{"component":"data2-core-primitives@String","params":{"content":"https://natura-x-app.data2.link/rush/A0kvMekKfk4Yk0da7NLET"}},"method":"POST","data":{"sql":{"component":"data2-core-primitives@String","params":{"content":"SELECT CD_SETOR setor,\n       MAX(DS_ESTADO) uf,\n       COUNT(DISTINCT CD_CONSULTORA) cbs,\n       COUNT(DISTINCT DS_MUNICIPIO) munis\nFROM product.perfil_cb.crm_perfil_cb_diaria_historico\nWHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR>0\n  AND DT_HISTORICO=(SELECT MAX(DT_HISTORICO) ...)\nGROUP BY CD_SETOR\nORDER BY CD_SETOR"}},"skip_monitoring":{"params":{"content":true},"component":"data2-core-primitives@Boolean"},"country":{"component":"data2-core-primitives@String","params":{"content":"BR"}}},"requestParameters":[]},"updatedAt":"2026-07-23T18:23:32.926Z","createdAt":"2026-07-23T18:12:45.990Z"},{"_id":"6a6992f4e1053d806729e9f4","component":"data2-core-connect@HttpClient","displayName":"GeoDataBR Client","reference":"N15zEWu4GvXztmPPTjOBt","system":"6a57cfe9673eb7e3c5e57784","params":{"policies":[{"component":"data2-core-types@PolicyReference","params":{"allow":{"component":"data2-core-auth@InvokedByBuilder","params":{}}}}]},"updatedAt":"2026-08-06T16:47:11.806Z","createdAt":"2026-07-29T05:44:05.903Z"},{"_id":"6a6992f4e1053d806729e9f5","component":"data2-core-connect@HttpRequest","displayName":"Geo Data Request","reference":"gh_MFH1HrDf2o2JrlseD0","system":"6a57cfe9673eb7e3c5e57784","params":{"parent":{"component":"data2-core-types@InstanceReference","params":{"component":"data2-core-connect@HttpClient","reference":"N15zEWu4GvXztmPPTjOBt"}},"method":{"component":"data2-core-primitives@String","params":{"content":"GET"}},"url":{"params":{"portions":[{"component":"data2-core-primitives@String","params":{"content":"https://raw.githubusercontent.com/tbrugz/geodata-br/master/geojson/geojs-"}},{"params":{"components":[{"component":"data2-core-types@Getter","params":{"prop":{"component":"data2-core-primitives@String","params":{"content":"ibge"}},"module":{"params":{"array":{"params":{"text":{"component":"data2-core-primitives@String","params":{"content":"[\n  { \"ibge\": 11, \"uf\": \"RO\" },\n  { \"ibge\": 12, \"uf\": \"AC\" },\n  { \"ibge\": 13, \"uf\": \"AM\" },\n  { \"ibge\": 14, \"uf\": \"RR\" },\n  { \"ibge\": 15, \"uf\": \"PA\" },\n  { \"ibge\": 16, \"uf\": \"AP\" },\n  { \"ibge\": 17, \"uf\": \"TO\" },\n  { \"ibge\": 21, \"uf\": \"MA\" },\n  { \"ibge\": 22, \"uf\": \"PI\" },\n  { \"ibge\": 23, \"uf\": \"CE\" },\n  { \"ibge\": 24, \"uf\": \"RN\" },\n  { \"ibge\": 25, \"uf\": \"PB\" },\n  { \"ibge\": 26, \"uf\": \"PE\" },\n  { \"ibge\": 27, \"uf\": \"AL\" },\n  { \"ibge\": 28, \"uf\": \"SE\" },\n  { \"ibge\": 29, \"uf\": \"BA\" },\n  { \"ibge\": 31, \"uf\": \"MG\" },\n  { \"ibge\": 32, \"uf\": \"ES\" },\n  { \"ibge\": 33, \"uf\": \"RJ\" },\n  { \"ibge\": 35, \"uf\": \"SP\" },\n  { \"ibge\": 41, \"uf\": \"PR\" },\n  { \"ibge\": 42, \"uf\": \"SC\" },\n  { \"ibge\": 43, \"uf\": \"RS\" },\n  { \"ibge\": 50, \"uf\": \"MS\" },\n  { \"ibge\": 51, \"uf\": \"MT\" },\n  { \"ibge\": 52, \"uf\": \"GO\" },\n  { \"ibge\": 53, \"uf\": \"DF\" }\n]"}}},"component":"data2-core-functions@JSONParse"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"f"}}],"body":{"params":{"subject":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"f.uf"}}},"component":"data2-core-types@Reference"},"comparisonSubject":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"uf"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-comparison-operators@Equal"}}}},"component":"data2-core-functions@ArrayFind"}}},{"component":"data2-core-primitives@String","params":{"content":"35"}}]},"component":"data2-core-logical-operators@Or"},{"component":"data2-core-primitives@String","params":{"content":"-mun.json"}}]},"component":"data2-core-functions@StringConcat"},"useProxy":true,"rawResponse":true,"requestParameters":[{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"uf"}},"component":"data2-core-primitives@String"}}]},"updatedAt":"2026-07-29T05:46:28.646Z","createdAt":"2026-07-29T05:44:05.913Z"},{"_id":"6a724079f36177c3a54ed9ac","component":"data2-core-connect@HttpClient","displayName":"natura-x-app Databricks Probe","reference":"BfAGABjBQ7vjjfHt6t6TH","system":"6a57cfe9673eb7e3c5e57784","params":{"baseURL":"https://natura-x-app.data2apis.com","headers":{},"policies":[{"component":"data2-core-auth@Policy","params":{"authenticationStrategy":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"timelineSimAuthFinal"}}}},{"component":"data2-core-auth@BuilderPolicy","params":{}},{"component":"data2-core-auth@RushPolicy","params":{"rushes":{"allow":[],"deny":[]},"systems":{"allow":[],"deny":[]}}}]},"updatedAt":"2026-08-06T18:02:00.418Z","createdAt":"2026-08-04T19:41:45.913Z"},{"_id":"6a7240a39995499d32f99cbe","component":"data2-core-connect@HttpRequest","displayName":"Call databricks-probe (dynamic url)","reference":"aV6-HcQWMQs6zGfKu3Qgy","system":"6a57cfe9673eb7e3c5e57784","params":{"parent":{"component":"data2-core-types@InstanceReference","params":{"component":"data2-core-connect@HttpClient","reference":"BfAGABjBQ7vjjfHt6t6TH"}},"method":{"component":"data2-core-primitives@String","params":{"content":"GET"}},"url":{"component":"data2-core-types@Reference","params":{"reference":"url"}},"requestParameters":[{"component":"data2-core-primitives@PrimitiveParameter","key":"url","mock":"https://natura-x-app.data2apis.com/rush/c-4Mga6rx9zbZ8Gs3vbY8"}],"useProxy":true,"rawResponse":true,"policies":[{"component":"data2-core-auth@Policy","params":{"authenticationStrategy":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"timelineSimAuthFinal"}}}},{"component":"data2-core-auth@BuilderPolicy","params":{}},{"component":"data2-core-auth@RushPolicy","params":{"rushes":{"allow":[],"deny":[]},"systems":{"allow":[],"deny":[]}}}]},"updatedAt":"2026-08-06T18:02:00.760Z","createdAt":"2026-08-04T19:42:27.852Z"},{"_id":"6a7240abab11eee26d640c2e","component":"data2-rush@HTTPListener","displayName":"TEST · call databricks-probe via token","reference":"AwW_11Nkg-dKksP7ic8V8","system":"6a57cfe9673eb7e3c5e57784","params":{"enableExecutionLogs":true,"shouldLogRequestBody":true,"insertLogsDataSet":{"component":"data2-core-types@DataSetReference","params":{"reference":"AwW_11Nkg-dKksP7ic8V8LogInsertDataSet"}},"readLogsDataSet":{"component":"data2-core-types@DataSetReference","params":{"reference":"AwW_11Nkg-dKksP7ic8V8LogReadDataSet"}},"rawResponse":false,"handler":{"component":"data2-core-flow@Series","params":{"actions":[{"component":"data2-core-flow@Step","params":{"action":{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"keyvault-HwPHTveDB-1SF3LoQhpJ2"}},"prop":"getValue","args":["GEOMARKETING_PROBE_TOKEN"]}},"resultName":"token"}},{"component":"data2-core-flow@Step","params":{"action":{"component":"data2-core-types@Reference","params":{"reference":"body.sql"}},"resultName":"sql"}},{"component":"data2-core-flow@Step","params":{"action":{"component":"data2-core-functions@StringConcat","params":{"portions":["","https://natura-x-app.data2apis.com/rush/c-4Mga6rx9zbZ8Gs3vbY8?token=",{"component":"data2-core-types@Reference","params":{"reference":"token"}},"&sql=",{"component":"http@UrlEncodedFormData","params":{"data":{"component":"data2-core-types@Reference","params":{"reference":"sql"}}}}]}},"resultName":"builtUrl"}},{"component":"data2-core-flow@Step","params":{"action":{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"BfAGABjBQ7vjjfHt6t6TH"}},"prop":"sendRequest","args":[{"request":{"component":"data2-core-types@InstanceReference","params":{"component":"data2-core-connect@HttpRequest","reference":"aV6-HcQWMQs6zGfKu3Qgy"}},"requestParameters":{"url":{"component":"data2-core-types@Reference","params":{"reference":"builtUrl"}}}}]}},"resultName":"result"}},{"component":"data2-core-flow@Step","params":{"action":{"sql":{"component":"data2-core-types@Reference","params":{"reference":"sql"}},"result":{"component":"data2-core-types@Reference","params":{"reference":"result.data"}}},"resultName":"out"}}]}},"policies":[{"component":"data2-core-auth@Policy","params":{"authenticationStrategy":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"timelineSimAuthFinal"}}}},{"component":"data2-core-auth@BuilderPolicy","params":{}}]},"updatedAt":"2026-08-06T18:01:49.788Z","createdAt":"2026-08-04T19:42:35.671Z"},{"_id":"6a7c81038157bd3190aac2c3","component":"data2-core-connect@HttpClient","displayName":"Overpass (OSM) Client","reference":"overpassRoadsClient","system":"6a57cfe9673eb7e3c5e57784","params":{"baseURL":"https://overpass-api.de","headers":{}},"updatedAt":"2026-08-12T14:19:47.322Z","createdAt":"2026-08-12T14:19:47.322Z","deleteMetadata":{}},{"_id":"6a7c8110cb3cd9441af9e4aa","component":"data2-core-connect@HttpRequest","displayName":"Overpass interpreter (dynamic url)","reference":"overpassRoadsInterpreter","system":"6a57cfe9673eb7e3c5e57784","params":{"parent":{"component":"data2-core-types@InstanceReference","params":{"component":"data2-core-connect@HttpClient","reference":"overpassRoadsClient"}},"method":{"component":"data2-core-primitives@String","params":{"content":"GET"}},"url":{"component":"data2-core-types@Reference","params":{"reference":"url"}},"requestParameters":[{"component":"data2-core-primitives@PrimitiveParameter","key":"url","mock":"https://overpass-api.de/api/interpreter?data=placeholder"}],"responseType":"json","useProxy":true,"rawResponse":true,"headers":[{"key":"User-Agent","value":"natura-geomarketing-timeline-simulator/1.0 (Data2; lucca@data2.app)"},{"key":"Accept","value":"application/json"}]},"updatedAt":"2026-08-12T14:24:38.613Z","createdAt":"2026-08-12T14:20:00.534Z","deleteMetadata":{}},{"_id":"6a7c812ed9d1e4126b0ed253","component":"data2-rush@HTTPListener","displayName":"Overpass roads proxy","reference":"overpassRoads","system":"6a57cfe9673eb7e3c5e57784","params":{"enableExecutionLogs":true,"shouldLogRequestBody":true,"insertLogsDataSet":{"component":"data2-core-types@DataSetReference","params":{"reference":"overpassRoadsLogInsertDataSet"}},"readLogsDataSet":{"component":"data2-core-types@DataSetReference","params":{"reference":"overpassRoadsLogReadDataSet"}},"rawResponse":false,"handler":{"component":"data2-core-flow@Series","params":{"actions":[{"component":"data2-core-flow@Step","params":{"action":{"component":"http@UrlEncodedFormData","params":{"data":{"component":"data2-core-types@Reference","params":{"reference":"body.ql"}}}},"resultName":"enc"}},{"component":"data2-core-flow@Step","params":{"action":{"component":"data2-core-functions@StringConcat","params":{"portions":["","https://overpass-api.de/api/interpreter?data=",{"component":"data2-core-types@Reference","params":{"reference":"enc"}}]}},"resultName":"url"}},{"component":"data2-core-flow@Step","params":{"action":{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"overpassRoadsClient"}},"prop":"sendRequest","args":[{"request":{"component":"data2-core-types@InstanceReference","params":{"component":"data2-core-connect@HttpRequest","reference":"overpassRoadsInterpreter"}},"requestParameters":{"url":{"component":"data2-core-types@Reference","params":{"reference":"url"}}}}]}},"resultName":"resp"}},{"component":"data2-core-flow@Step","params":{"action":{"elements":{"component":"data2-core-types@Reference","params":{"reference":"resp.data.elements"}},"status":{"component":"data2-core-types@Reference","params":{"reference":"resp.status"}}},"resultName":"out"}}]}}},"updatedAt":"2026-08-12T14:25:27.527Z","createdAt":"2026-08-12T14:20:30.016Z","deleteMetadata":{}},{"_id":"6a7c81a359b332991e7eecf4","component":"data2-core-connect@HttpRequest","displayName":"Overpass interpreter (dynamic url)","reference":"overpassRoadsInterpreter","system":"6a57cfe9673eb7e3c5e57784","params":{"parent":{"component":"data2-core-types@InstanceReference","params":{"component":"data2-core-connect@HttpClient","reference":"overpassRoadsClient"}},"method":{"component":"data2-core-primitives@String","params":{"content":"GET"}},"url":{"component":"data2-core-types@Reference","params":{"reference":"url"}},"requestParameters":[{"component":"data2-core-primitives@PrimitiveParameter","key":"url","mock":"https://overpass-api.de/api/interpreter?data=placeholder"}],"headers":[{"key":"User-Agent","value":"natura-geomarketing-timeline-simulator/1.0 (Data2; contato lucca@data2.app)"},{"key":"Accept","value":"application/json"}],"responseType":"json","useProxy":true,"rawResponse":true},"updatedAt":"2026-08-12T14:22:27.282Z","createdAt":"2026-08-12T14:22:27.282Z","deleteMetadata":{}}]}},{"reference":"ComponentInstancesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[{"_id":"2544724b6e0a08f3b8b81464","parent":"6a74b63815209eb021fcad40","component":"natura-geomarketing@timeline_sim_session_read","system":"6a57cfe9673eb7e3c5e57784","displayName":"Session read instance","params":{"shared":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"timeline-shared-sessionsDataSet"}},"super":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":0,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":true}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":900}}}},"reference":"2xQ6i0KYfzxTWFEJPJCv6","updatedAt":"2026-08-06T16:28:50.905Z","createdAt":"2026-08-06T16:28:50.905Z"},{"_id":"26d3b0c391fd13f84b36db74","parent":"6a73b922cac879773098b7cc","component":"natura-geomarketing@timeline-fechamentos","system":"6a57cfe9673eb7e3c5e57784","displayName":"Timeline simulator instance","params":{"sessionsDataset":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"geo-timeline-sessionsDataSet"}},"super":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":0,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":true,"exactX":0,"exactY":0}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1440,"height":900}}}},"reference":"hvMneki0Bgu70fK1GZhDA","updatedAt":"2026-08-05T22:38:38.153Z","createdAt":"2026-08-05T22:29:16.594Z"},{"_id":"3f5ffa522d0d7d36329f6954","parent":"4b4e51042eb63d563e8fc2c7","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"OptSetor","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":0,"freeTransform":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":219,"height":44}},"text":{"component":"data2-core-primitives@String","params":{"content":"Setor"}},"textSize":15,"textColor":{"component":"data2-core-types@Color","params":{"rgba":"#3c3c40"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"verticalAlignment":"middle","horizontalAlignment":"left"}},"style":{"padding":"0px 0px 0px 20px"},"cursor":"pointer","onClick":{"component":"data2-core-flow@Series","params":{"actions":[{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":"6a7172879c26d69dd14e254c","key":"currentView"}},"value":"Setor"}},{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":"6a7172879c26d69dd14e254c","key":"viewMenuOpen"}},"value":false}}]}}},"index":1,"reference":"_EZffqV2J0Gf2mAG25O34","updatedAt":"2026-08-05T23:38:27.699Z","createdAt":"2026-08-05T23:37:58.106Z"},{"_id":"4b4e51042eb63d563e8fc2c7","parent":"6a7172879c26d69dd14e254c","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"ViewMenuPanel","params":{"position":{"component":"data2-core-types@Position","params":{"x":20,"y":90,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":219,"height":132}},"childrenMode":"rows","index":100,"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}}}}]}},"border":{"component":"data2-core-types@Border","params":{"color":"#d4d4d4","width":{"top":1,"bottom":1,"left":1,"right":1},"radius":{"leftTop":8,"rightTop":8,"leftBottom":8,"rightBottom":8}}},"shadow":[{"component":"data2-core-types@Shadow","params":{"spread":"-10","blur":"18","y":"6","color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0.25)"}}}}],"hide":{"component":"data2-core-logical-operators@Not","params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":"6a7172879c26d69dd14e254c","key":"viewMenuOpen"}}}}}},"cursor":"pointer","onClickOutside":{"component":"data2-core-flow@Series","params":{"actions":[{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":"6a7172879c26d69dd14e254c","key":"viewMenuOpen"}},"value":false}}]}}},"reference":"v1LmJclV5Gk2UUZdPp8TR","updatedAt":"2026-08-05T23:40:38.666Z","createdAt":"2026-08-05T23:37:40.056Z"},{"_id":"58676499c376b2b87e908132","parent":"6a75621ae45e25fa9e450a5e","component":"natura-geomarketing@cb-senso-de-rede","system":"6a57cfe9673eb7e3c5e57784","displayName":"Senso de rede — instância","params":{"limite":82,"lacos":4,"amostra":"top","super":{"position":{"component":"data2-core-types@Position","params":{"x":-120,"y":-278,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":true,"exactX":-120,"exactY":-278}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1440,"height":900}}}},"reference":"dCsSLwSQPVM6ZNg0SICwe","updatedAt":"2026-08-13T20:32:36.062Z","createdAt":"2026-08-07T04:42:17.476Z"},{"_id":"6a5e8d605c2b589c492f447a","component":"data2-core-primitives@Router","system":"6a57cfe9673eb7e3c5e57784","displayName":"Hub-Router","params":{"login":{"disabled":true,"component":"data2-core-types@ArtboardReference","params":{}},"initialPath":{"component":"data2-core-primitives@String","params":{"content":"/"}},"routes":[{"component":"data2-core-primitives@Route","params":{"path":{"component":"data2-core-primitives@String","params":{"content":"/"}},"onEnter":{"disabled":true,"component":"data2-core-types@Interaction","params":{}},"content":{"disabled":false,"component":"data2-core-types@ArtboardReference","params":{"reference":"k6yQNLR1Pt1-zCBxtryLD"}}}},{"component":"data2-core-primitives@Route","params":{"path":{"component":"data2-core-primitives@String","params":{"content":"/acessos"}},"content":{"disabled":false,"component":"data2-core-types@ArtboardReference","params":{"reference":"NKi0_IAvHL5fCXkrT5so3"}}}},{"component":"data2-core-primitives@Route","params":{"path":{"component":"data2-core-primitives@String","params":{"content":"/simulador"}},"content":{"disabled":false,"component":"data2-core-types@ArtboardReference","params":{"reference":"5uzSLIEdUa3QR24u4A-pM"}}}}]},"reference":"MNv9vHdKUB_s3iOqiMkiB","updatedAt":"2026-07-21T17:33:01.994Z","createdAt":"2026-07-20T21:04:59.113Z"},{"_id":"6a5eaedd30428d8f37ef1020","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"UI concept","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768}},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"reference":"LhyTz8Uwy1MrQvqAVRx5N","updatedAt":"2026-07-21T01:37:49.309Z","createdAt":"2026-07-20T23:27:53.661Z"},{"_id":"6a5eaedd30428d8f37ef1021","parent":"6a5eaedd30428d8f37ef1020","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"-----------------","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":false,"exactY":false,"top":true,"left":true}},"backdropFilter":[{"component":"data2-core-types@BitmapFilter","params":{"type":"blur","unit":"px","value":{"component":"data2-core-primitives@Number","params":{"content":0.47}}},"break":true}],"style":{"pointer-events":{"component":"data2-core-primitives@String","params":{"content":"none"}}}},"index":2,"updatedAt":"2026-07-21T01:22:47.287Z","createdAt":"2026-07-20T23:27:53.661Z"},{"_id":"6a5eaedd30428d8f37ef1022","parent":"6a5eaf3d30428d8f37ef1033","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":36,"height":357,"exactWidth":36.32,"exactHeight":356.97999999999996}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":146,"exactX":0.4099999999999999,"exactY":146,"fixed":false,"left":true,"bottom":false,"top":true,"growV":false}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"style":{"flex":{"component":"data2-core-primitives@String","params":{"content":"0.028"}}}},"index":0,"updatedAt":"2026-07-21T07:09:25.844Z","createdAt":"2026-07-20T23:27:53.661Z"},{"_id":"6a5eaedd30428d8f37ef1023","parent":"6a5eaedd30428d8f37ef1022","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":207,"height":36}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":false,"exactY":false,"fixed":false}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"index":0,"updatedAt":"2026-07-20T23:27:53.661Z","createdAt":"2026-07-20T23:27:53.661Z"},{"_id":"6a5eaedd30428d8f37ef1024","parent":"6a5eaedd30428d8f37ef1023","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#ffffff","radius":{"leftTop":"8"},"width":{"left":"0","top":"1","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":36,"height":36,"exactWidth":36,"exactHeight":36}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":0.31,"exactY":0}},"shadow":[{"component":"data2-core-types@Shadow","params":{"type":"outset","offsetY":"1","blur":"0","color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0.7)"}}}}],"fill":{"disabled":false,"component":"data2-core-types@Fill","params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(161,161,247,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]}}},"updatedAt":"2026-07-21T00:49:22.845Z","createdAt":"2026-07-20T23:27:53.661Z"},{"_id":"6a5eaedd30428d8f37ef1026","parent":"6a5eaedd30428d8f37ef1022","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":243,"height":36,"exactWidth":243.4}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":20,"exactX":false,"exactY":false,"fixed":false}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"index":2,"updatedAt":"2026-07-20T23:27:53.661Z","createdAt":"2026-07-20T23:27:53.661Z"},{"_id":"6a5eaedd30428d8f37ef1029","parent":"6a5eaedd30428d8f37ef1022","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":207,"height":36}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":20,"exactX":false,"exactY":false,"fixed":false}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"index":1,"updatedAt":"2026-07-20T23:27:53.661Z","createdAt":"2026-07-20T23:27:53.661Z"},{"_id":"6a5eaedd30428d8f37ef102a","parent":"6a5eaedd30428d8f37ef1029","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#ffffff","radius":{"leftTop":"8"},"width":{"left":"0","top":"1","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":36,"height":36,"exactWidth":36,"exactHeight":36}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":0,"exactY":0}},"shadow":[{"component":"data2-core-types@Shadow","params":{"type":"outset","offsetY":"1","blur":"0","color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0.7)"}}}}],"fill":{"disabled":false,"component":"data2-core-types@Fill","params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(161,161,247,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]}}},"updatedAt":"2026-07-21T00:49:22.839Z","createdAt":"2026-07-20T23:27:53.661Z"},{"_id":"6a5eaedd30428d8f37ef102c","parent":"6a5eaedd30428d8f37ef1022","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":327,"height":36,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":375,"exactX":false,"exactY":false,"fixed":false}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"index":0,"updatedAt":"2026-07-20T23:27:53.661Z","createdAt":"2026-07-20T23:27:53.661Z"},{"_id":"6a5eaedd30428d8f37ef102d","parent":"6a5eaedd30428d8f37ef102c","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#ffffff","radius":{"leftTop":"8"},"width":{"left":"0","top":"1","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":36,"height":36,"exactWidth":36,"exactHeight":36}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":0,"exactY":0}},"shadow":[{"component":"data2-core-types@Shadow","params":{"type":"outset","offsetY":"1","blur":"0","color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0.7)"}}}}],"fill":{"disabled":false,"component":"data2-core-types@Fill","params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(161,161,247,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]}}},"updatedAt":"2026-07-21T00:49:22.870Z","createdAt":"2026-07-20T23:27:53.661Z"},{"_id":"6a5eaedd30428d8f37ef1030","parent":"6a5eaedd30428d8f37ef1020","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":40,"exactHeight":40,"exactWidth":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":false,"exactY":false,"top":true,"left":true,"right":true,"growH":false}},"fill":{"disabled":false,"component":"data2-core-types@Fill","params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(238,238,238,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"index":3,"updatedAt":"2026-07-21T01:22:47.069Z","createdAt":"2026-07-20T23:27:53.661Z"},{"_id":"6a5eaedd30428d8f37ef1031","parent":"6a5eaedd30428d8f37ef1030","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":209,"height":36,"exactWidth":209,"exactHeight":36.18}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":579,"y":2,"exactX":false,"exactY":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"Hub | Geomarketing"}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"center","letterSpacing":"","fontWeight":400}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":17}},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"},"style":{"webkit-font-smoothing":{"component":"data2-core-primitives@String","params":{"content":"antialiased"}},"text-rendering":{"component":"data2-core-primitives@String","params":{"content":"optimizeLegibility"}}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(26,26,26,1)"}}},"updatedAt":"2026-07-20T23:27:53.661Z","createdAt":"2026-07-20T23:27:53.661Z"},{"_id":"6a5eaf2d30428d8f37ef1032","parent":"6a5eaf3d30428d8f37ef1033","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1270,"height":648,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":20,"y":0,"exactX":false,"exactY":false,"fixed":false,"bottom":true,"right":false,"top":true,"growV":false,"left":true,"growH":false}},"style":{"flex":{"component":"data2-core-primitives@String","params":{"content":"1"}}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"index":1,"updatedAt":"2026-07-21T00:54:39.144Z","createdAt":"2026-07-20T23:29:11.535Z"},{"_id":"6a5eaf3d30428d8f37ef1033","parent":"6a5eaedd30428d8f37ef1020","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1326,"height":648,"exactWidth":1326,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":20,"y":80,"exactX":false,"exactY":false,"top":true,"left":true,"right":true,"growH":false,"bottom":true,"growV":false}},"childrenMode":"cols","childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"index":1,"updatedAt":"2026-07-21T01:22:47.061Z","createdAt":"2026-07-20T23:29:52.768Z"},{"_id":"6a5eb05e30428d8f37ef1035","parent":"6a5eaf2d30428d8f37ef1032","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"13"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1270,"height":648,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":false,"exactY":false,"bottom":true,"left":true,"top":true,"growV":false,"right":true,"growH":false}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"fill":{"disabled":false,"component":"data2-core-types@Fill","params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]}}},"updatedAt":"2026-07-21T00:54:43.526Z","createdAt":"2026-07-20T23:34:16.371Z"},{"_id":"6a5eb14230428d8f37ef1036","parent":"6a5eb05e30428d8f37ef1035","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1250,"height":60,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":20,"y":0,"exactX":false,"exactY":false,"fixed":false,"left":true,"top":true,"right":true,"growH":false}},"border":{"disabled":false,"component":"data2-core-types@Border","params":{"width":{"bottom":"1"},"color":"#e7e7e7"}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"updatedAt":"2026-07-21T00:54:46.654Z","createdAt":"2026-07-20T23:38:04.063Z"},{"_id":"6a5eb15c30428d8f37ef1037","parent":"6a5eb14230428d8f37ef1036","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":251,"height":20,"exactWidth":251.03,"exactHeight":19.54}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":46,"y":11,"exactX":false,"exactY":false,"left":true,"top":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"top"}},"text":{"component":"data2-core-primitives@String","params":{"content":"Gerenciamento de acessos"}}},"updatedAt":"2026-07-21T00:54:52.034Z","createdAt":"2026-07-20T23:38:30.745Z"},{"_id":"6a5eb22330428d8f37ef103b","parent":"6a5eaedd30428d8f37ef1020","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(238,238,238,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":75,"height":768,"exactWidth":75,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":0,"exactY":0,"top":true,"left":true,"bottom":true,"growV":false}},"text":""},"index":0,"updatedAt":"2026-07-21T15:41:00.487Z","createdAt":"2026-07-20T23:41:59.238Z"},{"_id":"6a5eb39f30428d8f37ef103d","parent":"6a5eb14230428d8f37ef1036","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":324,"height":18,"exactWidth":323.83,"exactHeight":18.439999999999998}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":45,"y":30,"exactX":false,"exactY":false,"top":true,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"top"}},"text":{"component":"data2-core-primitives@String","params":{"content":"Mostrando 50 de 200 acessos"}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(97,97,97,1)"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":14}}},"updatedAt":"2026-07-21T01:15:24.982Z","createdAt":"2026-07-20T23:48:35.884Z"},{"_id":"6a5eb54230428d8f37ef103e","parent":"6a5eb14230428d8f37ef1036","component":"data2-blocks@Html","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":28,"height":29,"exactWidth":28,"exactHeight":29}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":2,"y":15,"exactX":false,"exactY":false,"top":true,"left":true}},"opacity":{"disabled":false,"component":"data2-core-types@Opacity","params":{"value":51}}},"text":{"component":"data2-core-primitives@String","params":{"content":"<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\" class=\"size-6\">\n  <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M18 18.72a9.094 9.094 0 0 0 3.741-.479 3 3 0 0 0-4.682-2.72m.94 3.198.001.031c0 .225-.012.447-.037.666A11.944 11.944 0 0 1 12 21c-2.17 0-4.207-.576-5.963-1.584A6.062 6.062 0 0 1 6 18.719m12 0a5.971 5.971 0 0 0-.941-3.197m0 0A5.995 5.995 0 0 0 12 12.75a5.995 5.995 0 0 0-5.058 2.772m0 0a3 3 0 0 0-4.681 2.72 8.986 8.986 0 0 0 3.74.477m.94-3.197a5.971 5.971 0 0 0-.94 3.197M15 6.75a3 3 0 1 1-6 0 3 3 0 0 1 6 0Zm6 3a2.25 2.25 0 1 1-4.5 0 2.25 2.25 0 0 1 4.5 0Zm-13.5 0a2.25 2.25 0 1 1-4.5 0 2.25 2.25 0 0 1 4.5 0Z\" />\n</svg>\n"}}},"updatedAt":"2026-07-21T00:54:57.521Z","createdAt":"2026-07-20T23:55:19.306Z"},{"_id":"6a5eb7bd30428d8f37ef1045","parent":"6a5eb05e30428d8f37ef1035","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1270,"height":588,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":5,"exactX":false,"exactY":false,"fixed":false,"left":true,"top":true,"right":true,"growH":false}},"style":{"flex":{"component":"data2-core-primitives@String","params":{"content":"1"}}},"text":"","childrenMode":"cols"},"updatedAt":"2026-07-21T01:17:33.504Z","createdAt":"2026-07-21T00:05:42.771Z"},{"_id":"6a5eb7f130428d8f37ef1046","parent":"6a5eb7bd30428d8f37ef1045","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":420,"height":588,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"top":true,"left":true,"bottom":true,"growV":false,"fixed":false}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":17}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(26,26,26,1)"}},"style":{"flex":{"component":"data2-core-primitives@String","params":{"content":"1"}}}},"updatedAt":"2026-07-21T01:24:50.179Z","createdAt":"2026-07-21T00:06:34.822Z"},{"_id":"6a5eb85b30428d8f37ef104b","parent":"6a5ec3b630428d8f37ef1080","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":359,"height":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":111,"y":0,"exactX":111,"exactY":0,"top":true}},"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"9"},"width":{"left":"1","top":"1","right":"1","bottom":"1"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(231,231,231,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"updatedAt":"2026-07-21T00:56:50.303Z","createdAt":"2026-07-21T00:08:29.546Z"},{"_id":"6a5eb85b30428d8f37ef104c","parent":"6a5eb85b30428d8f37ef104b","component":"data2-blocks@Html","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":28,"height":28,"exactWidth":28,"exactHeight":28.240000000000002}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":10,"y":6,"exactX":false,"exactY":5.76}},"opacity":{"disabled":false,"component":"data2-core-types@Opacity","params":{"value":43}}},"text":{"component":"data2-core-primitives@String","params":{"content":"<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\" class=\"size-6\">\n  <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"m21 21-5.197-5.197m0 0A7.5 7.5 0 1 0 5.196 5.196a7.5 7.5 0 0 0 10.607 10.607Z\" />\n</svg>\n"}}},"updatedAt":"2026-07-21T16:18:09.049Z","createdAt":"2026-07-21T00:08:29.546Z"},{"_id":"6a5eb85b30428d8f37ef104d","parent":"6a5eb85b30428d8f37ef104b","component":"data2-blocks@DataFieldBlock","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":313,"height":38,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":"36","y":0,"exactX":false,"exactY":false}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"center","textOverflow":false,"verticalAlignment":"middle"}}},"placeholder":{"component":"data2-core-primitives@String","params":{"content":"Buscar..."}},"padding":{"left":{"component":"data2-core-primitives@Number","params":{"content":20}},"right":{"component":"data2-core-primitives@Number","params":{"content":40}}}},"updatedAt":"2026-07-21T00:10:58.505Z","createdAt":"2026-07-21T00:08:29.546Z"},{"_id":"6a5eb91830428d8f37ef104e","parent":"6a5ec3b630428d8f37ef1080","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"9"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":40,"height":40,"exactWidth":40,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":1,"exactX":0,"exactY":1,"top":true}},"children":{"locked":true}},"updatedAt":"2026-07-21T01:07:29.634Z","createdAt":"2026-07-21T00:11:30.473Z"},{"_id":"6a5eb91f30428d8f37ef1050","parent":"6a5eb91830428d8f37ef104e","component":"data2-blocks@Html","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":28,"height":29,"exactWidth":28,"exactHeight":29}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":6,"y":6,"exactX":false,"exactY":false}},"opacity":{"disabled":false,"component":"data2-core-types@Opacity","params":{"value":43}}},"text":{"component":"data2-core-primitives@String","params":{"content":"<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\" class=\"size-6\">\n  <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M3 16.5v2.25A2.25 2.25 0 0 0 5.25 21h13.5A2.25 2.25 0 0 0 21 18.75V16.5M16.5 12 12 16.5m0 0L7.5 12m4.5 4.5V3\" />\n</svg>\n"}}},"updatedAt":"2026-07-21T00:12:12.078Z","createdAt":"2026-07-21T00:12:12.078Z"},{"_id":"6a5eb9bf30428d8f37ef1051","parent":"6a5ec3b630428d8f37ef1080","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"9"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":40,"height":40,"exactWidth":40,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":52,"y":1,"exactX":52,"exactY":1,"top":true}},"children":{"locked":true}},"updatedAt":"2026-07-21T01:07:25.413Z","createdAt":"2026-07-21T00:14:20.200Z"},{"_id":"6a5eb9bf30428d8f37ef1052","parent":"6a5eb9bf30428d8f37ef1051","component":"data2-blocks@Html","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":28,"height":29,"exactWidth":28,"exactHeight":29}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":6,"y":6,"exactX":false,"exactY":false}},"opacity":{"disabled":false,"component":"data2-core-types@Opacity","params":{"value":43}}},"text":{"component":"data2-core-primitives@String","params":{"content":"<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\" class=\"size-6\">\n  <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M8.25 15 12 18.75 15.75 15m-7.5-6L12 5.25 15.75 9\" />\n</svg>\n"}}},"updatedAt":"2026-07-21T00:14:22.588Z","createdAt":"2026-07-21T00:14:20.200Z"},{"_id":"6a5ebb3e30428d8f37ef1054","parent":"6a5eb7f130428d8f37ef1046","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"9"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":10,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}},"fill":{"disabled":false,"component":"data2-core-types@Fill","params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0.08)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]}}},"updatedAt":"2026-07-21T01:25:15.504Z","createdAt":"2026-07-21T00:20:56.695Z"},{"_id":"6a5ebb5630428d8f37ef1056","parent":"6a5eb7f130428d8f37ef1046","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T01:25:15.329Z","createdAt":"2026-07-21T00:21:04.734Z"},{"_id":"6a5ebc6c30428d8f37ef1057","parent":"6a5eaedd30428d8f37ef1024","component":"data2-blocks@IconBlock","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":36,"height":34,"exactWidth":false,"exactHeight":33.79}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":1,"exactX":0,"exactY":1.21}},"shadow":[]},"icon":{"disabled":false,"component":"data2-core-web@Icon","params":{"iconSet":"remix","icon":"ri-home-2-line"}},"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,0.76)"}},"size":{"component":"data2-core-primitives@Number","params":{"content":"27"}}},"updatedAt":"2026-07-21T01:23:33.625Z","createdAt":"2026-07-21T00:25:42.541Z"},{"_id":"6a5ebd0d30428d8f37ef1059","parent":"6a5eaedd30428d8f37ef102a","component":"data2-blocks@Html","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":32,"height":32,"exactWidth":32.32,"exactHeight":31.88}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":2,"y":2,"exactX":false,"exactY":false}},"filter":[{"component":"data2-core-types@BitmapFilter","params":{"type":"brightness","unit":"%","value":0}},{"component":"data2-core-types@BitmapFilter","params":{"type":"invert","unit":"%","value":100}}]},"text":{"component":"data2-core-primitives@String","params":{"content":"<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\" class=\"size-6\">\n  <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M12.75 3.03v.568c0 .334.148.65.405.864l1.068.89c.442.369.535 1.01.216 1.49l-.51.766a2.25 2.25 0 0 1-1.161.886l-.143.048a1.107 1.107 0 0 0-.57 1.664c.369.555.169 1.307-.427 1.605L9 13.125l.423 1.059a.956.956 0 0 1-1.652.928l-.679-.906a1.125 1.125 0 0 0-1.906.172L4.5 15.75l-.612.153M12.75 3.031a9 9 0 0 0-8.862 12.872M12.75 3.031a9 9 0 0 1 6.69 14.036m0 0-.177-.529A2.25 2.25 0 0 0 17.128 15H16.5l-.324-.324a1.453 1.453 0 0 0-2.328.377l-.036.073a1.586 1.586 0 0 1-.982.816l-.99.282c-.55.157-.894.702-.8 1.267l.073.438c.08.474.49.821.97.821.846 0 1.598.542 1.865 1.345l.215.643m5.276-3.67a9.012 9.012 0 0 1-5.276 3.67m0 0a9 9 0 0 1-10.275-4.835M15.75 9c0 .896-.393 1.7-1.016 2.25\" />\n</svg>\n"}}},"updatedAt":"2026-07-21T01:14:13.416Z","createdAt":"2026-07-21T00:28:34.369Z"},{"_id":"6a5ebe1230428d8f37ef105d","parent":"6a5eb14230428d8f37ef1036","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":165,"height":40,"exactWidth":164.56}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":1085,"y":10,"exactX":false,"exactY":false,"top":true,"right":true}},"border":{"component":"data2-core-types@Border","params":{"color":"#f2eced","radius":{"leftTop":"9"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,122,255,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"text":""},"updatedAt":"2026-07-21T00:57:31.435Z","createdAt":"2026-07-21T00:32:51.853Z"},{"_id":"6a5ebe1230428d8f37ef105e","parent":"6a5ebe1230428d8f37ef105d","component":"data2-blocks@Html","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":28,"height":29,"exactWidth":28,"exactHeight":29}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":10,"y":5,"exactX":false,"exactY":false}},"filter":[{"component":"data2-core-types@BitmapFilter","params":{"type":"invert","unit":"%","value":100}}]},"text":{"component":"data2-core-primitives@String","params":{"content":"<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\" class=\"size-6\">\n  <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M12 4.5v15m7.5-7.5h-15\" />\n</svg>\n"}}},"updatedAt":"2026-07-21T00:33:54.704Z","createdAt":"2026-07-21T00:32:51.853Z"},{"_id":"6a5ebe1230428d8f37ef105f","parent":"6a5ebe1230428d8f37ef105d","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":138,"height":38,"exactWidth":137.54,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":25,"y":0,"exactX":25.46,"exactY":false}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"center","textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"Criar Acesso"}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}}},"updatedAt":"2026-07-21T00:34:17.283Z","createdAt":"2026-07-21T00:32:51.853Z"},{"_id":"6a5ebfa830428d8f37ef1061","parent":"6a5eb7f130428d8f37ef1046","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T01:25:15.324Z","createdAt":"2026-07-21T00:39:30.274Z"},{"_id":"6a5ebfa930428d8f37ef1063","parent":"6a5eb7f130428d8f37ef1046","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T01:25:15.320Z","createdAt":"2026-07-21T00:39:31.224Z"},{"_id":"6a5ebfaa30428d8f37ef1065","parent":"6a5eb7f130428d8f37ef1046","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T01:25:15.318Z","createdAt":"2026-07-21T00:39:32.060Z"},{"_id":"6a5ebfaa30428d8f37ef1067","parent":"6a5eb7f130428d8f37ef1046","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T01:25:15.304Z","createdAt":"2026-07-21T00:39:32.767Z"},{"_id":"6a5ebfab30428d8f37ef1069","parent":"6a5eb7f130428d8f37ef1046","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T01:25:15.304Z","createdAt":"2026-07-21T00:39:33.568Z"},{"_id":"6a5ebfac30428d8f37ef106b","parent":"6a5eb7f130428d8f37ef1046","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T01:25:15.299Z","createdAt":"2026-07-21T00:39:34.658Z"},{"_id":"6a5ebfad30428d8f37ef106d","parent":"6a5eb7f130428d8f37ef1046","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T01:25:15.300Z","createdAt":"2026-07-21T00:39:35.242Z"},{"_id":"6a5ebfae30428d8f37ef106f","parent":"6a5eb7f130428d8f37ef1046","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T01:25:15.304Z","createdAt":"2026-07-21T00:39:36.083Z"},{"_id":"6a5ebfae30428d8f37ef1071","parent":"6a5eb7f130428d8f37ef1046","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T01:25:15.421Z","createdAt":"2026-07-21T00:39:36.862Z"},{"_id":"6a5ebfaf30428d8f37ef1073","parent":"6a5eb7f130428d8f37ef1046","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T01:25:15.434Z","createdAt":"2026-07-21T00:39:37.676Z"},{"_id":"6a5ebfb030428d8f37ef1075","parent":"6a5eb7f130428d8f37ef1046","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T01:25:15.419Z","createdAt":"2026-07-21T00:39:38.493Z"},{"_id":"6a5ebfb130428d8f37ef1077","parent":"6a5eb7f130428d8f37ef1046","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T01:25:15.444Z","createdAt":"2026-07-21T00:39:49.625Z"},{"_id":"6a5ec25e30428d8f37ef107a","parent":"6a5eaedd30428d8f37ef1026","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#ffffff","radius":{"leftTop":"8"},"width":{"left":"0","top":"1","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":36,"height":36,"exactWidth":36,"exactHeight":36}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":0.31,"exactY":0}},"shadow":[{"component":"data2-core-types@Shadow","params":{"type":"outset","offsetY":"1","blur":"0","color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0.7)"}}}}],"fill":{"disabled":false,"component":"data2-core-types@Fill","params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(161,161,247,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]}}},"updatedAt":"2026-07-21T00:51:05.357Z","createdAt":"2026-07-21T00:51:05.357Z"},{"_id":"6a5ec25e30428d8f37ef107b","parent":"6a5ec25e30428d8f37ef107a","component":"data2-blocks@Html","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":27,"height":32,"exactWidth":26.92,"exactHeight":31.73}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":5,"y":3,"exactX":false,"exactY":false}},"filter":[{"component":"data2-core-types@BitmapFilter","params":{"type":"invert","unit":"%","value":100}}]},"text":{"component":"data2-core-primitives@String","params":{"content":"<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\" class=\"size-6\">\n  <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M18 18.72a9.094 9.094 0 0 0 3.741-.479 3 3 0 0 0-4.682-2.72m.94 3.198.001.031c0 .225-.012.447-.037.666A11.944 11.944 0 0 1 12 21c-2.17 0-4.207-.576-5.963-1.584A6.062 6.062 0 0 1 6 18.719m12 0a5.971 5.971 0 0 0-.941-3.197m0 0A5.995 5.995 0 0 0 12 12.75a5.995 5.995 0 0 0-5.058 2.772m0 0a3 3 0 0 0-4.681 2.72 8.986 8.986 0 0 0 3.74.477m.94-3.197a5.971 5.971 0 0 0-.94 3.197M15 6.75a3 3 0 1 1-6 0 3 3 0 0 1 6 0Zm6 3a2.25 2.25 0 1 1-4.5 0 2.25 2.25 0 0 1 4.5 0Zm-13.5 0a2.25 2.25 0 1 1-4.5 0 2.25 2.25 0 0 1 4.5 0Z\" />\n</svg>\n"}}},"updatedAt":"2026-07-21T00:52:08.152Z","createdAt":"2026-07-21T00:51:05.357Z"},{"_id":"6a5ec3a830428d8f37ef107c","parent":"6a5ec3b630428d8f37ef1080","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"9"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":40,"height":40,"exactWidth":40,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":593,"y":1,"exactX":593.49,"exactY":1.01,"top":true}},"children":{"locked":true}},"updatedAt":"2026-07-21T01:10:31.694Z","createdAt":"2026-07-21T00:56:50.106Z"},{"_id":"6a5ec3a830428d8f37ef107e","parent":"6a5ec3b630428d8f37ef1080","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"9"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":40,"height":40,"exactWidth":40,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":637,"y":1,"exactX":637.49,"exactY":1.01,"top":true}},"children":{"locked":true}},"updatedAt":"2026-07-21T01:10:31.692Z","createdAt":"2026-07-21T00:56:50.106Z"},{"_id":"6a5ec3a830428d8f37ef107f","parent":"6a5ec3a830428d8f37ef107e","component":"data2-blocks@IconBlock","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":28,"height":29,"exactWidth":28,"exactHeight":29}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":6,"y":6,"exactX":false,"exactY":false}},"opacity":{"disabled":false,"component":"data2-core-types@Opacity","params":{"value":43}}},"icon":{"disabled":false,"component":"data2-core-web@Icon","params":{"iconSet":"remix","icon":"ri-arrow-right-wide-fill"}},"size":{"component":"data2-core-primitives@Number","params":{"content":"28"}}},"updatedAt":"2026-07-21T01:03:46.233Z","createdAt":"2026-07-21T00:56:50.106Z"},{"_id":"6a5ec3b630428d8f37ef1080","parent":"6a5eb14230428d8f37ef1036","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":695,"height":41,"exactWidth":695.25}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":331,"y":10,"top":true,"exactX":false,"exactY":false}}},"updatedAt":"2026-07-21T01:08:31.187Z","createdAt":"2026-07-21T00:56:50.106Z"},{"_id":"6a5ec55b30428d8f37ef1082","parent":"6a5ec3a830428d8f37ef107c","component":"data2-blocks@IconBlock","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":28,"height":29,"exactWidth":28,"exactHeight":29}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":6,"y":6,"exactX":false,"exactY":false}},"opacity":{"disabled":false,"component":"data2-core-types@Opacity","params":{"value":43}}},"icon":{"disabled":false,"component":"data2-core-web@Icon","params":{"iconSet":"remix","icon":"ri-arrow-left-wide-fill"}},"size":{"component":"data2-core-primitives@Number","params":{"content":"28"}}},"updatedAt":"2026-07-21T01:03:59.328Z","createdAt":"2026-07-21T01:03:59.328Z"},{"_id":"6a5ec67bc28b758182f0d2c6","parent":"6a5ec3b630428d8f37ef1080","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":89,"height":41,"exactWidth":89.49,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":498,"y":0,"exactX":498.49,"exactY":0.01}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"left","textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"Página 1 / 4"}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(114,114,114,1)"}}},"updatedAt":"2026-07-21T01:10:31.678Z","createdAt":"2026-07-21T01:08:58.699Z"},{"_id":"6a5ec7e9c28b758182f0d2d6","parent":"6a5eb7bd30428d8f37ef1045","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":420,"height":588,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":20,"y":0,"exactX":false,"exactY":false,"top":true,"left":true,"bottom":true,"growV":false,"fixed":false}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":17}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(26,26,26,1)"}},"style":{"flex":{"component":"data2-core-primitives@String","params":{"content":"1"}}}},"updatedAt":"2026-07-21T01:24:50.197Z","createdAt":"2026-07-21T01:14:43.757Z"},{"_id":"6a5ec7e9c28b758182f0d2d7","parent":"6a5ec7e9c28b758182f0d2d6","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"9"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":10,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T01:25:11.524Z","createdAt":"2026-07-21T01:14:43.757Z"},{"_id":"6a5ec7e9c28b758182f0d2d8","parent":"6a5ec7e9c28b758182f0d2d6","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T01:25:11.329Z","createdAt":"2026-07-21T01:14:43.757Z"},{"_id":"6a5ec7e9c28b758182f0d2d9","parent":"6a5ec7e9c28b758182f0d2d6","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T01:25:11.341Z","createdAt":"2026-07-21T01:14:43.757Z"},{"_id":"6a5ec7e9c28b758182f0d2da","parent":"6a5ec7e9c28b758182f0d2d6","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T01:25:11.360Z","createdAt":"2026-07-21T01:14:43.757Z"},{"_id":"6a5ec7e9c28b758182f0d2db","parent":"6a5ec7e9c28b758182f0d2d6","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T01:25:11.342Z","createdAt":"2026-07-21T01:14:43.757Z"},{"_id":"6a5ec7e9c28b758182f0d2dc","parent":"6a5ec7e9c28b758182f0d2d6","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T01:25:11.367Z","createdAt":"2026-07-21T01:14:43.757Z"},{"_id":"6a5ec7e9c28b758182f0d2dd","parent":"6a5ec7e9c28b758182f0d2d6","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T01:25:11.339Z","createdAt":"2026-07-21T01:14:43.757Z"},{"_id":"6a5ec7e9c28b758182f0d2de","parent":"6a5ec7e9c28b758182f0d2d6","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T01:25:11.336Z","createdAt":"2026-07-21T01:14:43.757Z"},{"_id":"6a5ec7e9c28b758182f0d2df","parent":"6a5ec7e9c28b758182f0d2d6","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T01:25:11.362Z","createdAt":"2026-07-21T01:14:43.757Z"},{"_id":"6a5ec7e9c28b758182f0d2e0","parent":"6a5ec7e9c28b758182f0d2d6","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T01:25:11.342Z","createdAt":"2026-07-21T01:14:43.757Z"},{"_id":"6a5ec7e9c28b758182f0d2e1","parent":"6a5ec7e9c28b758182f0d2d6","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T01:25:11.464Z","createdAt":"2026-07-21T01:14:43.757Z"},{"_id":"6a5ec7e9c28b758182f0d2e2","parent":"6a5ec7e9c28b758182f0d2d6","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T01:25:11.595Z","createdAt":"2026-07-21T01:14:43.757Z"},{"_id":"6a5ec7e9c28b758182f0d2e3","parent":"6a5ec7e9c28b758182f0d2d6","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T01:25:11.452Z","createdAt":"2026-07-21T01:14:43.757Z"},{"_id":"6a5ec7e9c28b758182f0d2e4","parent":"6a5ec7e9c28b758182f0d2d6","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T01:25:11.458Z","createdAt":"2026-07-21T01:14:43.757Z"},{"_id":"6a5ec7eac28b758182f0d2f4","parent":"6a5eb7bd30428d8f37ef1045","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":420,"height":588,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":20,"y":0,"exactX":false,"exactY":false,"top":true,"left":true,"bottom":true,"growV":false,"fixed":false}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":17}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(26,26,26,1)"}},"style":{"flex":{"component":"data2-core-primitives@String","params":{"content":"1"}}}},"updatedAt":"2026-07-21T01:24:50.187Z","createdAt":"2026-07-21T01:14:46.901Z"},{"_id":"6a5ec7eac28b758182f0d2f5","parent":"6a5ec7eac28b758182f0d2f4","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"9"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":10,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T01:25:18.220Z","createdAt":"2026-07-21T01:14:46.901Z"},{"_id":"6a5ec7eac28b758182f0d2f6","parent":"6a5ec7eac28b758182f0d2f4","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T01:25:18.203Z","createdAt":"2026-07-21T01:14:46.901Z"},{"_id":"6a5ec7eac28b758182f0d2f7","parent":"6a5ec7eac28b758182f0d2f4","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T01:25:18.206Z","createdAt":"2026-07-21T01:14:46.901Z"},{"_id":"6a5ec7eac28b758182f0d2f8","parent":"6a5ec7eac28b758182f0d2f4","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T01:25:18.202Z","createdAt":"2026-07-21T01:14:46.901Z"},{"_id":"6a5ec7eac28b758182f0d2f9","parent":"6a5ec7eac28b758182f0d2f4","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T01:25:18.217Z","createdAt":"2026-07-21T01:14:46.901Z"},{"_id":"6a5ec7eac28b758182f0d2fa","parent":"6a5ec7eac28b758182f0d2f4","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T01:25:18.212Z","createdAt":"2026-07-21T01:14:46.901Z"},{"_id":"6a5ec7eac28b758182f0d2fb","parent":"6a5ec7eac28b758182f0d2f4","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T01:25:18.223Z","createdAt":"2026-07-21T01:14:46.901Z"},{"_id":"6a5ec7eac28b758182f0d2fc","parent":"6a5ec7eac28b758182f0d2f4","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T01:25:18.211Z","createdAt":"2026-07-21T01:14:46.901Z"},{"_id":"6a5ec7eac28b758182f0d2fd","parent":"6a5ec7eac28b758182f0d2f4","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T01:25:18.236Z","createdAt":"2026-07-21T01:14:46.901Z"},{"_id":"6a5ec7eac28b758182f0d2fe","parent":"6a5ec7eac28b758182f0d2f4","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T01:25:18.242Z","createdAt":"2026-07-21T01:14:46.901Z"},{"_id":"6a5ec7eac28b758182f0d2ff","parent":"6a5ec7eac28b758182f0d2f4","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T01:25:18.344Z","createdAt":"2026-07-21T01:14:46.901Z"},{"_id":"6a5ec7eac28b758182f0d300","parent":"6a5ec7eac28b758182f0d2f4","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T01:25:18.319Z","createdAt":"2026-07-21T01:14:46.901Z"},{"_id":"6a5ec7eac28b758182f0d301","parent":"6a5ec7eac28b758182f0d2f4","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T01:25:18.316Z","createdAt":"2026-07-21T01:14:46.901Z"},{"_id":"6a5ec7eac28b758182f0d302","parent":"6a5ec7eac28b758182f0d2f4","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T01:25:18.315Z","createdAt":"2026-07-21T01:14:46.901Z"},{"_id":"6a5ecd04c28b758182f0d306","parent":"6a5eaedd30428d8f37ef102d","component":"data2-blocks@Html","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":26,"height":30,"exactWidth":26.37,"exactHeight":30.09}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":5,"y":5,"exactX":false,"exactY":4.64}},"filter":[{"component":"data2-core-types@BitmapFilter","params":{"type":"invert","unit":"%","value":100}}]},"text":{"component":"data2-core-primitives@String","params":{"content":"<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\" class=\"size-6\">\n  <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M15.75 6a3.75 3.75 0 1 1-7.5 0 3.75 3.75 0 0 1 7.5 0ZM4.501 20.118a7.5 7.5 0 0 1 14.998 0A17.933 17.933 0 0 1 12 21.75c-2.676 0-5.216-.584-7.499-1.632Z\" />\n</svg>\n"}}},"updatedAt":"2026-07-21T01:36:48.785Z","createdAt":"2026-07-21T01:36:41.404Z"},{"_id":"6a5ecd59c28b758182f0d35f","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"Simulador | Fechamento de setores","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768}},"fill":{"params":{"content":"#ffffff"},"component":"data2-core-primitives@String"},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"reference":"5uzSLIEdUa3QR24u4A-pM","updatedAt":"2026-07-27T19:35:56.201Z","createdAt":"2026-07-21T01:38:00.990Z"},{"_id":"6a5f16b2951c23b007767436","parent":"6a5eb22330428d8f37ef103b","component":"data2-blocks@Html","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"},"disabled":true},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":false,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":45,"height":38,"exactWidth":45.19,"exactHeight":38}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":15,"y":91,"exactX":false,"exactY":false,"top":true,"left":true}},"filter":[{"component":"data2-core-types@BitmapFilter","params":{"type":"invert","unit":"%","value":100}}],"shadow":[{"component":"data2-core-types@Shadow","params":{"type":"complex","offsetX":"0","offsetY":"1","blur":"1","color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(161,161,247,1)"}}}},{"component":"data2-core-types@Shadow","params":{"type":"complex","offsetX":"0","offsetY":"1","blur":"1","color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(161,161,247,1)"}}}}]},"text":{"component":"data2-core-primitives@String","params":{"content":"<svg version=\"1.1\" id=\"Layer_1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\" viewBox=\"0 0 139.2 98\" style=\"enable-background:new 0 0 139.2 98;\" xml:space=\"preserve\">\n <path d=\"M65.5,14c-3.1,6-6.8,19-6.8,19s-0.3,1-1-0.1c-0.4-0.7-5.6-7.8-8.2-11c-3-3.7-16.4-17.8-31.7-9.8C4,19.3,9.3,36.9,13.5,43.6\n\tc2.6,4,7.5,10.3,9,12.1c0.2,0.3,0.2,0.4-0.2,0.3c-1.2-0.3-4.3-1.1-9.9-2.6c-5.1-1.3-10-1.1-11.4,1.1c-1,1.6-1.6,4,0.4,7.8\n\tC5.4,69.5,16.6,81.2,35,85c0.4,0,0.3,0.4,0,0.9c-0.9,1.5-0.8,3.4,0.3,4.7c2.7,3.3,5.8,4.5,18,6.6c16.9,2.9,22.9-2.8,23.6-3.6\n\tc0.1,0,0.1,0,0.2,0c8.8,2.1,18,1.2,26.2-2.4c11.8-4.9,16.3-9.6,16.4-12.4s-6.1-2.2-7.9-2.7c-0.6-0.1-0.4-0.4,0-0.6\n\tc0.8-0.5,2.9-1.4,4.6-2.3c1.7-0.9,18.9-9.6,22.4-24.2c3.4-14.7-9.9-14.8-17-11.7s-13.9,6.4-15.4,7.1c-0.2,0.1-0.3,0-0.2-0.2\n\tc1.9-4.6,3.4-9.4,4.6-14.2c1.5-7,0.8-26-18.1-29.6C91.1,0.1,89.8,0,88.4,0C78.7,0.1,69.9,5.4,65.5,14 M66.2,43.9\n\tc1.5-4.2,2-6.3,4.5-14.4c3.1-10.1,9.7-18,20.4-14.8c12.5,3.8,9.6,16.4,7.6,21.7c-1.6,4.1-2.9,8.4-5.6,15.3c-2.1,5.6,2.5,5.7,4.9,5.2\n\tc2.8-0.6,11-4.8,16.1-7.2c3.8-1.7,10.8-6,14.8-1.9s-0.5,11.3-5.3,15.5c-4.8,4.3-17.5,9.6-21.4,11.2c-3.9,1.6-5.4,3.8-3.5,5\n\tc1.9,1.2,7.5,2.2,9.2,2.4c1.4,0.2,2.8,0.5,2.8,1.5c0,1.2-3.3,3.7-11,6.3c-5.2,1.6-10.7,2.2-16.1,1.6c-6.7-1.3-7.8-2.3-11-1.1\n\tc-2.3,0.9-2.5,2.8-5.9,4.2s-8.4,1.1-12.3,0.4s-10.6-1.3-11.3-4.4c-0.3-1.2,1.1-2,2.2-3.3c1.1-1.3,2.1-3.6-2.8-4.6\n\tc-1.3-0.3-14.7-2.4-23-6.6S8.1,65.1,8.9,62.7c0.7-1.9,2.6-2.1,5.2-1.6c2.9,0.6,15.8,4.1,19.7,4.1c1.6,0,2.8-0.3,3.4-1.3\n\tc1.5-2.7-3.2-5.9-7-10.5c-5.6-6.6-16.1-17.6-8.2-27.5c5.3-6.6,15.7-2.3,20,2.7c3.3,3.9,9.1,11.7,13.5,17.1c1.3,1.8,3.3,2.9,5.4,3.1\n\tc2.2,0,4.2-1.6,5.4-4.9\">\n </path>\n</svg>"}}},"updatedAt":"2026-07-21T06:51:36.935Z","createdAt":"2026-07-21T06:50:59.617Z"},{"_id":"6a5f17e6951c23b007767437","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"HubSideBarMinimized","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":80,"height":768,"exactWidth":80,"exactHeight":false}},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"reference":"Zzo2rpM07PebrST2OB3v-","updatedAt":"2026-07-25T03:35:57.557Z","createdAt":"2026-07-21T06:56:06.340Z"},{"_id":"6a5f1847951c23b007767456","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"HubSideBarExpanded","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":240,"height":768,"exactWidth":240,"exactHeight":false}},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"reference":"kVc8IDV9J6R2eBn7nLDyb","updatedAt":"2026-07-24T23:24:34.459Z","createdAt":"2026-07-21T06:58:04.953Z"},{"_id":"6a5f1ad6951c23b007767475","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"HubSideBarComponent","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":80,"height":768,"exactWidth":80,"exactHeight":false}},"componentClass":{"disabled":false,"component":"data2-core-types@ComponentClass","params":{}},"componentStates":[{"component":"data2-core-types@ComponentState","params":{"state":{"component":"data2-core-primitives@String","params":{"content":"default"}},"artboard":{"disabled":false,"component":"data2-core-types@ArtboardReference","params":{"reference":"Zzo2rpM07PebrST2OB3v-"}}}},{"component":"data2-core-types@ComponentState","params":{"state":{"component":"data2-core-primitives@String","params":{"content":"false"}},"artboard":{"disabled":false,"component":"data2-core-types@ArtboardReference","params":{"reference":"Zzo2rpM07PebrST2OB3v-"}}}},{"component":"data2-core-types@ComponentState","params":{"state":{"component":"data2-core-primitives@String","params":{"content":"true"}},"artboard":{"disabled":false,"component":"data2-core-types@ArtboardReference","params":{"reference":"kVc8IDV9J6R2eBn7nLDyb"}}}}]},"reference":"k1ctDNtMYQklApCji4N76","updatedAt":"2026-07-24T23:24:21.579Z","createdAt":"2026-07-21T07:08:38.125Z"},{"_id":"6a5f1b0b951c23b007767477","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"Copy of UI concept","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768}},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"reference":"ytg_CsbJfW0kE-t44UtCg","updatedAt":"2026-07-21T07:09:34.187Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b007767478","parent":"6a5f1b0b951c23b007767477","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"-----------------","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":false,"exactY":false,"top":true,"left":true}},"backdropFilter":[{"component":"data2-core-types@BitmapFilter","params":{"type":"blur","unit":"px","value":{"component":"data2-core-primitives@Number","params":{"content":0.47}}},"break":true}],"style":{"pointer-events":{"component":"data2-core-primitives@String","params":{"content":"none"}}}},"index":2,"updatedAt":"2026-07-21T07:09:34.187Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b007767479","parent":"6a5f1b0b951c23b007767477","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":40,"exactHeight":40,"exactWidth":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":false,"exactY":false,"top":true,"left":true,"right":true,"growH":false}},"fill":{"disabled":false,"component":"data2-core-types@Fill","params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(238,238,238,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"index":3,"updatedAt":"2026-07-21T07:09:34.187Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b00776747a","parent":"6a5f1b0b951c23b007767479","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":209,"height":36,"exactWidth":209,"exactHeight":36.18}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":579,"y":2,"exactX":false,"exactY":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"Hub | Geomarketing"}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"center","letterSpacing":"","fontWeight":400}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":17}},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"},"style":{"webkit-font-smoothing":{"component":"data2-core-primitives@String","params":{"content":"antialiased"}},"text-rendering":{"component":"data2-core-primitives@String","params":{"content":"optimizeLegibility"}}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(26,26,26,1)"}}},"updatedAt":"2026-07-21T07:09:34.187Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b00776747b","parent":"6a5f1b0b951c23b007767477","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1246,"height":648,"exactWidth":1246,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":80,"y":80,"exactX":false,"exactY":false,"top":true,"left":true,"right":true,"growH":false,"bottom":true,"growV":false}},"childrenMode":"cols","childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"index":1,"updatedAt":"2026-07-21T07:10:22.645Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b007767489","parent":"6a5f1b0b951c23b00776747b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1226,"height":648,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":20,"y":0,"exactX":false,"exactY":false,"fixed":false,"bottom":true,"right":false,"top":true,"growV":false,"left":true,"growH":false}},"style":{"flex":{"component":"data2-core-primitives@String","params":{"content":"1"}}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"index":1,"updatedAt":"2026-07-21T07:10:32.407Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b00776748a","parent":"6a5f1b0b951c23b007767489","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"13"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1270,"height":648,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":false,"exactY":false,"bottom":true,"left":true,"top":true,"growV":false,"right":true,"growH":false}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"fill":{"disabled":false,"component":"data2-core-types@Fill","params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]}}},"updatedAt":"2026-07-21T07:09:34.187Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b00776748b","parent":"6a5f1b0b951c23b00776748a","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1250,"height":60,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":20,"y":0,"exactX":false,"exactY":false,"fixed":false,"left":true,"top":true,"right":true,"growH":false}},"border":{"disabled":false,"component":"data2-core-types@Border","params":{"width":{"bottom":"1"},"color":"#e7e7e7"}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"updatedAt":"2026-07-21T07:09:34.187Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b00776748c","parent":"6a5f1b0b951c23b00776748b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":251,"height":20,"exactWidth":251.03,"exactHeight":19.54}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":46,"y":11,"exactX":false,"exactY":false,"left":true,"top":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"top"}},"text":{"component":"data2-core-primitives@String","params":{"content":"Gerenciamento de acessos"}}},"updatedAt":"2026-07-21T07:09:34.187Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b00776748d","parent":"6a5f1b0b951c23b00776748b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":324,"height":18,"exactWidth":323.83,"exactHeight":18.439999999999998}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":45,"y":30,"exactX":false,"exactY":false,"top":true,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"top"}},"text":{"component":"data2-core-primitives@String","params":{"content":"Mostrando 50 de 200 acessos"}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(97,97,97,1)"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":14}}},"updatedAt":"2026-07-21T07:09:34.187Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b00776748e","parent":"6a5f1b0b951c23b00776748b","component":"data2-blocks@Html","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":28,"height":29,"exactWidth":28,"exactHeight":29}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":2,"y":15,"exactX":false,"exactY":false,"top":true,"left":true}},"opacity":{"disabled":false,"component":"data2-core-types@Opacity","params":{"value":51}}},"text":{"component":"data2-core-primitives@String","params":{"content":"<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\" class=\"size-6\">\n  <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M18 18.72a9.094 9.094 0 0 0 3.741-.479 3 3 0 0 0-4.682-2.72m.94 3.198.001.031c0 .225-.012.447-.037.666A11.944 11.944 0 0 1 12 21c-2.17 0-4.207-.576-5.963-1.584A6.062 6.062 0 0 1 6 18.719m12 0a5.971 5.971 0 0 0-.941-3.197m0 0A5.995 5.995 0 0 0 12 12.75a5.995 5.995 0 0 0-5.058 2.772m0 0a3 3 0 0 0-4.681 2.72 8.986 8.986 0 0 0 3.74.477m.94-3.197a5.971 5.971 0 0 0-.94 3.197M15 6.75a3 3 0 1 1-6 0 3 3 0 0 1 6 0Zm6 3a2.25 2.25 0 1 1-4.5 0 2.25 2.25 0 0 1 4.5 0Zm-13.5 0a2.25 2.25 0 1 1-4.5 0 2.25 2.25 0 0 1 4.5 0Z\" />\n</svg>\n"}}},"updatedAt":"2026-07-21T07:09:34.187Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b00776748f","parent":"6a5f1b0b951c23b00776748b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":165,"height":40,"exactWidth":164.56}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":1085,"y":10,"exactX":false,"exactY":false,"top":true,"right":true}},"border":{"component":"data2-core-types@Border","params":{"color":"#f2eced","radius":{"leftTop":"9"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,122,255,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"text":""},"updatedAt":"2026-07-21T07:09:34.187Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b007767490","parent":"6a5f1b0b951c23b00776748f","component":"data2-blocks@Html","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":28,"height":29,"exactWidth":28,"exactHeight":29}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":10,"y":5,"exactX":false,"exactY":false}},"filter":[{"component":"data2-core-types@BitmapFilter","params":{"type":"invert","unit":"%","value":100}}]},"text":{"component":"data2-core-primitives@String","params":{"content":"<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\" class=\"size-6\">\n  <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M12 4.5v15m7.5-7.5h-15\" />\n</svg>\n"}}},"updatedAt":"2026-07-21T07:09:34.187Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b007767491","parent":"6a5f1b0b951c23b00776748f","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":138,"height":38,"exactWidth":137.54,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":25,"y":0,"exactX":25.46,"exactY":false}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"center","textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"Criar Acesso"}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}}},"updatedAt":"2026-07-21T07:09:34.187Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b007767492","parent":"6a5f1b0b951c23b00776748b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":695,"height":41,"exactWidth":695.25}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":331,"y":10,"top":true,"exactX":false,"exactY":false}}},"updatedAt":"2026-07-21T07:09:34.187Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b007767493","parent":"6a5f1b0b951c23b007767492","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":359,"height":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":111,"y":0,"exactX":111,"exactY":0,"top":true}},"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"9"},"width":{"left":"1","top":"1","right":"1","bottom":"1"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(231,231,231,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"updatedAt":"2026-07-21T07:09:34.187Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b007767494","parent":"6a5f1b0b951c23b007767493","component":"data2-blocks@Html","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":28,"height":29,"exactWidth":28,"exactHeight":29}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":10,"y":5,"exactX":false,"exactY":false}},"opacity":{"disabled":false,"component":"data2-core-types@Opacity","params":{"value":43}}},"text":{"component":"data2-core-primitives@String","params":{"content":"<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\" class=\"size-6\">\n  <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"m21 21-5.197-5.197m0 0A7.5 7.5 0 1 0 5.196 5.196a7.5 7.5 0 0 0 10.607 10.607Z\" />\n</svg>\n"}}},"updatedAt":"2026-07-21T07:09:34.187Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b007767495","parent":"6a5f1b0b951c23b007767493","component":"data2-blocks@DataFieldBlock","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":313,"height":38,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":"36","y":0,"exactX":false,"exactY":false}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"center","textOverflow":false,"verticalAlignment":"middle"}}},"placeholder":{"component":"data2-core-primitives@String","params":{"content":"Buscar..."}},"padding":{"left":{"component":"data2-core-primitives@Number","params":{"content":20}},"right":{"component":"data2-core-primitives@Number","params":{"content":40}}}},"updatedAt":"2026-07-21T07:09:34.187Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b007767496","parent":"6a5f1b0b951c23b007767492","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"9"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":40,"height":40,"exactWidth":40,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":1,"exactX":0,"exactY":1,"top":true}},"children":{"locked":true}},"updatedAt":"2026-07-21T07:09:34.187Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b007767497","parent":"6a5f1b0b951c23b007767496","component":"data2-blocks@Html","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":28,"height":29,"exactWidth":28,"exactHeight":29}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":6,"y":6,"exactX":false,"exactY":false}},"opacity":{"disabled":false,"component":"data2-core-types@Opacity","params":{"value":43}}},"text":{"component":"data2-core-primitives@String","params":{"content":"<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\" class=\"size-6\">\n  <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M3 16.5v2.25A2.25 2.25 0 0 0 5.25 21h13.5A2.25 2.25 0 0 0 21 18.75V16.5M16.5 12 12 16.5m0 0L7.5 12m4.5 4.5V3\" />\n</svg>\n"}}},"updatedAt":"2026-07-21T07:09:34.187Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b007767498","parent":"6a5f1b0b951c23b007767492","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"9"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":40,"height":40,"exactWidth":40,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":52,"y":1,"exactX":52,"exactY":1,"top":true}},"children":{"locked":true}},"updatedAt":"2026-07-21T07:09:34.187Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b007767499","parent":"6a5f1b0b951c23b007767498","component":"data2-blocks@Html","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":28,"height":29,"exactWidth":28,"exactHeight":29}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":6,"y":6,"exactX":false,"exactY":false}},"opacity":{"disabled":false,"component":"data2-core-types@Opacity","params":{"value":43}}},"text":{"component":"data2-core-primitives@String","params":{"content":"<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\" class=\"size-6\">\n  <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M8.25 15 12 18.75 15.75 15m-7.5-6L12 5.25 15.75 9\" />\n</svg>\n"}}},"updatedAt":"2026-07-21T07:09:34.187Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b00776749a","parent":"6a5f1b0b951c23b007767492","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"9"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":40,"height":40,"exactWidth":40,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":593,"y":1,"exactX":593.49,"exactY":1.01,"top":true}},"children":{"locked":true}},"updatedAt":"2026-07-21T07:09:34.187Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b00776749b","parent":"6a5f1b0b951c23b00776749a","component":"data2-blocks@IconBlock","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":28,"height":29,"exactWidth":28,"exactHeight":29}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":6,"y":6,"exactX":false,"exactY":false}},"opacity":{"disabled":false,"component":"data2-core-types@Opacity","params":{"value":43}}},"icon":{"disabled":false,"component":"data2-core-web@Icon","params":{"iconSet":"remix","icon":"ri-arrow-left-wide-fill"}},"size":{"component":"data2-core-primitives@Number","params":{"content":"28"}}},"updatedAt":"2026-07-21T07:09:34.187Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b00776749c","parent":"6a5f1b0b951c23b007767492","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"9"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":40,"height":40,"exactWidth":40,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":637,"y":1,"exactX":637.49,"exactY":1.01,"top":true}},"children":{"locked":true}},"updatedAt":"2026-07-21T07:09:34.187Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b00776749d","parent":"6a5f1b0b951c23b00776749c","component":"data2-blocks@IconBlock","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":28,"height":29,"exactWidth":28,"exactHeight":29}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":6,"y":6,"exactX":false,"exactY":false}},"opacity":{"disabled":false,"component":"data2-core-types@Opacity","params":{"value":43}}},"icon":{"disabled":false,"component":"data2-core-web@Icon","params":{"iconSet":"remix","icon":"ri-arrow-right-wide-fill"}},"size":{"component":"data2-core-primitives@Number","params":{"content":"28"}}},"updatedAt":"2026-07-21T07:09:34.187Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b00776749e","parent":"6a5f1b0b951c23b007767492","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":89,"height":41,"exactWidth":89.49,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":498,"y":0,"exactX":498.49,"exactY":0.01}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"left","textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"Página 1 / 4"}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(114,114,114,1)"}}},"updatedAt":"2026-07-21T07:09:34.187Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b00776749f","parent":"6a5f1b0b951c23b00776748a","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1270,"height":588,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":5,"exactX":false,"exactY":false,"fixed":false,"left":true,"top":true,"right":true,"growH":false}},"style":{"flex":{"component":"data2-core-primitives@String","params":{"content":"1"}}},"text":"","childrenMode":"cols"},"updatedAt":"2026-07-21T07:09:34.187Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b0077674a0","parent":"6a5f1b0b951c23b00776749f","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":420,"height":588,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"top":true,"left":true,"bottom":true,"growV":false,"fixed":false}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":17}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(26,26,26,1)"}},"style":{"flex":{"component":"data2-core-primitives@String","params":{"content":"1"}}}},"updatedAt":"2026-07-21T07:09:34.187Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b0077674a1","parent":"6a5f1b0b951c23b0077674a0","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"9"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":10,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}},"fill":{"disabled":false,"component":"data2-core-types@Fill","params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0.08)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]}}},"updatedAt":"2026-07-21T07:09:34.187Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b0077674a2","parent":"6a5f1b0b951c23b0077674a0","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T07:09:34.187Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b0077674a3","parent":"6a5f1b0b951c23b0077674a0","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T07:09:34.187Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b0077674a4","parent":"6a5f1b0b951c23b0077674a0","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T07:09:34.187Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b0077674a5","parent":"6a5f1b0b951c23b0077674a0","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T07:09:34.187Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b0077674a6","parent":"6a5f1b0b951c23b0077674a0","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T07:09:34.187Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b0077674a7","parent":"6a5f1b0b951c23b0077674a0","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T07:09:34.187Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b0077674a8","parent":"6a5f1b0b951c23b0077674a0","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T07:09:34.187Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b0077674a9","parent":"6a5f1b0b951c23b0077674a0","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T07:09:34.187Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b0077674aa","parent":"6a5f1b0b951c23b0077674a0","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T07:09:34.187Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b0077674ab","parent":"6a5f1b0b951c23b0077674a0","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T07:09:34.187Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b0077674ac","parent":"6a5f1b0b951c23b0077674a0","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T07:09:34.187Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b0077674ad","parent":"6a5f1b0b951c23b0077674a0","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T07:09:34.187Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b0077674ae","parent":"6a5f1b0b951c23b0077674a0","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T07:09:34.187Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b0077674af","parent":"6a5f1b0b951c23b00776749f","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":420,"height":588,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":20,"y":0,"exactX":false,"exactY":false,"top":true,"left":true,"bottom":true,"growV":false,"fixed":false}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":17}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(26,26,26,1)"}},"style":{"flex":{"component":"data2-core-primitives@String","params":{"content":"1"}}}},"updatedAt":"2026-07-21T07:09:34.187Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b0077674b0","parent":"6a5f1b0b951c23b0077674af","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"9"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":10,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T07:09:34.187Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b0077674b1","parent":"6a5f1b0b951c23b0077674af","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T07:09:34.187Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b0077674b2","parent":"6a5f1b0b951c23b0077674af","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T07:09:34.187Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b0077674b3","parent":"6a5f1b0b951c23b0077674af","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T07:09:34.187Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b0077674b4","parent":"6a5f1b0b951c23b0077674af","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T07:09:34.187Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b0077674b5","parent":"6a5f1b0b951c23b0077674af","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T07:09:34.187Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b0077674b6","parent":"6a5f1b0b951c23b0077674af","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T07:09:34.187Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b0077674b7","parent":"6a5f1b0b951c23b0077674af","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T07:09:34.187Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b0077674b8","parent":"6a5f1b0b951c23b0077674af","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T07:09:34.187Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b0077674b9","parent":"6a5f1b0b951c23b0077674af","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T07:09:34.187Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b0077674ba","parent":"6a5f1b0b951c23b0077674af","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T07:09:34.187Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b0077674bb","parent":"6a5f1b0b951c23b0077674af","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T07:09:34.187Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b0077674bc","parent":"6a5f1b0b951c23b0077674af","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T07:09:34.187Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b0077674bd","parent":"6a5f1b0b951c23b0077674af","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T07:09:34.187Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b0077674be","parent":"6a5f1b0b951c23b00776749f","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":420,"height":588,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":20,"y":0,"exactX":false,"exactY":false,"top":true,"left":true,"bottom":true,"growV":false,"fixed":false}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":17}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(26,26,26,1)"}},"style":{"flex":{"component":"data2-core-primitives@String","params":{"content":"1"}}},"fill":{"params":{"backgrounds":[{"params":{"gradient":{"params":{"colors":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,1)"}}}}]}}}}]}}},"updatedAt":"2026-07-21T07:29:10.730Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b0077674bf","parent":"6a5f1b0b951c23b0077674be","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"9"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":10,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T07:09:34.187Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b0077674c0","parent":"6a5f1b0b951c23b0077674be","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T07:09:34.187Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b0077674c1","parent":"6a5f1b0b951c23b0077674be","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T07:09:34.187Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b0077674c2","parent":"6a5f1b0b951c23b0077674be","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T07:09:34.187Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b0077674c3","parent":"6a5f1b0b951c23b0077674be","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T07:09:34.187Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b0077674c4","parent":"6a5f1b0b951c23b0077674be","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T07:09:34.187Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b0077674c5","parent":"6a5f1b0b951c23b0077674be","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T07:09:34.187Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b0077674c6","parent":"6a5f1b0b951c23b0077674be","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T07:09:34.187Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b0077674c7","parent":"6a5f1b0b951c23b0077674be","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T07:09:34.187Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b0077674c8","parent":"6a5f1b0b951c23b0077674be","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T07:09:34.187Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b0077674c9","parent":"6a5f1b0b951c23b0077674be","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T07:09:34.187Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b0077674ca","parent":"6a5f1b0b951c23b0077674be","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T07:09:34.187Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b0077674cb","parent":"6a5f1b0b951c23b0077674be","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T07:09:34.187Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b0b951c23b0077674cc","parent":"6a5f1b0b951c23b0077674be","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":40,"exactWidth":169,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em"}}}},"updatedAt":"2026-07-21T07:09:34.187Z","createdAt":"2026-07-21T07:09:34.187Z"},{"_id":"6a5f1b2b951c23b0077674d0","parent":"6a5f1b0b951c23b007767477","component":"natura-geomarketing@k1ctDNtMYQklApCji4N76","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(238,238,238,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":75,"height":768,"exactWidth":75,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":false,"exactY":false,"top":true,"left":true,"bottom":true,"growV":false,"fixed":false}},"stateDefinitions":[{"component":"data2-core-user-interface@StateDefinition","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"hovered"}},"component":"data2-core-primitives@Boolean"}}],"onMouseEnter":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6a5f1b2b951c23b0077674d0"}},"key":{"component":"data2-core-primitives@String","params":{"content":"hovered"}}}},"value":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-types@Setter"},"onMouseLeave":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6a5f1b2b951c23b0077674d0"}},"key":{"component":"data2-core-primitives@String","params":{"content":"hovered"}}}},"value":{"params":{"content":false},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-types@Setter"}},"componentState":{"component":"data2-core-primitives@String","params":{"content":{"params":{"components":[{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6a5f1b2b951c23b0077674d0"}},"key":{"component":"data2-core-primitives@String","params":{"content":"hovered"}}}}}},{"component":"data2-core-primitives@String","params":{"content":"default"}}]},"component":"data2-core-logical-operators@Or"}},"break":true}},"index":0,"updatedAt":"2026-07-21T07:12:03.555Z","createdAt":"2026-07-21T07:10:04.739Z"},{"_id":"6a5f1bc4951c23b0077674d1","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"Gestão de acessos","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768}},"fill":{"params":{"content":"#ffffff"},"component":"data2-core-primitives@String"},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"reference":"NKi0_IAvHL5fCXkrT5so3","updatedAt":"2026-07-25T00:39:36.752Z","createdAt":"2026-07-21T07:12:41.011Z"},{"_id":"6a5f1f79951c23b00776758b","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"New Artboard (7)","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768}},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"reference":"KytXyNPfanq1AjJJfn_MA","updatedAt":"2026-07-21T07:28:25.109Z","createdAt":"2026-07-21T07:28:25.109Z"},{"_id":"6a5f1f7c951c23b00776758c","parent":"6a5f1f79951c23b00776758b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"},"disabled":true},"gradient":{"disabled":false,"component":"data2-core-types@ColorGradient","params":{"angle":{"component":"data2-core-primitives@Number","params":{"content":45}},"type":"repeating-linear","colors":[{"component":"data2-core-types@ColorGradientStop","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0.4)"}}}},{"component":"data2-core-types@ColorGradientStop","params":{"offset":"100%","color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0.1)"}}}}]},"break":true},"image":{"disabled":true,"component":"data2-core-types@String","params":{}},"size":{"params":{"content":"20px 20px"},"component":"data2-core-primitives@String"}},"component":"data2-core-types@Background","break":true}]},"component":"data2-core-types@Fill","break":true},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":false,"exactY":false}},"style":{"pointer-events":{"component":"data2-core-primitives@String","params":{"content":"none"}}}},"updatedAt":"2026-07-24T23:44:10.898Z","createdAt":"2026-07-21T07:28:27.835Z"},{"_id":"6a5f8ecd8bb72493616fc17b","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"HubSideBarShortcut 0","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":60,"height":60,"exactHeight":60,"exactWidth":60}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"reference":"ygBx42LfoW45vgebqTss9","updatedAt":"2026-07-23T02:12:22.534Z","createdAt":"2026-07-21T15:23:24.309Z"},{"_id":"6a5f8f048bb72493616fc181","parent":"6a5f8ecd8bb72493616fc17b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"box","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#ffffff","radius":{"leftTop":"8"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":40,"height":40,"exactWidth":40,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":10,"y":10,"exactX":false,"exactY":false,"left":true,"top":true}},"shadow":[{"component":"data2-core-types@Shadow","params":{"type":"outset","offsetY":"2","blur":"3","color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(107,107,124,1)"}},"spread":"0"}}],"fill":{"params":{"content":"#6C5CE0"},"component":"data2-core-primitives@String"}},"index":0,"reference":"box","updatedAt":"2026-07-24T23:51:28.933Z","createdAt":"2026-07-21T15:24:21.284Z"},{"_id":"6a5f8f048bb72493616fc182","parent":"6a5f8f048bb72493616fc181","component":"data2-blocks@IconBlock","system":"6a57cfe9673eb7e3c5e57784","displayName":"icon","params":{"super":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":36,"height":34,"exactWidth":false,"exactHeight":33.79}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":2,"y":3,"exactX":false,"exactY":false,"left":true,"top":true}},"hide":{"params":{"subject":{"params":{"subject":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"type"}}},"component":"data2-core-types@Reference"},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"inicio"}}},"component":"data2-core-comparison-operators@Equal"}},"component":"data2-core-logical-operators@Not"}},"icon":{"disabled":false,"component":"data2-core-web@Icon","params":{"iconSet":"remix","icon":"ri-home-2-line"}},"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"size":{"component":"data2-core-primitives@Number","params":{"content":"27"}}},"reference":"icon","updatedAt":"2026-07-24T23:51:32.652Z","createdAt":"2026-07-21T15:24:21.284Z"},{"_id":"6a5f8f048bb72493616fc187","parent":"6a5f8ecd8bb72493616fc17b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"label","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":161,"height":25,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":"60","y":18,"exactX":false,"exactY":false,"left":true,"top":true,"fixed":false}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"params":{"defaultCase":{"component":"data2-core-primitives@String","params":{"content":"Início"}},"expression":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"type"}}},"component":"data2-core-types@Reference"},"cases":[{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"gestaoDeAcessos"}},"value":{"component":"data2-core-primitives@String","params":{"content":"Gestão de acessos"}}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"profile"}},"value":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"simulador"}},"value":{"component":"data2-core-primitives@String","params":{"content":"Simulador"}}}}]},"component":"data2-core-flow@Switch"},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"17"}},"transitions":[{"component":"data2-core-types@Transition","params":{"scope":"ALL","duration":"220","easing":"cubic-bezier(0.019736842105263157,0.0063750000000000195,0.2894736842105263,0.782375)"}}],"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(27,27,43,1)"}},"onMouseDown":{"disabled":false,"component":"data2-core-types@Interaction","params":{}},"opacity":{"disabled":false,"component":"data2-core-types@Opacity","params":{"value":0}},"preventUserSelection":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"index":1,"reference":"label","updatedAt":"2026-07-24T23:42:18.640Z","createdAt":"2026-07-21T15:24:21.284Z"},{"_id":"6a5f8f048bb72493616fc18c","parent":"6a5f8ecd8bb72493616fc17b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"boxhover","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"9"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0.15)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":60,"height":60,"exactWidth":60,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":0,"exactY":0,"bottom":true,"left":true,"top":true,"growV":false,"right":true,"growH":false}},"text":"","transitions":[{"component":"data2-core-types@Transition","params":{"duration":"220","scope":"ALL","easing":"cubic-bezier(0.14473684210526316,0.5663750000000001,0.4934210526315789,0.7983750000000001)"}}],"opacity":{"params":{"compare":{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"A7W_yE-inCOBw24Fo8BzY"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.sidebarHover"}}}},"comparisonSubject":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"type"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-comparison-operators@Equal"},"then":{"component":"data2-core-primitives@String","params":{"content":"100"}},"else":{"component":"data2-core-primitives@String","params":{"content":"0"}}},"component":"data2-core-flow@If"},"style":{"pointer-events":{"component":"data2-core-primitives@String","params":{"content":"all"}}},"onMouseEnter":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"A7W_yE-inCOBw24Fo8BzY"}},"value":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"type"}}},"component":"data2-core-types@Reference"},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.sidebarHover"}}},"component":"data2-core-types@Setter"},"cursor":"pointer","onMouseDown":{"disabled":false,"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"MNv9vHdKUB_s3iOqiMkiBInterface"}},"prop":"goTo","args":[{"params":{"expression":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"type"}}},"component":"data2-core-types@Reference"},"defaultCase":{"component":"data2-core-primitives@String","params":{"content":"/"}},"cases":[{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"simulador"}},"value":{"component":"data2-core-primitives@String","params":{"content":"/simulador"}}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"gestaoDeAcessos"}},"value":{"component":"data2-core-primitives@String","params":{"content":"/acessos"}}}}]},"component":"data2-core-flow@Switch"}]}},"onMouseLeave":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"A7W_yE-inCOBw24Fo8BzY"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.sidebarHover"}},"value":{"component":"data2-core-primitives@String","params":{"content":"-"}}},"component":"data2-core-types@Setter"}},"index":2,"reference":"boxhover","updatedAt":"2026-07-21T18:48:22.195Z","createdAt":"2026-07-21T15:24:21.284Z"},{"_id":"6a5f8f778bb72493616fc19d","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"HubSideBarShortcut","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":60,"height":60,"exactHeight":60,"exactWidth":60}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"componentClass":{"disabled":false,"component":"data2-core-types@ComponentClass","params":{}},"componentStates":[{"component":"data2-core-types@ComponentState","params":{"state":{"component":"data2-core-primitives@String","params":{"content":"default"}},"artboard":{"disabled":false,"component":"data2-core-types@ArtboardReference","params":{"reference":"ygBx42LfoW45vgebqTss9"}}}},{"component":"data2-core-types@ComponentState","params":{"state":{"component":"data2-core-primitives@String","params":{"content":"false"}},"artboard":{"disabled":false,"component":"data2-core-types@ArtboardReference","params":{"reference":"ygBx42LfoW45vgebqTss9"}}}},{"component":"data2-core-types@ComponentState","params":{"state":{"component":"data2-core-primitives@String","params":{"content":"true"}},"artboard":{"disabled":false,"component":"data2-core-types@ArtboardReference","params":{"reference":"QOWgs5ciBulgL7I-HJFdr"}}}}]},"reference":"cdiDE26p-BvVcPlXaCtSC","updatedAt":"2026-07-21T15:37:41.210Z","createdAt":"2026-07-21T15:26:19.115Z"},{"_id":"6a5f8fcd8bb72493616fc1a4","parent":"6a5f8f048bb72493616fc181","component":"data2-blocks@Html","system":"6a57cfe9673eb7e3c5e57784","displayName":"iconhtml","params":{"super":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":30,"height":30,"exactWidth":30,"exactHeight":30}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":5,"y":5,"exactX":false,"exactY":false,"top":true,"left":true},"break":false},"hide":{"params":{"subject":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"type"}}},"component":"data2-core-types@Reference"},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"inicio"}}},"component":"data2-core-comparison-operators@Equal"}},"text":{"params":{"defaultCase":{"component":"data2-core-primitives@String","params":{"content":"<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"#fff\" class=\"size-6\">\n  <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M12.75 3.03v.568c0 .334.148.65.405.864l1.068.89c.442.369.535 1.01.216 1.49l-.51.766a2.25 2.25 0 0 1-1.161.886l-.143.048a1.107 1.107 0 0 0-.57 1.664c.369.555.169 1.307-.427 1.605L9 13.125l.423 1.059a.956.956 0 0 1-1.652.928l-.679-.906a1.125 1.125 0 0 0-1.906.172L4.5 15.75l-.612.153M12.75 3.031a9 9 0 0 0-8.862 12.872M12.75 3.031a9 9 0 0 1 6.69 14.036m0 0-.177-.529A2.25 2.25 0 0 0 17.128 15H16.5l-.324-.324a1.453 1.453 0 0 0-2.328.377l-.036.073a1.586 1.586 0 0 1-.982.816l-.99.282c-.55.157-.894.702-.8 1.267l.073.438c.08.474.49.821.97.821.846 0 1.598.542 1.865 1.345l.215.643m5.276-3.67a9.012 9.012 0 0 1-5.276 3.67m0 0a9 9 0 0 1-10.275-4.835M15.75 9c0 .896-.393 1.7-1.016 2.25\" />\n</svg>\n"}},"expression":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"type"}}},"component":"data2-core-types@Reference"},"cases":[{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"gestaoDeAcessos"}},"value":{"component":"data2-core-primitives@String","params":{"content":"<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"#fff\" class=\"size-6\">\n  <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M18 18.72a9.094 9.094 0 0 0 3.741-.479 3 3 0 0 0-4.682-2.72m.94 3.198.001.031c0 .225-.012.447-.037.666A11.944 11.944 0 0 1 12 21c-2.17 0-4.207-.576-5.963-1.584A6.062 6.062 0 0 1 6 18.719m12 0a5.971 5.971 0 0 0-.941-3.197m0 0A5.995 5.995 0 0 0 12 12.75a5.995 5.995 0 0 0-5.058 2.772m0 0a3 3 0 0 0-4.681 2.72 8.986 8.986 0 0 0 3.74.477m.94-3.197a5.971 5.971 0 0 0-.94 3.197M15 6.75a3 3 0 1 1-6 0 3 3 0 0 1 6 0Zm6 3a2.25 2.25 0 1 1-4.5 0 2.25 2.25 0 0 1 4.5 0Zm-13.5 0a2.25 2.25 0 1 1-4.5 0 2.25 2.25 0 0 1 4.5 0Z\" />\n</svg>\n"}}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"profile"}},"value":{"component":"data2-core-primitives@String","params":{"content":"<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"#fff\" class=\"size-6\">\n  <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M15.75 6a3.75 3.75 0 1 1-7.5 0 3.75 3.75 0 0 1 7.5 0ZM4.501 20.118a7.5 7.5 0 0 1 14.998 0A17.933 17.933 0 0 1 12 21.75c-2.676 0-5.216-.584-7.499-1.632Z\" />\n</svg>\n"}}}}]},"component":"data2-core-flow@Switch"}},"reference":"iconhtml","updatedAt":"2026-07-24T23:51:41.271Z","createdAt":"2026-07-21T15:28:12.525Z"},{"_id":"6a5f91388bb72493616fc1a5","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"HubSideBarShortcut 1","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":223,"height":60,"exactWidth":223,"exactHeight":false}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"reference":"QOWgs5ciBulgL7I-HJFdr","updatedAt":"2026-07-21T15:37:35.530Z","createdAt":"2026-07-21T15:33:45.420Z"},{"_id":"6a5f91388bb72493616fc1a6","parent":"6a5f91388bb72493616fc1a5","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"box","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#ffffff","radius":{"leftTop":"8"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":40,"height":40,"exactWidth":40,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":"10","y":10,"exactX":false,"exactY":false,"left":true,"top":true}},"shadow":[{"component":"data2-core-types@Shadow","params":{"type":"outset","offsetY":"2","blur":"3","color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(107,107,124,1)"}},"spread":"0"}}],"fill":{"params":{"content":"#6C5CE0"},"component":"data2-core-primitives@String"}},"index":0,"reference":"box","updatedAt":"2026-07-24T23:54:58.418Z","createdAt":"2026-07-21T15:33:45.420Z"},{"_id":"6a5f91388bb72493616fc1a7","parent":"6a5f91388bb72493616fc1a6","component":"data2-blocks@IconBlock","system":"6a57cfe9673eb7e3c5e57784","displayName":"icon","params":{"super":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":36,"height":34,"exactWidth":false,"exactHeight":33.79}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":2,"y":3,"exactX":false,"exactY":false,"left":true,"top":true}},"hide":{"params":{"subject":{"params":{"subject":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"type"}}},"component":"data2-core-types@Reference"},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"inicio"}}},"component":"data2-core-comparison-operators@Equal"}},"component":"data2-core-logical-operators@Not"}},"icon":{"disabled":false,"component":"data2-core-web@Icon","params":{"iconSet":"remix","icon":"ri-home-2-line"}},"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"size":{"component":"data2-core-primitives@Number","params":{"content":"27"}}},"reference":"icon","updatedAt":"2026-07-24T23:51:52.319Z","createdAt":"2026-07-21T15:33:45.420Z"},{"_id":"6a5f91388bb72493616fc1a8","parent":"6a5f91388bb72493616fc1a6","component":"data2-blocks@Html","system":"6a57cfe9673eb7e3c5e57784","displayName":"iconhtml","params":{"super":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":30,"height":30,"exactWidth":30,"exactHeight":30}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":5,"y":5,"exactX":false,"exactY":false,"top":true,"left":true},"break":false},"filter":[{"component":"data2-core-types@BitmapFilter","params":{"type":"brightness","unit":"%","value":0}},{"component":"data2-core-types@BitmapFilter","params":{"type":"invert","unit":"%","value":100}}],"hide":{"params":{"subject":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"type"}}},"component":"data2-core-types@Reference"},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"inicio"}}},"component":"data2-core-comparison-operators@Equal"}},"text":{"params":{"defaultCase":{"component":"data2-core-primitives@String","params":{"content":"<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"#fff\" class=\"size-6\">\n  <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M12.75 3.03v.568c0 .334.148.65.405.864l1.068.89c.442.369.535 1.01.216 1.49l-.51.766a2.25 2.25 0 0 1-1.161.886l-.143.048a1.107 1.107 0 0 0-.57 1.664c.369.555.169 1.307-.427 1.605L9 13.125l.423 1.059a.956.956 0 0 1-1.652.928l-.679-.906a1.125 1.125 0 0 0-1.906.172L4.5 15.75l-.612.153M12.75 3.031a9 9 0 0 0-8.862 12.872M12.75 3.031a9 9 0 0 1 6.69 14.036m0 0-.177-.529A2.25 2.25 0 0 0 17.128 15H16.5l-.324-.324a1.453 1.453 0 0 0-2.328.377l-.036.073a1.586 1.586 0 0 1-.982.816l-.99.282c-.55.157-.894.702-.8 1.267l.073.438c.08.474.49.821.97.821.846 0 1.598.542 1.865 1.345l.215.643m5.276-3.67a9.012 9.012 0 0 1-5.276 3.67m0 0a9 9 0 0 1-10.275-4.835M15.75 9c0 .896-.393 1.7-1.016 2.25\" />\n</svg>\n"}},"expression":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"type"}}},"component":"data2-core-types@Reference"},"cases":[{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"gestaoDeAcessos"}},"value":{"component":"data2-core-primitives@String","params":{"content":"<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"#fff\" class=\"size-6\">\n  <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M18 18.72a9.094 9.094 0 0 0 3.741-.479 3 3 0 0 0-4.682-2.72m.94 3.198.001.031c0 .225-.012.447-.037.666A11.944 11.944 0 0 1 12 21c-2.17 0-4.207-.576-5.963-1.584A6.062 6.062 0 0 1 6 18.719m12 0a5.971 5.971 0 0 0-.941-3.197m0 0A5.995 5.995 0 0 0 12 12.75a5.995 5.995 0 0 0-5.058 2.772m0 0a3 3 0 0 0-4.681 2.72 8.986 8.986 0 0 0 3.74.477m.94-3.197a5.971 5.971 0 0 0-.94 3.197M15 6.75a3 3 0 1 1-6 0 3 3 0 0 1 6 0Zm6 3a2.25 2.25 0 1 1-4.5 0 2.25 2.25 0 0 1 4.5 0Zm-13.5 0a2.25 2.25 0 1 1-4.5 0 2.25 2.25 0 0 1 4.5 0Z\" />\n</svg>\n"}}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"profile"}},"value":{"component":"data2-core-primitives@String","params":{"content":"<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"#fff\" class=\"size-6\">\n  <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M15.75 6a3.75 3.75 0 1 1-7.5 0 3.75 3.75 0 0 1 7.5 0ZM4.501 20.118a7.5 7.5 0 0 1 14.998 0A17.933 17.933 0 0 1 12 21.75c-2.676 0-5.216-.584-7.499-1.632Z\" />\n</svg>\n"}}}}]},"component":"data2-core-flow@Switch"}},"reference":"iconhtml","updatedAt":"2026-07-24T23:51:59.130Z","createdAt":"2026-07-21T15:33:45.420Z"},{"_id":"6a5f91388bb72493616fc1a9","parent":"6a5f91388bb72493616fc1a5","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"label","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":161,"height":25,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":"60","y":18,"exactX":false,"exactY":false,"left":true,"top":true,"fixed":false}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"params":{"defaultCase":{"component":"data2-core-primitives@String","params":{"content":"Início"}},"expression":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"type"}}},"component":"data2-core-types@Reference"},"cases":[{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"gestaoDeAcessos"}},"value":{"component":"data2-core-primitives@String","params":{"content":"Gestão de acessos"}}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"profile"}},"value":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"simulador"}},"value":{"component":"data2-core-primitives@String","params":{"content":"Simulador"}}}}]},"component":"data2-core-flow@Switch"},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"17"}},"transitions":[{"component":"data2-core-types@Transition","params":{"scope":"ALL","duration":"220","easing":"cubic-bezier(0.019736842105263157,0.0063750000000000195,0.2894736842105263,0.782375)"}}],"onMouseDown":{"disabled":false,"component":"data2-core-types@Interaction","params":{}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(27,27,43,1)"}},"preventUserSelection":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"opacity":{"disabled":false,"component":"data2-core-types@Opacity","params":{"value":100}}},"index":1,"reference":"label","updatedAt":"2026-07-25T00:20:59.758Z","createdAt":"2026-07-21T15:33:45.420Z"},{"_id":"6a5f91388bb72493616fc1aa","parent":"6a5f91388bb72493616fc1a5","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"boxhover","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"9"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0.15)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":223,"height":60,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":0,"exactY":0,"bottom":true,"left":true,"top":true,"growV":false,"right":true,"growH":false}},"text":"","transitions":[{"component":"data2-core-types@Transition","params":{"duration":"220","scope":"ALL","easing":"cubic-bezier(0.14473684210526316,0.5663750000000001,0.4934210526315789,0.7983750000000001)"}}],"opacity":{"params":{"compare":{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"A7W_yE-inCOBw24Fo8BzY"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.sidebarHover"}}}},"comparisonSubject":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"type"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-comparison-operators@Equal"},"then":{"component":"data2-core-primitives@String","params":{"content":"100"}},"else":{"component":"data2-core-primitives@String","params":{"content":"0"}}},"component":"data2-core-flow@If"},"style":{"pointer-events":{"component":"data2-core-primitives@String","params":{"content":"all"}}},"onMouseEnter":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"A7W_yE-inCOBw24Fo8BzY"}},"value":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"type"}}},"component":"data2-core-types@Reference"},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.sidebarHover"}}},"component":"data2-core-types@Setter"},"cursor":"pointer","onMouseDown":{"disabled":false,"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"MNv9vHdKUB_s3iOqiMkiBInterface"}},"prop":"goTo","args":[{"params":{"expression":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"type"}}},"component":"data2-core-types@Reference"},"defaultCase":{"component":"data2-core-primitives@String","params":{"content":"/"}},"cases":[{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"simulador"}},"value":{"component":"data2-core-primitives@String","params":{"content":"/simulador"}}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"gestaoDeAcessos"}},"value":{"component":"data2-core-primitives@String","params":{"content":"/acessos"}}}}]},"component":"data2-core-flow@Switch"}]}},"onMouseLeave":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"A7W_yE-inCOBw24Fo8BzY"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.sidebarHover"}},"value":{"component":"data2-core-primitives@String","params":{"content":"-"}}},"component":"data2-core-types@Setter"}},"index":2,"reference":"boxhover","updatedAt":"2026-07-21T18:48:12.027Z","createdAt":"2026-07-21T15:33:45.420Z"},{"_id":"6a5f9aaea5529ef885ca965d","parent":"6a5f1847951c23b007767456","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"body","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":240,"height":768,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":false,"exactY":false,"top":true,"left":true,"bottom":false,"growV":false,"fixed":false}},"transitions":[{"component":"data2-core-types@Transition","params":{"scope":"ALL","duration":"220","easing":"cubic-bezier(0.013157894736842105,0.0063750000000000195,0.2894736842105263,0.830375)"}}],"text":"","style":{"pointer-events":{"component":"data2-core-primitives@String","params":{"content":"none"}},"flex":{"component":"data2-core-primitives@String","params":{"content":"1"}}}},"index":0,"reference":"body","updatedAt":"2026-07-24T23:58:14.007Z","createdAt":"2026-07-21T16:14:06.550Z"},{"_id":"6a5f9aaea5529ef885ca965e","parent":"6a5f9aaea5529ef885ca965d","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"routesContainer","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":200,"height":508,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":20,"y":260,"exactX":false,"exactY":false,"fixed":false,"left":true,"bottom":false,"top":true,"growV":false}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"text":""},"index":0,"reference":"routesContainer","updatedAt":"2026-07-25T03:35:42.464Z","createdAt":"2026-07-21T16:14:06.550Z"},{"_id":"6a5f9aaea5529ef885ca965f","parent":"6a5f9aaea5529ef885ca965e","component":"natura-geomarketing@cdiDE26p-BvVcPlXaCtSC","system":"6a57cfe9673eb7e3c5e57784","displayName":"inicio","params":{"super":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":220,"height":60,"exactHeight":false,"exactWidth":220}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":-10,"y":"-10","exactX":false,"exactY":false,"fixed":false,"left":true,"top":true}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"transitions":[{"component":"data2-core-types@Transition","params":{"scope":"ALL","duration":"220","easing":"cubic-bezier(0.013157894736842105,0.0063750000000000195,0.2894736842105263,0.830375)"}}]},"type":{"component":"data2-core-primitives@String","params":{"content":"inicio"}},"componentState":{"component":"data2-core-primitives@String","params":{"content":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}},"break":true}},"index":0,"reference":"inicio","updatedAt":"2026-07-25T00:21:38.702Z","createdAt":"2026-07-21T16:14:06.550Z"},{"_id":"6a5f9aaea5529ef885ca9660","parent":"6a5f9aaea5529ef885ca965e","component":"natura-geomarketing@cdiDE26p-BvVcPlXaCtSC","system":"6a57cfe9673eb7e3c5e57784","displayName":"simulador","params":{"super":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":220,"height":60,"exactHeight":false,"exactWidth":220}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":-10,"y":"20","exactX":false,"exactY":false,"fixed":false,"left":true,"top":true}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"transitions":[{"component":"data2-core-types@Transition","params":{"scope":"ALL","duration":"220","easing":"cubic-bezier(0.013157894736842105,0.0063750000000000195,0.2894736842105263,0.830375)"}}]},"type":{"component":"data2-core-primitives@String","params":{"content":"simulador"}},"componentState":{"component":"data2-core-primitives@String","params":{"content":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}},"break":true}},"index":1,"reference":"simulador","updatedAt":"2026-07-25T00:21:39.047Z","createdAt":"2026-07-21T16:14:06.550Z"},{"_id":"6a5f9aaea5529ef885ca9661","parent":"6a5f9aaea5529ef885ca965e","component":"natura-geomarketing@cdiDE26p-BvVcPlXaCtSC","system":"6a57cfe9673eb7e3c5e57784","displayName":"gestadoDeAcessos","params":{"super":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":220,"height":60,"exactHeight":false,"exactWidth":220}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":-10,"y":"20","exactX":false,"exactY":false,"fixed":false,"left":true,"top":true}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"transitions":[{"component":"data2-core-types@Transition","params":{"scope":"ALL","duration":"220","easing":"cubic-bezier(0.013157894736842105,0.0063750000000000195,0.2894736842105263,0.830375)"}}]},"type":{"component":"data2-core-primitives@String","params":{"content":"gestaoDeAcessos"}},"componentState":{"component":"data2-core-primitives@String","params":{"content":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}},"break":true}},"index":1,"reference":"gestadoDeAcessos","updatedAt":"2026-07-25T00:21:38.691Z","createdAt":"2026-07-21T16:14:06.550Z"},{"_id":"6a5f9aaea5529ef885ca9662","parent":"6a5f9aaea5529ef885ca965e","component":"natura-geomarketing@cdiDE26p-BvVcPlXaCtSC","system":"6a57cfe9673eb7e3c5e57784","displayName":"profile","params":{"super":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":220,"height":60,"exactHeight":false,"exactWidth":220}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":-10,"y":448,"exactX":false,"exactY":false,"fixed":false,"left":true,"top":false,"bottom":true}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"transitions":[{"component":"data2-core-types@Transition","params":{"scope":"ALL","duration":"220","easing":"cubic-bezier(0.013157894736842105,0.0063750000000000195,0.2894736842105263,0.830375)"}}]},"type":{"component":"data2-core-primitives@String","params":{"content":"profile"}},"componentState":{"component":"data2-core-primitives@String","params":{"content":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}},"break":true}},"index":1,"reference":"profile","updatedAt":"2026-07-25T03:35:52.738Z","createdAt":"2026-07-21T16:14:06.550Z"},{"_id":"6a5f9b1ba5529ef885ca9686","parent":"6a5f17e6951c23b007767437","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"body","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":80,"height":768,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":false,"exactY":false,"top":true,"left":true,"bottom":false,"growV":false,"fixed":false}},"transitions":[{"component":"data2-core-types@Transition","params":{"scope":"ALL","duration":"220","easing":"cubic-bezier(0.013157894736842105,0.0063750000000000195,0.2894736842105263,0.830375)"}}],"text":"","style":{"pointer-events":{"component":"data2-core-primitives@String","params":{"content":"none"}},"flex":{"component":"data2-core-primitives@String","params":{"content":"1"}}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":false}}},"index":0,"reference":"body","updatedAt":"2026-07-24T23:58:26.968Z","createdAt":"2026-07-21T16:15:54.790Z"},{"_id":"6a5f9b1ba5529ef885ca9687","parent":"6a5f9b1ba5529ef885ca9686","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"routesContainer","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":200,"height":508,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":20,"y":260,"exactX":false,"exactY":false,"fixed":false,"left":true,"bottom":false,"top":true,"growV":false}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"text":""},"index":0,"reference":"routesContainer","updatedAt":"2026-07-25T03:34:03.867Z","createdAt":"2026-07-21T16:15:54.790Z"},{"_id":"6a5f9b1ba5529ef885ca9688","parent":"6a5f9b1ba5529ef885ca9687","component":"natura-geomarketing@cdiDE26p-BvVcPlXaCtSC","system":"6a57cfe9673eb7e3c5e57784","displayName":"inicio","params":{"super":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":60,"height":60,"exactHeight":false,"exactWidth":60}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":-10,"y":"-10","exactX":false,"exactY":false,"fixed":false,"left":true,"top":true}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"transitions":[{"component":"data2-core-types@Transition","params":{"scope":"ALL","duration":"220","easing":"cubic-bezier(0.013157894736842105,0.0063750000000000195,0.2894736842105263,0.830375)"}}]},"type":{"component":"data2-core-primitives@String","params":{"content":"inicio"}},"componentState":{"component":"data2-core-primitives@String","params":{"content":false},"break":true}},"index":0,"reference":"inicio","updatedAt":"2026-07-25T00:21:34.612Z","createdAt":"2026-07-21T16:15:54.790Z"},{"_id":"6a5f9b1ba5529ef885ca9689","parent":"6a5f9b1ba5529ef885ca9687","component":"natura-geomarketing@cdiDE26p-BvVcPlXaCtSC","system":"6a57cfe9673eb7e3c5e57784","displayName":"simulador","params":{"super":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":60,"height":60,"exactHeight":false,"exactWidth":60}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":-10,"y":"20","exactX":false,"exactY":false,"fixed":false,"left":true,"top":true}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"transitions":[{"component":"data2-core-types@Transition","params":{"scope":"ALL","duration":"220","easing":"cubic-bezier(0.013157894736842105,0.0063750000000000195,0.2894736842105263,0.830375)"}}]},"type":{"component":"data2-core-primitives@String","params":{"content":"simulador"}},"componentState":{"component":"data2-core-primitives@String","params":{"content":false},"break":true}},"index":1,"reference":"simulador","updatedAt":"2026-07-25T00:21:35.224Z","createdAt":"2026-07-21T16:15:54.790Z"},{"_id":"6a5f9b1ba5529ef885ca968a","parent":"6a5f9b1ba5529ef885ca9687","component":"natura-geomarketing@cdiDE26p-BvVcPlXaCtSC","system":"6a57cfe9673eb7e3c5e57784","displayName":"gestadoDeAcessos","params":{"super":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":60,"height":60,"exactHeight":false,"exactWidth":60}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":-10,"y":20,"exactX":false,"exactY":false,"fixed":false,"left":true,"top":true}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"transitions":[{"component":"data2-core-types@Transition","params":{"scope":"ALL","duration":"220","easing":"cubic-bezier(0.013157894736842105,0.0063750000000000195,0.2894736842105263,0.830375)"}}]},"type":{"component":"data2-core-primitives@String","params":{"content":"gestaoDeAcessos"}},"componentState":{"component":"data2-core-primitives@String","params":{"content":false},"break":true}},"index":1,"reference":"gestadoDeAcessos","updatedAt":"2026-07-25T00:21:34.619Z","createdAt":"2026-07-21T16:15:54.790Z"},{"_id":"6a5f9b1ba5529ef885ca968b","parent":"6a5f9b1ba5529ef885ca9687","component":"natura-geomarketing@cdiDE26p-BvVcPlXaCtSC","system":"6a57cfe9673eb7e3c5e57784","displayName":"profile","params":{"super":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":60,"height":60,"exactHeight":false,"exactWidth":60}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":-10,"y":448,"exactX":false,"exactY":false,"fixed":false,"left":true,"top":false,"bottom":true}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"transitions":[{"component":"data2-core-types@Transition","params":{"scope":"ALL","duration":"220","easing":"cubic-bezier(0.013157894736842105,0.0063750000000000195,0.2894736842105263,0.830375)"}}]},"type":{"component":"data2-core-primitives@String","params":{"content":"profile"}},"componentState":{"component":"data2-core-primitives@String","params":{"content":false},"break":true}},"index":1,"reference":"profile","updatedAt":"2026-07-25T03:34:56.121Z","createdAt":"2026-07-21T16:15:54.790Z"},{"_id":"6a5f9e50a5529ef885ca9694","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"HubTextItem0","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":180,"height":40,"exactWidth":179.8,"exactHeight":40,"growWidthWithContent":true}}},"reference":"N-d1zIHDj3CBxcV-9h7Uq","updatedAt":"2026-07-21T16:30:21.027Z","createdAt":"2026-07-21T16:29:35.263Z"},{"_id":"6a5f9e51a5529ef885ca9696","parent":"6a5f9e50a5529ef885ca9694","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"9"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":180,"height":40,"exactWidth":179.8,"exactHeight":40,"growWidthWithContent":true}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"label"}}},"component":"data2-core-types@Reference"},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"20px"}}},"onClick":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"onClick"}}},"component":"data2-core-types@Reference"},"transitions":[{"component":"data2-core-types@Transition","params":{"scope":"ALL","duration":"220","easing":"cubic-bezier(0,-0.0016249999999999876,0.3684210526315789,0.830375)"}}],"cursor":"pointer"},"reference":"label","updatedAt":"2026-07-24T23:34:56.374Z","createdAt":"2026-07-21T16:29:35.996Z"},{"_id":"6a5f9e6da5529ef885ca9697","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"HubTextItem1","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":180,"height":40,"exactWidth":179.8,"exactHeight":40,"growWidthWithContent":true}}},"reference":"pBTPkX-Oin21ueqzZ2g1X","updatedAt":"2026-07-21T16:30:27.686Z","createdAt":"2026-07-21T16:30:06.263Z"},{"_id":"6a5f9e6da5529ef885ca9698","parent":"6a5f9e6da5529ef885ca9697","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"9"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":180,"height":40,"exactWidth":179.8,"exactHeight":40,"growWidthWithContent":true}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":0,"exactY":0,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"label"}}},"component":"data2-core-types@Reference"},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"20px"}}},"fill":{"disabled":false,"component":"data2-core-types@Fill","params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0.1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]}},"onClick":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"onClick"}}},"component":"data2-core-types@Reference"},"transitions":[{"component":"data2-core-types@Transition","params":{"scope":"ALL","duration":"220","easing":"cubic-bezier(0,-0.0016249999999999876,0.3684210526315789,0.830375)"}}],"cursor":"pointer"},"reference":"label","updatedAt":"2026-07-24T23:35:06.840Z","createdAt":"2026-07-21T16:30:06.263Z"},{"_id":"6a5f9e6fa5529ef885ca9699","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"HubTextItem","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":180,"height":40,"exactWidth":179.8,"exactHeight":40,"growWidthWithContent":true}},"componentClass":{"disabled":false,"component":"data2-core-types@ComponentClass","params":{}},"componentStates":[{"component":"data2-core-types@ComponentState","params":{"state":{"component":"data2-core-primitives@String","params":{"content":"default"}},"artboard":{"disabled":false,"component":"data2-core-types@ArtboardReference","params":{"reference":"N-d1zIHDj3CBxcV-9h7Uq"}}}},{"component":"data2-core-types@ComponentState","params":{"state":{"component":"data2-core-primitives@String","params":{"content":"false"}},"artboard":{"disabled":false,"component":"data2-core-types@ArtboardReference","params":{"reference":"N-d1zIHDj3CBxcV-9h7Uq"}}}},{"component":"data2-core-types@ComponentState","params":{"state":{"component":"data2-core-primitives@String","params":{"content":"true"}},"artboard":{"disabled":false,"component":"data2-core-types@ArtboardReference","params":{"reference":"pBTPkX-Oin21ueqzZ2g1X"}}}}]},"reference":"0CZ7pC6NULlDQhV3hv-0G","updatedAt":"2026-07-21T16:35:13.696Z","createdAt":"2026-07-21T16:30:08.983Z"},{"_id":"6a5fa72174f960d57156905d","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"HubPageHeaderAcessos","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1260,"height":60,"exactWidth":1259.6699999999998,"exactHeight":false}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"reference":"Jl_gD4rwsECW2tOfUczYm","updatedAt":"2026-07-27T18:47:12.757Z","createdAt":"2026-07-21T17:07:11.928Z"},{"_id":"6a5fa72474f960d571569072","parent":"6a5fa72174f960d57156905d","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"body","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1260,"height":60,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":false,"exactY":false,"fixed":false,"left":true,"top":true,"right":true,"growH":false}},"border":{"disabled":false,"component":"data2-core-types@Border","params":{"width":{"bottom":"1"},"color":"#cfcfde"}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"reference":"body","updatedAt":"2026-07-27T18:47:34.186Z","createdAt":"2026-07-21T17:07:18.875Z"},{"_id":"6a5fa72474f960d571569073","parent":"6a5fa72474f960d571569072","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"title","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":257,"height":17,"exactWidth":256.97999999999996,"exactHeight":16.89}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":"50","y":"13","exactX":false,"exactY":false,"left":true,"top":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"top"}},"text":{"component":"data2-core-primitives@String","params":{"content":"Gerenciamento de acessos"}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(27,27,43,1)"}}},"index":0,"reference":"title","updatedAt":"2026-07-25T00:28:05.139Z","createdAt":"2026-07-21T17:07:18.875Z"},{"_id":"6a5fa72474f960d571569074","parent":"6a5fa72474f960d571569072","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"subtitle","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":328,"height":18,"exactWidth":328.06,"exactHeight":18.439999999999998}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":"50","y":"30","exactX":false,"exactY":false,"top":true,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"params":{"portions":[{"component":"data2-core-primitives@String","params":{"content":"Mostrando "}},{"params":{"components":[{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"tFznon1CqdR98RwcHH1w_"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records.length"}}}},{"component":"data2-core-primitives@String","params":{"content":"0"}}]},"component":"data2-core-logical-operators@Or"},{"component":"data2-core-primitives@String","params":{"content":" de "}},{"params":{"components":[{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"tFznon1CqdR98RwcHH1w_"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records.length"}}}},{"component":"data2-core-primitives@String","params":{"content":"0"}}]},"component":"data2-core-logical-operators@Or"},{"params":{"then":{"component":"data2-core-primitives@String","params":{"content":" acessos"}},"compare":{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"tFznon1CqdR98RwcHH1w_"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records.length"}}}},"comparisonSubject":{"params":{"content":1},"component":"data2-core-primitives@Number"}},"component":"data2-core-comparison-operators@Different"},"else":{"component":"data2-core-primitives@String","params":{"content":" acesso"}}},"component":"data2-core-flow@If"}]},"component":"data2-core-functions@StringConcat"},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(107,107,124,1)"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"12"}}},"index":1,"reference":"subtitle","updatedAt":"2026-07-25T00:28:05.138Z","createdAt":"2026-07-21T17:07:18.875Z"},{"_id":"6a5fa72474f960d571569075","parent":"6a5fa72474f960d571569072","component":"data2-blocks@Html","system":"6a57cfe9673eb7e3c5e57784","displayName":"icon","params":{"super":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":30,"height":31,"exactWidth":30,"exactHeight":31}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":"5","y":14,"exactX":false,"exactY":false,"top":true,"left":true}}},"text":{"component":"data2-core-primitives@String","params":{"content":"<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"#1B1B2B\" class=\"size-6\">\n  <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M18 18.72a9.094 9.094 0 0 0 3.741-.479 3 3 0 0 0-4.682-2.72m.94 3.198.001.031c0 .225-.012.447-.037.666A11.944 11.944 0 0 1 12 21c-2.17 0-4.207-.576-5.963-1.584A6.062 6.062 0 0 1 6 18.719m12 0a5.971 5.971 0 0 0-.941-3.197m0 0A5.995 5.995 0 0 0 12 12.75a5.995 5.995 0 0 0-5.058 2.772m0 0a3 3 0 0 0-4.681 2.72 8.986 8.986 0 0 0 3.74.477m.94-3.197a5.971 5.971 0 0 0-.94 3.197M15 6.75a3 3 0 1 1-6 0 3 3 0 0 1 6 0Zm6 3a2.25 2.25 0 1 1-4.5 0 2.25 2.25 0 0 1 4.5 0Zm-13.5 0a2.25 2.25 0 1 1-4.5 0 2.25 2.25 0 0 1 4.5 0Z\" />\n</svg>\n"}}},"index":2,"reference":"icon","updatedAt":"2026-07-25T00:30:00.439Z","createdAt":"2026-07-21T17:07:18.875Z"},{"_id":"6a5fa72474f960d571569076","parent":"6a5fa72474f960d571569072","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"newButton","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":160,"height":40,"exactWidth":160}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":"1080","y":9,"exactX":false,"exactY":false,"top":true,"right":true}},"border":{"component":"data2-core-types@Border","params":{"color":"#f2eced","radius":{"leftTop":"9"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(108,92,224,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"text":""},"index":4,"reference":"newButton","updatedAt":"2026-07-25T00:23:28.760Z","createdAt":"2026-07-21T17:07:18.875Z"},{"_id":"6a5fa72474f960d571569077","parent":"6a5fa72474f960d571569076","component":"data2-blocks@Html","system":"6a57cfe9673eb7e3c5e57784","displayName":"newIcon","params":{"super":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":28,"height":29,"exactWidth":28,"exactHeight":29}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":10,"y":"7","exactX":false,"exactY":false}}},"text":{"component":"data2-core-primitives@String","params":{"content":"<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"#fff\" class=\"size-6\">\n  <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M12 4.5v15m7.5-7.5h-15\" />\n</svg>\n"}}},"reference":"newIcon","updatedAt":"2026-07-25T00:17:21.007Z","createdAt":"2026-07-21T17:07:18.875Z"},{"_id":"6a5fa72474f960d571569078","parent":"6a5fa72474f960d571569076","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"newLabel","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":135,"height":40,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":25,"y":0,"exactX":false,"exactY":false}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"center","textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"Criar Acesso"}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}}},"reference":"newLabel","updatedAt":"2026-07-25T00:17:17.540Z","createdAt":"2026-07-21T17:07:18.875Z"},{"_id":"6a5fa72474f960d571569079","parent":"6a5fa72474f960d571569072","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"contentOptions","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":380,"height":40,"exactWidth":380,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":"440","y":10,"top":true,"exactX":false,"exactY":false}},"border":{"disabled":true,"component":"data2-core-types@Border","params":{}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"index":3,"reference":"contentOptions","updatedAt":"2026-07-25T00:13:28.106Z","createdAt":"2026-07-21T17:07:18.875Z"},{"_id":"6a5fa72474f960d57156907a","parent":"6a5fa72474f960d571569079","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"searchContainer","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":360,"height":40,"exactWidth":359.59999999999997}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":0,"exactY":0,"top":true}},"border":{"component":"data2-core-types@Border","params":{"color":"#e5e5ef","radius":{"leftTop":"9"},"width":{"left":"1","top":"1","right":"1","bottom":"1"}}},"text":""},"reference":"searchContainer","updatedAt":"2026-07-25T00:30:23.405Z","createdAt":"2026-07-21T17:07:18.875Z"},{"_id":"6a5fa72474f960d57156907b","parent":"6a5fa72474f960d57156907a","component":"data2-blocks@Html","system":"6a57cfe9673eb7e3c5e57784","displayName":"searchIcon","params":{"super":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":24,"height":24,"exactWidth":24.32,"exactHeight":24.02}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":8,"y":7,"exactX":false,"exactY":false,"left":true}}},"text":{"component":"data2-core-primitives@String","params":{"content":"<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"#6B6B7C\" class=\"size-6\">\n  <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"m21 21-5.197-5.197m0 0A7.5 7.5 0 1 0 5.196 5.196a7.5 7.5 0 0 0 10.607 10.607Z\" />\n</svg>\n"}}},"reference":"searchIcon","updatedAt":"2026-07-25T00:14:00.376Z","createdAt":"2026-07-21T17:07:18.875Z"},{"_id":"6a5fa72474f960d57156907c","parent":"6a5fa72474f960d57156907a","component":"data2-blocks@DataFieldBlock","system":"6a57cfe9673eb7e3c5e57784","displayName":"searchInput","params":{"super":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":298,"height":38,"exactWidth":298,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":"41","y":0,"exactX":false,"exactY":false,"bottom":true,"left":true,"top":true,"growV":false,"right":true,"growH":false}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"center","textOverflow":false,"verticalAlignment":"middle"}}},"placeholder":{"component":"data2-core-primitives@String","params":{"content":"Buscar..."}},"padding":{"left":{"component":"data2-core-primitives@Number","params":{"content":20}},"right":{"component":"data2-core-primitives@Number","params":{"content":40}}}},"reference":"searchInput","updatedAt":"2026-07-25T00:14:15.616Z","createdAt":"2026-07-21T17:07:18.875Z"},{"_id":"6a5fa72474f960d57156907d","parent":"6a5fa72474f960d571569079","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"downloadButton","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"9"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":40,"height":40,"exactWidth":40,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":-60,"y":0,"exactX":false,"exactY":false,"top":true}},"children":{"locked":true}},"reference":"downloadButton","updatedAt":"2026-07-25T00:14:42.578Z","createdAt":"2026-07-21T17:07:18.875Z"},{"_id":"6a5fa72474f960d57156907e","parent":"6a5fa72474f960d57156907d","component":"data2-blocks@Html","system":"6a57cfe9673eb7e3c5e57784","displayName":"downloadIcon","params":{"super":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":28,"height":29,"exactWidth":28,"exactHeight":29}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":6,"y":6,"exactX":false,"exactY":false}}},"text":{"component":"data2-core-primitives@String","params":{"content":"<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"#6B6B7C\" class=\"size-6\">\n  <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M3 16.5v2.25A2.25 2.25 0 0 0 5.25 21h13.5A2.25 2.25 0 0 0 21 18.75V16.5M16.5 12 12 16.5m0 0L7.5 12m4.5 4.5V3\" />\n</svg>\n"}}},"reference":"downloadIcon","updatedAt":"2026-07-25T00:14:51.137Z","createdAt":"2026-07-21T17:07:18.875Z"},{"_id":"6a5fa72474f960d57156907f","parent":"6a5fa72474f960d571569079","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"sortButton","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"9"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":40,"height":40,"exactWidth":40,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":"380","y":0,"exactX":false,"exactY":false,"top":true}},"children":{"locked":true}},"reference":"sortButton","updatedAt":"2026-07-25T00:14:59.002Z","createdAt":"2026-07-21T17:07:18.875Z"},{"_id":"6a5fa72474f960d571569080","parent":"6a5fa72474f960d57156907f","component":"data2-blocks@Html","system":"6a57cfe9673eb7e3c5e57784","displayName":"sortIcon","params":{"super":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":28,"height":29,"exactWidth":28,"exactHeight":29}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":6,"y":6,"exactX":false,"exactY":false}}},"text":{"component":"data2-core-primitives@String","params":{"content":"<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"#6B6B7C\" class=\"size-6\">\n  <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M8.25 15 12 18.75 15.75 15m-7.5-6L12 5.25 15.75 9\" />\n</svg>\n"}}},"reference":"sortIcon","updatedAt":"2026-07-25T00:15:05.781Z","createdAt":"2026-07-21T17:07:18.875Z"},{"_id":"6a5fa72474f960d571569081","parent":"6a5fa72474f960d571569079","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"prevPageButton","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"9"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":40,"height":40,"exactWidth":40,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":"540","y":0,"exactX":false,"exactY":false,"top":true}},"children":{"locked":true}},"reference":"prevPageButton","updatedAt":"2026-07-25T00:15:27.423Z","createdAt":"2026-07-21T17:07:18.875Z"},{"_id":"6a5fa72474f960d571569082","parent":"6a5fa72474f960d571569081","component":"data2-blocks@IconBlock","system":"6a57cfe9673eb7e3c5e57784","displayName":"prevPageIcon","params":{"super":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":28,"height":29,"exactWidth":28,"exactHeight":29}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":6,"y":6,"exactX":false,"exactY":false}}},"icon":{"disabled":false,"component":"data2-core-web@Icon","params":{"iconSet":"remix","icon":"ri-arrow-left-wide-fill"}},"size":{"component":"data2-core-primitives@Number","params":{"content":"28"}},"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(107,107,124,1)"}}},"reference":"prevPageIcon","updatedAt":"2026-07-25T00:15:35.121Z","createdAt":"2026-07-21T17:07:18.875Z"},{"_id":"6a5fa72474f960d571569083","parent":"6a5fa72474f960d571569079","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"nextPageButton","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"9"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":40,"height":40,"exactWidth":40,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":"580","y":0,"exactX":false,"exactY":false,"top":true}},"children":{"locked":true}},"reference":"nextPageButton","updatedAt":"2026-07-25T00:16:02.703Z","createdAt":"2026-07-21T17:07:18.875Z"},{"_id":"6a5fa72474f960d571569084","parent":"6a5fa72474f960d571569083","component":"data2-blocks@IconBlock","system":"6a57cfe9673eb7e3c5e57784","displayName":"nextPageIcon","params":{"super":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":28,"height":29,"exactWidth":28,"exactHeight":29}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":6,"y":6,"exactX":false,"exactY":false}}},"icon":{"disabled":false,"component":"data2-core-web@Icon","params":{"iconSet":"remix","icon":"ri-arrow-right-wide-fill"}},"size":{"component":"data2-core-primitives@Number","params":{"content":"28"}},"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(107,107,124,1)"}}},"reference":"nextPageIcon","updatedAt":"2026-07-25T00:15:49.238Z","createdAt":"2026-07-21T17:07:18.875Z"},{"_id":"6a5fa72474f960d571569085","parent":"6a5fa72474f960d571569079","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"pageIndicator","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":100,"height":41,"exactWidth":99.61,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":"440","y":0,"exactX":false,"exactY":false}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"left","textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"Página 1 / 1"}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(107,107,124,1)"}}},"reference":"pageIndicator","updatedAt":"2026-07-25T00:18:06.191Z","createdAt":"2026-07-21T17:07:18.875Z"},{"_id":"6a5fa7cd74f960d571569086","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"HubPageHeaderComponent","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1250,"height":60,"exactWidth":false,"exactHeight":false}},"componentClass":{"disabled":false,"component":"data2-core-types@ComponentClass","params":{}},"componentStates":[{"component":"data2-core-types@ComponentState","params":{"state":{"component":"data2-core-primitives@String","params":{"content":"gestaoDeAcessos"}},"artboard":{"disabled":false,"component":"data2-core-types@ArtboardReference","params":{"reference":"Jl_gD4rwsECW2tOfUczYm"}}}},{"component":"data2-core-types@ComponentState","params":{"state":{"component":"data2-core-primitives@String","params":{"content":"simulador"}},"artboard":{"disabled":false,"component":"data2-core-types@ArtboardReference","params":{"reference":"tPvK9qsMTsuUVVoEjEnL1"}}}}],"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"reference":"4hvch1V6MXqBr9rL-nvAu","updatedAt":"2026-07-24T23:32:22.686Z","createdAt":"2026-07-21T17:10:04.642Z"},{"_id":"6a5face141de3fb32ace7537","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"Início","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768}},"fill":{"params":{"content":"#ffffff"},"component":"data2-core-primitives@String"},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"reference":"k6yQNLR1Pt1-zCBxtryLD","updatedAt":"2026-07-24T23:31:47.062Z","createdAt":"2026-07-21T17:31:49.770Z"},{"_id":"6a5fcaba3a34c57f2ac6b32d","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"HubPageHeaderSimulador","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1250,"height":60,"exactWidth":false,"exactHeight":false}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"reference":"tPvK9qsMTsuUVVoEjEnL1","updatedAt":"2026-07-27T18:47:12.458Z","createdAt":"2026-07-21T19:39:04.742Z"},{"_id":"6a5fcabb3a34c57f2ac6b340","parent":"6a5fcaba3a34c57f2ac6b32d","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1250,"height":60,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":false,"exactY":false,"fixed":false,"left":true,"top":true,"right":true,"growH":false}},"border":{"disabled":false,"component":"data2-core-types@Border","params":{"width":{"bottom":"1"},"color":"#e7e7e7"}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(26,26,26,1)"}},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"},"onMouseDown":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6a72149640a65f13df647133"}},"key":{"component":"data2-core-primitives@String","params":{"content":"focused"}}}},"value":{"params":{"content":false},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-types@Setter"}},"updatedAt":"2026-08-04T18:22:36.247Z","createdAt":"2026-07-21T19:39:05.357Z"},{"_id":"6a5fcabb3a34c57f2ac6b341","parent":"6a5fcabb3a34c57f2ac6b340","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":336,"height":20,"exactWidth":336.25,"exactHeight":20}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":"50","y":"13","exactX":false,"exactY":false,"left":true,"top":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"top"}},"text":{"component":"data2-core-primitives@String","params":{"content":"Simulador de movimentações otimizadas"}}},"updatedAt":"2026-08-04T18:12:09.944Z","createdAt":"2026-07-21T19:39:05.357Z"},{"_id":"6a5fcabb3a34c57f2ac6b342","parent":"6a5fcabb3a34c57f2ac6b340","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":490,"height":18,"exactWidth":490.15999999999997,"exactHeight":18.439999999999998}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":50,"y":35,"exactX":50,"exactY":34.66,"top":true,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"Novo projeto de planejamento"}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(97,97,97,1)"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"hide":{"component":"data2-core-primitives@Boolean","params":{"content":false}}},"updatedAt":"2026-08-04T16:48:07.449Z","createdAt":"2026-07-21T19:39:05.357Z"},{"_id":"6a5fcabb3a34c57f2ac6b343","parent":"6a5fcabb3a34c57f2ac6b340","component":"data2-blocks@Html","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":30,"height":31,"exactWidth":30,"exactHeight":31}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":"5","y":14,"exactX":false,"exactY":false,"top":true,"left":true}},"opacity":{"disabled":false,"component":"data2-core-types@Opacity","params":{"value":51}}},"text":{"component":"data2-core-primitives@String","params":{"content":"<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\" class=\"size-6\">\n  <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M12.75 3.03v.568c0 .334.148.65.405.864l1.068.89c.442.369.535 1.01.216 1.49l-.51.766a2.25 2.25 0 0 1-1.161.886l-.143.048a1.107 1.107 0 0 0-.57 1.664c.369.555.169 1.307-.427 1.605L9 13.125l.423 1.059a.956.956 0 0 1-1.652.928l-.679-.906a1.125 1.125 0 0 0-1.906.172L4.5 15.75l-.612.153M12.75 3.031a9 9 0 0 0-8.862 12.872M12.75 3.031a9 9 0 0 1 6.69 14.036m0 0-.177-.529A2.25 2.25 0 0 0 17.128 15H16.5l-.324-.324a1.453 1.453 0 0 0-2.328.377l-.036.073a1.586 1.586 0 0 1-.982.816l-.99.282c-.55.157-.894.702-.8 1.267l.073.438c.08.474.49.821.97.821.846 0 1.598.542 1.865 1.345l.215.643m5.276-3.67a9.012 9.012 0 0 1-5.276 3.67m0 0a9 9 0 0 1-10.275-4.835M15.75 9c0 .896-.393 1.7-1.016 2.25\" />\n</svg>\n"}}},"updatedAt":"2026-07-27T18:45:24.393Z","createdAt":"2026-07-21T19:39:05.357Z"},{"_id":"6a5fcabb3a34c57f2ac6b344","parent":"6a5fcabb3a34c57f2ac6b340","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":810,"height":40,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":440,"y":10,"top":true,"exactX":false,"exactY":false,"right":true,"left":true,"growH":false}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"stateDefinitions":[{"component":"data2-core-user-interface@StateDefinition","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"focused"}},"component":"data2-core-primitives@Boolean"}},{"component":"data2-core-user-interface@StateDefinition","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"sector"}},"component":"data2-core-primitives@String"}}]},"updatedAt":"2026-08-04T16:39:34.081Z","createdAt":"2026-07-21T19:39:05.357Z"},{"_id":"6a5fcabb3a34c57f2ac6b345","parent":"6a5fcabb3a34c57f2ac6b344","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":360,"height":40,"exactWidth":359.59999999999997}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":215,"y":0,"exactX":false,"exactY":false,"top":true,"right":true}},"border":{"component":"data2-core-types@Border","params":{"color":{"params":{"then":{"params":{"content":"#6C5CE0"},"component":"data2-core-primitives@String"},"compare":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6a5fcabb3a34c57f2ac6b344"}},"key":{"component":"data2-core-primitives@String","params":{"content":"focused"}}}}},"component":"data2-core-types@Getter"},"else":"#e6e6e6"},"component":"data2-core-flow@If"},"radius":{"leftTop":"9"},"width":{"left":"1","top":"1","right":"1","bottom":"1"}},"break":true},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"hide":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"updatedAt":"2026-08-04T04:46:06.061Z","createdAt":"2026-07-21T19:39:05.357Z"},{"_id":"6a5fcabb3a34c57f2ac6b346","parent":"6a5fcabb3a34c57f2ac6b345","component":"data2-blocks@Html","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":22,"height":20,"exactWidth":21.84,"exactHeight":20.27}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":321,"y":9,"exactX":false,"exactY":false}},"opacity":{"disabled":false,"component":"data2-core-types@Opacity","params":{"value":43}},"style":{"transform":{"params":{"compare":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6a5fcabb3a34c57f2ac6b344"}},"key":{"component":"data2-core-primitives@String","params":{"content":"focused"}}}}}},"then":{"component":"data2-core-primitives@String","params":{"content":"rotate(180deg)"}}},"component":"data2-core-flow@If"}}},"text":{"component":"data2-core-primitives@String","params":{"content":"<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\" class=\"size-6\">\n  <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"m19.5 8.25-7.5 7.5-7.5-7.5\" />\n</svg>\n"}}},"index":0,"updatedAt":"2026-07-29T06:29:01.445Z","createdAt":"2026-07-21T19:39:05.357Z"},{"_id":"6a5fcabb3a34c57f2ac6b347","parent":"6a5fcabb3a34c57f2ac6b345","component":"data2-blocks@DataFieldBlock","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":336,"height":38,"exactWidth":336.04,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":false,"exactY":false,"left":true,"top":true,"right":true,"growH":false,"bottom":true,"growV":false}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"center","textOverflow":false,"verticalAlignment":"middle"}}},"placeholder":{"component":"data2-core-primitives@String","params":{"content":"Digite aqui um código de setor"}},"dataset":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"field":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6a5fcabb3a34c57f2ac6b344"}},"key":{"component":"data2-core-primitives@String","params":{"content":"sector"}}}},"type":"text","mask":{"component":"data2-core-primitives@String","params":{"content":"0000"}},"onFocus":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6a5fcabb3a34c57f2ac6b344"}},"key":{"component":"data2-core-primitives@String","params":{"content":"focused"}}}},"value":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-types@Setter"},"onBlur":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6a5fcabb3a34c57f2ac6b344"}},"key":{"component":"data2-core-primitives@String","params":{"content":"focused"}}}},"value":{"params":{"content":false},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-types@Setter"}},"index":2,"updatedAt":"2026-07-31T08:29:22.188Z","createdAt":"2026-07-21T19:39:05.357Z"},{"_id":"6a5fcabb3a34c57f2ac6b348","parent":"6a5fcabb3a34c57f2ac6b345","component":"data2-blocks@IconBlock","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":37,"height":38,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":"8","y":0,"exactX":false,"exactY":false,"top":true}},"children":{"locked":true},"onClick":{"params":{"actions":[{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Y0MVeSB0t_bjBEppVYgQJ"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.state"}},"value":{"component":"data2-core-primitives@String","params":{"content":"loading"}}}},{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Y0MVeSB0t_bjBEppVYgQJ"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.setor"}},"value":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6a5fcabb3a34c57f2ac6b344"}},"key":{"component":"data2-core-primitives@String","params":{"content":"sector"}}}}}}}},{"params":{"actions":[{"params":{"actions":[{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"2A0QvRsDzftCYYnjJ_hIe"}},"prop":"filter","args":[{"params":{"fields":{"CD_SETOR":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Y0MVeSB0t_bjBEppVYgQJ"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.setor"}}}}}},"component":"data2-core-types@FieldSet"}]}},{"params":{"resultName":{"component":"data2-core-primitives@String","params":{"content":"municipios"}},"action":{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"2A0QvRsDzftCYYnjJ_hIe"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"mapper":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"m"}}],"body":{"MUNICIPIO":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m.MUNICIPIO"}}},"component":"data2-core-types@Reference"},"UF":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m.UF"}}},"component":"data2-core-types@Reference"}}}}},"component":"data2-core-functions@ArrayMap"}},"component":"data2-core-flow@Step"},{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Y0MVeSB0t_bjBEppVYgQJ"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.municipios"}},"value":{"params":{"array":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"municipios"}}},"component":"data2-core-types@Reference"},"mapper":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"m"}}],"body":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m.MUNICIPIO"}}},"component":"data2-core-types@Reference"}}}},"component":"data2-core-functions@ArrayMap"}},"displayName":"get municipios"},{"params":{"actions":{"params":{"array":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"municipios"}}},"component":"data2-core-types@Reference"},"mapper":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"m"}}],"body":{"params":{"actions":[{"params":{"municipio":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m.MUNICIPIO"}}},"component":"data2-core-types@Reference"},"uf":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m.UF"}}},"component":"data2-core-types@Reference"}},"component":"natura-geomarketing@4vQ1HUOSYMGvZGCOV2GYd"},{"params":{"message":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m"}}},"component":"data2-core-types@Reference"},"data":{"data":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"prevResult"}}},"component":"data2-core-types@Reference"}}},"component":"natura-geomarketing@nGePVjqDWdX2KQL8ahh-w"},{"params":{"array":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"prevResult"}}},"component":"data2-core-types@Reference"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"f"}}],"body":{"params":{"subject":{"params":{"pattern":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"f"}}},"component":"data2-core-types@Reference"},"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Y0MVeSB0t_bjBEppVYgQJ"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.municipios"}}}}},"component":"data2-core-functions@Includes"}},"component":"data2-core-logical-operators@Not"}}}},"component":"data2-core-functions@ArrayFilter"},{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Y0MVeSB0t_bjBEppVYgQJ"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.neighboring_municipios"}},"value":{"params":{"array":{"params":{"components":[{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Y0MVeSB0t_bjBEppVYgQJ"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.neighboring_municipios"}}},"component":"data2-core-types@Getter"},[]]},"component":"data2-core-logical-operators@Or"},"arrays":[{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"prevResult"}}},"component":"data2-core-types@Reference"}]},"component":"data2-core-functions@ArrayConcat"}}}]},"component":"data2-core-flow@Series"}}}},"component":"data2-core-functions@ArrayMap"}},"component":"data2-core-flow@Parallel","displayName":"neighbor_municipios"},{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"will filter thingy"}},"data":{"MUNICIPIO":{"in":{"params":{"arrays":[{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Y0MVeSB0t_bjBEppVYgQJ"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.municipios"}}},"component":"data2-core-types@Getter"},{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Y0MVeSB0t_bjBEppVYgQJ"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.neighboring_municipios"}}},"component":"data2-core-types@Getter"}]},"component":"data2-core-functions@ArrayConcat"}}}},"component":"natura-geomarketing@nGePVjqDWdX2KQL8ahh-w"},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"UI2RIyzH2ZnVnYlZtETzi"}},"prop":"filter","args":[{"params":{"fields":{"MUNICIPIO":{"in":{"params":{"arrays":[{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Y0MVeSB0t_bjBEppVYgQJ"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.municipios"}}},"component":"data2-core-types@Getter"},{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Y0MVeSB0t_bjBEppVYgQJ"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.neighboring_municipios"}}},"component":"data2-core-types@Getter"}]},"component":"data2-core-functions@ArrayConcat"}}}},"component":"data2-core-types@FieldSet"}]}},{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"sectors of municipios"}},"data":{"data":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"UI2RIyzH2ZnVnYlZtETzi"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}}}}},"component":"natura-geomarketing@nGePVjqDWdX2KQL8ahh-w"},{"params":{"actions":{"params":{"mapper":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"m"}}],"body":{"params":{"actions":[{"params":{"text":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m"}}},"component":"data2-core-types@Reference"}},"component":"natura-geomarketing@gA5O7o100HVWfKwEEPNyM"},{"component":"data2-core-types@Setter","params":{"value":{"params":{"sources":[{"component":"data2-core-types@FieldSet","params":{"fields":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Y0MVeSB0t_bjBEppVYgQJ"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.assignments"}}},"component":"data2-core-types@Getter"}}},{"component":"data2-core-types@FieldSet","params":{"fieldsList":[{"value":{"params":{"array":{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"UI2RIyzH2ZnVnYlZtETzi"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"f"}}],"body":{"params":{"subject":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"f.MUNICIPIO"}}},"component":"data2-core-types@Reference"},"comparisonSubject":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-comparison-operators@Equal"}}}},"component":"data2-core-functions@ArrayFilter"},"mapper":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"m2"}}],"body":{"params":{"else":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m2.CD_SETOR"}}},"component":"data2-core-types@Reference"},"then":{"component":"data2-core-primitives@String","params":{"content":""}},"compare":{"params":{"subject":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m2.CD_SETOR"}}},"component":"data2-core-types@Reference"},"comparisonSubject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Y0MVeSB0t_bjBEppVYgQJ"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.setor"}}}}},"component":"data2-core-comparison-operators@Equal"}},"component":"data2-core-flow@If"}}}},"component":"data2-core-functions@ArrayMap"},"key":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"prevResult"}}},"component":"data2-core-types@Reference"}}]}}],"object":{}},"component":"data2-core-functions@ObjectAssign"},"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Y0MVeSB0t_bjBEppVYgQJ"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.assignments"}}}}]},"component":"data2-core-flow@Series"}}},"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Y0MVeSB0t_bjBEppVYgQJ"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.municipios"}}},"component":"data2-core-types@Getter"}},"component":"data2-core-functions@ArrayMap"}},"component":"data2-core-flow@Series"},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"UI2RIyzH2ZnVnYlZtETzi"}},"prop":"filter","args":[{"params":{"fields":{"MUNICIPIO":{"in":{"params":{"arrays":[{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Y0MVeSB0t_bjBEppVYgQJ"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.municipios"}}},"component":"data2-core-types@Getter"},{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Y0MVeSB0t_bjBEppVYgQJ"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.neighboring_municipios"}}},"component":"data2-core-types@Getter"}]},"component":"data2-core-functions@ArrayConcat"}}}},"component":"data2-core-types@FieldSet"}]}},{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Y0MVeSB0t_bjBEppVYgQJ"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.groups"}},"value":{"params":{"array":{"params":{"array":{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"UI2RIyzH2ZnVnYlZtETzi"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"field":{"component":"data2-core-primitives@String","params":{"content":"CD_SETOR"}}},"component":"data2-core-functions@Uniq"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"f"}}],"body":{"params":{"subject":{"params":{"subject":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"f.CD_SETOR"}}},"component":"data2-core-types@Reference"},"comparisonSubject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Y0MVeSB0t_bjBEppVYgQJ"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.setor"}}}}},"component":"data2-core-comparison-operators@Equal"}},"component":"data2-core-logical-operators@Not"}}}},"component":"data2-core-functions@ArrayFilter"},"mapper":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"m"}}],"body":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m.CD_SETOR"}}}}}}},"component":"data2-core-functions@ArrayMap"}},"component":"data2-core-types@Setter"},{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Y0MVeSB0t_bjBEppVYgQJ"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.colors"}},"value":{"params":{"array":{"params":{"array":{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"UI2RIyzH2ZnVnYlZtETzi"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"field":{"component":"data2-core-primitives@String","params":{"content":"CD_SETOR"}}},"component":"data2-core-functions@Uniq"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"f"}}],"body":{"params":{"subject":{"params":{"subject":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"f.CD_SETOR"}}},"component":"data2-core-types@Reference"},"comparisonSubject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Y0MVeSB0t_bjBEppVYgQJ"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.setor"}}}}},"component":"data2-core-comparison-operators@Equal"}},"component":"data2-core-logical-operators@Not"}}}},"component":"data2-core-functions@ArrayFilter"},"mapper":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"m"}},{"component":"data2-core-primitives@String","params":{"content":"i"}},{"component":"data2-core-primitives@String","params":{"content":"l"}}],"body":{"params":{"fieldsList":[{"key":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m.CD_SETOR"}}}},"value":{"params":{"color":{"params":{"color":{"h":{"params":{"components":[{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"i"}}},"component":"data2-core-types@Reference"},{"params":{"components":[{"params":{"components":[{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"l.length"}}},"component":"data2-core-types@Reference"},{"component":"data2-core-primitives@Number","params":{"content":10}}]},"component":"data2-core-numerical-operators@Multiply"},{"component":"data2-core-primitives@Number","params":{"content":36}}]},"component":"data2-core-numerical-operators@Divide"}]},"component":"data2-core-numerical-operators@Multiply"},"s":{"component":"data2-core-primitives@String","params":{"content":"1"}},"l":{"component":"data2-core-primitives@String","params":{"content":"1"}},"alpha":{"component":"data2-core-primitives@String","params":{"content":"1"}}}},"component":"data2-core-color@ColorFormatHsl"}},"component":"data2-core-color@ColorFormatHex"}}]},"component":"data2-core-types@FieldSet"}}}},"component":"data2-core-functions@ArrayMap"}},"component":"data2-core-types@Setter"},{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"ASIS"}},"data":{"data":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Y0MVeSB0t_bjBEppVYgQJ"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data"}}}}}},"component":"natura-geomarketing@nGePVjqDWdX2KQL8ahh-w"}]},"component":"data2-core-flow@Series"},{"params":{"actions":[{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"2A0QvRsDzftCYYnjJ_hIe"}},"prop":"filter","args":[{"params":{"fields":{"CD_SETOR":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Y0MVeSB0t_bjBEppVYgQJ"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.setor"}}}}}},"component":"data2-core-types@FieldSet"}]}},{"params":{"actions":{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"2A0QvRsDzftCYYnjJ_hIe"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"mapper":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"m"}}],"body":{"params":{"actions":[{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Y0MVeSB0t_bjBEppVYgQJ"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.ufs"}},"value":{"params":{"item":{"component":"data2-core-types@Getter","params":{"prop":{"component":"data2-core-primitives@String","params":{"content":"0"}},"module":{"params":{"needle":{"component":"data2-core-primitives@String","params":{"content":"-"}},"haystack":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m.UF_MUNICIPIO"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-functions@Split"}}},"array":{"params":{"components":[{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Y0MVeSB0t_bjBEppVYgQJ"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.ufs"}}},"component":"data2-core-types@Getter"},[]]},"component":"data2-core-logical-operators@Or"}},"component":"data2-core-functions@ArrayPush"}}},{"params":{"text":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m.MUNICIPIO"}}},"component":"data2-core-types@Reference"}},"component":"natura-geomarketing@gA5O7o100HVWfKwEEPNyM"},{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Y0MVeSB0t_bjBEppVYgQJ"}},"prop":{"params":{"portions":[{"component":"data2-core-primitives@String","params":{"content":"data.assignments."}},{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"prevResult"}}},"component":"data2-core-types@Reference"}]},"component":"data2-core-functions@StringConcat"},"value":{"params":{"array":{"params":{"components":[{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Y0MVeSB0t_bjBEppVYgQJ"}},"prop":{"params":{"portions":[{"component":"data2-core-primitives@String","params":{"content":"data.assignments."}},{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"prevResult"}}},"component":"data2-core-types@Reference"}]},"component":"data2-core-functions@StringConcat"}},"component":"data2-core-types@Getter"},[]]},"component":"data2-core-logical-operators@Or"},"item":{"component":"data2-core-primitives@String","params":{"content":""}}},"component":"data2-core-functions@ArrayPush"}},"component":"data2-core-types@Setter"}]},"component":"data2-core-flow@Series"}}}},"component":"data2-core-functions@ArrayMap"}},"component":"data2-core-flow@Series"},{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"ASIS"}},"data":{"data":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Y0MVeSB0t_bjBEppVYgQJ"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data"}}}}}},"component":"natura-geomarketing@nGePVjqDWdX2KQL8ahh-w"}]},"component":"data2-core-flow@Series","disabled":true}]},"component":"data2-core-flow@Series"},{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Y0MVeSB0t_bjBEppVYgQJ"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.state"}},"value":{"component":"data2-core-primitives@String","params":{"content":"done"}}}}]},"component":"data2-core-flow@Series"},"hide":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"icon":{"disabled":false,"component":"data2-core-web@Icon","params":{"iconSet":"fontawesome6","icon":"fa6-solid fa6-dice"}},"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(159,159,159,1)"}},"size":{"component":"data2-core-primitives@Number","params":{"content":"22"}},"text":""},"index":1,"updatedAt":"2026-07-31T08:26:55.231Z","createdAt":"2026-07-21T19:39:05.357Z"},{"_id":"6a5fcabb3a34c57f2ac6b34a","parent":"6a5fcabb3a34c57f2ac6b344","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":293,"height":40,"exactWidth":292.74,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":517,"y":0,"exactX":false,"exactY":false,"top":true,"right":true}},"border":{"component":"data2-core-types@Border","params":{"color":"#f2eced","radius":{"leftTop":"9"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"then":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(64,53,157,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"else":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(108,92,224,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"compare":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6a5fcabb3a34c57f2ac6b34a"}},"key":{"component":"data2-core-primitives@String","params":{"content":"hovered"}}}}},"component":"data2-core-types@Getter"}},"component":"data2-core-flow@If"},"children":{"locked":true},"onClick":{"params":{"actions":[{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"ziIl3zJpxF2x8qsRQy10a"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data"}},"value":{}},"component":"data2-core-types@Setter"},{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Y0MVeSB0t_bjBEppVYgQJ"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.state"}},"value":{"component":"data2-core-primitives@String","params":{"content":"loading"}}}},{"params":{"setor":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6a5fcabb3a34c57f2ac6b344"}},"key":{"component":"data2-core-primitives@String","params":{"content":"sector"}}}}}}},"component":"natura-geomarketing@Y-BartZI5BwXJmLbhFG_3"},{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Y0MVeSB0t_bjBEppVYgQJ"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.state"}},"value":{"component":"data2-core-primitives@String","params":{"content":"done"}}}}]},"component":"data2-core-flow@Series"},"stateDefinitions":[{"component":"data2-core-user-interface@StateDefinition","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"hovered"}},"component":"data2-core-primitives@Boolean"}}],"onMouseEnter":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6a5fcabb3a34c57f2ac6b34a"}},"key":{"component":"data2-core-primitives@String","params":{"content":"hovered"}}}},"value":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-types@Setter"},"onMouseLeave":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6a5fcabb3a34c57f2ac6b34a"}},"key":{"component":"data2-core-primitives@String","params":{"content":"hovered"}}}},"value":{"params":{"content":false},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-types@Setter"},"hide":{"component":"data2-core-primitives@Boolean","params":{"content":false}}},"updatedAt":"2026-08-04T16:39:44.133Z","createdAt":"2026-07-21T19:39:05.357Z"},{"_id":"6a5fcabb3a34c57f2ac6b34b","parent":"6a5fcabb3a34c57f2ac6b34a","component":"data2-blocks@Html","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":25,"height":27,"exactWidth":24.72,"exactHeight":27.1}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":"18","y":"8","exactX":false,"exactY":false}},"filter":[{"component":"data2-core-types@BitmapFilter","params":{"type":"invert","unit":"%","value":100}}]},"text":{"component":"data2-core-primitives@String","params":{"content":"<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"100%\" height=\"100%\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"feather feather-user-plus\"><path d=\"M16 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2\"></path><circle cx=\"8.5\" cy=\"7\" r=\"4\"></circle><line x1=\"20\" y1=\"8\" x2=\"20\" y2=\"14\"></line><line x1=\"23\" y1=\"11\" x2=\"17\" y2=\"11\"></line></svg>"}}},"updatedAt":"2026-08-04T16:39:01.067Z","createdAt":"2026-07-21T19:39:05.357Z"},{"_id":"6a5fcabb3a34c57f2ac6b34c","parent":"6a5fcabb3a34c57f2ac6b34a","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":279,"height":36,"exactWidth":278.74,"exactHeight":36}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":57,"y":2,"exactX":57.26,"exactY":false}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"left","textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"Fechar versão e compartilhar"}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"hide":{"component":"data2-core-primitives@Boolean","params":{"content":false}}},"updatedAt":"2026-08-04T16:38:52.133Z","createdAt":"2026-07-21T19:39:05.357Z"},{"_id":"6a5fcc983a34c57f2ac6b358","parent":"6a5fcabb3a34c57f2ac6b344","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"9"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":40,"height":40,"exactWidth":40,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":-60,"y":0,"exactX":false,"exactY":false,"top":true}},"children":{"locked":true},"hide":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"updatedAt":"2026-07-31T08:28:53.691Z","createdAt":"2026-07-21T19:47:03.779Z"},{"_id":"6a5fcc983a34c57f2ac6b359","parent":"6a5fcc983a34c57f2ac6b358","component":"data2-blocks@Html","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":28,"height":29,"exactWidth":28,"exactHeight":29}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":6,"y":6,"exactX":false,"exactY":false}},"opacity":{"disabled":false,"component":"data2-core-types@Opacity","params":{"value":43}}},"text":{"component":"data2-core-primitives@String","params":{"content":"<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\" class=\"size-6\">\n  <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9.879 7.519c1.171-1.025 3.071-1.025 4.242 0 1.172 1.025 1.172 2.687 0 3.712-.203.179-.43.326-.67.442-.745.361-1.45.999-1.45 1.827v.75M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9 5.25h.008v.008H12v-.008Z\" />\n</svg>\n"}}},"updatedAt":"2026-07-21T19:47:09.142Z","createdAt":"2026-07-21T19:47:03.779Z"},{"_id":"6a621818ae79ef246a75772d","parent":"6a621818ae79ef246a75772c","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":566,"height":265,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":false,"exactY":false,"fixed":false}},"text":""},"index":2,"updatedAt":"2026-07-23T13:33:52.216Z","createdAt":"2026-07-23T13:33:52.216Z"},{"_id":"6a621818ae79ef246a75772e","parent":"6a621818ae79ef246a75772d","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":580,"height":20,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":19,"exactX":false,"exactY":false,"top":true,"left":false}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left"}},"text":{"component":"data2-core-primitives@String","params":{"content":"Span por setor (CBS) — base + entrantes"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":17}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(94,94,94,1)"}}},"updatedAt":"2026-07-23T13:33:52.216Z","createdAt":"2026-07-23T13:33:52.216Z"},{"_id":"6a621818ae79ef246a75772f","parent":"6a621818ae79ef246a75772d","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":566,"height":30,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":60,"exactX":false,"exactY":false,"fixed":false}}},"updatedAt":"2026-07-23T13:33:52.216Z","createdAt":"2026-07-23T13:33:52.216Z"},{"_id":"6a621818ae79ef246a757730","parent":"6a621818ae79ef246a75772f","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":46,"height":30,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":false,"exactY":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"3504"}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"left","textOverflow":false,"verticalAlignment":"middle","fontWeight":700}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(71,85,105,1)"}}},"updatedAt":"2026-07-23T13:33:52.216Z","createdAt":"2026-07-23T13:33:52.216Z"},{"_id":"6a621818ae79ef246a757731","parent":"6a621818ae79ef246a75772f","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"7"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(71,85,105,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":484,"height":30,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":50,"y":0,"exactX":false,"exactY":false}}},"updatedAt":"2026-07-23T13:33:52.216Z","createdAt":"2026-07-23T13:33:52.216Z"},{"_id":"6a621818ae79ef246a757732","parent":"6a621818ae79ef246a75772f","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":46,"height":30,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":520,"y":0,"exactX":false,"exactY":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"1.648"}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"right","textOverflow":false,"verticalAlignment":"middle"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(137,137,137,1)"}}},"updatedAt":"2026-07-23T13:33:52.216Z","createdAt":"2026-07-23T13:33:52.216Z"},{"_id":"6a621818ae79ef246a757733","parent":"6a621818ae79ef246a75772d","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":580,"height":30,"exactWidth":false,"exactHeight":30}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":10,"exactX":false,"exactY":false,"fixed":false}}},"updatedAt":"2026-07-23T13:33:52.216Z","createdAt":"2026-07-23T13:33:52.216Z"},{"_id":"6a621818ae79ef246a757734","parent":"6a621818ae79ef246a757733","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":46,"height":30,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":false,"exactY":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"3504"}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"left","textOverflow":false,"verticalAlignment":"middle","fontWeight":700}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(71,85,105,1)"}}},"updatedAt":"2026-07-23T13:33:52.216Z","createdAt":"2026-07-23T13:33:52.216Z"},{"_id":"6a621818ae79ef246a757735","parent":"6a621818ae79ef246a757733","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"7"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(71,85,105,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":484,"height":30,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":50,"y":0,"exactX":false,"exactY":false}}},"updatedAt":"2026-07-23T13:33:52.216Z","createdAt":"2026-07-23T13:33:52.216Z"},{"_id":"6a621818ae79ef246a757736","parent":"6a621818ae79ef246a757733","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":46,"height":30,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":534,"y":0,"exactX":false,"exactY":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"1.648"}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"right","textOverflow":false,"verticalAlignment":"middle"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(137,137,137,1)"}}},"updatedAt":"2026-07-23T13:33:52.216Z","createdAt":"2026-07-23T13:33:52.216Z"},{"_id":"6a62184aae79ef246a757737","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"HubSimulatorModelButtons","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":566,"height":100,"exactWidth":false,"exactHeight":false}},"componentClass":{"disabled":false,"component":"data2-core-types@ComponentClass","params":{}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"reference":"ONebofT7KQiRJeb0mlziC","updatedAt":"2026-07-23T23:06:00.531Z","createdAt":"2026-07-23T13:34:37.031Z"},{"_id":"6a62184aae79ef246a75773e","parent":"6a62184aae79ef246a757737","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":566,"height":100,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"left":true,"exactX":false,"exactY":false,"top":true,"fixed":false,"right":false,"growH":false}},"childrenMode":"cols","childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"index":2,"updatedAt":"2026-07-23T17:09:27.687Z","createdAt":"2026-07-23T13:34:37.750Z"},{"_id":"6a62184aae79ef246a75773f","parent":"6a62184aae79ef246a75773e","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":360,"height":40,"exactWidth":359.59999999999997}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":60,"exactX":false,"exactY":false,"top":true,"fixed":false,"left":true}},"border":{"component":"data2-core-types@Border","params":{"color":"#e6e6e6","radius":{"leftTop":"9"},"width":{"left":"1","top":"1","right":"1","bottom":"1"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"text":"","shadow":[{"component":"data2-core-types@Shadow","params":{"type":"outset","offsetY":"2","blur":"2","color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(202,202,202,1)"}},"spread":"0"}}],"cursor":"pointer"},"updatedAt":"2026-07-23T19:45:43.809Z","createdAt":"2026-07-23T13:34:37.750Z"},{"_id":"6a62184aae79ef246a757740","parent":"6a62184aae79ef246a75773f","component":"data2-blocks@Html","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":24,"height":24,"exactWidth":24.32,"exactHeight":24.02}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":20,"y":7,"exactX":false,"exactY":false,"left":true}},"opacity":{"disabled":false,"component":"data2-core-types@Opacity","params":{"value":43}}},"text":{"component":"data2-core-primitives@String","params":{"content":"<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"feather feather-star\"><polygon points=\"12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2\"></polygon></svg>"}}},"updatedAt":"2026-07-24T16:23:31.211Z","createdAt":"2026-07-23T13:34:37.750Z"},{"_id":"6a62184aae79ef246a757741","parent":"6a62184aae79ef246a75773f","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":326,"height":38,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":32,"y":0,"exactX":false,"exactY":false,"left":true,"top":true,"right":true,"growH":false}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"center","textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"Modelo ÓTIMO (equilibrio + quebra)"}}},"updatedAt":"2026-07-24T16:23:49.551Z","createdAt":"2026-07-23T13:34:37.750Z"},{"_id":"6a62184aae79ef246a757742","parent":"6a62184aae79ef246a75773e","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":196,"height":40,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":20,"y":60,"exactX":false,"exactY":false,"top":true,"fixed":false,"left":true}},"border":{"component":"data2-core-types@Border","params":{"color":"#e6e6e6","radius":{"leftTop":"9"},"width":{"left":"1","top":"1","right":"1","bottom":"1"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"text":"","shadow":[{"component":"data2-core-types@Shadow","params":{"type":"outset","offsetY":"2","blur":"2","color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(202,202,202,1)"}},"spread":"0"}}],"cursor":"pointer"},"updatedAt":"2026-07-23T19:45:46.000Z","createdAt":"2026-07-23T13:34:37.750Z"},{"_id":"6a62184aae79ef246a757743","parent":"6a62184aae79ef246a757742","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":194,"height":38,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":false,"exactY":false,"left":true,"top":true,"right":true,"growH":false,"bottom":true,"growV":false}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"center","textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"Por adjacência"}}},"updatedAt":"2026-07-23T17:08:35.486Z","createdAt":"2026-07-23T13:34:37.750Z"},{"_id":"6a62184fae79ef246a757744","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"HubSimulatorStats","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":566,"height":200,"exactWidth":false,"exactHeight":200}},"componentClass":{"disabled":false,"component":"data2-core-types@ComponentClass","params":{}},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"reference":"gm34nI8iHui1SSuwobYTT","updatedAt":"2026-07-23T23:46:42.302Z","createdAt":"2026-07-23T13:34:44.051Z"},{"_id":"6a621854ae79ef246a757758","parent":"6a62184fae79ef246a757744","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":566,"height":200,"exactWidth":false,"exactHeight":200,"growHeightWithContent":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"left":true,"exactX":false,"exactY":false,"top":true,"fixed":false,"right":true,"growH":false}},"childrenMode":"rows"},"index":3,"updatedAt":"2026-07-23T16:53:54.498Z","createdAt":"2026-07-23T13:34:49.593Z"},{"_id":"6a621854ae79ef246a757759","parent":"6a6246ba203e921fd2513b01","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"13"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":160,"height":90,"exactWidth":160,"exactHeight":90}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":false,"exactY":false,"fixed":false,"top":true,"left":true}},"text":"","fill":{"disabled":false,"component":"data2-core-types@Fill","params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(247,247,251,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]}},"style":{"flex":{"component":"data2-core-primitives@String","params":{"content":"1"}}}},"updatedAt":"2026-07-23T16:53:25.369Z","createdAt":"2026-07-23T13:34:49.593Z"},{"_id":"6a621854ae79ef246a75775a","parent":"6a621854ae79ef246a757759","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":103,"height":42,"exactWidth":102.80000000000001,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":20,"y":10,"exactX":false,"exactY":false,"left":true}},"text":{"params":{"components":{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"2A0QvRsDzftCYYnjJ_hIe"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"mapper":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"m"}}],"body":{"params":{"content":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m.CBs"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-primitives@Number","break":true}}}},"component":"data2-core-functions@ArrayMap"}},"component":"data2-core-numerical-operators@Add"},"textSize":{"component":"data2-core-primitives@Number","params":{"content":22}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}}},"updatedAt":"2026-07-29T13:53:39.636Z","createdAt":"2026-07-23T13:34:49.593Z"},{"_id":"6a621854ae79ef246a75775b","parent":"6a621854ae79ef246a757759","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":140,"height":32,"exactWidth":140,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":20,"y":"45","exactX":false,"exactY":false,"left":true,"right":true,"growH":false}},"text":{"params":{"portions":[{"component":"data2-core-primitives@String","params":{"content":"CBs no setor "}},{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Y0MVeSB0t_bjBEppVYgQJ"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.setor"}}}}]},"component":"data2-core-functions@StringConcat"},"textSize":{"component":"data2-core-primitives@Number","params":{"content":14}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"bottom"}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(94,94,94,1)"}}},"updatedAt":"2026-07-29T13:51:44.965Z","createdAt":"2026-07-23T13:34:49.593Z"},{"_id":"6a621854ae79ef246a75775c","parent":"6a6246ba203e921fd2513b01","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"13"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":160,"height":90,"exactWidth":160,"exactHeight":90}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":20,"y":0,"exactX":false,"exactY":false,"fixed":false,"top":true,"left":true}},"text":"","fill":{"disabled":false,"component":"data2-core-types@Fill","params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(247,247,251,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]}},"style":{"flex":{"component":"data2-core-primitives@String","params":{"content":"1"}}},"hide":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"updatedAt":"2026-07-29T13:53:49.264Z","createdAt":"2026-07-23T13:34:49.593Z"},{"_id":"6a621854ae79ef246a75775d","parent":"6a621854ae79ef246a75775c","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":103,"height":42,"exactWidth":102.80000000000001,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":20,"y":10,"exactX":false,"exactY":false,"left":true}},"text":{"component":"data2-core-primitives@String","params":{"content":"1.468"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":22}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}}},"updatedAt":"2026-07-23T17:07:35.939Z","createdAt":"2026-07-23T13:34:49.593Z"},{"_id":"6a621854ae79ef246a75775e","parent":"6a621854ae79ef246a75775c","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":140,"height":32,"exactWidth":140,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":20,"y":45,"exactX":false,"exactY":false,"left":true,"right":true,"growH":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"Desequilíbrio (máx−mín CBs)"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":14}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"bottom"}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(94,94,94,1)"}}},"updatedAt":"2026-07-23T23:10:40.869Z","createdAt":"2026-07-23T13:34:49.593Z"},{"_id":"6a621854ae79ef246a75775f","parent":"6a6246ba203e921fd2513b01","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"13"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":160,"height":90,"exactWidth":160,"exactHeight":90}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":20,"y":0,"exactX":false,"exactY":false,"fixed":false,"top":true,"left":true}},"text":"","fill":{"disabled":false,"component":"data2-core-types@Fill","params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(247,247,251,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]}},"style":{"flex":{"component":"data2-core-primitives@String","params":{"content":"1"}}},"hide":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"updatedAt":"2026-07-29T13:53:49.229Z","createdAt":"2026-07-23T13:34:49.593Z"},{"_id":"6a621854ae79ef246a757760","parent":"6a621854ae79ef246a75775f","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":103,"height":42,"exactWidth":102.80000000000001,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":20,"y":10,"exactX":false,"exactY":false,"left":true}},"text":{"component":"data2-core-primitives@String","params":{"content":"1.468"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":22}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}}},"updatedAt":"2026-07-23T17:07:35.900Z","createdAt":"2026-07-23T13:34:49.593Z"},{"_id":"6a621854ae79ef246a757761","parent":"6a621854ae79ef246a75775f","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":140,"height":32,"exactWidth":140,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":20,"y":45,"exactX":false,"exactY":false,"left":true,"right":true,"growH":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"CBs realocadas"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":14}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"bottom"}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(94,94,94,1)"}}},"updatedAt":"2026-07-23T23:10:42.751Z","createdAt":"2026-07-23T13:34:49.593Z"},{"_id":"6a621854ae79ef246a757762","parent":"6a621854ae79ef246a757758","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"13"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":566,"height":90,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":20,"exactX":false,"exactY":false,"fixed":false,"top":true,"left":true,"right":true,"growH":false}},"text":"","fill":{"disabled":false,"component":"data2-core-types@Fill","params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(247,247,251,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]}},"hide":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"index":1,"updatedAt":"2026-07-29T13:53:49.229Z","createdAt":"2026-07-23T13:34:49.593Z"},{"_id":"6a621854ae79ef246a757763","parent":"6a621854ae79ef246a757762","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":546,"height":70,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":19,"y":21,"exactX":19.02,"exactY":20.99,"left":true}},"text":{"component":"data2-core-primitives@String","params":{"content":"3287, 3360, 3258, 3290, 3445"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":22}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"top"}}},"updatedAt":"2026-07-23T23:44:03.289Z","createdAt":"2026-07-23T13:34:49.593Z"},{"_id":"6a621854ae79ef246a757764","parent":"6a621854ae79ef246a757762","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":528,"height":32,"exactWidth":528.0600000000001,"exactHeight":32}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":22,"y":45,"exactX":false,"exactY":false,"left":true}},"text":{"component":"data2-core-primitives@String","params":{"content":"Setor sem líder herdada"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":14}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"bottom"}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(94,94,94,1)"}}},"updatedAt":"2026-07-23T23:10:47.958Z","createdAt":"2026-07-23T13:34:49.593Z"},{"_id":"6a62185bae79ef246a757765","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"HubSimulatorSpanPerSector","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":566,"height":275,"exactWidth":false,"exactHeight":275}},"componentClass":{"disabled":false,"component":"data2-core-types@ComponentClass","params":{}},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"reference":"PCOvC0KQdskFojBsWZBfd","updatedAt":"2026-07-24T01:03:55.933Z","createdAt":"2026-07-23T13:34:54.039Z"},{"_id":"6a62185eae79ef246a757771","parent":"6a62185bae79ef246a757765","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"13"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":566,"height":275,"exactWidth":false,"exactHeight":false,"growHeightWithContent":true}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":false,"exactY":false,"fixed":false,"right":true,"top":true,"left":true,"growH":false}},"text":"","fill":{"disabled":false,"component":"data2-core-types@Fill","params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(247,247,251,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]}}},"index":4,"updatedAt":"2026-07-29T14:01:31.160Z","createdAt":"2026-07-23T13:34:57.058Z"},{"_id":"6a62185eae79ef246a757772","parent":"6a62185eae79ef246a757771","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":566,"height":265,"exactWidth":false,"exactHeight":false,"growHeightWithContent":true}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":false,"exactY":false,"fixed":false,"left":true,"top":true,"right":true,"growH":false}},"text":""},"index":2,"updatedAt":"2026-07-23T17:23:48.988Z","createdAt":"2026-07-23T13:34:57.058Z"},{"_id":"6a62185eae79ef246a757773","parent":"6a62185eae79ef246a757772","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#d6d6d6","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":20,"y":20,"exactX":20,"exactY":20,"top":true,"left":true,"right":true,"growH":false}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left"}},"text":{"component":"data2-core-primitives@String","params":{"content":"Span por setor (CBS) — base + entrantes"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":14}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(94,94,94,1)"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":546,"height":28,"exactWidth":false,"exactHeight":false}}},"updatedAt":"2026-07-24T01:01:41.370Z","createdAt":"2026-07-23T13:34:57.058Z"},{"_id":"6a62185eae79ef246a757774","parent":"6a624de8203e921fd2513b0a","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":566,"height":35,"exactWidth":false,"exactHeight":35}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":10,"exactX":false,"exactY":false,"fixed":false,"left":true,"top":true,"right":true,"growH":false}},"text":""},"updatedAt":"2026-07-29T14:01:35.266Z","createdAt":"2026-07-23T13:34:57.058Z"},{"_id":"6a62185eae79ef246a757775","parent":"6a62185eae79ef246a757774","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":82,"height":29,"exactWidth":82.11,"exactHeight":29.32}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":3,"exactX":false,"exactY":false,"left":true}},"text":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"sRepeater"}}},"component":"data2-core-types@Reference"},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"center","textOverflow":false,"verticalAlignment":"middle","fontWeight":700}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(71,85,105,1)"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"19"}}},"updatedAt":"2026-07-29T13:59:16.655Z","createdAt":"2026-07-23T13:34:57.058Z"},{"_id":"6a62185eae79ef246a757776","parent":"6a62185eae79ef246a757774","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"disabled":false,"component":"data2-core-types@Border","params":{"radius":{"leftTop":"9"},"width":{"top":"0","bottom":"0","left":"0","right":"0"},"color":"#9a9b9c"}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(71,85,105,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":400,"height":35,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":83,"y":0,"exactX":false,"exactY":false,"left":true,"top":true,"right":true,"growH":false}},"childrenMode":"reversed-cols"},"updatedAt":"2026-07-24T01:40:24.181Z","createdAt":"2026-07-23T13:34:57.058Z"},{"_id":"6a62185eae79ef246a757777","parent":"6a62185eae79ef246a757774","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":63,"height":17,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":483,"y":0,"exactX":false,"exactY":false,"right":true,"top":true}},"text":{"component":"data2-core-primitives@String","params":{"content":"1.648"}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"right","textOverflow":false,"verticalAlignment":"middle"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"19"}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(137,137,137,1)"}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"updatedAt":"2026-07-24T01:42:43.068Z","createdAt":"2026-07-23T13:34:57.058Z"},{"_id":"6a62187aae79ef246a75777c","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"HubSimulatorMap","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":640,"height":440,"exactWidth":640,"exactHeight":440}},"componentClass":{"disabled":false,"component":"data2-core-types@ComponentClass","params":{}},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"reference":"ScMFTr5OoTTcfjDdfP0uw","updatedAt":"2026-07-23T23:06:11.856Z","createdAt":"2026-07-23T13:35:25.923Z"},{"_id":"6a62187bae79ef246a75777e","parent":"6a62187aae79ef246a75777c","component":"data2-blocks@IframeBlock","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"0"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":640,"height":440,"exactWidth":640,"exactHeight":440}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":0,"exactY":0,"left":true,"top":true,"bottom":true,"growV":false,"growH":false,"right":true}}},"url":{"component":"data2-core-primitives@String","params":{"content":"https://map.lucca-office.next.data2.app/?assignments=campinas:´valinhos:&colors=setora:67bd5b´sertorb:5aa9d6&groups=setora´setorb&municipio=Campinas&neighborUfs=SP&ufs=SP"}}},"index":1,"updatedAt":"2026-08-04T18:28:09.089Z","createdAt":"2026-07-23T13:35:26.690Z"},{"_id":"6a621885ae79ef246a75777f","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"HubSimulatorModeSelect","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":172,"height":60,"exactWidth":172.39,"exactHeight":60}},"componentClass":{"disabled":false,"component":"data2-core-types@ComponentClass","params":{}},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"reference":"O4-zOAoAC9BwIp-XZ0ekO","updatedAt":"2026-07-23T23:05:59.421Z","createdAt":"2026-07-23T13:35:36.832Z"},{"_id":"6a621887ae79ef246a757787","parent":"6a621885ae79ef246a75777f","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":172,"height":60,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":false,"exactY":false,"top":true,"left":true,"right":false}},"text":"","textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"children":{"locked":true}},"index":0,"updatedAt":"2026-07-23T16:55:21.489Z","createdAt":"2026-07-23T13:35:38.026Z"},{"_id":"6a621887ae79ef246a757788","parent":"6a621887ae79ef246a757787","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":172,"height":30,"exactHeight":false,"exactWidth":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":30,"exactX":false,"exactY":false}},"text":""},"updatedAt":"2026-07-23T16:55:24.323Z","createdAt":"2026-07-23T13:35:38.026Z"},{"_id":"6a621887ae79ef246a757789","parent":"6a621887ae79ef246a757788","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"9"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":145,"height":30,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":27,"y":0,"exactX":false,"exactY":false,"left":true}},"text":{"component":"data2-core-primitives@String","params":{"content":"ASIS (hoje)"}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left"}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(26,26,26,1)"}}},"updatedAt":"2026-07-23T16:55:43.720Z","createdAt":"2026-07-23T13:35:38.026Z"},{"_id":"6a621887ae79ef246a75778a","parent":"6a621887ae79ef246a757788","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#eeeeee","radius":{"leftTop":"999"},"width":{"left":"1","top":"1","right":"1","bottom":"1"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":16,"height":16,"exactWidth":16,"exactHeight":16}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":7,"exactX":false,"exactY":false}},"text":""},"updatedAt":"2026-07-23T13:35:38.026Z","createdAt":"2026-07-23T13:35:38.026Z"},{"_id":"6a621887ae79ef246a75778b","parent":"6a621887ae79ef246a757787","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":172,"height":30,"exactHeight":false,"exactWidth":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":false,"exactY":false}}},"updatedAt":"2026-07-23T16:55:23.793Z","createdAt":"2026-07-23T13:35:38.026Z"},{"_id":"6a621887ae79ef246a75778c","parent":"6a621887ae79ef246a75778b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":145,"height":30,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":27,"y":0,"exactX":false,"exactY":false,"left":true}},"text":{"component":"data2-core-primitives@String","params":{"content":"TOBE (simulação)"}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left"}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(26,26,26,1)"}}},"updatedAt":"2026-07-23T16:55:39.009Z","createdAt":"2026-07-23T13:35:38.026Z"},{"_id":"6a621887ae79ef246a75778d","parent":"6a621887ae79ef246a75778b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#007aff","radius":{"leftTop":"999"},"width":{"left":"4","top":"4","right":"4","bottom":"4"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(250,250,250,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":16,"height":16,"exactWidth":16,"exactHeight":16}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":7,"exactX":false,"exactY":false}},"text":""},"updatedAt":"2026-07-23T13:35:38.026Z","createdAt":"2026-07-23T13:35:38.026Z"},{"_id":"6a6223b00ff5a8d431e8cec0","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"HubSimulatorInfoModeHeader","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":640,"height":40,"exactWidth":false,"exactHeight":false}},"componentClass":{"disabled":false,"component":"data2-core-types@ComponentClass","params":{}},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"reference":"1S_fB3hvzwUro47iuZ55p","updatedAt":"2026-07-23T23:06:10.392Z","createdAt":"2026-07-23T14:23:15.251Z"},{"_id":"6a6223b10ff5a8d431e8cec6","parent":"6a6223b00ff5a8d431e8cec0","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":640,"height":40,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"left":true,"exactX":false,"exactY":false,"top":true,"fixed":false,"right":true,"growH":false}},"childrenMode":"cols","textFormat":{"disabled":true,"component":"data2-core-types@TextFormat","params":{}},"border":{"disabled":false,"component":"data2-core-types@Border","params":{"radius":{"leftTop":"9"}}},"fill":{"disabled":false,"component":"data2-core-types@Fill","params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(231,232,232,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]}}},"index":2,"updatedAt":"2026-07-23T14:23:17.445Z","createdAt":"2026-07-23T14:23:17.445Z"},{"_id":"6a6223b10ff5a8d431e8cec7","parent":"6a6223b10ff5a8d431e8cec6","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"7"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":136,"height":36,"exactWidth":136,"exactHeight":36}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"2","y":2,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"center","textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"Matriz ASIS"}},"fill":{"params":{"then":{"disabled":false,"component":"data2-core-types@Fill","params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]}},"compare":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kfqDiL83O6CTlKOfellwq"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.additionalInfo"}}}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kfqDiL83O6CTlKOfellwq"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.additionalInfo"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"matriz"}}},"component":"data2-core-comparison-operators@Equal"}]},"component":"data2-core-logical-operators@Or"},"else":{"params":{"else":{"disabled":false,"component":"data2-core-types@Fill","params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,0)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]}},"then":{"disabled":false,"component":"data2-core-types@Fill","params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0.1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]}},"compare":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6a6223b10ff5a8d431e8cec7"}},"key":{"component":"data2-core-primitives@String","params":{"content":"hovered"}}}}}}},"component":"data2-core-flow@If"}},"component":"data2-core-flow@If"},"cursor":"pointer","onMouseDown":{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kfqDiL83O6CTlKOfellwq"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.additionalInfo"}},"value":{"component":"data2-core-primitives@String","params":{"content":"matriz"}}}},"transitions":[{"component":"data2-core-types@Transition","params":{"scope":"ALL","duration":"260","easing":"cubic-bezier(0.09287141498766448,0.500681640625,0.4941872044613487,0.900681640625)"}}],"stateDefinitions":[{"component":"data2-core-user-interface@StateDefinition","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"hovered"}},"component":"data2-core-primitives@Boolean"}}],"onMouseEnter":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6a6223b10ff5a8d431e8cec7"}},"key":{"component":"data2-core-primitives@String","params":{"content":"hovered"}}}},"value":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-types@Setter"},"onMouseLeave":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6a6223b10ff5a8d431e8cec7"}},"key":{"component":"data2-core-primitives@String","params":{"content":"hovered"}}}},"value":{"params":{"content":false},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-types@Setter"}},"updatedAt":"2026-07-24T01:56:42.946Z","createdAt":"2026-07-23T14:23:17.445Z"},{"_id":"6a6223b10ff5a8d431e8cec8","parent":"6a6223b10ff5a8d431e8cec6","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"7"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":357,"height":36,"exactWidth":357,"exactHeight":36}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":3,"y":2,"exactX":3,"exactY":2,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"center","textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"Relatório de impacto (6 ciclos | antes/depois)"}},"fill":{"params":{"then":{"disabled":false,"component":"data2-core-types@Fill","params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]}},"compare":{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kfqDiL83O6CTlKOfellwq"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.additionalInfo"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"relatorio"}}},"component":"data2-core-comparison-operators@Equal"},"else":{"params":{"else":{"disabled":false,"component":"data2-core-types@Fill","params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,0)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]}},"then":{"disabled":false,"component":"data2-core-types@Fill","params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0.1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]}},"compare":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6a6223b10ff5a8d431e8cec8"}},"key":{"component":"data2-core-primitives@String","params":{"content":"hovered"}}}}}}},"component":"data2-core-flow@If"}},"component":"data2-core-flow@If"},"cursor":"pointer","onMouseDown":{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kfqDiL83O6CTlKOfellwq"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.additionalInfo"}},"value":{"component":"data2-core-primitives@String","params":{"content":"relatorio"}}}},"transitions":[{"component":"data2-core-types@Transition","params":{"scope":"ALL","duration":"260","easing":"cubic-bezier(0.09287141498766448,0.500681640625,0.4941872044613487,0.900681640625)"}}],"stateDefinitions":[{"component":"data2-core-user-interface@StateDefinition","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"hovered"}},"component":"data2-core-primitives@Boolean"}}],"onMouseEnter":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6a6223b10ff5a8d431e8cec8"}},"key":{"component":"data2-core-primitives@String","params":{"content":"hovered"}}}},"value":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-types@Setter"},"onMouseLeave":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6a6223b10ff5a8d431e8cec8"}},"key":{"component":"data2-core-primitives@String","params":{"content":"hovered"}}}},"value":{"params":{"content":false},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-types@Setter"}},"updatedAt":"2026-07-24T01:56:55.788Z","createdAt":"2026-07-23T14:23:17.445Z"},{"_id":"6a6223b10ff5a8d431e8cec9","parent":"6a6223b10ff5a8d431e8cec6","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"7"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":137,"height":36,"exactWidth":137,"exactHeight":36}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":3,"y":"2","exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"center","textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"Console SQL"}},"fill":{"params":{"then":{"disabled":false,"component":"data2-core-types@Fill","params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]}},"compare":{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kfqDiL83O6CTlKOfellwq"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.additionalInfo"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"console"}}},"component":"data2-core-comparison-operators@Equal"},"else":{"params":{"else":{"disabled":false,"component":"data2-core-types@Fill","params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,0)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]}},"then":{"disabled":false,"component":"data2-core-types@Fill","params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0.1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]}},"compare":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6a6223b10ff5a8d431e8cec9"}},"key":{"component":"data2-core-primitives@String","params":{"content":"hovered"}}}}}}},"component":"data2-core-flow@If"}},"component":"data2-core-flow@If"},"onClick":{"disabled":true,"component":"data2-core-types@Interaction","params":{}},"onMouseDown":{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kfqDiL83O6CTlKOfellwq"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.additionalInfo"}},"value":{"component":"data2-core-primitives@String","params":{"content":"console"}}}},"cursor":"pointer","transitions":[{"component":"data2-core-types@Transition","params":{"scope":"ALL","duration":"260","easing":"cubic-bezier(0.09287141498766448,0.500681640625,0.4941872044613487,0.900681640625)"}}],"stateDefinitions":[{"component":"data2-core-user-interface@StateDefinition","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"hovered"}},"component":"data2-core-primitives@Boolean"}}],"onMouseEnter":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6a6223b10ff5a8d431e8cec9"}},"key":{"component":"data2-core-primitives@String","params":{"content":"hovered"}}}},"value":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-types@Setter"},"onMouseLeave":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6a6223b10ff5a8d431e8cec9"}},"key":{"component":"data2-core-primitives@String","params":{"content":"hovered"}}}},"value":{"params":{"content":false},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-types@Setter"}},"updatedAt":"2026-07-24T01:56:49.453Z","createdAt":"2026-07-23T14:23:17.445Z"},{"_id":"6a6223b10ff5a8d431e8ceca","parent":"6a6223b10ff5a8d431e8cec6","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(139,139,139,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1,"height":25,"exactWidth":1}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":"499","y":8,"exactX":false,"exactY":false}},"hide":{"params":{"subject":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kfqDiL83O6CTlKOfellwq"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.additionalInfo"}}}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kfqDiL83O6CTlKOfellwq"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.additionalInfo"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"matriz"}}},"component":"data2-core-comparison-operators@Equal"}]},"component":"data2-core-logical-operators@Or"}},"component":"data2-core-logical-operators@Not"}},"updatedAt":"2026-07-23T19:44:48.138Z","createdAt":"2026-07-23T14:23:17.445Z"},{"_id":"6a6223b90ff5a8d431e8cecb","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"HubSimulatorMatrixAsIs","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":640,"height":293,"exactWidth":false,"exactHeight":293.02000000000004}},"componentClass":{"disabled":false,"component":"data2-core-types@ComponentClass","params":{}},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"reference":"L--dVhugwB17-_W00pA7S","updatedAt":"2026-07-23T23:06:15.033Z","createdAt":"2026-07-23T14:23:24.250Z"},{"_id":"6a6223ba0ff5a8d431e8cecd","parent":"6a6223b90ff5a8d431e8cecb","component":"data2-blocks@IframeBlock","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":640,"height":293,"exactWidth":false,"exactHeight":293.02000000000004}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":false,"exactY":false,"bottom":true,"left":true,"top":true,"growV":false,"right":true,"growH":false,"fixed":false}}},"url":{"component":"data2-core-primitives@String","params":{"content":"https://table.lucca-office.next.data2.app/"}}},"updatedAt":"2026-07-23T19:57:57.552Z","createdAt":"2026-07-23T14:23:24.984Z"},{"_id":"6a6233960ff5a8d431e8cef3","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"HubSimulatorGraphBeforeAfter","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":640,"height":293,"exactWidth":false,"exactHeight":293.02000000000004}},"componentClass":{"disabled":false,"component":"data2-core-types@ComponentClass","params":{}},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"reference":"XaKyb6x3qMpZupICoqsnY","updatedAt":"2026-07-23T23:06:13.712Z","createdAt":"2026-07-23T15:31:04.712Z"},{"_id":"6a6246ba203e921fd2513b01","parent":"6a621854ae79ef246a757758","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":566,"height":90,"exactWidth":false,"exactHeight":90}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"fixed":false,"exactX":false,"exactY":false,"left":true,"top":true,"right":true,"growH":false}},"childrenMode":"cols"},"index":0,"updatedAt":"2026-07-23T16:53:20.506Z","createdAt":"2026-07-23T16:52:52.161Z"},{"_id":"6a624de8203e921fd2513b0a","parent":"6a62185eae79ef246a757772","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":564,"height":195,"exactWidth":false,"exactHeight":false,"growHeightWithContent":true}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"1","y":"60","left":true,"exactX":false,"exactY":false,"top":true,"right":true,"growH":false,"bottom":false,"growV":false,"fixed":false}},"repeat":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Y0MVeSB0t_bjBEppVYgQJ"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.setores_destino"}}},"component":"data2-core-types@Getter"},"repeatReference":{"component":"data2-core-primitives@String","params":{"content":"s"}}},"updatedAt":"2026-07-29T14:01:37.848Z","createdAt":"2026-07-23T17:23:23.014Z"},{"_id":"6a62505c203e921fd2513b13","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"1","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768}},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"reference":"xRRdYgqODk_ORFpK8dEyS","updatedAt":"2026-07-23T17:33:53.105Z","createdAt":"2026-07-23T17:33:50.158Z"},{"_id":"6a625061203e921fd2513b14","parent":"6a62505c203e921fd2513b13","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"0":{"value":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m.0"}}},"component":"data2-core-types@Reference"},"key":{"component":"data2-core-types@Getter","params":{"module":{"params":{"text":{"component":"data2-core-primitives@String","params":{"content":"{\n  \"statusCode\": 200,\n  \"body\": {\n    \"data\": {\n      \"statement_id\": \"01f186b4-5219-1851-b455-560a81a049bc\",\n      \"status\": {\n        \"state\": \"SUCCEEDED\"\n      },\n      \"manifest\": {\n        \"format\": \"JSON_ARRAY\",\n        \"schema\": {\n          \"column_count\": 2,\n          \"columns\": [\n            {\n              \"name\": \"uf\",\n              \"type_text\": \"STRING\",\n              \"type_name\": \"STRING\",\n              \"position\": 0\n            },\n            {\n              \"name\": \"n\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 1\n            }\n          ]\n        },\n        \"total_chunk_count\": 1,\n        \"chunks\": [\n          {\n            \"chunk_index\": 0,\n            \"row_offset\": 0,\n            \"row_count\": 8\n          }\n        ],\n        \"total_row_count\": 8,\n        \"truncated\": false\n      },\n      \"result\": {\n        \"chunk_index\": 0,\n        \"row_offset\": 0,\n        \"row_count\": 8,\n        \"data_array\": [\n          [\n            \"BA\",\n            \"2567\"\n          ],\n          [\n            null,\n            \"27\"\n          ],\n          [\n            \"RJ\",\n            \"2\"\n          ],\n          [\n            \"SP\",\n            \"1\"\n          ],\n          [\n            \"AL\",\n            \"1\"\n          ],\n          [\n            \"PR\",\n            \"1\"\n          ],\n          [\n            \"SC\",\n            \"1\"\n          ],\n          [\n            \"MG\",\n            \"1\"\n          ]\n        ]\n      }\n    }\n  },\n  \"timings\": [\n    {\n      \"label\": \"00_defs\",\n      \"dur\": 23.25\n    },\n    {\n      \"label\": \"010_env_bundle\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"011_env_init\",\n      \"dur\": 1534.36\n    },\n    {\n      \"label\": \"012_env_pem\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"01_env\",\n      \"dur\": 1535.87\n    },\n    {\n      \"label\": \"02_setup\",\n      \"dur\": 185.52\n    },\n    {\n      \"label\": \"03_permissions\",\n      \"dur\": 0.03\n    },\n    {\n      \"label\": \"04_op_response\",\n      \"dur\": 11289.41\n    },\n    {\n      \"label\": \"04_op\",\n      \"dur\": 11293.26\n    },\n    {\n      \"label\": \"05_track\",\n      \"dur\": 504.98\n    }\n  ]\n}"}}},"component":"data2-core-functions@JSONParse"},"prop":{"component":"data2-core-primitives@String","params":{"content":"body.data.manifest.schema.columns.0.name"}}}}},"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":false,"exactY":false,"bottom":true,"left":true,"top":true,"growV":false,"right":true,"growH":false}},"childrenMode":"cols"},"updatedAt":"2026-07-24T16:32:01.973Z","createdAt":"2026-07-23T17:33:55.846Z"},{"_id":"6a62506a203e921fd2513b15","parent":"6a625061203e921fd2513b14","component":"data2-blocks@JsonViewer","system":"6a57cfe9673eb7e3c5e57784","displayName":"input","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":503,"height":267,"exactWidth":false,"exactHeight":266.76}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":0,"exactY":0,"fixed":false,"left":true,"top":true,"bottom":true,"growV":false}},"style":{"flex":{"component":"data2-core-primitives@String","params":{"content":"1"}}},"scroll":{"disabled":false,"component":"data2-core-types@Scroll","params":{"y":true}}},"json":{"params":{"text":{"component":"data2-core-primitives@String","params":{"content":"{\n  \"body\": {\n    \"sql\": \"SELECT DS_ESTADO uf, COUNT(*) n FROM product.perfil_cb.crm_perfil_cb_diaria_historico WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR=3487 AND DT_HISTORICO=(SELECT MAX(DT_HISTORICO) FROM product.perfil_cb.crm_perfil_cb_diaria_historico WHERE CD_PAIS=1) GROUP BY DS_ESTADO ORDER BY n DESC\",\n    \"skip_monitoring\": true,\n    \"country\": \"BR\"\n  },\n  \"headers\": null,\n  \"query\": {},\n  \"method\": \"POST\"\n}"}}},"component":"data2-core-functions@JSONParse"},"collapsed":{"component":"data2-core-primitives@Number","params":{"content":99}}},"updatedAt":"2026-08-04T19:07:50.625Z","createdAt":"2026-07-23T17:34:04.477Z"},{"_id":"6a62507e203e921fd2513b17","parent":"6a625061203e921fd2513b14","component":"data2-blocks@JsonViewer","system":"6a57cfe9673eb7e3c5e57784","displayName":"output","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":503,"height":768,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":0,"exactY":0,"fixed":false,"left":true,"top":true,"bottom":true,"growV":false}},"style":{"flex":{"component":"data2-core-primitives@String","params":{"content":"1"}}},"scroll":{"disabled":false,"component":"data2-core-types@Scroll","params":{"y":true}}},"json":{"params":{"text":{"component":"data2-core-primitives@String","params":{"content":"{\n  \"statusCode\": 200,\n  \"body\": {\n    \"data\": {\n      \"statement_id\": \"01f186b4-5219-1851-b455-560a81a049bc\",\n      \"status\": {\n        \"state\": \"SUCCEEDED\"\n      },\n      \"manifest\": {\n        \"format\": \"JSON_ARRAY\",\n        \"schema\": {\n          \"column_count\": 2,\n          \"columns\": [\n            {\n              \"name\": \"uf\",\n              \"type_text\": \"STRING\",\n              \"type_name\": \"STRING\",\n              \"position\": 0\n            },\n            {\n              \"name\": \"n\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 1\n            }\n          ]\n        },\n        \"total_chunk_count\": 1,\n        \"chunks\": [\n          {\n            \"chunk_index\": 0,\n            \"row_offset\": 0,\n            \"row_count\": 8\n          }\n        ],\n        \"total_row_count\": 8,\n        \"truncated\": false\n      },\n      \"result\": {\n        \"chunk_index\": 0,\n        \"row_offset\": 0,\n        \"row_count\": 8,\n        \"data_array\": [\n          [\n            \"BA\",\n            \"2567\"\n          ],\n          [\n            null,\n            \"27\"\n          ],\n          [\n            \"RJ\",\n            \"2\"\n          ],\n          [\n            \"SP\",\n            \"1\"\n          ],\n          [\n            \"AL\",\n            \"1\"\n          ],\n          [\n            \"PR\",\n            \"1\"\n          ],\n          [\n            \"SC\",\n            \"1\"\n          ],\n          [\n            \"MG\",\n            \"1\"\n          ]\n        ]\n      }\n    }\n  },\n  \"timings\": [\n    {\n      \"label\": \"00_defs\",\n      \"dur\": 23.25\n    },\n    {\n      \"label\": \"010_env_bundle\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"011_env_init\",\n      \"dur\": 1534.36\n    },\n    {\n      \"label\": \"012_env_pem\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"01_env\",\n      \"dur\": 1535.87\n    },\n    {\n      \"label\": \"02_setup\",\n      \"dur\": 185.52\n    },\n    {\n      \"label\": \"03_permissions\",\n      \"dur\": 0.03\n    },\n    {\n      \"label\": \"04_op_response\",\n      \"dur\": 11289.41\n    },\n    {\n      \"label\": \"04_op\",\n      \"dur\": 11293.26\n    },\n    {\n      \"label\": \"05_track\",\n      \"dur\": 504.98\n    }\n  ]\n}"}}},"component":"data2-core-functions@JSONParse"},"collapsed":{"component":"data2-core-primitives@Number","params":{"content":99}}},"updatedAt":"2026-07-23T17:36:09.614Z","createdAt":"2026-07-23T17:34:24.888Z"},{"_id":"6a6250f9203e921fd2513b18","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"2","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768}},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"reference":"2VNvSxV2nd-GhIMHuFhIe","updatedAt":"2026-07-23T17:36:29.540Z","createdAt":"2026-07-23T17:36:29.540Z"},{"_id":"6a6250f9203e921fd2513b19","parent":"6a6250f9203e921fd2513b18","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":0,"exactY":0,"bottom":true,"left":true,"top":true,"growV":false,"right":true,"growH":false}},"childrenMode":"cols"},"updatedAt":"2026-07-27T19:55:42.104Z","createdAt":"2026-07-23T17:36:29.540Z"},{"_id":"6a6250f9203e921fd2513b1a","parent":"6a6250f9203e921fd2513b19","component":"data2-blocks@JsonViewer","system":"6a57cfe9673eb7e3c5e57784","displayName":"input","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":503,"height":768,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":0,"exactY":0,"fixed":false,"left":true,"top":true,"bottom":true,"growV":false}},"style":{"flex":{"component":"data2-core-primitives@String","params":{"content":"1"}}},"scroll":{"disabled":false,"component":"data2-core-types@Scroll","params":{"y":true}}},"json":{"params":{"text":{"component":"data2-core-primitives@String","params":{"content":"{\n  \"body\": {\n    \"sql\": \"SELECT DS_MUNICIPIO municipio, DS_NVL_PLAN_CRESC nivel, COUNT(DISTINCT CD_CONSULTORA) cbs\\n      FROM product.perfil_cb.crm_perfil_cb_diaria_historico WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR=3487 AND DS_NVL_PLAN_CRESC IS NOT NULL AND DT_HISTORICO=(SELECT MAX(DT_HISTORICO) FROM product.perfil_cb.crm_perfil_cb_diaria_historico WHERE CD_PAIS=1) GROUP BY DS_MUNICIPIO, DS_NVL_PLAN_CRESC\",\n    \"skip_monitoring\": true,\n    \"country\": \"BR\"\n  },\n  \"headers\": null,\n  \"query\": {},\n  \"method\": \"POST\"\n}"}}},"component":"data2-core-functions@JSONParse"},"collapsed":{"component":"data2-core-primitives@Number","params":{"content":99}}},"updatedAt":"2026-07-23T17:36:41.279Z","createdAt":"2026-07-23T17:36:29.540Z"},{"_id":"6a6250f9203e921fd2513b1b","parent":"6a6250f9203e921fd2513b19","component":"data2-blocks@JsonViewer","system":"6a57cfe9673eb7e3c5e57784","displayName":"output","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":503,"height":768,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":false,"exactY":false,"fixed":false,"left":true,"top":true,"bottom":true,"growV":false}},"style":{"flex":{"component":"data2-core-primitives@String","params":{"content":"1"}}},"scroll":{"disabled":false,"component":"data2-core-types@Scroll","params":{"y":true}}},"json":{"params":{"text":{"component":"data2-core-primitives@String","params":{"content":"{\n  \"statusCode\": 200,\n  \"body\": {\n    \"data\": {\n      \"statement_id\": \"01f186b4-4f0c-1b7d-98cc-47323f8b74c5\",\n      \"status\": {\n        \"state\": \"SUCCEEDED\"\n      },\n      \"manifest\": {\n        \"format\": \"JSON_ARRAY\",\n        \"schema\": {\n          \"column_count\": 3,\n          \"columns\": [\n            {\n              \"name\": \"municipio\",\n              \"type_text\": \"STRING\",\n              \"type_name\": \"STRING\",\n              \"position\": 0\n            },\n            {\n              \"name\": \"nivel\",\n              \"type_text\": \"STRING\",\n              \"type_name\": \"STRING\",\n              \"position\": 1\n            },\n            {\n              \"name\": \"cbs\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 2\n            }\n          ]\n        },\n        \"total_chunk_count\": 1,\n        \"chunks\": [\n          {\n            \"chunk_index\": 0,\n            \"row_offset\": 0,\n            \"row_count\": 81\n          }\n        ],\n        \"total_row_count\": 81,\n        \"truncated\": false\n      },\n      \"result\": {\n        \"chunk_index\": 0,\n        \"row_offset\": 0,\n        \"row_count\": 81,\n        \"data_array\": [\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"Cristal\",\n            \"145\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"Prata\",\n            \"96\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"Bronze\",\n            \"8\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"Diamante\",\n            \"18\"\n          ],\n          [\n            \"SERRINHA\",\n            \"Bronze\",\n            \"1\"\n          ],\n          [\n            \"SAO SEBASTIAO DO PASSE\",\n            \"Cristal\",\n            \"2\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"Bronze\",\n            \"326\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"Diamante\",\n            \"4\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"Prata\",\n            \"3\"\n          ],\n          [\n            \"SAUBARA\",\n            \"Diamante\",\n            \"5\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"Prata\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"Bronze\",\n            \"3\"\n          ],\n          [\n            \"SIMOES FILHO\",\n            \"Bronze\",\n            \"1\"\n          ],\n          [\n            \"RIO DE JANEIRO\",\n            \"Bronze\",\n            \"1\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"Ouro\",\n            \"37\"\n          ],\n          [\n            \"CABOTO\",\n            \"Cristal\",\n            \"2\"\n          ],\n          [\n            \"SERROLANDIA\",\n            \"Bronze\",\n            \"1\"\n          ],\n          [\n            \"IPIAU\",\n            \"Cristal\",\n            \"1\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"Prata\",\n            \"125\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"Ouro\",\n            \"41\"\n          ],\n          [\n            \"SALVADOR\",\n            \"Prata\",\n            \"2\"\n          ],\n          [\n            \"DOCE GRANDE\",\n            \"Ouro\",\n            \"1\"\n          ],\n          [\n            \"ACUPE\",\n            \"Ouro\",\n            \"3\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"Bronze\",\n            \"149\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"Ouro\",\n            \"4\"\n          ],\n          [\n            \"CAROBA\",\n            \"Bronze\",\n            \"14\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"Ouro\",\n            \"26\"\n          ],\n          [\n            \"CAMPINHOS\",\n            \"Cristal\",\n            \"2\"\n          ],\n          [\n            \"CABOTO\",\n            \"Ouro\",\n            \"2\"\n          ],\n          [\n            \"SAO JOAO DA BARRA\",\n            \"Bronze\",\n            \"1\"\n          ],\n          [\n            \"PASSE\",\n            \"Cristal\",\n            \"12\"\n          ],\n          [\n            \"SAUBARA\",\n            \"Ouro\",\n            \"7\"\n          ],\n          [\n            \"PASSE\",\n            \"Prata\",\n            \"4\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"Diamante\",\n            \"8\"\n          ],\n          [\n            \"JOINVILLE\",\n            \"Prata\",\n            \"1\"\n          ],\n          [\n            \"ILHEUS\",\n            \"Cristal\",\n            \"1\"\n          ],\n          [\n            \"SAUBARA\",\n            \"Cristal\",\n            \"61\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"Cristal\",\n            \"5\"\n          ],\n          [\n            \"ACUPE\",\n            \"Prata\",\n            \"9\"\n          ],\n          [\n            null,\n            \"Ouro\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"Ouro\",\n            \"2\"\n          ],\n          [\n            \"MONTE RECONCAVO\",\n            \"Ouro\",\n            \"1\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"Diamante+\",\n            \"1\"\n          ],\n          [\n            \"MARIANA\",\n            \"Cristal\",\n            \"1\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"Prata\",\n            \"163\"\n          ],\n          [\n            null,\n            \"Bronze\",\n            \"9\"\n          ],\n          [\n            \"MACEIO\",\n            \"Cristal\",\n            \"1\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"Ouro\",\n            \"2\"\n          ],\n          [\n            \"GODOY CRUZ\",\n            \"Cristal\",\n            \"1\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"Cristal\",\n            \"266\"\n          ],\n          [\n            \"SALVADOR\",\n            \"Cristal\",\n            \"4\"\n          ],\n          [\n            \"ACUPE\",\n            \"Diamante\",\n            \"1\"\n          ],\n          [\n            \"CAMACARI\",\n            \"Prata\",\n            \"1\"\n          ],\n          [\n            \"CABOTO\",\n            \"Bronze\",\n            \"3\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"Cristal\",\n            \"92\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"Cristal\",\n            \"244\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"Diamante\",\n            \"18\"\n          ],\n          [\n            \"CAROBA\",\n            \"Cristal\",\n            \"14\"\n          ],\n          [\n            \"SAUBARA\",\n            \"Bronze\",\n            \"49\"\n          ],\n          [\n            \"PASSE\",\n            \"Bronze\",\n            \"6\"\n          ],\n          [\n            null,\n            \"Prata\",\n            \"5\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"Diamante+\",\n            \"1\"\n          ],\n          [\n            \"CABOTO\",\n            \"Prata\",\n            \"3\"\n          ],\n          [\n            \"SAO PAULO\",\n            \"Bronze\",\n            \"1\"\n          ],\n          [\n            \"MONTE RECONCAVO\",\n            \"Cristal\",\n            \"1\"\n          ],\n          [\n            \"SANTO ESTEVAO\",\n            \"Prata\",\n            \"1\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"Bronze\",\n            \"88\"\n          ],\n          [\n            \"CAROBA\",\n            \"Prata\",\n            \"7\"\n          ],\n          [\n            null,\n            \"Cristal\",\n            \"10\"\n          ],\n          [\n            \"CAROBA\",\n            \"Ouro\",\n            \"1\"\n          ],\n          [\n            \"TIJUANA\",\n            \"Bronze\",\n            \"1\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"Ouro\",\n            \"77\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"Prata\",\n            \"61\"\n          ],\n          [\n            \"ACUPE\",\n            \"Cristal\",\n            \"34\"\n          ],\n          [\n            \"ENTRE RIOS\",\n            \"Prata\",\n            \"1\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"Cristal\",\n            \"9\"\n          ],\n          [\n            \"ACUPE\",\n            \"Bronze\",\n            \"22\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"Bronze\",\n            \"221\"\n          ],\n          [\n            \"SAUBARA\",\n            \"Prata\",\n            \"33\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"Bronze\",\n            \"9\"\n          ],\n          [\n            \"PASSE\",\n            \"Diamante\",\n            \"1\"\n          ]\n        ]\n      }\n    }\n  },\n  \"timings\": [\n    {\n      \"label\": \"00_defs\",\n      \"dur\": 13.24\n    },\n    {\n      \"label\": \"010_env_bundle\",\n      \"dur\": 0\n    },\n    {\n      \"label\": \"011_env_init\",\n      \"dur\": 1660.32\n    },\n    {\n      \"label\": \"012_env_pem\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"01_env\",\n      \"dur\": 1661.57\n    },\n    {\n      \"label\": \"02_setup\",\n      \"dur\": 149.26\n    },\n    {\n      \"label\": \"03_permissions\",\n      \"dur\": 0.09\n    },\n    {\n      \"label\": \"04_op_response\",\n      \"dur\": 6582.41\n    },\n    {\n      \"label\": \"04_op\",\n      \"dur\": 6582.96\n    },\n    {\n      \"label\": \"05_track\",\n      \"dur\": 514.25\n    }\n  ]\n}"}}},"component":"data2-core-functions@JSONParse"},"collapsed":{"component":"data2-core-primitives@Number","params":{"content":99}}},"updatedAt":"2026-07-27T19:55:46.209Z","createdAt":"2026-07-23T17:36:29.540Z"},{"_id":"6a62510c203e921fd2513b1c","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"3","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768}},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"reference":"ut-bWtXc0IlkmI6YtTw6Z","updatedAt":"2026-07-23T17:36:50.353Z","createdAt":"2026-07-23T17:36:50.353Z"},{"_id":"6a62510c203e921fd2513b1d","parent":"6a62510c203e921fd2513b1c","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":false,"exactY":false,"bottom":true,"left":true,"top":true,"growV":false,"right":true,"growH":false}},"childrenMode":"cols"},"updatedAt":"2026-07-23T17:36:50.353Z","createdAt":"2026-07-23T17:36:50.353Z"},{"_id":"6a62510c203e921fd2513b1e","parent":"6a62510c203e921fd2513b1d","component":"data2-blocks@JsonViewer","system":"6a57cfe9673eb7e3c5e57784","displayName":"input","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":503,"height":768,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":0,"exactY":0,"fixed":false,"left":true,"top":true,"bottom":true,"growV":false}},"style":{"flex":{"component":"data2-core-primitives@String","params":{"content":"1"}}},"scroll":{"disabled":false,"component":"data2-core-types@Scroll","params":{"y":true}}},"json":{"params":{"text":{"component":"data2-core-primitives@String","params":{"content":"{\n  \"body\": {\n    \"sql\": \"SELECT DS_MUNICIPIO municipio, CD_GRUPO grupo, MAX(DS_LEADER_NAME) lider,\\n       COUNT(DISTINCT CD_CONSULTORA) cbs, ROUND(SUM(VL_PEDIDOS_CICLO),0) receita,\\n       ROUND(SUM(VL_PEDIDOS_NATURA_CICLO),0) rec_nat, ROUND(SUM(VL_PEDIDOS_AVON_CICLO),0) rec_avon,\\n       ROUND(SUM(QT_PONTOS_CICLO),0) pontos, ROUND(SUM(QT_PEDIDOS_CICLO),0) pedidos,\\n       SUM(CASE WHEN ST_FEZ_PED_CICLO_ATUAL THEN 1 ELSE 0 END) ativas\\n      FROM product.perfil_cb.crm_perfil_cb_diaria_historico WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR=3487 AND DT_HISTORICO=(SELECT MAX(DT_HISTORICO) FROM product.perfil_cb.crm_perfil_cb_diaria_historico WHERE CD_PAIS=1)\\n      GROUP BY DS_MUNICIPIO, CD_GRUPO\",\n    \"skip_monitoring\": true,\n    \"country\": \"BR\"\n  },\n  \"headers\": null,\n  \"query\": {},\n  \"method\": \"POST\"\n}"}}},"component":"data2-core-functions@JSONParse"},"collapsed":{"component":"data2-core-primitives@Number","params":{"content":99}}},"updatedAt":"2026-07-23T17:36:58.048Z","createdAt":"2026-07-23T17:36:50.353Z"},{"_id":"6a62510c203e921fd2513b1f","parent":"6a62510c203e921fd2513b1d","component":"data2-blocks@JsonViewer","system":"6a57cfe9673eb7e3c5e57784","displayName":"output","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":503,"height":768,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":0,"exactY":0,"fixed":false,"left":true,"top":true,"bottom":true,"growV":false}},"style":{"flex":{"component":"data2-core-primitives@String","params":{"content":"1"}}},"scroll":{"disabled":false,"component":"data2-core-types@Scroll","params":{"y":true}}},"json":{"params":{"text":{"component":"data2-core-primitives@String","params":{"content":"{\n  \"statusCode\": 200,\n  \"body\": {\n    \"data\": {\n      \"statement_id\": \"01f186b4-4f0b-1def-9235-a8ee961f1f68\",\n      \"status\": {\n        \"state\": \"SUCCEEDED\"\n      },\n      \"manifest\": {\n        \"format\": \"JSON_ARRAY\",\n        \"schema\": {\n          \"column_count\": 10,\n          \"columns\": [\n            {\n              \"name\": \"municipio\",\n              \"type_text\": \"STRING\",\n              \"type_name\": \"STRING\",\n              \"position\": 0\n            },\n            {\n              \"name\": \"grupo\",\n              \"type_text\": \"INT\",\n              \"type_name\": \"INT\",\n              \"position\": 1\n            },\n            {\n              \"name\": \"lider\",\n              \"type_text\": \"STRING\",\n              \"type_name\": \"STRING\",\n              \"position\": 2\n            },\n            {\n              \"name\": \"cbs\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 3\n            },\n            {\n              \"name\": \"receita\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 4,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"rec_nat\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 5,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"rec_avon\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 6,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"pontos\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 7,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"pedidos\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 8,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"ativas\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 9\n            }\n          ]\n        },\n        \"total_chunk_count\": 1,\n        \"chunks\": [\n          {\n            \"chunk_index\": 0,\n            \"row_offset\": 0,\n            \"row_count\": 122\n          }\n        ],\n        \"total_row_count\": 122,\n        \"truncated\": false\n      },\n      \"result\": {\n        \"chunk_index\": 0,\n        \"row_offset\": 0,\n        \"row_count\": 122,\n        \"data_array\": [\n          [\n            \"MADRE DE DEUS\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"28\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ACUPE\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"42\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"185\",\n            \"5603\",\n            \"5497\",\n            \"106\",\n            \"938\",\n            \"5\",\n            \"5\"\n          ],\n          [\n            \"SALVADOR\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"21\",\n            \"625\",\n            \"625\",\n            \"0\",\n            \"104\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"11\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MONTE RECONCAVO\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SALVADOR\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ACUPE\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"2\",\n            \"765\",\n            \"483\",\n            \"283\",\n            \"134\",\n            \"2\",\n            \"1\"\n          ],\n          [\n            null,\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO JOAO DA BARRA\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"71\",\n            \"2110\",\n            \"2110\",\n            \"0\",\n            \"335\",\n            \"3\",\n            \"3\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"10\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"3\",\n            \"642\",\n            \"642\",\n            \"0\",\n            \"100\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"21\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"8\",\n            \"140\",\n            \"0\",\n            \"140\",\n            \"25\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"18\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MACEIO\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAMACARI\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CABOTO\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MARIANA\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO ESTEVAO\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"70\",\n            \"527\",\n            \"527\",\n            \"0\",\n            \"81\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"12\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"6\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CABOTO\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"38\",\n            \"319\",\n            \"0\",\n            \"319\",\n            \"77\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"39\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"76\",\n            \"1916\",\n            \"1916\",\n            \"0\",\n            \"279\",\n            \"2\",\n            \"2\"\n          ],\n          [\n            \"CAROBA\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"23\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"137\",\n            \"1595\",\n            \"1595\",\n            \"0\",\n            \"204\",\n            \"2\",\n            \"2\"\n          ],\n          [\n            \"PASSE\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"4\",\n            \"592\",\n            \"592\",\n            \"0\",\n            \"88\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"SAO PAULO\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MONTE RECONCAVO\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAMPINHOS\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"32\",\n            \"537\",\n            \"336\",\n            \"201\",\n            \"78\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"PASSE\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"5\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"36\",\n            \"1614\",\n            \"835\",\n            \"779\",\n            \"267\",\n            \"3\",\n            \"3\"\n          ],\n          [\n            null,\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"3\",\n            \"247\",\n            \"247\",\n            \"0\",\n            \"44\",\n            \"1\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"83\",\n            \"1152\",\n            \"983\",\n            \"170\",\n            \"199\",\n            \"3\",\n            \"3\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"82\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"9\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ACUPE\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"5\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SALVADOR\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"124\",\n            \"9945\",\n            \"5384\",\n            \"4561\",\n            \"1955\",\n            \"6\",\n            \"5\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"34\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"13\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"45\",\n            \"1417\",\n            \"1306\",\n            \"110\",\n            \"213\",\n            \"2\",\n            \"2\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"6\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SIMOES FILHO\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"148\",\n            \"985\",\n            \"985\",\n            \"0\",\n            \"126\",\n            \"2\",\n            \"2\"\n          ],\n          [\n            \"ENTRE RIOS\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"218\",\n            \"503\",\n            \"503\",\n            \"0\",\n            \"88\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"31\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"37\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"5\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"RIO DE JANEIRO\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ILHEUS\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"197\",\n            \"5072\",\n            \"4830\",\n            \"243\",\n            \"890\",\n            \"7\",\n            \"7\"\n          ],\n          [\n            \"ACUPE\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"13\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"114\",\n            \"2394\",\n            \"2394\",\n            \"0\",\n            \"358\",\n            \"2\",\n            \"2\"\n          ],\n          [\n            \"DOCE GRANDE\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"IPIAU\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"89\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"11\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"50\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"10\",\n            \"1715\",\n            \"1715\",\n            \"0\",\n            \"248\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"13\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"5\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAMPINHOS\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SERROLANDIA\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"JOINVILLE\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO SEBASTIAO DO PASSE\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"4\",\n            \"142\",\n            \"0\",\n            \"142\",\n            \"25\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"68\",\n            \"2253\",\n            \"2074\",\n            \"179\",\n            \"361\",\n            \"3\",\n            \"3\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"39\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CABOTO\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CABOTO\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SERRINHA\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO SEBASTIAO DO PASSE\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"19\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"95\",\n            \"343\",\n            \"0\",\n            \"343\",\n            \"67\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"CAROBA\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CABOTO\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ACUPE\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"6\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"GODOY CRUZ\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ACUPE\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SALVADOR\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"TIJUANA\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"5\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ]\n        ]\n      }\n    }\n  },\n  \"timings\": [\n    {\n      \"label\": \"00_defs\",\n      \"dur\": 19.74\n    },\n    {\n      \"label\": \"010_env_bundle\",\n      \"dur\": 0\n    },\n    {\n      \"label\": \"011_env_init\",\n      \"dur\": 837.65\n    },\n    {\n      \"label\": \"012_env_pem\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"01_env\",\n      \"dur\": 838.21\n    },\n    {\n      \"label\": \"02_setup\",\n      \"dur\": 173.69\n    },\n    {\n      \"label\": \"03_permissions\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"04_op_response\",\n      \"dur\": 5844.55\n    },\n    {\n      \"label\": \"04_op\",\n      \"dur\": 5845.13\n    },\n    {\n      \"label\": \"05_track\",\n      \"dur\": 509.89\n    }\n  ]\n}"}}},"component":"data2-core-functions@JSONParse"},"collapsed":{"component":"data2-core-primitives@Number","params":{"content":99}}},"updatedAt":"2026-07-23T17:37:00.449Z","createdAt":"2026-07-23T17:36:50.353Z"},{"_id":"6a625124203e921fd2513b20","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"4","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768}},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"reference":"TYNMHAGuPSWocsX-rKnVk","updatedAt":"2026-07-23T17:37:15.668Z","createdAt":"2026-07-23T17:37:15.668Z"},{"_id":"6a625124203e921fd2513b21","parent":"6a625124203e921fd2513b20","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":false,"exactY":false,"bottom":true,"left":true,"top":true,"growV":false,"right":true,"growH":false}},"childrenMode":"cols"},"updatedAt":"2026-07-23T17:37:15.668Z","createdAt":"2026-07-23T17:37:15.668Z"},{"_id":"6a625124203e921fd2513b22","parent":"6a625124203e921fd2513b21","component":"data2-blocks@JsonViewer","system":"6a57cfe9673eb7e3c5e57784","displayName":"input","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":503,"height":768,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":0,"exactY":0,"fixed":false,"left":true,"top":true,"bottom":true,"growV":false}},"style":{"flex":{"component":"data2-core-primitives@String","params":{"content":"1"}}},"scroll":{"disabled":false,"component":"data2-core-types@Scroll","params":{"y":true}}},"json":{"params":{"text":{"component":"data2-core-primitives@String","params":{"content":"{\n  \"body\": {\n    \"sql\": \"SELECT DS_NVL_PLAN_CRESC nivel, COUNT(DISTINCT CD_CONSULTORA) cbs,\\n       ROUND(SUM(VL_PEDIDOS_NATURA_CICLO),0) rec_nat, ROUND(SUM(VL_PEDIDOS_AVON_CICLO),0) rec_avon\\n      FROM product.perfil_cb.crm_perfil_cb_diaria_historico WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR=3487 AND DS_NVL_PLAN_CRESC IS NOT NULL AND DT_HISTORICO=(SELECT MAX(DT_HISTORICO) FROM product.perfil_cb.crm_perfil_cb_diaria_historico WHERE CD_PAIS=1) GROUP BY DS_NVL_PLAN_CRESC ORDER BY cbs DESC\",\n    \"skip_monitoring\": true,\n    \"country\": \"BR\"\n  },\n  \"headers\": null,\n  \"query\": {},\n  \"method\": \"POST\"\n}"}}},"component":"data2-core-functions@JSONParse"},"collapsed":{"component":"data2-core-primitives@Number","params":{"content":99}}},"updatedAt":"2026-07-23T17:37:22.283Z","createdAt":"2026-07-23T17:37:15.668Z"},{"_id":"6a625124203e921fd2513b23","parent":"6a625124203e921fd2513b21","component":"data2-blocks@JsonViewer","system":"6a57cfe9673eb7e3c5e57784","displayName":"output","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":503,"height":768,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":0,"exactY":0,"fixed":false,"left":true,"top":true,"bottom":true,"growV":false}},"style":{"flex":{"component":"data2-core-primitives@String","params":{"content":"1"}}},"scroll":{"disabled":false,"component":"data2-core-types@Scroll","params":{"y":true}}},"json":{"params":{"text":{"component":"data2-core-primitives@String","params":{"content":"{\n  \"statusCode\": 200,\n  \"body\": {\n    \"data\": {\n      \"statement_id\": \"01f186b4-5013-171b-8d52-724495a18500\",\n      \"status\": {\n        \"state\": \"SUCCEEDED\"\n      },\n      \"manifest\": {\n        \"format\": \"JSON_ARRAY\",\n        \"schema\": {\n          \"column_count\": 4,\n          \"columns\": [\n            {\n              \"name\": \"nivel\",\n              \"type_text\": \"STRING\",\n              \"type_name\": \"STRING\",\n              \"position\": 0\n            },\n            {\n              \"name\": \"cbs\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 1\n            },\n            {\n              \"name\": \"rec_nat\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 2,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"rec_avon\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 3,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            }\n          ]\n        },\n        \"total_chunk_count\": 1,\n        \"chunks\": [\n          {\n            \"chunk_index\": 0,\n            \"row_offset\": 0,\n            \"row_count\": 6\n          }\n        ],\n        \"total_row_count\": 6,\n        \"truncated\": false\n      },\n      \"result\": {\n        \"chunk_index\": 0,\n        \"row_offset\": 0,\n        \"row_count\": 6,\n        \"data_array\": [\n          [\n            \"Bronze\",\n            \"914\",\n            \"4010\",\n            \"1387\"\n          ],\n          [\n            \"Cristal\",\n            \"908\",\n            \"345\",\n            \"170\"\n          ],\n          [\n            \"Prata\",\n            \"517\",\n            \"11682\",\n            \"1381\"\n          ],\n          [\n            \"Ouro\",\n            \"205\",\n            \"9909\",\n            \"283\"\n          ],\n          [\n            \"Diamante\",\n            \"55\",\n            \"6999\",\n            \"0\"\n          ],\n          [\n            \"Diamante+\",\n            \"2\",\n            \"2634\",\n            \"4356\"\n          ]\n        ]\n      }\n    }\n  },\n  \"timings\": [\n    {\n      \"label\": \"00_defs\",\n      \"dur\": 10.08\n    },\n    {\n      \"label\": \"010_env_bundle\",\n      \"dur\": 0\n    },\n    {\n      \"label\": \"011_env_init\",\n      \"dur\": 1691.06\n    },\n    {\n      \"label\": \"012_env_pem\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"01_env\",\n      \"dur\": 1691.68\n    },\n    {\n      \"label\": \"02_setup\",\n      \"dur\": 122.16\n    },\n    {\n      \"label\": \"03_permissions\",\n      \"dur\": 0.02\n    },\n    {\n      \"label\": \"04_op_response\",\n      \"dur\": 5979.52\n    },\n    {\n      \"label\": \"04_op\",\n      \"dur\": 5979.93\n    },\n    {\n      \"label\": \"05_track\",\n      \"dur\": 488.67\n    }\n  ]\n}"}}},"component":"data2-core-functions@JSONParse"},"collapsed":{"component":"data2-core-primitives@Number","params":{"content":99}}},"updatedAt":"2026-07-23T17:37:22.009Z","createdAt":"2026-07-23T17:37:15.668Z"},{"_id":"6a625139203e921fd2513b25","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"5","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768}},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"reference":"_kMBjcWBKBkfgdnNxTk-c","updatedAt":"2026-07-23T17:37:45.848Z","createdAt":"2026-07-23T17:37:45.848Z"},{"_id":"6a625139203e921fd2513b26","parent":"6a625139203e921fd2513b25","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":false,"exactY":false,"bottom":true,"left":true,"top":true,"growV":false,"right":true,"growH":false}},"childrenMode":"cols"},"updatedAt":"2026-07-23T17:37:45.848Z","createdAt":"2026-07-23T17:37:45.848Z"},{"_id":"6a625139203e921fd2513b27","parent":"6a625139203e921fd2513b26","component":"data2-blocks@JsonViewer","system":"6a57cfe9673eb7e3c5e57784","displayName":"input","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":503,"height":768,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":0,"exactY":0,"fixed":false,"left":true,"top":true,"bottom":true,"growV":false}},"style":{"flex":{"component":"data2-core-primitives@String","params":{"content":"1"}}},"scroll":{"disabled":false,"component":"data2-core-types@Scroll","params":{"y":true}}},"json":{"params":{"text":{"component":"data2-core-primitives@String","params":{"content":"{\n  \"body\": {\n    \"sql\": \"SELECT operational_cycle ciclo, COUNT(DISTINCT person_code) cbs,\\n       COUNT(DISTINCT CASE WHEN registered_bc_ind=1 THEN person_code END) ativas,\\n       ROUND(SUM(revenue_nat_ss_amt),0) receita, ROUND(SUM(points_nat_ss_amt),0) pontos\\n      FROM product.elo_modelo_combinado.commercial_consultant_index WHERE country_code=1 AND sector_code=3487 GROUP BY operational_cycle ORDER BY operational_cycle DESC LIMIT 8\",\n    \"skip_monitoring\": true,\n    \"country\": \"BR\"\n  },\n  \"headers\": null,\n  \"query\": {},\n  \"method\": \"POST\"\n}"}}},"component":"data2-core-functions@JSONParse"},"collapsed":{"component":"data2-core-primitives@Number","params":{"content":99}}},"updatedAt":"2026-07-23T17:37:50.074Z","createdAt":"2026-07-23T17:37:45.848Z"},{"_id":"6a625139203e921fd2513b28","parent":"6a625139203e921fd2513b26","component":"data2-blocks@JsonViewer","system":"6a57cfe9673eb7e3c5e57784","displayName":"output","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":503,"height":768,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":0,"exactY":0,"fixed":false,"left":true,"top":true,"bottom":true,"growV":false}},"style":{"flex":{"component":"data2-core-primitives@String","params":{"content":"1"}}},"scroll":{"disabled":false,"component":"data2-core-types@Scroll","params":{"y":true}}},"json":{"params":{"text":{"component":"data2-core-primitives@String","params":{"content":"{\n  \"statusCode\": 200,\n  \"body\": {\n    \"data\": {\n      \"statement_id\": \"01f186b4-5376-1a99-b689-d0a41d1ca86d\",\n      \"status\": {\n        \"state\": \"SUCCEEDED\"\n      },\n      \"manifest\": {\n        \"format\": \"JSON_ARRAY\",\n        \"schema\": {\n          \"column_count\": 5,\n          \"columns\": [\n            {\n              \"name\": \"ciclo\",\n              \"type_text\": \"INT\",\n              \"type_name\": \"INT\",\n              \"position\": 0\n            },\n            {\n              \"name\": \"cbs\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 1\n            },\n            {\n              \"name\": \"ativas\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 2\n            },\n            {\n              \"name\": \"receita\",\n              \"type_text\": \"DOUBLE\",\n              \"type_name\": \"DOUBLE\",\n              \"position\": 3\n            },\n            {\n              \"name\": \"pontos\",\n              \"type_text\": \"DOUBLE\",\n              \"type_name\": \"DOUBLE\",\n              \"position\": 4\n            }\n          ]\n        },\n        \"total_chunk_count\": 1,\n        \"chunks\": [\n          {\n            \"chunk_index\": 0,\n            \"row_offset\": 0,\n            \"row_count\": 8\n          }\n        ],\n        \"total_row_count\": 8,\n        \"truncated\": false\n      },\n      \"result\": {\n        \"chunk_index\": 0,\n        \"row_offset\": 0,\n        \"row_count\": 8,\n        \"data_array\": [\n          [\n            \"202612\",\n            \"2612\",\n            \"2601\",\n            \"52456.0\",\n            \"8343.0\"\n          ],\n          [\n            \"202611\",\n            \"2693\",\n            \"2656\",\n            \"906774.0\",\n            \"155675.0\"\n          ],\n          [\n            \"202610\",\n            \"2656\",\n            \"2630\",\n            \"972685.0\",\n            \"172207.0\"\n          ],\n          [\n            \"202609\",\n            \"2702\",\n            \"2658\",\n            \"940204.0\",\n            \"175128.0\"\n          ],\n          [\n            \"202608\",\n            \"2661\",\n            \"2631\",\n            \"895173.0\",\n            \"158986.0\"\n          ],\n          [\n            \"202607\",\n            \"2622\",\n            \"2614\",\n            \"652192.0\",\n            \"94839.0\"\n          ],\n          [\n            \"202606\",\n            \"2635\",\n            \"2623\",\n            \"1009029.0\",\n            \"163026.0\"\n          ],\n          [\n            \"202605\",\n            \"2631\",\n            \"2603\",\n            \"943406.0\",\n            \"142920.0\"\n          ]\n        ]\n      }\n    }\n  },\n  \"timings\": [\n    {\n      \"label\": \"00_defs\",\n      \"dur\": 26.13\n    },\n    {\n      \"label\": \"010_env_bundle\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"011_env_init\",\n      \"dur\": 1055.96\n    },\n    {\n      \"label\": \"012_env_pem\",\n      \"dur\": 0.02\n    },\n    {\n      \"label\": \"01_env\",\n      \"dur\": 1057.4\n    },\n    {\n      \"label\": \"02_setup\",\n      \"dur\": 610.56\n    },\n    {\n      \"label\": \"03_permissions\",\n      \"dur\": 0.03\n    },\n    {\n      \"label\": \"04_op_response\",\n      \"dur\": 6702.53\n    },\n    {\n      \"label\": \"04_op\",\n      \"dur\": 6703.44\n    },\n    {\n      \"label\": \"05_track\",\n      \"dur\": 609.23\n    }\n  ]\n}"}}},"component":"data2-core-functions@JSONParse"},"collapsed":{"component":"data2-core-primitives@Number","params":{"content":99}}},"updatedAt":"2026-07-23T17:37:51.943Z","createdAt":"2026-07-23T17:37:45.848Z"},{"_id":"6a625155203e921fd2513b2a","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"6","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768}},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"reference":"1GN7ezZlA_SF4B818tdh-","updatedAt":"2026-07-23T17:38:10.171Z","createdAt":"2026-07-23T17:38:00.732Z"},{"_id":"6a625155203e921fd2513b2b","parent":"6a625155203e921fd2513b2a","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":false,"exactY":false,"bottom":true,"left":true,"top":true,"growV":false,"right":true,"growH":false}},"childrenMode":"cols"},"updatedAt":"2026-07-23T17:38:00.732Z","createdAt":"2026-07-23T17:38:00.732Z"},{"_id":"6a625155203e921fd2513b2c","parent":"6a625155203e921fd2513b2b","component":"data2-blocks@JsonViewer","system":"6a57cfe9673eb7e3c5e57784","displayName":"input","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":503,"height":768,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":0,"exactY":0,"fixed":false,"left":true,"top":true,"bottom":true,"growV":false}},"style":{"flex":{"component":"data2-core-primitives@String","params":{"content":"1"}}},"scroll":{"disabled":false,"component":"data2-core-types@Scroll","params":{"y":true}}},"json":{"params":{"text":{"component":"data2-core-primitives@String","params":{"content":"{\n  \"body\": {\n    \"sql\": \"SELECT DS_MUNICIPIO municipio, CD_SETOR setor, COUNT(DISTINCT CD_CONSULTORA) cbs\\n        FROM product.perfil_cb.crm_perfil_cb_diaria_historico WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR<>3487 AND CD_SETOR>0 AND DT_HISTORICO=(SELECT MAX(DT_HISTORICO) FROM product.perfil_cb.crm_perfil_cb_diaria_historico WHERE CD_PAIS=1) AND DS_MUNICIPIO IN ('FORMIGA','CAMACHO','SAO FRANCISCO DE PAULA','SANTANA DO JACARE','CAMPO BELO','CRISTAIS','AMELIA RODRIGUES','SAO SEBASTIAO DO PASSE','SALVADOR','CACHOEIRA','SAO GONCALO DOS CAMPOS','FEIRA DE SANTANA','CONCEICAO DO JACUIPE','SALINAS DA MARGARIDA','MARAGOGIPE') GROUP BY DS_MUNICIPIO, CD_SETOR\",\n    \"skip_monitoring\": true,\n    \"country\": \"BR\"\n  },\n  \"headers\": null,\n  \"query\": {},\n  \"method\": \"POST\"\n}"}}},"component":"data2-core-functions@JSONParse"},"collapsed":{"component":"data2-core-primitives@Number","params":{"content":99}}},"updatedAt":"2026-07-23T17:38:14.871Z","createdAt":"2026-07-23T17:38:00.732Z"},{"_id":"6a625155203e921fd2513b2d","parent":"6a625155203e921fd2513b2b","component":"data2-blocks@JsonViewer","system":"6a57cfe9673eb7e3c5e57784","displayName":"output","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":503,"height":768,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":0,"exactY":0,"fixed":false,"left":true,"top":true,"bottom":true,"growV":false}},"style":{"flex":{"component":"data2-core-primitives@String","params":{"content":"1"}}},"scroll":{"disabled":false,"component":"data2-core-types@Scroll","params":{"y":true}}},"json":{"params":{"text":{"component":"data2-core-primitives@String","params":{"content":"{\n  \"statusCode\": 200,\n  \"body\": {\n    \"data\": {\n      \"statement_id\": \"01f186b4-5aff-18b1-ac79-30605e087987\",\n      \"status\": {\n        \"state\": \"SUCCEEDED\"\n      },\n      \"manifest\": {\n        \"format\": \"JSON_ARRAY\",\n        \"schema\": {\n          \"column_count\": 3,\n          \"columns\": [\n            {\n              \"name\": \"municipio\",\n              \"type_text\": \"STRING\",\n              \"type_name\": \"STRING\",\n              \"position\": 0\n            },\n            {\n              \"name\": \"setor\",\n              \"type_text\": \"INT\",\n              \"type_name\": \"INT\",\n              \"position\": 1\n            },\n            {\n              \"name\": \"cbs\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 2\n            }\n          ]\n        },\n        \"total_chunk_count\": 1,\n        \"chunks\": [\n          {\n            \"chunk_index\": 0,\n            \"row_offset\": 0,\n            \"row_count\": 284\n          }\n        ],\n        \"total_row_count\": 284,\n        \"truncated\": false\n      },\n      \"result\": {\n        \"chunk_index\": 0,\n        \"row_offset\": 0,\n        \"row_count\": 284,\n        \"data_array\": [\n          [\n            \"SALVADOR\",\n            \"3434\",\n            \"3116\"\n          ],\n          [\n            \"SAO SEBASTIAO DO PASSE\",\n            \"3703\",\n            \"400\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3608\",\n            \"4\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3529\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3553\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3417\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3812\",\n            \"2\"\n          ],\n          [\n            \"MARAGOGIPE\",\n            \"3705\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3495\",\n            \"3\"\n          ],\n          [\n            \"MARAGOGIPE\",\n            \"3358\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3730\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3330\",\n            \"1\"\n          ],\n          [\n            \"CACHOEIRA\",\n            \"3471\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3193\",\n            \"1\"\n          ],\n          [\n            \"CAMPO BELO\",\n            \"3544\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3720\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3698\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3832\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3750\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3270\",\n            \"2189\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3321\",\n            \"44\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3602\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3309\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3674\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3272\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3701\",\n            \"2\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3261\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3269\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3327\",\n            \"1\"\n          ],\n          [\n            \"CONCEICAO DO JACUIPE\",\n            \"3292\",\n            \"1\"\n          ],\n          [\n            \"CONCEICAO DO JACUIPE\",\n            \"3492\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3821\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3527\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3358\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3507\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3705\",\n            \"2587\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3639\",\n            \"75\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3417\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3253\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3822\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3466\",\n            \"3\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3801\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3511\",\n            \"4\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3515\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3435\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3551\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3483\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3555\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3571\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3564\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3539\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3800\",\n            \"1\"\n          ],\n          [\n            \"CACHOEIRA\",\n            \"3639\",\n            \"1\"\n          ],\n          [\n            \"CONCEICAO DO JACUIPE\",\n            \"3471\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3632\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3369\",\n            \"3\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3376\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3865\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3667\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3373\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3321\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3691\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3277\",\n            \"1\"\n          ],\n          [\n            \"MARAGOGIPE\",\n            \"3808\",\n            \"279\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3269\",\n            \"10\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3492\",\n            \"5\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3315\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3612\",\n            \"8\"\n          ],\n          [\n            \"SAO SEBASTIAO DO PASSE\",\n            \"3304\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3773\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3328\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3245\",\n            \"1\"\n          ],\n          [\n            \"CACHOEIRA\",\n            \"3830\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3818\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3559\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3292\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3745\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3489\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3399\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3648\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"4012\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3314\",\n            \"2\"\n          ],\n          [\n            \"AMELIA RODRIGUES\",\n            \"3703\",\n            \"275\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3374\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3808\",\n            \"3\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3383\",\n            \"4\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3741\",\n            \"3\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3711\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3341\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3234\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3703\",\n            \"5\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3825\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3794\",\n            \"6\"\n          ],\n          [\n            \"CONCEICAO DO JACUIPE\",\n            \"3847\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3723\",\n            \"1\"\n          ],\n          [\n            \"CACHOEIRA\",\n            \"3667\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3582\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3646\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3304\",\n            \"3\"\n          ],\n          [\n            \"SAO SEBASTIAO DO PASSE\",\n            \"3639\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3338\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3243\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3696\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3389\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3822\",\n            \"2661\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3847\",\n            \"2424\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3540\",\n            \"4\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3820\",\n            \"1\"\n          ],\n          [\n            \"CONCEICAO DO JACUIPE\",\n            \"3703\",\n            \"314\"\n          ],\n          [\n            \"CAMPO BELO\",\n            \"3655\",\n            \"199\"\n          ],\n          [\n            \"SAO FRANCISCO DE PAULA\",\n            \"3509\",\n            \"116\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3644\",\n            \"1\"\n          ],\n          [\n            \"CACHOEIRA\",\n            \"3676\",\n            \"17\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3703\",\n            \"10\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3384\",\n            \"1\"\n          ],\n          [\n            \"AMELIA RODRIGUES\",\n            \"3392\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3608\",\n            \"2\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3706\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3696\",\n            \"3\"\n          ],\n          [\n            \"SAO SEBASTIAO DO PASSE\",\n            \"3219\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3789\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3379\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3667\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3724\",\n            \"1\"\n          ],\n          [\n            \"CACHOEIRA\",\n            \"3622\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3678\",\n            \"2413\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3488\",\n            \"3\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3471\",\n            \"24\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3540\",\n            \"8\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3343\",\n            \"1\"\n          ],\n          [\n            \"CAMPO BELO\",\n            \"3241\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3271\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3309\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3792\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3267\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3572\",\n            \"1\"\n          ],\n          [\n            \"CACHOEIRA\",\n            \"3494\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3206\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3490\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3623\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3754\",\n            \"1\"\n          ],\n          [\n            \"CACHOEIRA\",\n            \"3492\",\n            \"1\"\n          ],\n          [\n            \"SALINAS DA MARGARIDA\",\n            \"3358\",\n            \"205\"\n          ],\n          [\n            \"CACHOEIRA\",\n            \"3808\",\n            \"247\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3348\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3808\",\n            \"18\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3847\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3229\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3823\",\n            \"2\"\n          ],\n          [\n            \"CONCEICAO DO JACUIPE\",\n            \"3773\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3797\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3211\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3672\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3454\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3390\",\n            \"1\"\n          ],\n          [\n            \"SAO GONCALO DOS CAMPOS\",\n            \"3492\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3637\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3770\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3598\",\n            \"1\"\n          ],\n          [\n            \"CACHOEIRA\",\n            \"3723\",\n            \"1\"\n          ],\n          [\n            \"SAO FRANCISCO DE PAULA\",\n            \"3447\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3330\",\n            \"2688\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3781\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3647\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3228\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3442\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3432\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3717\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3436\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3811\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3213\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3690\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3568\",\n            \"1\"\n          ],\n          [\n            \"CONCEICAO DO JACUIPE\",\n            \"3612\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3350\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3704\",\n            \"1\"\n          ],\n          [\n            \"MARAGOGIPE\",\n            \"3639\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3303\",\n            \"1\"\n          ],\n          [\n            \"CONCEICAO DO JACUIPE\",\n            \"3384\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3509\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3328\",\n            \"1\"\n          ],\n          [\n            \"CRISTAIS\",\n            \"3248\",\n            \"1\"\n          ],\n          [\n            \"CACHOEIRA\",\n            \"3703\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3492\",\n            \"3148\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3392\",\n            \"2997\"\n          ],\n          [\n            \"FORMIGA\",\n            \"3221\",\n            \"289\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3552\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3817\",\n            \"3\"\n          ],\n          [\n            \"SAO SEBASTIAO DO PASSE\",\n            \"3347\",\n            \"1\"\n          ],\n          [\n            \"CAMACHO\",\n            \"3655\",\n            \"9\"\n          ],\n          [\n            \"SAO SEBASTIAO DO PASSE\",\n            \"3847\",\n            \"2\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3471\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3237\",\n            \"2\"\n          ],\n          [\n            \"FORMIGA\",\n            \"3688\",\n            \"1\"\n          ],\n          [\n            \"SAO GONCALO DOS CAMPOS\",\n            \"3392\",\n            \"5\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3519\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3367\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3576\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3517\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3398\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3219\",\n            \"1\"\n          ],\n          [\n            \"SAO GONCALO DOS CAMPOS\",\n            \"3612\",\n            \"259\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3217\",\n            \"2942\"\n          ],\n          [\n            \"CACHOEIRA\",\n            \"3568\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3339\",\n            \"1\"\n          ],\n          [\n            \"SAO FRANCISCO DE PAULA\",\n            \"3258\",\n            \"1\"\n          ],\n          [\n            \"CONCEICAO DO JACUIPE\",\n            \"3270\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3418\",\n            \"2\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3566\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3759\",\n            \"1\"\n          ],\n          [\n            \"SAO GONCALO DOS CAMPOS\",\n            \"3754\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3619\",\n            \"1\"\n          ],\n          [\n            \"SALINAS DA MARGARIDA\",\n            \"3270\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3583\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3435\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3560\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3213\",\n            \"1\"\n          ],\n          [\n            \"CRISTAIS\",\n            \"3655\",\n            \"44\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3404\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3263\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3706\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3612\",\n            \"9\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3795\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3488\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3428\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3241\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3416\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3782\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3261\",\n            \"1\"\n          ],\n          [\n            \"SAO FRANCISCO DE PAULA\",\n            \"3805\",\n            \"17\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3281\",\n            \"11\"\n          ],\n          [\n            \"SAO FRANCISCO DE PAULA\",\n            \"3279\",\n            \"13\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3336\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3392\",\n            \"6\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3629\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3381\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3572\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3285\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3358\",\n            \"6\"\n          ],\n          [\n            \"CACHOEIRA\",\n            \"3612\",\n            \"3\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3817\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3387\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3610\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3351\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3830\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3252\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3262\",\n            \"1\"\n          ],\n          [\n            \"SANTANA DO JACARE\",\n            \"3655\",\n            \"18\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3257\",\n            \"2\"\n          ],\n          [\n            \"CRISTAIS\",\n            \"3566\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3738\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3794\",\n            \"7\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3295\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3844\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3744\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3409\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3474\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3466\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3673\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3311\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3407\",\n            \"1\"\n          ],\n          [\n            \"AMELIA RODRIGUES\",\n            \"3808\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3326\",\n            \"1\"\n          ],\n          [\n            \"AMELIA RODRIGUES\",\n            \"3639\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3814\",\n            \"2788\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3391\",\n            \"2378\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3304\",\n            \"3623\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3689\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3764\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3830\",\n            \"7\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3264\",\n            \"3\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3681\",\n            \"6\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3725\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3635\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3208\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3658\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3456\",\n            \"1\"\n          ],\n          [\n            \"SAO SEBASTIAO DO PASSE\",\n            \"3705\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3809\",\n            \"1\"\n          ],\n          [\n            \"MARAGOGIPE\",\n            \"3304\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3434\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"4012\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3336\",\n            \"1\"\n          ],\n          [\n            \"AMELIA RODRIGUES\",\n            \"3471\",\n            \"1\"\n          ]\n        ]\n      }\n    }\n  },\n  \"timings\": [\n    {\n      \"label\": \"00_defs\",\n      \"dur\": 157.81\n    },\n    {\n      \"label\": \"010_env_bundle\",\n      \"dur\": 0\n    },\n    {\n      \"label\": \"011_env_init\",\n      \"dur\": 1374.25\n    },\n    {\n      \"label\": \"012_env_pem\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"01_env\",\n      \"dur\": 1375.67\n    },\n    {\n      \"label\": \"02_setup\",\n      \"dur\": 1386.83\n    },\n    {\n      \"label\": \"03_permissions\",\n      \"dur\": 0.02\n    },\n    {\n      \"label\": \"04_op_response\",\n      \"dur\": 2472.69\n    },\n    {\n      \"label\": \"04_op\",\n      \"dur\": 2473.42\n    },\n    {\n      \"label\": \"05_track\",\n      \"dur\": 562.87\n    }\n  ]\n}"}}},"component":"data2-core-functions@JSONParse"},"collapsed":{"component":"data2-core-primitives@Number","params":{"content":99}}},"updatedAt":"2026-07-23T17:38:16.910Z","createdAt":"2026-07-23T17:38:00.732Z"},{"_id":"6a62516b203e921fd2513b2e","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"7","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768}},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"reference":"ZM29twhL3I368YmpIjkkL","updatedAt":"2026-07-23T17:38:32.532Z","createdAt":"2026-07-23T17:38:32.532Z"},{"_id":"6a62516b203e921fd2513b2f","parent":"6a62516b203e921fd2513b2e","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":false,"exactY":false,"bottom":true,"left":true,"top":true,"growV":false,"right":true,"growH":false}},"childrenMode":"cols"},"updatedAt":"2026-07-23T17:38:32.532Z","createdAt":"2026-07-23T17:38:32.532Z"},{"_id":"6a62516b203e921fd2513b30","parent":"6a62516b203e921fd2513b2f","component":"data2-blocks@JsonViewer","system":"6a57cfe9673eb7e3c5e57784","displayName":"input","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":503,"height":768,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":0,"exactY":0,"fixed":false,"left":true,"top":true,"bottom":true,"growV":false}},"style":{"flex":{"component":"data2-core-primitives@String","params":{"content":"1"}}},"scroll":{"disabled":false,"component":"data2-core-types@Scroll","params":{"y":true}}},"json":{"params":{"text":{"component":"data2-core-primitives@String","params":{"content":"{\n  \"body\": {\n    \"sql\": \"SELECT CD_SETOR setor, DS_NVL_PLAN_CRESC nivel, COUNT(DISTINCT CD_CONSULTORA) cbs\\n      FROM product.perfil_cb.crm_perfil_cb_diaria_historico WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR IN (3655,3808,3221,3703,3304,3612) AND DS_NVL_PLAN_CRESC IS NOT NULL AND DT_HISTORICO=(SELECT MAX(DT_HISTORICO) FROM product.perfil_cb.crm_perfil_cb_diaria_historico WHERE CD_PAIS=1) GROUP BY CD_SETOR, DS_NVL_PLAN_CRESC\",\n    \"skip_monitoring\": true,\n    \"country\": \"BR\"\n  },\n  \"headers\": null,\n  \"query\": {},\n  \"method\": \"POST\"\n}"}}},"component":"data2-core-functions@JSONParse"},"collapsed":{"component":"data2-core-primitives@Number","params":{"content":99}}},"updatedAt":"2026-07-23T17:38:38.953Z","createdAt":"2026-07-23T17:38:32.532Z"},{"_id":"6a62516b203e921fd2513b31","parent":"6a62516b203e921fd2513b2f","component":"data2-blocks@JsonViewer","system":"6a57cfe9673eb7e3c5e57784","displayName":"output","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":503,"height":768,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":0,"exactY":0,"fixed":false,"left":true,"top":true,"bottom":true,"growV":false}},"style":{"flex":{"component":"data2-core-primitives@String","params":{"content":"1"}}},"scroll":{"disabled":false,"component":"data2-core-types@Scroll","params":{"y":true}}},"json":{"params":{"text":{"component":"data2-core-primitives@String","params":{"content":"{\n  \"statusCode\": 200,\n  \"body\": {\n    \"data\": {\n      \"statement_id\": \"01f186b4-5e07-1889-bb45-aaaa820b423c\",\n      \"status\": {\n        \"state\": \"SUCCEEDED\"\n      },\n      \"manifest\": {\n        \"format\": \"JSON_ARRAY\",\n        \"schema\": {\n          \"column_count\": 3,\n          \"columns\": [\n            {\n              \"name\": \"setor\",\n              \"type_text\": \"INT\",\n              \"type_name\": \"INT\",\n              \"position\": 0\n            },\n            {\n              \"name\": \"nivel\",\n              \"type_text\": \"STRING\",\n              \"type_name\": \"STRING\",\n              \"position\": 1\n            },\n            {\n              \"name\": \"cbs\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 2\n            }\n          ]\n        },\n        \"total_chunk_count\": 1,\n        \"chunks\": [\n          {\n            \"chunk_index\": 0,\n            \"row_offset\": 0,\n            \"row_count\": 36\n          }\n        ],\n        \"total_row_count\": 36,\n        \"truncated\": false\n      },\n      \"result\": {\n        \"chunk_index\": 0,\n        \"row_offset\": 0,\n        \"row_count\": 36,\n        \"data_array\": [\n          [\n            \"3703\",\n            \"Bronze\",\n            \"475\"\n          ],\n          [\n            \"3655\",\n            \"Diamante\",\n            \"50\"\n          ],\n          [\n            \"3655\",\n            \"Ouro\",\n            \"174\"\n          ],\n          [\n            \"3703\",\n            \"Ouro\",\n            \"129\"\n          ],\n          [\n            \"3612\",\n            \"Cristal\",\n            \"1161\"\n          ],\n          [\n            \"3221\",\n            \"Bronze\",\n            \"621\"\n          ],\n          [\n            \"3304\",\n            \"Diamante+\",\n            \"2\"\n          ],\n          [\n            \"3655\",\n            \"Diamante+\",\n            \"1\"\n          ],\n          [\n            \"3221\",\n            \"Cristal\",\n            \"607\"\n          ],\n          [\n            \"3808\",\n            \"Cristal\",\n            \"644\"\n          ],\n          [\n            \"3703\",\n            \"Cristal\",\n            \"387\"\n          ],\n          [\n            \"3612\",\n            \"Prata\",\n            \"751\"\n          ],\n          [\n            \"3808\",\n            \"Diamante\",\n            \"60\"\n          ],\n          [\n            \"3304\",\n            \"Ouro\",\n            \"314\"\n          ],\n          [\n            \"3304\",\n            \"Prata\",\n            \"769\"\n          ],\n          [\n            \"3612\",\n            \"Bronze\",\n            \"1094\"\n          ],\n          [\n            \"3612\",\n            \"Ouro\",\n            \"311\"\n          ],\n          [\n            \"3304\",\n            \"Diamante\",\n            \"95\"\n          ],\n          [\n            \"3808\",\n            \"Prata\",\n            \"610\"\n          ],\n          [\n            \"3304\",\n            \"Bronze\",\n            \"1263\"\n          ],\n          [\n            \"3655\",\n            \"Cristal\",\n            \"597\"\n          ],\n          [\n            \"3703\",\n            \"Diamante\",\n            \"46\"\n          ],\n          [\n            \"3655\",\n            \"Bronze\",\n            \"622\"\n          ],\n          [\n            \"3221\",\n            \"Prata\",\n            \"479\"\n          ],\n          [\n            \"3612\",\n            \"Diamante\",\n            \"99\"\n          ],\n          [\n            \"3221\",\n            \"Diamante+\",\n            \"2\"\n          ],\n          [\n            \"3808\",\n            \"Diamante+\",\n            \"1\"\n          ],\n          [\n            \"3655\",\n            \"Prata\",\n            \"478\"\n          ],\n          [\n            \"3304\",\n            \"Cristal\",\n            \"1271\"\n          ],\n          [\n            \"3221\",\n            \"Diamante\",\n            \"56\"\n          ],\n          [\n            \"3221\",\n            \"Ouro\",\n            \"174\"\n          ],\n          [\n            \"3808\",\n            \"Bronze\",\n            \"850\"\n          ],\n          [\n            \"3703\",\n            \"Prata\",\n            \"385\"\n          ],\n          [\n            \"3612\",\n            \"Diamante+\",\n            \"2\"\n          ],\n          [\n            \"3808\",\n            \"Ouro\",\n            \"211\"\n          ],\n          [\n            \"3703\",\n            \"Diamante+\",\n            \"1\"\n          ]\n        ]\n      }\n    }\n  },\n  \"timings\": [\n    {\n      \"label\": \"00_defs\",\n      \"dur\": 18.78\n    },\n    {\n      \"label\": \"010_env_bundle\",\n      \"dur\": 0\n    },\n    {\n      \"label\": \"011_env_init\",\n      \"dur\": 894.74\n    },\n    {\n      \"label\": \"012_env_pem\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"01_env\",\n      \"dur\": 895.36\n    },\n    {\n      \"label\": \"02_setup\",\n      \"dur\": 117.22\n    },\n    {\n      \"label\": \"03_permissions\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"04_op_response\",\n      \"dur\": 3976.89\n    },\n    {\n      \"label\": \"04_op\",\n      \"dur\": 3977.29\n    },\n    {\n      \"label\": \"05_track\",\n      \"dur\": 485.19\n    }\n  ]\n}"}}},"component":"data2-core-functions@JSONParse"},"collapsed":{"component":"data2-core-primitives@Number","params":{"content":99}}},"updatedAt":"2026-07-23T17:38:39.714Z","createdAt":"2026-07-23T17:38:32.532Z"},{"_id":"6a625182203e921fd2513b32","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"8","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768}},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"reference":"5pTMEi7J0r2F8lXKFqvax","updatedAt":"2026-07-23T17:39:03.522Z","createdAt":"2026-07-23T17:38:49.433Z"},{"_id":"6a625182203e921fd2513b33","parent":"6a625182203e921fd2513b32","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":false,"exactY":false,"bottom":true,"left":true,"top":true,"growV":false,"right":true,"growH":false}},"childrenMode":"cols"},"updatedAt":"2026-07-23T17:38:49.433Z","createdAt":"2026-07-23T17:38:49.433Z"},{"_id":"6a625182203e921fd2513b34","parent":"6a625182203e921fd2513b33","component":"data2-blocks@JsonViewer","system":"6a57cfe9673eb7e3c5e57784","displayName":"input","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":503,"height":768,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":0,"exactY":0,"fixed":false,"left":true,"top":true,"bottom":true,"growV":false}},"style":{"flex":{"component":"data2-core-primitives@String","params":{"content":"1"}}},"scroll":{"disabled":false,"component":"data2-core-types@Scroll","params":{"y":true}}},"json":{"params":{"text":{"component":"data2-core-primitives@String","params":{"content":"{\n  \"body\": {\n    \"sql\": \"SELECT CD_SETOR setor, COUNT(DISTINCT CD_CONSULTORA) cbs,\\n       SUM(CASE WHEN ST_FEZ_PED_CICLO_ATUAL THEN 1 ELSE 0 END) ativas,\\n       ROUND(SUM(VL_PEDIDOS_CICLO),0) receita, ROUND(SUM(VL_PEDIDOS_NATURA_CICLO),0) rec_nat,\\n       ROUND(SUM(VL_PEDIDOS_AVON_CICLO),0) rec_avon, ROUND(SUM(QT_PONTOS_CICLO),0) pontos, ROUND(SUM(QT_PEDIDOS_CICLO),0) pedidos\\n      FROM product.perfil_cb.crm_perfil_cb_diaria_historico WHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR IN (3655,3808,3221,3703,3304,3612) AND DT_HISTORICO=(SELECT MAX(DT_HISTORICO) FROM product.perfil_cb.crm_perfil_cb_diaria_historico WHERE CD_PAIS=1) GROUP BY CD_SETOR\",\n    \"skip_monitoring\": true,\n    \"country\": \"BR\"\n  },\n  \"headers\": null,\n  \"query\": {},\n  \"method\": \"POST\"\n}"}}},"component":"data2-core-functions@JSONParse"},"collapsed":{"component":"data2-core-primitives@Number","params":{"content":99}}},"updatedAt":"2026-07-23T17:38:55.504Z","createdAt":"2026-07-23T17:38:49.433Z"},{"_id":"6a625182203e921fd2513b35","parent":"6a625182203e921fd2513b33","component":"data2-blocks@JsonViewer","system":"6a57cfe9673eb7e3c5e57784","displayName":"output","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":503,"height":768,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":0,"exactY":0,"fixed":false,"left":true,"top":true,"bottom":true,"growV":false}},"style":{"flex":{"component":"data2-core-primitives@String","params":{"content":"1"}}},"scroll":{"disabled":false,"component":"data2-core-types@Scroll","params":{"y":true}}},"json":{"params":{"text":{"component":"data2-core-primitives@String","params":{"content":"{\n  \"statusCode\": 200,\n  \"body\": {\n    \"data\": {\n      \"statement_id\": \"01f186b4-5d0a-102c-9089-35fe99fb76d3\",\n      \"status\": {\n        \"state\": \"SUCCEEDED\"\n      },\n      \"manifest\": {\n        \"format\": \"JSON_ARRAY\",\n        \"schema\": {\n          \"column_count\": 8,\n          \"columns\": [\n            {\n              \"name\": \"setor\",\n              \"type_text\": \"INT\",\n              \"type_name\": \"INT\",\n              \"position\": 0\n            },\n            {\n              \"name\": \"cbs\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 1\n            },\n            {\n              \"name\": \"ativas\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 2\n            },\n            {\n              \"name\": \"receita\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 3,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"rec_nat\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 4,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"rec_avon\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 5,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"pontos\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 6,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"pedidos\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 7,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            }\n          ]\n        },\n        \"total_chunk_count\": 1,\n        \"chunks\": [\n          {\n            \"chunk_index\": 0,\n            \"row_offset\": 0,\n            \"row_count\": 6\n          }\n        ],\n        \"total_row_count\": 6,\n        \"truncated\": false\n      },\n      \"result\": {\n        \"chunk_index\": 0,\n        \"row_offset\": 0,\n        \"row_count\": 6,\n        \"data_array\": [\n          [\n            \"3808\",\n            \"2376\",\n            \"273\",\n            \"294252\",\n            \"256182\",\n            \"38069\",\n            \"48260\",\n            \"341\"\n          ],\n          [\n            \"3221\",\n            \"1939\",\n            \"747\",\n            \"647897\",\n            \"508219\",\n            \"139649\",\n            \"118759\",\n            \"1216\"\n          ],\n          [\n            \"3304\",\n            \"3714\",\n            \"1363\",\n            \"1344946\",\n            \"1131010\",\n            \"212544\",\n            \"234700\",\n            \"1891\"\n          ],\n          [\n            \"3655\",\n            \"1922\",\n            \"387\",\n            \"355872\",\n            \"291733\",\n            \"64126\",\n            \"62726\",\n            \"515\"\n          ],\n          [\n            \"3612\",\n            \"3418\",\n            \"394\",\n            \"362306\",\n            \"312889\",\n            \"49221\",\n            \"67096\",\n            \"507\"\n          ],\n          [\n            \"3703\",\n            \"1423\",\n            \"36\",\n            \"38180\",\n            \"34965\",\n            \"3215\",\n            \"6169\",\n            \"39\"\n          ]\n        ]\n      }\n    }\n  },\n  \"timings\": [\n    {\n      \"label\": \"00_defs\",\n      \"dur\": 21.04\n    },\n    {\n      \"label\": \"010_env_bundle\",\n      \"dur\": 0\n    },\n    {\n      \"label\": \"011_env_init\",\n      \"dur\": 1100.84\n    },\n    {\n      \"label\": \"012_env_pem\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"01_env\",\n      \"dur\": 1112.14\n    },\n    {\n      \"label\": \"02_setup\",\n      \"dur\": 118.72\n    },\n    {\n      \"label\": \"03_permissions\",\n      \"dur\": 0.02\n    },\n    {\n      \"label\": \"04_op_response\",\n      \"dur\": 2195.9\n    },\n    {\n      \"label\": \"04_op\",\n      \"dur\": 2196.54\n    },\n    {\n      \"label\": \"05_track\",\n      \"dur\": 510.91\n    }\n  ]\n}"}}},"component":"data2-core-functions@JSONParse"},"collapsed":{"component":"data2-core-primitives@Number","params":{"content":99}}},"updatedAt":"2026-07-23T17:38:57.620Z","createdAt":"2026-07-23T17:38:49.433Z"},{"_id":"6a62531d203e921fd2513b36","parent":"6a62185eae79ef246a757776","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,0.5)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":214,"height":35,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":false,"exactY":false,"fixed":false,"left":true,"top":true,"growH":true}}},"updatedAt":"2026-07-24T01:33:11.566Z","createdAt":"2026-07-23T17:45:35.726Z"},{"_id":"6a625a9912863f7deaa6508c","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"New Artboard (34)","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768}},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"reference":"hdlhjYVBcFocCkWumy43D","updatedAt":"2026-07-23T18:17:30.876Z","createdAt":"2026-07-23T18:17:30.876Z"},{"_id":"6a625a9a12863f7deaa6508d","parent":"6a625a9912863f7deaa6508c","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":206,"height":768,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":false,"exactY":false}},"onClick":{"disabled":false,"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"A0kvMekKfk4Yk0da7NLET"}}},"break":true},"prop":{"component":"data2-core-primitives@String","params":{"content":"invoke"}},"args":{"params":{"text":{"component":"data2-core-primitives@String","params":{"content":"{\n  \"sql\": \"SELECT CD_SETOR setor,\\n       MAX(DS_ESTADO) uf,\\n       COUNT(DISTINCT CD_CONSULTORA) cbs,\\n       COUNT(DISTINCT DS_MUNICIPIO) munis\\nFROM product.perfil_cb.crm_perfil_cb_diaria_historico\\nWHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR>0\\n  AND DT_HISTORICO=(SELECT MAX(DT_HISTORICO) ...)\\nGROUP BY CD_SETOR\\nORDER BY CD_SETOR\",\n  \"skip_monitoring\": true,\n  \"country\": \"BR\"\n}"}}},"component":"data2-core-functions@JSONParse"}},"break":true}},"updatedAt":"2026-07-23T18:18:21.085Z","createdAt":"2026-07-23T18:17:32.413Z"},{"_id":"6a626ca0bc0ed2896304f0b2","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"MATRIZ ASIS","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":640,"height":284,"exactWidth":false,"exactHeight":false}},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"reference":"DEUVpakmGeSNEBoFMdXnx","updatedAt":"2026-07-23T23:06:17.657Z","createdAt":"2026-07-23T19:34:26.163Z"},{"_id":"6a626cb961501108689e9722","parent":"6a626ca0bc0ed2896304f0b2","component":"natura-geomarketing@L--dVhugwB17-_W00pA7S","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":640,"height":284,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":false,"exactY":false,"fixed":false,"bottom":false,"left":true,"top":true,"growV":false,"right":true,"growH":false}}}},"index":0,"updatedAt":"2026-07-29T14:05:02.206Z","createdAt":"2026-07-23T19:34:54.374Z"},{"_id":"6a626ccf61501108689e9723","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"Relatório de impacto (6 ciclos | antes/depois)","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":640,"height":526,"exactWidth":false,"exactHeight":525.98}},"fill":{"disabled":false,"component":"data2-core-types@Fill","params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]}},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"reference":"8W6k6ufjc-HJOpZ9BZjNE","updatedAt":"2026-07-23T23:06:30.267Z","createdAt":"2026-07-23T19:35:19.072Z"},{"_id":"6a626ce961501108689e9729","parent":"6a626ccf61501108689e9723","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":320,"height":30,"exactWidth":320.02,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":"5","exactX":false,"exactY":false,"fixed":false,"left":true}},"text":{"component":"data2-core-primitives@String","params":{"content":"Impacto antes -> depois por setor"}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left"}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(26,26,26,1)"}}},"index":1,"updatedAt":"2026-07-23T19:35:39.503Z","createdAt":"2026-07-23T19:35:39.503Z"},{"_id":"6a626ce961501108689e972e","parent":"6a626ccf61501108689e9723","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":140,"height":40,"exactWidth":140}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":500,"y":0,"exactX":false,"exactY":false,"top":true}},"border":{"component":"data2-core-types@Border","params":{"color":"#e6e6e6","radius":{"leftTop":"9"},"width":{"left":"1","top":"1","right":"1","bottom":"1"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"index":2,"updatedAt":"2026-07-23T19:35:39.503Z","createdAt":"2026-07-23T19:35:39.503Z"},{"_id":"6a626ce961501108689e972f","parent":"6a626ce961501108689e972e","component":"data2-blocks@Html","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":22,"height":20,"exactWidth":21.84,"exactHeight":20.27}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":"111","y":9,"exactX":false,"exactY":false}},"opacity":{"disabled":false,"component":"data2-core-types@Opacity","params":{"value":43}}},"text":{"component":"data2-core-primitives@String","params":{"content":"<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\" class=\"size-6\">\n  <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"m19.5 8.25-7.5 7.5-7.5-7.5\" />\n</svg>\n"}}},"index":1,"updatedAt":"2026-07-23T19:35:39.503Z","createdAt":"2026-07-23T19:35:39.503Z"},{"_id":"6a626ce961501108689e9730","parent":"6a626ce961501108689e972e","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":114,"height":38,"exactWidth":114.15,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":false,"exactY":false}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"center","textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"Rec. Natura"}}},"index":0,"updatedAt":"2026-07-23T19:35:39.503Z","createdAt":"2026-07-23T19:35:39.503Z"},{"_id":"6a626d0e61501108689e9731","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"HubSimulatorAdditionalInfo","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":640,"height":284,"exactWidth":false,"exactHeight":false}},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"componentClass":{"disabled":false,"component":"data2-core-types@ComponentClass","params":{}},"componentStates":[{"component":"data2-core-types@ComponentState","params":{"state":{"component":"data2-core-primitives@String","params":{"content":"default"}},"artboard":{"disabled":false,"component":"data2-core-types@ArtboardReference","params":{"reference":"DEUVpakmGeSNEBoFMdXnx"}}}},{"component":"data2-core-types@ComponentState","params":{"state":{"component":"data2-core-primitives@String","params":{"content":"matriz"}},"artboard":{"disabled":false,"component":"data2-core-types@ArtboardReference","params":{"reference":"DEUVpakmGeSNEBoFMdXnx"}}}},{"component":"data2-core-types@ComponentState","params":{"state":{"component":"data2-core-primitives@String","params":{"content":"relatorio"}},"artboard":{"disabled":false,"component":"data2-core-types@ArtboardReference","params":{"reference":"8W6k6ufjc-HJOpZ9BZjNE"}}}},{"component":"data2-core-types@ComponentState","params":{"state":{"component":"data2-core-primitives@String","params":{"content":"console"}},"artboard":{"disabled":false,"component":"data2-core-types@ArtboardReference","params":{"reference":"ymJvTq0nprMkyC2uPfWln"}}}}]},"reference":"_3BHHDtVc0ZK0wlfcnLM3","updatedAt":"2026-07-23T19:37:35.955Z","createdAt":"2026-07-23T19:36:16.266Z"},{"_id":"6a626d5561501108689e9733","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"console sql","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":640,"height":293,"exactWidth":false,"exactHeight":293.02000000000004}},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"reference":"ymJvTq0nprMkyC2uPfWln","updatedAt":"2026-07-29T14:05:16.882Z","createdAt":"2026-07-23T19:37:26.762Z"},{"_id":"6a626dd861501108689e9736","parent":"6a6223b10ff5a8d431e8cec6","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(139,139,139,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1,"height":25,"exactWidth":1}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":"139","y":8,"exactX":false,"exactY":false}},"hide":{"params":{"subject":{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kfqDiL83O6CTlKOfellwq"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.additionalInfo"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"console"}}},"component":"data2-core-comparison-operators@Equal"}},"component":"data2-core-logical-operators@Not"}},"updatedAt":"2026-07-23T19:44:17.180Z","createdAt":"2026-07-23T19:39:47.719Z"},{"_id":"6a62700d61501108689e9737","parent":"6a626ccf61501108689e9723","component":"natura-geomarketing@XaKyb6x3qMpZupICoqsnY","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":640,"height":468,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":58,"exactX":false,"exactY":false,"left":true,"top":true,"right":true,"growH":false,"fixed":false}}}},"updatedAt":"2026-07-23T20:17:17.878Z","createdAt":"2026-07-23T19:49:02.681Z"},{"_id":"6a62703e61501108689e9739","parent":"6a6233960ff5a8d431e8cef3","component":"data2-blocks@IframeBlock","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":640,"height":293,"exactWidth":false,"exactHeight":293.02000000000004}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":false,"exactY":false,"bottom":true,"left":true,"top":true,"growV":false,"right":true,"growH":false}}},"url":{"component":"data2-core-primitives@String","params":{"content":"https://graph.lucca-office.next.data2.app/"}}},"updatedAt":"2026-07-23T19:54:18.284Z","createdAt":"2026-07-23T19:49:52.632Z"},{"_id":"6a62728a61501108689e9744","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"HubSimulatorSetorDestino","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":566,"height":275,"exactWidth":false,"exactHeight":275}},"componentClass":{"disabled":false,"component":"data2-core-types@ComponentClass","params":{}},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"reference":"iW3NufyoQGjGAwhmVZ3ow","updatedAt":"2026-07-23T23:06:08.611Z","createdAt":"2026-07-23T19:59:45.431Z"},{"_id":"6a62728a61501108689e9745","parent":"6a62728a61501108689e9744","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"13"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":566,"height":275,"exactWidth":false,"exactHeight":false,"growHeightWithContent":true}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":false,"exactY":false,"fixed":false,"right":true,"top":true,"left":true,"growH":false}},"text":"","fill":{"disabled":false,"component":"data2-core-types@Fill","params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(247,247,251,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]}}},"index":4,"updatedAt":"2026-07-29T14:04:17.260Z","createdAt":"2026-07-23T19:59:45.431Z"},{"_id":"6a62728a61501108689e9746","parent":"6a62728a61501108689e9745","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":566,"height":275,"exactWidth":false,"exactHeight":false,"growHeightWithContent":true}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":false,"exactY":false,"fixed":false,"left":true,"top":true,"right":true,"growH":false,"bottom":false,"growV":false}},"text":""},"index":2,"updatedAt":"2026-07-29T14:01:19.673Z","createdAt":"2026-07-23T19:59:45.431Z"},{"_id":"6a62728a61501108689e9747","parent":"6a62728a61501108689e9746","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#d6d6d6","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":546,"height":28,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":20,"y":20,"exactX":false,"exactY":false,"top":true,"left":true,"right":true,"growH":false}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left"}},"text":{"component":"data2-core-primitives@String","params":{"content":"Municípios -> Setor destino"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":14}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(94,94,94,1)"}}},"updatedAt":"2026-07-24T01:01:48.226Z","createdAt":"2026-07-23T19:59:45.431Z"},{"_id":"6a62728a61501108689e9748","parent":"6a62728a61501108689e9746","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":566,"height":215,"exactWidth":false,"exactHeight":false,"growHeightWithContent":true}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":60,"left":true,"exactX":false,"exactY":false,"top":true,"right":true,"growH":false,"bottom":false,"growV":false,"fixed":false}},"textFormat":{"disabled":true,"component":"data2-core-types@TextFormat","params":{}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(127,127,127,1)"}},"repeat":{"disabled":false,"component":"data2-core-types@DataSetReference","params":{"reference":"2A0QvRsDzftCYYnjJ_hIe"}},"repeatReference":{"component":"data2-core-primitives@String","params":{"content":"m"}}},"updatedAt":"2026-07-29T14:01:15.799Z","createdAt":"2026-07-23T19:59:45.431Z"},{"_id":"6a62728a61501108689e9749","parent":"6a62728a61501108689e9748","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":526,"height":82,"exactWidth":526,"exactHeight":82}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":20,"y":10,"exactX":false,"exactY":false,"fixed":false,"left":true,"top":true,"right":true,"growH":false}}},"updatedAt":"2026-07-24T01:30:44.033Z","createdAt":"2026-07-23T19:59:45.431Z"},{"_id":"6a6272db61501108689e9757","parent":"6a62728a61501108689e9749","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":526,"height":20,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":false,"exactY":false,"top":true,"left":true,"right":true,"growH":false}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"center"}},"text":{"params":{"portions":[{"params":{"string":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"mRepeater.MUNICIPIO"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-functions@toUpperCase"},{"component":"data2-core-primitives@String","params":{"content":" ("}},{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"mRepeater.CBs"}}},"component":"data2-core-types@Reference"},{"component":"data2-core-primitives@String","params":{"content":"CBs)"}}]},"component":"data2-core-functions@StringConcat"},"textSize":{"component":"data2-core-primitives@Number","params":{"content":17}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(94,94,94,1)"}}},"updatedAt":"2026-07-29T13:55:38.713Z","createdAt":"2026-07-23T20:01:01.013Z"},{"_id":"6a62732e61501108689e975e","parent":"6a62728a61501108689e9749","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":526,"height":52,"exactWidth":false,"exactHeight":52}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":30,"left":true,"exactX":false,"exactY":false,"top":true,"fixed":false,"right":true,"growH":false}},"childrenMode":"cols","border":{"disabled":false,"component":"data2-core-types@Border","params":{"radius":{"leftTop":"9"},"width":{"top":"1","bottom":"1","left":"1","right":"1"},"color":"#9a9b9c"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"19"}},"repeat":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Y0MVeSB0t_bjBEppVYgQJ"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.setores_destino"}}},"component":"data2-core-types@Getter"},"repeatReference":{"component":"data2-core-primitives@String","params":{"content":"s"}}},"index":2,"updatedAt":"2026-07-29T13:58:18.732Z","createdAt":"2026-07-23T20:02:27.859Z"},{"_id":"6a62732e61501108689e975f","parent":"6a62732e61501108689e975e","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"7"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":136,"height":46,"exactWidth":false,"exactHeight":46}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"2","y":2,"exactX":false,"exactY":false,"fixed":false,"left":true,"top":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"center","textOverflow":false,"verticalAlignment":"middle"}},"text":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"sRepeater"}}},"component":"data2-core-types@Reference"},"cursor":"pointer","style":{"flex":{"component":"data2-core-primitives@String","params":{"content":"1"}}}},"updatedAt":"2026-07-29T13:58:45.519Z","createdAt":"2026-07-23T20:02:27.859Z"},{"_id":"6a62c2c118443ac5c92bd0da","parent":"6a62185eae79ef246a757774","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":63,"height":14,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":483,"y":21,"exactX":false,"exactY":false,"right":true,"top":true}},"text":{"component":"data2-core-primitives@String","params":{"content":"+745"}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"right","textOverflow":false,"verticalAlignment":"middle"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"17"}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(109,222,149,1)"}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"updatedAt":"2026-07-24T01:42:54.719Z","createdAt":"2026-07-24T01:42:16.243Z"},{"_id":"6a6357109642efac858afb00","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"HubSimulatorSectorsInfo","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":546,"height":550}},"componentClass":{"disabled":false,"component":"data2-core-types@ComponentClass","params":{}},"componentStates":[{"component":"data2-core-types@ComponentState","params":{"state":{"component":"data2-core-primitives@String","params":{"content":"default"}},"artboard":{"disabled":false,"component":"data2-core-types@ArtboardReference","params":{"reference":"8ar99L_gcmgTQ43nAS9Jy"}}}},{"component":"data2-core-types@ComponentState","params":{"state":{"component":"data2-core-primitives@String","params":{"content":"cols"}},"artboard":{"disabled":false,"component":"data2-core-types@ArtboardReference","params":{"reference":"8ar99L_gcmgTQ43nAS9Jy"}}}},{"component":"data2-core-types@ComponentState","params":{"state":{"component":"data2-core-primitives@String","params":{"content":"rows"}},"artboard":{"disabled":false,"component":"data2-core-types@ArtboardReference","params":{"reference":"lNrJPql94exRI91ppcL7l"}}}}]},"reference":"gfyeGJI77tJzdwSZTKCnV","updatedAt":"2026-07-24T12:18:20.589Z","createdAt":"2026-07-24T12:14:45.868Z"},{"_id":"6a63572a9642efac858afb01","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"HubSimulatorSectorsInfoCols","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":546,"height":550}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"reference":"8ar99L_gcmgTQ43nAS9Jy","updatedAt":"2026-07-24T12:16:34.032Z","createdAt":"2026-07-24T12:15:13.608Z"},{"_id":"6a6357379642efac858afb02","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"HubSimulatorSectorsInfoRows","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":546,"height":550}}},"reference":"lNrJPql94exRI91ppcL7l","updatedAt":"2026-07-24T12:15:32.714Z","createdAt":"2026-07-24T12:15:32.714Z"},{"_id":"6a6357469642efac858afb06","parent":"6a63572a9642efac858afb01","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":546,"height":550,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"fixed":false,"exactX":false,"exactY":false,"left":true,"top":true,"right":true,"growH":false}},"text":"","childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"updatedAt":"2026-07-24T12:16:31.312Z","createdAt":"2026-07-24T12:16:00.192Z"},{"_id":"6a6357469642efac858afb07","parent":"6a6357469642efac858afb06","component":"natura-geomarketing@PCOvC0KQdskFojBsWZBfd","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"13"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":252,"height":550,"exactWidth":false,"exactHeight":false,"growHeightWithContent":false,"growWidthWithContent":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":294,"y":0,"exactX":false,"exactY":false,"fixed":false,"right":true,"top":true,"left":false,"growH":true}},"text":""}},"index":1,"updatedAt":"2026-07-24T12:17:15.883Z","createdAt":"2026-07-24T12:16:00.192Z"},{"_id":"6a6357469642efac858afb08","parent":"6a6357469642efac858afb06","component":"natura-geomarketing@iW3NufyoQGjGAwhmVZ3ow","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"13"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":280,"height":550,"exactWidth":280,"exactHeight":false,"growHeightWithContent":false,"growWidthWithContent":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":false,"exactY":false,"fixed":false,"right":false,"top":true,"left":true,"growH":true}},"text":""}},"index":0,"updatedAt":"2026-07-24T12:17:17.628Z","createdAt":"2026-07-24T12:16:00.192Z"},{"_id":"6a6357949642efac858afb12","parent":"6a6357379642efac858afb02","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":546,"height":550,"exactWidth":false,"exactHeight":false,"growHeightWithContent":true}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"fixed":false,"exactX":false,"exactY":false,"left":true,"top":true,"right":true,"growH":false}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"childrenMode":"rows"},"updatedAt":"2026-07-24T12:16:59.022Z","createdAt":"2026-07-24T12:16:59.022Z"},{"_id":"6a6357949642efac858afb13","parent":"6a6357949642efac858afb12","component":"natura-geomarketing@PCOvC0KQdskFojBsWZBfd","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"13"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":546,"height":280,"exactWidth":false,"exactHeight":false,"growHeightWithContent":true,"growWidthWithContent":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":20,"exactX":false,"exactY":false,"fixed":false,"right":true,"top":true,"left":true,"growH":false}},"text":""}},"index":1,"updatedAt":"2026-07-24T12:17:42.571Z","createdAt":"2026-07-24T12:16:59.022Z"},{"_id":"6a6357949642efac858afb14","parent":"6a6357949642efac858afb12","component":"natura-geomarketing@iW3NufyoQGjGAwhmVZ3ow","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"13"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":546,"height":250,"exactWidth":false,"exactHeight":false,"growHeightWithContent":true,"growWidthWithContent":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":false,"exactY":false,"fixed":false,"right":true,"top":true,"left":true,"growH":false}},"text":""}},"index":0,"updatedAt":"2026-07-24T12:17:38.017Z","createdAt":"2026-07-24T12:16:59.022Z"},{"_id":"6a63935d4040249ac2ede72a","parent":"6a625061203e921fd2513b14","component":"data2-blocks@JsonViewer","system":"6a57cfe9673eb7e3c5e57784","displayName":"Copy of Copy of input","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":680,"height":501,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":1,"y":267,"exactX":1,"exactY":267,"fixed":false,"left":true,"top":true,"bottom":true,"growV":false}},"style":{"flex":{"component":"data2-core-primitives@String","params":{"content":"1"}}},"scroll":{"disabled":false,"component":"data2-core-types@Scroll","params":{"y":true}}},"json":{"params":{"array":{"params":{"module":{"params":{"text":{"component":"data2-core-primitives@String","params":{"content":"{\n  \"statusCode\": 200,\n  \"body\": {\n    \"data\": {\n      \"statement_id\": \"01f186b4-5219-1851-b455-560a81a049bc\",\n      \"status\": {\n        \"state\": \"SUCCEEDED\"\n      },\n      \"manifest\": {\n        \"format\": \"JSON_ARRAY\",\n        \"schema\": {\n          \"column_count\": 2,\n          \"columns\": [\n            {\n              \"name\": \"uf\",\n              \"type_text\": \"STRING\",\n              \"type_name\": \"STRING\",\n              \"position\": 0\n            },\n            {\n              \"name\": \"n\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 1\n            }\n          ]\n        },\n        \"total_chunk_count\": 1,\n        \"chunks\": [\n          {\n            \"chunk_index\": 0,\n            \"row_offset\": 0,\n            \"row_count\": 8\n          }\n        ],\n        \"total_row_count\": 8,\n        \"truncated\": false\n      },\n      \"result\": {\n        \"chunk_index\": 0,\n        \"row_offset\": 0,\n        \"row_count\": 8,\n        \"data_array\": [\n          [\n            \"BA\",\n            \"2567\"\n          ],\n          [\n            null,\n            \"27\"\n          ],\n          [\n            \"RJ\",\n            \"2\"\n          ],\n          [\n            \"SP\",\n            \"1\"\n          ],\n          [\n            \"AL\",\n            \"1\"\n          ],\n          [\n            \"PR\",\n            \"1\"\n          ],\n          [\n            \"SC\",\n            \"1\"\n          ],\n          [\n            \"MG\",\n            \"1\"\n          ]\n        ]\n      }\n    }\n  },\n  \"timings\": [\n    {\n      \"label\": \"00_defs\",\n      \"dur\": 23.25\n    },\n    {\n      \"label\": \"010_env_bundle\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"011_env_init\",\n      \"dur\": 1534.36\n    },\n    {\n      \"label\": \"012_env_pem\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"01_env\",\n      \"dur\": 1535.87\n    },\n    {\n      \"label\": \"02_setup\",\n      \"dur\": 185.52\n    },\n    {\n      \"label\": \"03_permissions\",\n      \"dur\": 0.03\n    },\n    {\n      \"label\": \"04_op_response\",\n      \"dur\": 11289.41\n    },\n    {\n      \"label\": \"04_op\",\n      \"dur\": 11293.26\n    },\n    {\n      \"label\": \"05_track\",\n      \"dur\": 504.98\n    }\n  ]\n}"}}},"component":"data2-core-functions@JSONParse"},"prop":{"component":"data2-core-primitives@String","params":{"content":"body.data.result.data_array"}}},"component":"data2-core-types@Getter"},"mapper":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"m"}},{"component":"data2-core-primitives@String","params":{"content":"i"}}],"body":{"params":{"fieldsList":[{"value":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m.0"}}},"component":"data2-core-types@Reference"},"key":{"component":"data2-core-types@Getter","params":{"module":{"params":{"text":{"component":"data2-core-primitives@String","params":{"content":"{\n  \"statusCode\": 200,\n  \"body\": {\n    \"data\": {\n      \"statement_id\": \"01f186b4-5219-1851-b455-560a81a049bc\",\n      \"status\": {\n        \"state\": \"SUCCEEDED\"\n      },\n      \"manifest\": {\n        \"format\": \"JSON_ARRAY\",\n        \"schema\": {\n          \"column_count\": 2,\n          \"columns\": [\n            {\n              \"name\": \"uf\",\n              \"type_text\": \"STRING\",\n              \"type_name\": \"STRING\",\n              \"position\": 0\n            },\n            {\n              \"name\": \"n\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 1\n            }\n          ]\n        },\n        \"total_chunk_count\": 1,\n        \"chunks\": [\n          {\n            \"chunk_index\": 0,\n            \"row_offset\": 0,\n            \"row_count\": 8\n          }\n        ],\n        \"total_row_count\": 8,\n        \"truncated\": false\n      },\n      \"result\": {\n        \"chunk_index\": 0,\n        \"row_offset\": 0,\n        \"row_count\": 8,\n        \"data_array\": [\n          [\n            \"BA\",\n            \"2567\"\n          ],\n          [\n            null,\n            \"27\"\n          ],\n          [\n            \"RJ\",\n            \"2\"\n          ],\n          [\n            \"SP\",\n            \"1\"\n          ],\n          [\n            \"AL\",\n            \"1\"\n          ],\n          [\n            \"PR\",\n            \"1\"\n          ],\n          [\n            \"SC\",\n            \"1\"\n          ],\n          [\n            \"MG\",\n            \"1\"\n          ]\n        ]\n      }\n    }\n  },\n  \"timings\": [\n    {\n      \"label\": \"00_defs\",\n      \"dur\": 23.25\n    },\n    {\n      \"label\": \"010_env_bundle\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"011_env_init\",\n      \"dur\": 1534.36\n    },\n    {\n      \"label\": \"012_env_pem\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"01_env\",\n      \"dur\": 1535.87\n    },\n    {\n      \"label\": \"02_setup\",\n      \"dur\": 185.52\n    },\n    {\n      \"label\": \"03_permissions\",\n      \"dur\": 0.03\n    },\n    {\n      \"label\": \"04_op_response\",\n      \"dur\": 11289.41\n    },\n    {\n      \"label\": \"04_op\",\n      \"dur\": 11293.26\n    },\n    {\n      \"label\": \"05_track\",\n      \"dur\": 504.98\n    }\n  ]\n}"}}},"component":"data2-core-functions@JSONParse"},"prop":{"component":"data2-core-primitives@String","params":{"content":"body.data.manifest.schema.columns.0.name"}}}}},{"value":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m.1"}}},"component":"data2-core-types@Reference"},"key":{"component":"data2-core-types@Getter","params":{"module":{"params":{"text":{"component":"data2-core-primitives@String","params":{"content":"{\n  \"statusCode\": 200,\n  \"body\": {\n    \"data\": {\n      \"statement_id\": \"01f186b4-5219-1851-b455-560a81a049bc\",\n      \"status\": {\n        \"state\": \"SUCCEEDED\"\n      },\n      \"manifest\": {\n        \"format\": \"JSON_ARRAY\",\n        \"schema\": {\n          \"column_count\": 2,\n          \"columns\": [\n            {\n              \"name\": \"uf\",\n              \"type_text\": \"STRING\",\n              \"type_name\": \"STRING\",\n              \"position\": 0\n            },\n            {\n              \"name\": \"n\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 1\n            }\n          ]\n        },\n        \"total_chunk_count\": 1,\n        \"chunks\": [\n          {\n            \"chunk_index\": 0,\n            \"row_offset\": 0,\n            \"row_count\": 8\n          }\n        ],\n        \"total_row_count\": 8,\n        \"truncated\": false\n      },\n      \"result\": {\n        \"chunk_index\": 0,\n        \"row_offset\": 0,\n        \"row_count\": 8,\n        \"data_array\": [\n          [\n            \"BA\",\n            \"2567\"\n          ],\n          [\n            null,\n            \"27\"\n          ],\n          [\n            \"RJ\",\n            \"2\"\n          ],\n          [\n            \"SP\",\n            \"1\"\n          ],\n          [\n            \"AL\",\n            \"1\"\n          ],\n          [\n            \"PR\",\n            \"1\"\n          ],\n          [\n            \"SC\",\n            \"1\"\n          ],\n          [\n            \"MG\",\n            \"1\"\n          ]\n        ]\n      }\n    }\n  },\n  \"timings\": [\n    {\n      \"label\": \"00_defs\",\n      \"dur\": 23.25\n    },\n    {\n      \"label\": \"010_env_bundle\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"011_env_init\",\n      \"dur\": 1534.36\n    },\n    {\n      \"label\": \"012_env_pem\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"01_env\",\n      \"dur\": 1535.87\n    },\n    {\n      \"label\": \"02_setup\",\n      \"dur\": 185.52\n    },\n    {\n      \"label\": \"03_permissions\",\n      \"dur\": 0.03\n    },\n    {\n      \"label\": \"04_op_response\",\n      \"dur\": 11289.41\n    },\n    {\n      \"label\": \"04_op\",\n      \"dur\": 11293.26\n    },\n    {\n      \"label\": \"05_track\",\n      \"dur\": 504.98\n    }\n  ]\n}"}}},"component":"data2-core-functions@JSONParse"},"prop":{"component":"data2-core-primitives@String","params":{"content":"body.data.manifest.schema.columns.1.name"}}}}}]},"component":"data2-core-types@FieldSet"}}}},"component":"data2-core-functions@ArrayMap"},"collapsed":{"component":"data2-core-primitives@Number","params":{"content":99}},"theme":"rjv-default"},"updatedAt":"2026-07-24T16:33:27.970Z","createdAt":"2026-07-24T16:32:03.146Z"},{"_id":"6a63944c4040249ac2ede72e","parent":"6a6250f9203e921fd2513b19","component":"data2-blocks@JsonViewer","system":"6a57cfe9673eb7e3c5e57784","displayName":"Copy of Copy of Copy of Copy of input","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":680,"height":482,"exactWidth":false,"exactHeight":482.36}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":1,"y":286,"exactX":1,"exactY":285.64,"fixed":false,"left":true,"top":true,"bottom":true,"growV":false}},"style":{"flex":{"component":"data2-core-primitives@String","params":{"content":"1"}}},"scroll":{"disabled":false,"component":"data2-core-types@Scroll","params":{"y":true}}},"json":{"params":{"array":{"params":{"module":{"params":{"text":{"component":"data2-core-primitives@String","params":{"content":"{\n  \"statusCode\": 200,\n  \"body\": {\n    \"data\": {\n      \"statement_id\": \"01f186b4-4f0c-1b7d-98cc-47323f8b74c5\",\n      \"status\": {\n        \"state\": \"SUCCEEDED\"\n      },\n      \"manifest\": {\n        \"format\": \"JSON_ARRAY\",\n        \"schema\": {\n          \"column_count\": 3,\n          \"columns\": [\n            {\n              \"name\": \"municipio\",\n              \"type_text\": \"STRING\",\n              \"type_name\": \"STRING\",\n              \"position\": 0\n            },\n            {\n              \"name\": \"nivel\",\n              \"type_text\": \"STRING\",\n              \"type_name\": \"STRING\",\n              \"position\": 1\n            },\n            {\n              \"name\": \"cbs\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 2\n            }\n          ]\n        },\n        \"total_chunk_count\": 1,\n        \"chunks\": [\n          {\n            \"chunk_index\": 0,\n            \"row_offset\": 0,\n            \"row_count\": 81\n          }\n        ],\n        \"total_row_count\": 81,\n        \"truncated\": false\n      },\n      \"result\": {\n        \"chunk_index\": 0,\n        \"row_offset\": 0,\n        \"row_count\": 81,\n        \"data_array\": [\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"Cristal\",\n            \"145\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"Prata\",\n            \"96\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"Bronze\",\n            \"8\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"Diamante\",\n            \"18\"\n          ],\n          [\n            \"SERRINHA\",\n            \"Bronze\",\n            \"1\"\n          ],\n          [\n            \"SAO SEBASTIAO DO PASSE\",\n            \"Cristal\",\n            \"2\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"Bronze\",\n            \"326\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"Diamante\",\n            \"4\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"Prata\",\n            \"3\"\n          ],\n          [\n            \"SAUBARA\",\n            \"Diamante\",\n            \"5\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"Prata\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"Bronze\",\n            \"3\"\n          ],\n          [\n            \"SIMOES FILHO\",\n            \"Bronze\",\n            \"1\"\n          ],\n          [\n            \"RIO DE JANEIRO\",\n            \"Bronze\",\n            \"1\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"Ouro\",\n            \"37\"\n          ],\n          [\n            \"CABOTO\",\n            \"Cristal\",\n            \"2\"\n          ],\n          [\n            \"SERROLANDIA\",\n            \"Bronze\",\n            \"1\"\n          ],\n          [\n            \"IPIAU\",\n            \"Cristal\",\n            \"1\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"Prata\",\n            \"125\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"Ouro\",\n            \"41\"\n          ],\n          [\n            \"SALVADOR\",\n            \"Prata\",\n            \"2\"\n          ],\n          [\n            \"DOCE GRANDE\",\n            \"Ouro\",\n            \"1\"\n          ],\n          [\n            \"ACUPE\",\n            \"Ouro\",\n            \"3\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"Bronze\",\n            \"149\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"Ouro\",\n            \"4\"\n          ],\n          [\n            \"CAROBA\",\n            \"Bronze\",\n            \"14\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"Ouro\",\n            \"26\"\n          ],\n          [\n            \"CAMPINHOS\",\n            \"Cristal\",\n            \"2\"\n          ],\n          [\n            \"CABOTO\",\n            \"Ouro\",\n            \"2\"\n          ],\n          [\n            \"SAO JOAO DA BARRA\",\n            \"Bronze\",\n            \"1\"\n          ],\n          [\n            \"PASSE\",\n            \"Cristal\",\n            \"12\"\n          ],\n          [\n            \"SAUBARA\",\n            \"Ouro\",\n            \"7\"\n          ],\n          [\n            \"PASSE\",\n            \"Prata\",\n            \"4\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"Diamante\",\n            \"8\"\n          ],\n          [\n            \"JOINVILLE\",\n            \"Prata\",\n            \"1\"\n          ],\n          [\n            \"ILHEUS\",\n            \"Cristal\",\n            \"1\"\n          ],\n          [\n            \"SAUBARA\",\n            \"Cristal\",\n            \"61\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"Cristal\",\n            \"5\"\n          ],\n          [\n            \"ACUPE\",\n            \"Prata\",\n            \"9\"\n          ],\n          [\n            null,\n            \"Ouro\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"Ouro\",\n            \"2\"\n          ],\n          [\n            \"MONTE RECONCAVO\",\n            \"Ouro\",\n            \"1\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"Diamante+\",\n            \"1\"\n          ],\n          [\n            \"MARIANA\",\n            \"Cristal\",\n            \"1\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"Prata\",\n            \"163\"\n          ],\n          [\n            null,\n            \"Bronze\",\n            \"9\"\n          ],\n          [\n            \"MACEIO\",\n            \"Cristal\",\n            \"1\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"Ouro\",\n            \"2\"\n          ],\n          [\n            \"GODOY CRUZ\",\n            \"Cristal\",\n            \"1\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"Cristal\",\n            \"266\"\n          ],\n          [\n            \"SALVADOR\",\n            \"Cristal\",\n            \"4\"\n          ],\n          [\n            \"ACUPE\",\n            \"Diamante\",\n            \"1\"\n          ],\n          [\n            \"CAMACARI\",\n            \"Prata\",\n            \"1\"\n          ],\n          [\n            \"CABOTO\",\n            \"Bronze\",\n            \"3\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"Cristal\",\n            \"92\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"Cristal\",\n            \"244\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"Diamante\",\n            \"18\"\n          ],\n          [\n            \"CAROBA\",\n            \"Cristal\",\n            \"14\"\n          ],\n          [\n            \"SAUBARA\",\n            \"Bronze\",\n            \"49\"\n          ],\n          [\n            \"PASSE\",\n            \"Bronze\",\n            \"6\"\n          ],\n          [\n            null,\n            \"Prata\",\n            \"5\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"Diamante+\",\n            \"1\"\n          ],\n          [\n            \"CABOTO\",\n            \"Prata\",\n            \"3\"\n          ],\n          [\n            \"SAO PAULO\",\n            \"Bronze\",\n            \"1\"\n          ],\n          [\n            \"MONTE RECONCAVO\",\n            \"Cristal\",\n            \"1\"\n          ],\n          [\n            \"SANTO ESTEVAO\",\n            \"Prata\",\n            \"1\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"Bronze\",\n            \"88\"\n          ],\n          [\n            \"CAROBA\",\n            \"Prata\",\n            \"7\"\n          ],\n          [\n            null,\n            \"Cristal\",\n            \"10\"\n          ],\n          [\n            \"CAROBA\",\n            \"Ouro\",\n            \"1\"\n          ],\n          [\n            \"TIJUANA\",\n            \"Bronze\",\n            \"1\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"Ouro\",\n            \"77\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"Prata\",\n            \"61\"\n          ],\n          [\n            \"ACUPE\",\n            \"Cristal\",\n            \"34\"\n          ],\n          [\n            \"ENTRE RIOS\",\n            \"Prata\",\n            \"1\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"Cristal\",\n            \"9\"\n          ],\n          [\n            \"ACUPE\",\n            \"Bronze\",\n            \"22\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"Bronze\",\n            \"221\"\n          ],\n          [\n            \"SAUBARA\",\n            \"Prata\",\n            \"33\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"Bronze\",\n            \"9\"\n          ],\n          [\n            \"PASSE\",\n            \"Diamante\",\n            \"1\"\n          ]\n        ]\n      }\n    }\n  },\n  \"timings\": [\n    {\n      \"label\": \"00_defs\",\n      \"dur\": 13.24\n    },\n    {\n      \"label\": \"010_env_bundle\",\n      \"dur\": 0\n    },\n    {\n      \"label\": \"011_env_init\",\n      \"dur\": 1660.32\n    },\n    {\n      \"label\": \"012_env_pem\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"01_env\",\n      \"dur\": 1661.57\n    },\n    {\n      \"label\": \"02_setup\",\n      \"dur\": 149.26\n    },\n    {\n      \"label\": \"03_permissions\",\n      \"dur\": 0.09\n    },\n    {\n      \"label\": \"04_op_response\",\n      \"dur\": 6582.41\n    },\n    {\n      \"label\": \"04_op\",\n      \"dur\": 6582.96\n    },\n    {\n      \"label\": \"05_track\",\n      \"dur\": 514.25\n    }\n  ]\n}"}}},"component":"data2-core-functions@JSONParse"},"prop":{"component":"data2-core-primitives@String","params":{"content":"body.data.result.data_array"}}},"component":"data2-core-types@Getter"},"mapper":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"m"}},{"component":"data2-core-primitives@String","params":{"content":"i"}}],"body":{"params":{"fieldsList":[{"value":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m.0"}}},"component":"data2-core-types@Reference"},"key":{"component":"data2-core-types@Getter","params":{"module":{"params":{"text":{"component":"data2-core-primitives@String","params":{"content":"{\n  \"statusCode\": 200,\n  \"body\": {\n    \"data\": {\n      \"statement_id\": \"01f186b4-4f0c-1b7d-98cc-47323f8b74c5\",\n      \"status\": {\n        \"state\": \"SUCCEEDED\"\n      },\n      \"manifest\": {\n        \"format\": \"JSON_ARRAY\",\n        \"schema\": {\n          \"column_count\": 3,\n          \"columns\": [\n            {\n              \"name\": \"municipio\",\n              \"type_text\": \"STRING\",\n              \"type_name\": \"STRING\",\n              \"position\": 0\n            },\n            {\n              \"name\": \"nivel\",\n              \"type_text\": \"STRING\",\n              \"type_name\": \"STRING\",\n              \"position\": 1\n            },\n            {\n              \"name\": \"cbs\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 2\n            }\n          ]\n        },\n        \"total_chunk_count\": 1,\n        \"chunks\": [\n          {\n            \"chunk_index\": 0,\n            \"row_offset\": 0,\n            \"row_count\": 81\n          }\n        ],\n        \"total_row_count\": 81,\n        \"truncated\": false\n      },\n      \"result\": {\n        \"chunk_index\": 0,\n        \"row_offset\": 0,\n        \"row_count\": 81,\n        \"data_array\": [\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"Cristal\",\n            \"145\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"Prata\",\n            \"96\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"Bronze\",\n            \"8\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"Diamante\",\n            \"18\"\n          ],\n          [\n            \"SERRINHA\",\n            \"Bronze\",\n            \"1\"\n          ],\n          [\n            \"SAO SEBASTIAO DO PASSE\",\n            \"Cristal\",\n            \"2\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"Bronze\",\n            \"326\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"Diamante\",\n            \"4\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"Prata\",\n            \"3\"\n          ],\n          [\n            \"SAUBARA\",\n            \"Diamante\",\n            \"5\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"Prata\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"Bronze\",\n            \"3\"\n          ],\n          [\n            \"SIMOES FILHO\",\n            \"Bronze\",\n            \"1\"\n          ],\n          [\n            \"RIO DE JANEIRO\",\n            \"Bronze\",\n            \"1\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"Ouro\",\n            \"37\"\n          ],\n          [\n            \"CABOTO\",\n            \"Cristal\",\n            \"2\"\n          ],\n          [\n            \"SERROLANDIA\",\n            \"Bronze\",\n            \"1\"\n          ],\n          [\n            \"IPIAU\",\n            \"Cristal\",\n            \"1\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"Prata\",\n            \"125\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"Ouro\",\n            \"41\"\n          ],\n          [\n            \"SALVADOR\",\n            \"Prata\",\n            \"2\"\n          ],\n          [\n            \"DOCE GRANDE\",\n            \"Ouro\",\n            \"1\"\n          ],\n          [\n            \"ACUPE\",\n            \"Ouro\",\n            \"3\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"Bronze\",\n            \"149\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"Ouro\",\n            \"4\"\n          ],\n          [\n            \"CAROBA\",\n            \"Bronze\",\n            \"14\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"Ouro\",\n            \"26\"\n          ],\n          [\n            \"CAMPINHOS\",\n            \"Cristal\",\n            \"2\"\n          ],\n          [\n            \"CABOTO\",\n            \"Ouro\",\n            \"2\"\n          ],\n          [\n            \"SAO JOAO DA BARRA\",\n            \"Bronze\",\n            \"1\"\n          ],\n          [\n            \"PASSE\",\n            \"Cristal\",\n            \"12\"\n          ],\n          [\n            \"SAUBARA\",\n            \"Ouro\",\n            \"7\"\n          ],\n          [\n            \"PASSE\",\n            \"Prata\",\n            \"4\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"Diamante\",\n            \"8\"\n          ],\n          [\n            \"JOINVILLE\",\n            \"Prata\",\n            \"1\"\n          ],\n          [\n            \"ILHEUS\",\n            \"Cristal\",\n            \"1\"\n          ],\n          [\n            \"SAUBARA\",\n            \"Cristal\",\n            \"61\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"Cristal\",\n            \"5\"\n          ],\n          [\n            \"ACUPE\",\n            \"Prata\",\n            \"9\"\n          ],\n          [\n            null,\n            \"Ouro\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"Ouro\",\n            \"2\"\n          ],\n          [\n            \"MONTE RECONCAVO\",\n            \"Ouro\",\n            \"1\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"Diamante+\",\n            \"1\"\n          ],\n          [\n            \"MARIANA\",\n            \"Cristal\",\n            \"1\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"Prata\",\n            \"163\"\n          ],\n          [\n            null,\n            \"Bronze\",\n            \"9\"\n          ],\n          [\n            \"MACEIO\",\n            \"Cristal\",\n            \"1\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"Ouro\",\n            \"2\"\n          ],\n          [\n            \"GODOY CRUZ\",\n            \"Cristal\",\n            \"1\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"Cristal\",\n            \"266\"\n          ],\n          [\n            \"SALVADOR\",\n            \"Cristal\",\n            \"4\"\n          ],\n          [\n            \"ACUPE\",\n            \"Diamante\",\n            \"1\"\n          ],\n          [\n            \"CAMACARI\",\n            \"Prata\",\n            \"1\"\n          ],\n          [\n            \"CABOTO\",\n            \"Bronze\",\n            \"3\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"Cristal\",\n            \"92\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"Cristal\",\n            \"244\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"Diamante\",\n            \"18\"\n          ],\n          [\n            \"CAROBA\",\n            \"Cristal\",\n            \"14\"\n          ],\n          [\n            \"SAUBARA\",\n            \"Bronze\",\n            \"49\"\n          ],\n          [\n            \"PASSE\",\n            \"Bronze\",\n            \"6\"\n          ],\n          [\n            null,\n            \"Prata\",\n            \"5\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"Diamante+\",\n            \"1\"\n          ],\n          [\n            \"CABOTO\",\n            \"Prata\",\n            \"3\"\n          ],\n          [\n            \"SAO PAULO\",\n            \"Bronze\",\n            \"1\"\n          ],\n          [\n            \"MONTE RECONCAVO\",\n            \"Cristal\",\n            \"1\"\n          ],\n          [\n            \"SANTO ESTEVAO\",\n            \"Prata\",\n            \"1\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"Bronze\",\n            \"88\"\n          ],\n          [\n            \"CAROBA\",\n            \"Prata\",\n            \"7\"\n          ],\n          [\n            null,\n            \"Cristal\",\n            \"10\"\n          ],\n          [\n            \"CAROBA\",\n            \"Ouro\",\n            \"1\"\n          ],\n          [\n            \"TIJUANA\",\n            \"Bronze\",\n            \"1\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"Ouro\",\n            \"77\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"Prata\",\n            \"61\"\n          ],\n          [\n            \"ACUPE\",\n            \"Cristal\",\n            \"34\"\n          ],\n          [\n            \"ENTRE RIOS\",\n            \"Prata\",\n            \"1\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"Cristal\",\n            \"9\"\n          ],\n          [\n            \"ACUPE\",\n            \"Bronze\",\n            \"22\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"Bronze\",\n            \"221\"\n          ],\n          [\n            \"SAUBARA\",\n            \"Prata\",\n            \"33\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"Bronze\",\n            \"9\"\n          ],\n          [\n            \"PASSE\",\n            \"Diamante\",\n            \"1\"\n          ]\n        ]\n      }\n    }\n  },\n  \"timings\": [\n    {\n      \"label\": \"00_defs\",\n      \"dur\": 13.24\n    },\n    {\n      \"label\": \"010_env_bundle\",\n      \"dur\": 0\n    },\n    {\n      \"label\": \"011_env_init\",\n      \"dur\": 1660.32\n    },\n    {\n      \"label\": \"012_env_pem\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"01_env\",\n      \"dur\": 1661.57\n    },\n    {\n      \"label\": \"02_setup\",\n      \"dur\": 149.26\n    },\n    {\n      \"label\": \"03_permissions\",\n      \"dur\": 0.09\n    },\n    {\n      \"label\": \"04_op_response\",\n      \"dur\": 6582.41\n    },\n    {\n      \"label\": \"04_op\",\n      \"dur\": 6582.96\n    },\n    {\n      \"label\": \"05_track\",\n      \"dur\": 514.25\n    }\n  ]\n}"}}},"component":"data2-core-functions@JSONParse"},"prop":{"component":"data2-core-primitives@String","params":{"content":"body.data.manifest.schema.columns.0.name"}}}}},{"value":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m.1"}}},"component":"data2-core-types@Reference"},"key":{"component":"data2-core-types@Getter","params":{"module":{"params":{"text":{"component":"data2-core-primitives@String","params":{"content":"{\n  \"statusCode\": 200,\n  \"body\": {\n    \"data\": {\n      \"statement_id\": \"01f186b4-4f0c-1b7d-98cc-47323f8b74c5\",\n      \"status\": {\n        \"state\": \"SUCCEEDED\"\n      },\n      \"manifest\": {\n        \"format\": \"JSON_ARRAY\",\n        \"schema\": {\n          \"column_count\": 3,\n          \"columns\": [\n            {\n              \"name\": \"municipio\",\n              \"type_text\": \"STRING\",\n              \"type_name\": \"STRING\",\n              \"position\": 0\n            },\n            {\n              \"name\": \"nivel\",\n              \"type_text\": \"STRING\",\n              \"type_name\": \"STRING\",\n              \"position\": 1\n            },\n            {\n              \"name\": \"cbs\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 2\n            }\n          ]\n        },\n        \"total_chunk_count\": 1,\n        \"chunks\": [\n          {\n            \"chunk_index\": 0,\n            \"row_offset\": 0,\n            \"row_count\": 81\n          }\n        ],\n        \"total_row_count\": 81,\n        \"truncated\": false\n      },\n      \"result\": {\n        \"chunk_index\": 0,\n        \"row_offset\": 0,\n        \"row_count\": 81,\n        \"data_array\": [\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"Cristal\",\n            \"145\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"Prata\",\n            \"96\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"Bronze\",\n            \"8\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"Diamante\",\n            \"18\"\n          ],\n          [\n            \"SERRINHA\",\n            \"Bronze\",\n            \"1\"\n          ],\n          [\n            \"SAO SEBASTIAO DO PASSE\",\n            \"Cristal\",\n            \"2\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"Bronze\",\n            \"326\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"Diamante\",\n            \"4\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"Prata\",\n            \"3\"\n          ],\n          [\n            \"SAUBARA\",\n            \"Diamante\",\n            \"5\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"Prata\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"Bronze\",\n            \"3\"\n          ],\n          [\n            \"SIMOES FILHO\",\n            \"Bronze\",\n            \"1\"\n          ],\n          [\n            \"RIO DE JANEIRO\",\n            \"Bronze\",\n            \"1\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"Ouro\",\n            \"37\"\n          ],\n          [\n            \"CABOTO\",\n            \"Cristal\",\n            \"2\"\n          ],\n          [\n            \"SERROLANDIA\",\n            \"Bronze\",\n            \"1\"\n          ],\n          [\n            \"IPIAU\",\n            \"Cristal\",\n            \"1\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"Prata\",\n            \"125\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"Ouro\",\n            \"41\"\n          ],\n          [\n            \"SALVADOR\",\n            \"Prata\",\n            \"2\"\n          ],\n          [\n            \"DOCE GRANDE\",\n            \"Ouro\",\n            \"1\"\n          ],\n          [\n            \"ACUPE\",\n            \"Ouro\",\n            \"3\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"Bronze\",\n            \"149\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"Ouro\",\n            \"4\"\n          ],\n          [\n            \"CAROBA\",\n            \"Bronze\",\n            \"14\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"Ouro\",\n            \"26\"\n          ],\n          [\n            \"CAMPINHOS\",\n            \"Cristal\",\n            \"2\"\n          ],\n          [\n            \"CABOTO\",\n            \"Ouro\",\n            \"2\"\n          ],\n          [\n            \"SAO JOAO DA BARRA\",\n            \"Bronze\",\n            \"1\"\n          ],\n          [\n            \"PASSE\",\n            \"Cristal\",\n            \"12\"\n          ],\n          [\n            \"SAUBARA\",\n            \"Ouro\",\n            \"7\"\n          ],\n          [\n            \"PASSE\",\n            \"Prata\",\n            \"4\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"Diamante\",\n            \"8\"\n          ],\n          [\n            \"JOINVILLE\",\n            \"Prata\",\n            \"1\"\n          ],\n          [\n            \"ILHEUS\",\n            \"Cristal\",\n            \"1\"\n          ],\n          [\n            \"SAUBARA\",\n            \"Cristal\",\n            \"61\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"Cristal\",\n            \"5\"\n          ],\n          [\n            \"ACUPE\",\n            \"Prata\",\n            \"9\"\n          ],\n          [\n            null,\n            \"Ouro\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"Ouro\",\n            \"2\"\n          ],\n          [\n            \"MONTE RECONCAVO\",\n            \"Ouro\",\n            \"1\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"Diamante+\",\n            \"1\"\n          ],\n          [\n            \"MARIANA\",\n            \"Cristal\",\n            \"1\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"Prata\",\n            \"163\"\n          ],\n          [\n            null,\n            \"Bronze\",\n            \"9\"\n          ],\n          [\n            \"MACEIO\",\n            \"Cristal\",\n            \"1\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"Ouro\",\n            \"2\"\n          ],\n          [\n            \"GODOY CRUZ\",\n            \"Cristal\",\n            \"1\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"Cristal\",\n            \"266\"\n          ],\n          [\n            \"SALVADOR\",\n            \"Cristal\",\n            \"4\"\n          ],\n          [\n            \"ACUPE\",\n            \"Diamante\",\n            \"1\"\n          ],\n          [\n            \"CAMACARI\",\n            \"Prata\",\n            \"1\"\n          ],\n          [\n            \"CABOTO\",\n            \"Bronze\",\n            \"3\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"Cristal\",\n            \"92\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"Cristal\",\n            \"244\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"Diamante\",\n            \"18\"\n          ],\n          [\n            \"CAROBA\",\n            \"Cristal\",\n            \"14\"\n          ],\n          [\n            \"SAUBARA\",\n            \"Bronze\",\n            \"49\"\n          ],\n          [\n            \"PASSE\",\n            \"Bronze\",\n            \"6\"\n          ],\n          [\n            null,\n            \"Prata\",\n            \"5\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"Diamante+\",\n            \"1\"\n          ],\n          [\n            \"CABOTO\",\n            \"Prata\",\n            \"3\"\n          ],\n          [\n            \"SAO PAULO\",\n            \"Bronze\",\n            \"1\"\n          ],\n          [\n            \"MONTE RECONCAVO\",\n            \"Cristal\",\n            \"1\"\n          ],\n          [\n            \"SANTO ESTEVAO\",\n            \"Prata\",\n            \"1\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"Bronze\",\n            \"88\"\n          ],\n          [\n            \"CAROBA\",\n            \"Prata\",\n            \"7\"\n          ],\n          [\n            null,\n            \"Cristal\",\n            \"10\"\n          ],\n          [\n            \"CAROBA\",\n            \"Ouro\",\n            \"1\"\n          ],\n          [\n            \"TIJUANA\",\n            \"Bronze\",\n            \"1\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"Ouro\",\n            \"77\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"Prata\",\n            \"61\"\n          ],\n          [\n            \"ACUPE\",\n            \"Cristal\",\n            \"34\"\n          ],\n          [\n            \"ENTRE RIOS\",\n            \"Prata\",\n            \"1\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"Cristal\",\n            \"9\"\n          ],\n          [\n            \"ACUPE\",\n            \"Bronze\",\n            \"22\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"Bronze\",\n            \"221\"\n          ],\n          [\n            \"SAUBARA\",\n            \"Prata\",\n            \"33\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"Bronze\",\n            \"9\"\n          ],\n          [\n            \"PASSE\",\n            \"Diamante\",\n            \"1\"\n          ]\n        ]\n      }\n    }\n  },\n  \"timings\": [\n    {\n      \"label\": \"00_defs\",\n      \"dur\": 13.24\n    },\n    {\n      \"label\": \"010_env_bundle\",\n      \"dur\": 0\n    },\n    {\n      \"label\": \"011_env_init\",\n      \"dur\": 1660.32\n    },\n    {\n      \"label\": \"012_env_pem\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"01_env\",\n      \"dur\": 1661.57\n    },\n    {\n      \"label\": \"02_setup\",\n      \"dur\": 149.26\n    },\n    {\n      \"label\": \"03_permissions\",\n      \"dur\": 0.09\n    },\n    {\n      \"label\": \"04_op_response\",\n      \"dur\": 6582.41\n    },\n    {\n      \"label\": \"04_op\",\n      \"dur\": 6582.96\n    },\n    {\n      \"label\": \"05_track\",\n      \"dur\": 514.25\n    }\n  ]\n}"}}},"component":"data2-core-functions@JSONParse"},"prop":{"component":"data2-core-primitives@String","params":{"content":"body.data.manifest.schema.columns.1.name"}}}}},{"value":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m.2"}}},"component":"data2-core-types@Reference"},"key":{"component":"data2-core-types@Getter","params":{"module":{"params":{"text":{"component":"data2-core-primitives@String","params":{"content":"{\n  \"statusCode\": 200,\n  \"body\": {\n    \"data\": {\n      \"statement_id\": \"01f186b4-4f0c-1b7d-98cc-47323f8b74c5\",\n      \"status\": {\n        \"state\": \"SUCCEEDED\"\n      },\n      \"manifest\": {\n        \"format\": \"JSON_ARRAY\",\n        \"schema\": {\n          \"column_count\": 3,\n          \"columns\": [\n            {\n              \"name\": \"municipio\",\n              \"type_text\": \"STRING\",\n              \"type_name\": \"STRING\",\n              \"position\": 0\n            },\n            {\n              \"name\": \"nivel\",\n              \"type_text\": \"STRING\",\n              \"type_name\": \"STRING\",\n              \"position\": 1\n            },\n            {\n              \"name\": \"cbs\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 2\n            }\n          ]\n        },\n        \"total_chunk_count\": 1,\n        \"chunks\": [\n          {\n            \"chunk_index\": 0,\n            \"row_offset\": 0,\n            \"row_count\": 81\n          }\n        ],\n        \"total_row_count\": 81,\n        \"truncated\": false\n      },\n      \"result\": {\n        \"chunk_index\": 0,\n        \"row_offset\": 0,\n        \"row_count\": 81,\n        \"data_array\": [\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"Cristal\",\n            \"145\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"Prata\",\n            \"96\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"Bronze\",\n            \"8\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"Diamante\",\n            \"18\"\n          ],\n          [\n            \"SERRINHA\",\n            \"Bronze\",\n            \"1\"\n          ],\n          [\n            \"SAO SEBASTIAO DO PASSE\",\n            \"Cristal\",\n            \"2\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"Bronze\",\n            \"326\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"Diamante\",\n            \"4\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"Prata\",\n            \"3\"\n          ],\n          [\n            \"SAUBARA\",\n            \"Diamante\",\n            \"5\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"Prata\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"Bronze\",\n            \"3\"\n          ],\n          [\n            \"SIMOES FILHO\",\n            \"Bronze\",\n            \"1\"\n          ],\n          [\n            \"RIO DE JANEIRO\",\n            \"Bronze\",\n            \"1\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"Ouro\",\n            \"37\"\n          ],\n          [\n            \"CABOTO\",\n            \"Cristal\",\n            \"2\"\n          ],\n          [\n            \"SERROLANDIA\",\n            \"Bronze\",\n            \"1\"\n          ],\n          [\n            \"IPIAU\",\n            \"Cristal\",\n            \"1\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"Prata\",\n            \"125\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"Ouro\",\n            \"41\"\n          ],\n          [\n            \"SALVADOR\",\n            \"Prata\",\n            \"2\"\n          ],\n          [\n            \"DOCE GRANDE\",\n            \"Ouro\",\n            \"1\"\n          ],\n          [\n            \"ACUPE\",\n            \"Ouro\",\n            \"3\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"Bronze\",\n            \"149\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"Ouro\",\n            \"4\"\n          ],\n          [\n            \"CAROBA\",\n            \"Bronze\",\n            \"14\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"Ouro\",\n            \"26\"\n          ],\n          [\n            \"CAMPINHOS\",\n            \"Cristal\",\n            \"2\"\n          ],\n          [\n            \"CABOTO\",\n            \"Ouro\",\n            \"2\"\n          ],\n          [\n            \"SAO JOAO DA BARRA\",\n            \"Bronze\",\n            \"1\"\n          ],\n          [\n            \"PASSE\",\n            \"Cristal\",\n            \"12\"\n          ],\n          [\n            \"SAUBARA\",\n            \"Ouro\",\n            \"7\"\n          ],\n          [\n            \"PASSE\",\n            \"Prata\",\n            \"4\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"Diamante\",\n            \"8\"\n          ],\n          [\n            \"JOINVILLE\",\n            \"Prata\",\n            \"1\"\n          ],\n          [\n            \"ILHEUS\",\n            \"Cristal\",\n            \"1\"\n          ],\n          [\n            \"SAUBARA\",\n            \"Cristal\",\n            \"61\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"Cristal\",\n            \"5\"\n          ],\n          [\n            \"ACUPE\",\n            \"Prata\",\n            \"9\"\n          ],\n          [\n            null,\n            \"Ouro\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"Ouro\",\n            \"2\"\n          ],\n          [\n            \"MONTE RECONCAVO\",\n            \"Ouro\",\n            \"1\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"Diamante+\",\n            \"1\"\n          ],\n          [\n            \"MARIANA\",\n            \"Cristal\",\n            \"1\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"Prata\",\n            \"163\"\n          ],\n          [\n            null,\n            \"Bronze\",\n            \"9\"\n          ],\n          [\n            \"MACEIO\",\n            \"Cristal\",\n            \"1\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"Ouro\",\n            \"2\"\n          ],\n          [\n            \"GODOY CRUZ\",\n            \"Cristal\",\n            \"1\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"Cristal\",\n            \"266\"\n          ],\n          [\n            \"SALVADOR\",\n            \"Cristal\",\n            \"4\"\n          ],\n          [\n            \"ACUPE\",\n            \"Diamante\",\n            \"1\"\n          ],\n          [\n            \"CAMACARI\",\n            \"Prata\",\n            \"1\"\n          ],\n          [\n            \"CABOTO\",\n            \"Bronze\",\n            \"3\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"Cristal\",\n            \"92\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"Cristal\",\n            \"244\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"Diamante\",\n            \"18\"\n          ],\n          [\n            \"CAROBA\",\n            \"Cristal\",\n            \"14\"\n          ],\n          [\n            \"SAUBARA\",\n            \"Bronze\",\n            \"49\"\n          ],\n          [\n            \"PASSE\",\n            \"Bronze\",\n            \"6\"\n          ],\n          [\n            null,\n            \"Prata\",\n            \"5\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"Diamante+\",\n            \"1\"\n          ],\n          [\n            \"CABOTO\",\n            \"Prata\",\n            \"3\"\n          ],\n          [\n            \"SAO PAULO\",\n            \"Bronze\",\n            \"1\"\n          ],\n          [\n            \"MONTE RECONCAVO\",\n            \"Cristal\",\n            \"1\"\n          ],\n          [\n            \"SANTO ESTEVAO\",\n            \"Prata\",\n            \"1\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"Bronze\",\n            \"88\"\n          ],\n          [\n            \"CAROBA\",\n            \"Prata\",\n            \"7\"\n          ],\n          [\n            null,\n            \"Cristal\",\n            \"10\"\n          ],\n          [\n            \"CAROBA\",\n            \"Ouro\",\n            \"1\"\n          ],\n          [\n            \"TIJUANA\",\n            \"Bronze\",\n            \"1\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"Ouro\",\n            \"77\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"Prata\",\n            \"61\"\n          ],\n          [\n            \"ACUPE\",\n            \"Cristal\",\n            \"34\"\n          ],\n          [\n            \"ENTRE RIOS\",\n            \"Prata\",\n            \"1\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"Cristal\",\n            \"9\"\n          ],\n          [\n            \"ACUPE\",\n            \"Bronze\",\n            \"22\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"Bronze\",\n            \"221\"\n          ],\n          [\n            \"SAUBARA\",\n            \"Prata\",\n            \"33\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"Bronze\",\n            \"9\"\n          ],\n          [\n            \"PASSE\",\n            \"Diamante\",\n            \"1\"\n          ]\n        ]\n      }\n    }\n  },\n  \"timings\": [\n    {\n      \"label\": \"00_defs\",\n      \"dur\": 13.24\n    },\n    {\n      \"label\": \"010_env_bundle\",\n      \"dur\": 0\n    },\n    {\n      \"label\": \"011_env_init\",\n      \"dur\": 1660.32\n    },\n    {\n      \"label\": \"012_env_pem\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"01_env\",\n      \"dur\": 1661.57\n    },\n    {\n      \"label\": \"02_setup\",\n      \"dur\": 149.26\n    },\n    {\n      \"label\": \"03_permissions\",\n      \"dur\": 0.09\n    },\n    {\n      \"label\": \"04_op_response\",\n      \"dur\": 6582.41\n    },\n    {\n      \"label\": \"04_op\",\n      \"dur\": 6582.96\n    },\n    {\n      \"label\": \"05_track\",\n      \"dur\": 514.25\n    }\n  ]\n}"}}},"component":"data2-core-functions@JSONParse"},"prop":{"component":"data2-core-primitives@String","params":{"content":"body.data.manifest.schema.columns.2.name"}}}}}]},"component":"data2-core-types@FieldSet"}}}},"component":"data2-core-functions@ArrayMap"},"collapsed":{"component":"data2-core-primitives@Number","params":{"content":99}},"theme":"rjv-default"},"updatedAt":"2026-07-24T16:36:04.996Z","createdAt":"2026-07-24T16:36:04.996Z"},{"_id":"6a6394544040249ac2ede730","parent":"6a62510c203e921fd2513b1c","component":"data2-blocks@JsonViewer","system":"6a57cfe9673eb7e3c5e57784","displayName":"Copy of Copy of Copy of Copy of Copy of input","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":680,"height":436,"exactWidth":false,"exactHeight":435.96999999999997}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":1,"y":332,"exactX":1,"exactY":332.03000000000003,"fixed":false,"left":true,"top":true,"bottom":true,"growV":false}},"style":{"flex":{"component":"data2-core-primitives@String","params":{"content":"1"}}},"scroll":{"disabled":false,"component":"data2-core-types@Scroll","params":{"y":true}}},"json":{"params":{"array":{"params":{"array":{"params":{"module":{"params":{"text":{"component":"data2-core-primitives@String","params":{"content":"{\n  \"statusCode\": 200,\n  \"body\": {\n    \"data\": {\n      \"statement_id\": \"01f186b4-4f0b-1def-9235-a8ee961f1f68\",\n      \"status\": {\n        \"state\": \"SUCCEEDED\"\n      },\n      \"manifest\": {\n        \"format\": \"JSON_ARRAY\",\n        \"schema\": {\n          \"column_count\": 10,\n          \"columns\": [\n            {\n              \"name\": \"municipio\",\n              \"type_text\": \"STRING\",\n              \"type_name\": \"STRING\",\n              \"position\": 0\n            },\n            {\n              \"name\": \"grupo\",\n              \"type_text\": \"INT\",\n              \"type_name\": \"INT\",\n              \"position\": 1\n            },\n            {\n              \"name\": \"lider\",\n              \"type_text\": \"STRING\",\n              \"type_name\": \"STRING\",\n              \"position\": 2\n            },\n            {\n              \"name\": \"cbs\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 3\n            },\n            {\n              \"name\": \"receita\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 4,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"rec_nat\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 5,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"rec_avon\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 6,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"pontos\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 7,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"pedidos\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 8,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"ativas\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 9\n            }\n          ]\n        },\n        \"total_chunk_count\": 1,\n        \"chunks\": [\n          {\n            \"chunk_index\": 0,\n            \"row_offset\": 0,\n            \"row_count\": 122\n          }\n        ],\n        \"total_row_count\": 122,\n        \"truncated\": false\n      },\n      \"result\": {\n        \"chunk_index\": 0,\n        \"row_offset\": 0,\n        \"row_count\": 122,\n        \"data_array\": [\n          [\n            \"MADRE DE DEUS\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"28\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ACUPE\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"42\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"185\",\n            \"5603\",\n            \"5497\",\n            \"106\",\n            \"938\",\n            \"5\",\n            \"5\"\n          ],\n          [\n            \"SALVADOR\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"21\",\n            \"625\",\n            \"625\",\n            \"0\",\n            \"104\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"11\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MONTE RECONCAVO\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SALVADOR\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ACUPE\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"2\",\n            \"765\",\n            \"483\",\n            \"283\",\n            \"134\",\n            \"2\",\n            \"1\"\n          ],\n          [\n            null,\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO JOAO DA BARRA\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"71\",\n            \"2110\",\n            \"2110\",\n            \"0\",\n            \"335\",\n            \"3\",\n            \"3\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"10\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"3\",\n            \"642\",\n            \"642\",\n            \"0\",\n            \"100\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"21\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"8\",\n            \"140\",\n            \"0\",\n            \"140\",\n            \"25\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"18\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MACEIO\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAMACARI\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CABOTO\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MARIANA\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO ESTEVAO\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"70\",\n            \"527\",\n            \"527\",\n            \"0\",\n            \"81\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"12\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"6\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CABOTO\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"38\",\n            \"319\",\n            \"0\",\n            \"319\",\n            \"77\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"39\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"76\",\n            \"1916\",\n            \"1916\",\n            \"0\",\n            \"279\",\n            \"2\",\n            \"2\"\n          ],\n          [\n            \"CAROBA\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"23\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"137\",\n            \"1595\",\n            \"1595\",\n            \"0\",\n            \"204\",\n            \"2\",\n            \"2\"\n          ],\n          [\n            \"PASSE\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"4\",\n            \"592\",\n            \"592\",\n            \"0\",\n            \"88\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"SAO PAULO\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MONTE RECONCAVO\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAMPINHOS\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"32\",\n            \"537\",\n            \"336\",\n            \"201\",\n            \"78\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"PASSE\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"5\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"36\",\n            \"1614\",\n            \"835\",\n            \"779\",\n            \"267\",\n            \"3\",\n            \"3\"\n          ],\n          [\n            null,\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"3\",\n            \"247\",\n            \"247\",\n            \"0\",\n            \"44\",\n            \"1\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"83\",\n            \"1152\",\n            \"983\",\n            \"170\",\n            \"199\",\n            \"3\",\n            \"3\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"82\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"9\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ACUPE\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"5\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SALVADOR\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"124\",\n            \"9945\",\n            \"5384\",\n            \"4561\",\n            \"1955\",\n            \"6\",\n            \"5\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"34\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"13\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"45\",\n            \"1417\",\n            \"1306\",\n            \"110\",\n            \"213\",\n            \"2\",\n            \"2\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"6\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SIMOES FILHO\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"148\",\n            \"985\",\n            \"985\",\n            \"0\",\n            \"126\",\n            \"2\",\n            \"2\"\n          ],\n          [\n            \"ENTRE RIOS\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"218\",\n            \"503\",\n            \"503\",\n            \"0\",\n            \"88\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"31\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"37\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"5\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"RIO DE JANEIRO\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ILHEUS\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"197\",\n            \"5072\",\n            \"4830\",\n            \"243\",\n            \"890\",\n            \"7\",\n            \"7\"\n          ],\n          [\n            \"ACUPE\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"13\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"114\",\n            \"2394\",\n            \"2394\",\n            \"0\",\n            \"358\",\n            \"2\",\n            \"2\"\n          ],\n          [\n            \"DOCE GRANDE\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"IPIAU\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"89\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"11\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"50\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"10\",\n            \"1715\",\n            \"1715\",\n            \"0\",\n            \"248\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"13\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"5\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAMPINHOS\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SERROLANDIA\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"JOINVILLE\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO SEBASTIAO DO PASSE\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"4\",\n            \"142\",\n            \"0\",\n            \"142\",\n            \"25\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"68\",\n            \"2253\",\n            \"2074\",\n            \"179\",\n            \"361\",\n            \"3\",\n            \"3\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"39\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CABOTO\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CABOTO\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SERRINHA\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO SEBASTIAO DO PASSE\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"19\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"95\",\n            \"343\",\n            \"0\",\n            \"343\",\n            \"67\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"CAROBA\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CABOTO\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ACUPE\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"6\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"GODOY CRUZ\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ACUPE\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SALVADOR\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"TIJUANA\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"5\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ]\n        ]\n      }\n    }\n  },\n  \"timings\": [\n    {\n      \"label\": \"00_defs\",\n      \"dur\": 19.74\n    },\n    {\n      \"label\": \"010_env_bundle\",\n      \"dur\": 0\n    },\n    {\n      \"label\": \"011_env_init\",\n      \"dur\": 837.65\n    },\n    {\n      \"label\": \"012_env_pem\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"01_env\",\n      \"dur\": 838.21\n    },\n    {\n      \"label\": \"02_setup\",\n      \"dur\": 173.69\n    },\n    {\n      \"label\": \"03_permissions\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"04_op_response\",\n      \"dur\": 5844.55\n    },\n    {\n      \"label\": \"04_op\",\n      \"dur\": 5845.13\n    },\n    {\n      \"label\": \"05_track\",\n      \"dur\": 509.89\n    }\n  ]\n}"}}},"component":"data2-core-functions@JSONParse"},"prop":{"component":"data2-core-primitives@String","params":{"content":"body.data.result.data_array"}}},"component":"data2-core-types@Getter"},"end":{"component":"data2-core-primitives@Number","params":{"content":80}}},"component":"data2-core-functions@ArraySlice"},"mapper":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"m"}},{"component":"data2-core-primitives@String","params":{"content":"i"}}],"body":{"params":{"fieldsList":[{"value":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m.0"}}},"component":"data2-core-types@Reference"},"key":{"component":"data2-core-types@Getter","params":{"module":{"params":{"text":{"component":"data2-core-primitives@String","params":{"content":"{\n  \"statusCode\": 200,\n  \"body\": {\n    \"data\": {\n      \"statement_id\": \"01f186b4-4f0b-1def-9235-a8ee961f1f68\",\n      \"status\": {\n        \"state\": \"SUCCEEDED\"\n      },\n      \"manifest\": {\n        \"format\": \"JSON_ARRAY\",\n        \"schema\": {\n          \"column_count\": 10,\n          \"columns\": [\n            {\n              \"name\": \"municipio\",\n              \"type_text\": \"STRING\",\n              \"type_name\": \"STRING\",\n              \"position\": 0\n            },\n            {\n              \"name\": \"grupo\",\n              \"type_text\": \"INT\",\n              \"type_name\": \"INT\",\n              \"position\": 1\n            },\n            {\n              \"name\": \"lider\",\n              \"type_text\": \"STRING\",\n              \"type_name\": \"STRING\",\n              \"position\": 2\n            },\n            {\n              \"name\": \"cbs\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 3\n            },\n            {\n              \"name\": \"receita\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 4,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"rec_nat\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 5,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"rec_avon\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 6,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"pontos\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 7,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"pedidos\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 8,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"ativas\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 9\n            }\n          ]\n        },\n        \"total_chunk_count\": 1,\n        \"chunks\": [\n          {\n            \"chunk_index\": 0,\n            \"row_offset\": 0,\n            \"row_count\": 122\n          }\n        ],\n        \"total_row_count\": 122,\n        \"truncated\": false\n      },\n      \"result\": {\n        \"chunk_index\": 0,\n        \"row_offset\": 0,\n        \"row_count\": 122,\n        \"data_array\": [\n          [\n            \"MADRE DE DEUS\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"28\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ACUPE\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"42\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"185\",\n            \"5603\",\n            \"5497\",\n            \"106\",\n            \"938\",\n            \"5\",\n            \"5\"\n          ],\n          [\n            \"SALVADOR\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"21\",\n            \"625\",\n            \"625\",\n            \"0\",\n            \"104\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"11\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MONTE RECONCAVO\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SALVADOR\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ACUPE\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"2\",\n            \"765\",\n            \"483\",\n            \"283\",\n            \"134\",\n            \"2\",\n            \"1\"\n          ],\n          [\n            null,\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO JOAO DA BARRA\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"71\",\n            \"2110\",\n            \"2110\",\n            \"0\",\n            \"335\",\n            \"3\",\n            \"3\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"10\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"3\",\n            \"642\",\n            \"642\",\n            \"0\",\n            \"100\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"21\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"8\",\n            \"140\",\n            \"0\",\n            \"140\",\n            \"25\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"18\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MACEIO\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAMACARI\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CABOTO\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MARIANA\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO ESTEVAO\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"70\",\n            \"527\",\n            \"527\",\n            \"0\",\n            \"81\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"12\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"6\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CABOTO\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"38\",\n            \"319\",\n            \"0\",\n            \"319\",\n            \"77\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"39\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"76\",\n            \"1916\",\n            \"1916\",\n            \"0\",\n            \"279\",\n            \"2\",\n            \"2\"\n          ],\n          [\n            \"CAROBA\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"23\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"137\",\n            \"1595\",\n            \"1595\",\n            \"0\",\n            \"204\",\n            \"2\",\n            \"2\"\n          ],\n          [\n            \"PASSE\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"4\",\n            \"592\",\n            \"592\",\n            \"0\",\n            \"88\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"SAO PAULO\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MONTE RECONCAVO\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAMPINHOS\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"32\",\n            \"537\",\n            \"336\",\n            \"201\",\n            \"78\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"PASSE\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"5\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"36\",\n            \"1614\",\n            \"835\",\n            \"779\",\n            \"267\",\n            \"3\",\n            \"3\"\n          ],\n          [\n            null,\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"3\",\n            \"247\",\n            \"247\",\n            \"0\",\n            \"44\",\n            \"1\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"83\",\n            \"1152\",\n            \"983\",\n            \"170\",\n            \"199\",\n            \"3\",\n            \"3\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"82\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"9\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ACUPE\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"5\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SALVADOR\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"124\",\n            \"9945\",\n            \"5384\",\n            \"4561\",\n            \"1955\",\n            \"6\",\n            \"5\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"34\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"13\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"45\",\n            \"1417\",\n            \"1306\",\n            \"110\",\n            \"213\",\n            \"2\",\n            \"2\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"6\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SIMOES FILHO\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"148\",\n            \"985\",\n            \"985\",\n            \"0\",\n            \"126\",\n            \"2\",\n            \"2\"\n          ],\n          [\n            \"ENTRE RIOS\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"218\",\n            \"503\",\n            \"503\",\n            \"0\",\n            \"88\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"31\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"37\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"5\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"RIO DE JANEIRO\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ILHEUS\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"197\",\n            \"5072\",\n            \"4830\",\n            \"243\",\n            \"890\",\n            \"7\",\n            \"7\"\n          ],\n          [\n            \"ACUPE\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"13\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"114\",\n            \"2394\",\n            \"2394\",\n            \"0\",\n            \"358\",\n            \"2\",\n            \"2\"\n          ],\n          [\n            \"DOCE GRANDE\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"IPIAU\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"89\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"11\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"50\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"10\",\n            \"1715\",\n            \"1715\",\n            \"0\",\n            \"248\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"13\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"5\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAMPINHOS\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SERROLANDIA\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"JOINVILLE\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO SEBASTIAO DO PASSE\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"4\",\n            \"142\",\n            \"0\",\n            \"142\",\n            \"25\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"68\",\n            \"2253\",\n            \"2074\",\n            \"179\",\n            \"361\",\n            \"3\",\n            \"3\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"39\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CABOTO\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CABOTO\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SERRINHA\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO SEBASTIAO DO PASSE\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"19\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"95\",\n            \"343\",\n            \"0\",\n            \"343\",\n            \"67\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"CAROBA\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CABOTO\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ACUPE\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"6\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"GODOY CRUZ\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ACUPE\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SALVADOR\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"TIJUANA\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"5\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ]\n        ]\n      }\n    }\n  },\n  \"timings\": [\n    {\n      \"label\": \"00_defs\",\n      \"dur\": 19.74\n    },\n    {\n      \"label\": \"010_env_bundle\",\n      \"dur\": 0\n    },\n    {\n      \"label\": \"011_env_init\",\n      \"dur\": 837.65\n    },\n    {\n      \"label\": \"012_env_pem\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"01_env\",\n      \"dur\": 838.21\n    },\n    {\n      \"label\": \"02_setup\",\n      \"dur\": 173.69\n    },\n    {\n      \"label\": \"03_permissions\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"04_op_response\",\n      \"dur\": 5844.55\n    },\n    {\n      \"label\": \"04_op\",\n      \"dur\": 5845.13\n    },\n    {\n      \"label\": \"05_track\",\n      \"dur\": 509.89\n    }\n  ]\n}"}}},"component":"data2-core-functions@JSONParse"},"prop":{"component":"data2-core-primitives@String","params":{"content":"body.data.manifest.schema.columns.0.name"}}}}},{"value":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m.1"}}},"component":"data2-core-types@Reference"},"key":{"component":"data2-core-types@Getter","params":{"module":{"params":{"text":{"component":"data2-core-primitives@String","params":{"content":"{\n  \"statusCode\": 200,\n  \"body\": {\n    \"data\": {\n      \"statement_id\": \"01f186b4-4f0b-1def-9235-a8ee961f1f68\",\n      \"status\": {\n        \"state\": \"SUCCEEDED\"\n      },\n      \"manifest\": {\n        \"format\": \"JSON_ARRAY\",\n        \"schema\": {\n          \"column_count\": 10,\n          \"columns\": [\n            {\n              \"name\": \"municipio\",\n              \"type_text\": \"STRING\",\n              \"type_name\": \"STRING\",\n              \"position\": 0\n            },\n            {\n              \"name\": \"grupo\",\n              \"type_text\": \"INT\",\n              \"type_name\": \"INT\",\n              \"position\": 1\n            },\n            {\n              \"name\": \"lider\",\n              \"type_text\": \"STRING\",\n              \"type_name\": \"STRING\",\n              \"position\": 2\n            },\n            {\n              \"name\": \"cbs\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 3\n            },\n            {\n              \"name\": \"receita\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 4,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"rec_nat\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 5,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"rec_avon\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 6,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"pontos\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 7,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"pedidos\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 8,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"ativas\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 9\n            }\n          ]\n        },\n        \"total_chunk_count\": 1,\n        \"chunks\": [\n          {\n            \"chunk_index\": 0,\n            \"row_offset\": 0,\n            \"row_count\": 122\n          }\n        ],\n        \"total_row_count\": 122,\n        \"truncated\": false\n      },\n      \"result\": {\n        \"chunk_index\": 0,\n        \"row_offset\": 0,\n        \"row_count\": 122,\n        \"data_array\": [\n          [\n            \"MADRE DE DEUS\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"28\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ACUPE\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"42\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"185\",\n            \"5603\",\n            \"5497\",\n            \"106\",\n            \"938\",\n            \"5\",\n            \"5\"\n          ],\n          [\n            \"SALVADOR\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"21\",\n            \"625\",\n            \"625\",\n            \"0\",\n            \"104\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"11\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MONTE RECONCAVO\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SALVADOR\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ACUPE\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"2\",\n            \"765\",\n            \"483\",\n            \"283\",\n            \"134\",\n            \"2\",\n            \"1\"\n          ],\n          [\n            null,\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO JOAO DA BARRA\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"71\",\n            \"2110\",\n            \"2110\",\n            \"0\",\n            \"335\",\n            \"3\",\n            \"3\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"10\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"3\",\n            \"642\",\n            \"642\",\n            \"0\",\n            \"100\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"21\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"8\",\n            \"140\",\n            \"0\",\n            \"140\",\n            \"25\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"18\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MACEIO\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAMACARI\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CABOTO\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MARIANA\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO ESTEVAO\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"70\",\n            \"527\",\n            \"527\",\n            \"0\",\n            \"81\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"12\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"6\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CABOTO\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"38\",\n            \"319\",\n            \"0\",\n            \"319\",\n            \"77\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"39\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"76\",\n            \"1916\",\n            \"1916\",\n            \"0\",\n            \"279\",\n            \"2\",\n            \"2\"\n          ],\n          [\n            \"CAROBA\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"23\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"137\",\n            \"1595\",\n            \"1595\",\n            \"0\",\n            \"204\",\n            \"2\",\n            \"2\"\n          ],\n          [\n            \"PASSE\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"4\",\n            \"592\",\n            \"592\",\n            \"0\",\n            \"88\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"SAO PAULO\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MONTE RECONCAVO\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAMPINHOS\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"32\",\n            \"537\",\n            \"336\",\n            \"201\",\n            \"78\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"PASSE\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"5\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"36\",\n            \"1614\",\n            \"835\",\n            \"779\",\n            \"267\",\n            \"3\",\n            \"3\"\n          ],\n          [\n            null,\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"3\",\n            \"247\",\n            \"247\",\n            \"0\",\n            \"44\",\n            \"1\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"83\",\n            \"1152\",\n            \"983\",\n            \"170\",\n            \"199\",\n            \"3\",\n            \"3\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"82\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"9\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ACUPE\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"5\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SALVADOR\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"124\",\n            \"9945\",\n            \"5384\",\n            \"4561\",\n            \"1955\",\n            \"6\",\n            \"5\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"34\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"13\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"45\",\n            \"1417\",\n            \"1306\",\n            \"110\",\n            \"213\",\n            \"2\",\n            \"2\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"6\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SIMOES FILHO\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"148\",\n            \"985\",\n            \"985\",\n            \"0\",\n            \"126\",\n            \"2\",\n            \"2\"\n          ],\n          [\n            \"ENTRE RIOS\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"218\",\n            \"503\",\n            \"503\",\n            \"0\",\n            \"88\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"31\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"37\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"5\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"RIO DE JANEIRO\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ILHEUS\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"197\",\n            \"5072\",\n            \"4830\",\n            \"243\",\n            \"890\",\n            \"7\",\n            \"7\"\n          ],\n          [\n            \"ACUPE\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"13\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"114\",\n            \"2394\",\n            \"2394\",\n            \"0\",\n            \"358\",\n            \"2\",\n            \"2\"\n          ],\n          [\n            \"DOCE GRANDE\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"IPIAU\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"89\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"11\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"50\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"10\",\n            \"1715\",\n            \"1715\",\n            \"0\",\n            \"248\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"13\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"5\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAMPINHOS\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SERROLANDIA\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"JOINVILLE\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO SEBASTIAO DO PASSE\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"4\",\n            \"142\",\n            \"0\",\n            \"142\",\n            \"25\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"68\",\n            \"2253\",\n            \"2074\",\n            \"179\",\n            \"361\",\n            \"3\",\n            \"3\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"39\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CABOTO\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CABOTO\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SERRINHA\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO SEBASTIAO DO PASSE\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"19\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"95\",\n            \"343\",\n            \"0\",\n            \"343\",\n            \"67\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"CAROBA\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CABOTO\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ACUPE\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"6\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"GODOY CRUZ\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ACUPE\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SALVADOR\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"TIJUANA\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"5\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ]\n        ]\n      }\n    }\n  },\n  \"timings\": [\n    {\n      \"label\": \"00_defs\",\n      \"dur\": 19.74\n    },\n    {\n      \"label\": \"010_env_bundle\",\n      \"dur\": 0\n    },\n    {\n      \"label\": \"011_env_init\",\n      \"dur\": 837.65\n    },\n    {\n      \"label\": \"012_env_pem\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"01_env\",\n      \"dur\": 838.21\n    },\n    {\n      \"label\": \"02_setup\",\n      \"dur\": 173.69\n    },\n    {\n      \"label\": \"03_permissions\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"04_op_response\",\n      \"dur\": 5844.55\n    },\n    {\n      \"label\": \"04_op\",\n      \"dur\": 5845.13\n    },\n    {\n      \"label\": \"05_track\",\n      \"dur\": 509.89\n    }\n  ]\n}"}}},"component":"data2-core-functions@JSONParse"},"prop":{"component":"data2-core-primitives@String","params":{"content":"body.data.manifest.schema.columns.1.name"}}}}},{"value":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m.2"}}},"component":"data2-core-types@Reference"},"key":{"component":"data2-core-types@Getter","params":{"module":{"params":{"text":{"component":"data2-core-primitives@String","params":{"content":"{\n  \"statusCode\": 200,\n  \"body\": {\n    \"data\": {\n      \"statement_id\": \"01f186b4-4f0b-1def-9235-a8ee961f1f68\",\n      \"status\": {\n        \"state\": \"SUCCEEDED\"\n      },\n      \"manifest\": {\n        \"format\": \"JSON_ARRAY\",\n        \"schema\": {\n          \"column_count\": 10,\n          \"columns\": [\n            {\n              \"name\": \"municipio\",\n              \"type_text\": \"STRING\",\n              \"type_name\": \"STRING\",\n              \"position\": 0\n            },\n            {\n              \"name\": \"grupo\",\n              \"type_text\": \"INT\",\n              \"type_name\": \"INT\",\n              \"position\": 1\n            },\n            {\n              \"name\": \"lider\",\n              \"type_text\": \"STRING\",\n              \"type_name\": \"STRING\",\n              \"position\": 2\n            },\n            {\n              \"name\": \"cbs\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 3\n            },\n            {\n              \"name\": \"receita\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 4,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"rec_nat\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 5,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"rec_avon\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 6,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"pontos\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 7,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"pedidos\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 8,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"ativas\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 9\n            }\n          ]\n        },\n        \"total_chunk_count\": 1,\n        \"chunks\": [\n          {\n            \"chunk_index\": 0,\n            \"row_offset\": 0,\n            \"row_count\": 122\n          }\n        ],\n        \"total_row_count\": 122,\n        \"truncated\": false\n      },\n      \"result\": {\n        \"chunk_index\": 0,\n        \"row_offset\": 0,\n        \"row_count\": 122,\n        \"data_array\": [\n          [\n            \"MADRE DE DEUS\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"28\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ACUPE\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"42\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"185\",\n            \"5603\",\n            \"5497\",\n            \"106\",\n            \"938\",\n            \"5\",\n            \"5\"\n          ],\n          [\n            \"SALVADOR\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"21\",\n            \"625\",\n            \"625\",\n            \"0\",\n            \"104\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"11\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MONTE RECONCAVO\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SALVADOR\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ACUPE\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"2\",\n            \"765\",\n            \"483\",\n            \"283\",\n            \"134\",\n            \"2\",\n            \"1\"\n          ],\n          [\n            null,\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO JOAO DA BARRA\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"71\",\n            \"2110\",\n            \"2110\",\n            \"0\",\n            \"335\",\n            \"3\",\n            \"3\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"10\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"3\",\n            \"642\",\n            \"642\",\n            \"0\",\n            \"100\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"21\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"8\",\n            \"140\",\n            \"0\",\n            \"140\",\n            \"25\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"18\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MACEIO\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAMACARI\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CABOTO\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MARIANA\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO ESTEVAO\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"70\",\n            \"527\",\n            \"527\",\n            \"0\",\n            \"81\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"12\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"6\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CABOTO\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"38\",\n            \"319\",\n            \"0\",\n            \"319\",\n            \"77\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"39\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"76\",\n            \"1916\",\n            \"1916\",\n            \"0\",\n            \"279\",\n            \"2\",\n            \"2\"\n          ],\n          [\n            \"CAROBA\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"23\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"137\",\n            \"1595\",\n            \"1595\",\n            \"0\",\n            \"204\",\n            \"2\",\n            \"2\"\n          ],\n          [\n            \"PASSE\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"4\",\n            \"592\",\n            \"592\",\n            \"0\",\n            \"88\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"SAO PAULO\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MONTE RECONCAVO\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAMPINHOS\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"32\",\n            \"537\",\n            \"336\",\n            \"201\",\n            \"78\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"PASSE\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"5\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"36\",\n            \"1614\",\n            \"835\",\n            \"779\",\n            \"267\",\n            \"3\",\n            \"3\"\n          ],\n          [\n            null,\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"3\",\n            \"247\",\n            \"247\",\n            \"0\",\n            \"44\",\n            \"1\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"83\",\n            \"1152\",\n            \"983\",\n            \"170\",\n            \"199\",\n            \"3\",\n            \"3\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"82\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"9\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ACUPE\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"5\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SALVADOR\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"124\",\n            \"9945\",\n            \"5384\",\n            \"4561\",\n            \"1955\",\n            \"6\",\n            \"5\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"34\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"13\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"45\",\n            \"1417\",\n            \"1306\",\n            \"110\",\n            \"213\",\n            \"2\",\n            \"2\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"6\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SIMOES FILHO\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"148\",\n            \"985\",\n            \"985\",\n            \"0\",\n            \"126\",\n            \"2\",\n            \"2\"\n          ],\n          [\n            \"ENTRE RIOS\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"218\",\n            \"503\",\n            \"503\",\n            \"0\",\n            \"88\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"31\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"37\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"5\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"RIO DE JANEIRO\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ILHEUS\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"197\",\n            \"5072\",\n            \"4830\",\n            \"243\",\n            \"890\",\n            \"7\",\n            \"7\"\n          ],\n          [\n            \"ACUPE\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"13\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"114\",\n            \"2394\",\n            \"2394\",\n            \"0\",\n            \"358\",\n            \"2\",\n            \"2\"\n          ],\n          [\n            \"DOCE GRANDE\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"IPIAU\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"89\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"11\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"50\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"10\",\n            \"1715\",\n            \"1715\",\n            \"0\",\n            \"248\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"13\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"5\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAMPINHOS\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SERROLANDIA\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"JOINVILLE\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO SEBASTIAO DO PASSE\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"4\",\n            \"142\",\n            \"0\",\n            \"142\",\n            \"25\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"68\",\n            \"2253\",\n            \"2074\",\n            \"179\",\n            \"361\",\n            \"3\",\n            \"3\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"39\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CABOTO\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CABOTO\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SERRINHA\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO SEBASTIAO DO PASSE\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"19\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"95\",\n            \"343\",\n            \"0\",\n            \"343\",\n            \"67\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"CAROBA\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CABOTO\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ACUPE\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"6\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"GODOY CRUZ\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ACUPE\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SALVADOR\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"TIJUANA\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"5\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ]\n        ]\n      }\n    }\n  },\n  \"timings\": [\n    {\n      \"label\": \"00_defs\",\n      \"dur\": 19.74\n    },\n    {\n      \"label\": \"010_env_bundle\",\n      \"dur\": 0\n    },\n    {\n      \"label\": \"011_env_init\",\n      \"dur\": 837.65\n    },\n    {\n      \"label\": \"012_env_pem\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"01_env\",\n      \"dur\": 838.21\n    },\n    {\n      \"label\": \"02_setup\",\n      \"dur\": 173.69\n    },\n    {\n      \"label\": \"03_permissions\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"04_op_response\",\n      \"dur\": 5844.55\n    },\n    {\n      \"label\": \"04_op\",\n      \"dur\": 5845.13\n    },\n    {\n      \"label\": \"05_track\",\n      \"dur\": 509.89\n    }\n  ]\n}"}}},"component":"data2-core-functions@JSONParse"},"prop":{"component":"data2-core-primitives@String","params":{"content":"body.data.manifest.schema.columns.2.name"}}}}},{"value":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m.3"}}},"component":"data2-core-types@Reference"},"key":{"component":"data2-core-types@Getter","params":{"module":{"params":{"text":{"component":"data2-core-primitives@String","params":{"content":"{\n  \"statusCode\": 200,\n  \"body\": {\n    \"data\": {\n      \"statement_id\": \"01f186b4-4f0b-1def-9235-a8ee961f1f68\",\n      \"status\": {\n        \"state\": \"SUCCEEDED\"\n      },\n      \"manifest\": {\n        \"format\": \"JSON_ARRAY\",\n        \"schema\": {\n          \"column_count\": 10,\n          \"columns\": [\n            {\n              \"name\": \"municipio\",\n              \"type_text\": \"STRING\",\n              \"type_name\": \"STRING\",\n              \"position\": 0\n            },\n            {\n              \"name\": \"grupo\",\n              \"type_text\": \"INT\",\n              \"type_name\": \"INT\",\n              \"position\": 1\n            },\n            {\n              \"name\": \"lider\",\n              \"type_text\": \"STRING\",\n              \"type_name\": \"STRING\",\n              \"position\": 2\n            },\n            {\n              \"name\": \"cbs\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 3\n            },\n            {\n              \"name\": \"receita\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 4,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"rec_nat\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 5,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"rec_avon\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 6,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"pontos\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 7,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"pedidos\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 8,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"ativas\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 9\n            }\n          ]\n        },\n        \"total_chunk_count\": 1,\n        \"chunks\": [\n          {\n            \"chunk_index\": 0,\n            \"row_offset\": 0,\n            \"row_count\": 122\n          }\n        ],\n        \"total_row_count\": 122,\n        \"truncated\": false\n      },\n      \"result\": {\n        \"chunk_index\": 0,\n        \"row_offset\": 0,\n        \"row_count\": 122,\n        \"data_array\": [\n          [\n            \"MADRE DE DEUS\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"28\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ACUPE\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"42\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"185\",\n            \"5603\",\n            \"5497\",\n            \"106\",\n            \"938\",\n            \"5\",\n            \"5\"\n          ],\n          [\n            \"SALVADOR\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"21\",\n            \"625\",\n            \"625\",\n            \"0\",\n            \"104\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"11\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MONTE RECONCAVO\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SALVADOR\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ACUPE\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"2\",\n            \"765\",\n            \"483\",\n            \"283\",\n            \"134\",\n            \"2\",\n            \"1\"\n          ],\n          [\n            null,\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO JOAO DA BARRA\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"71\",\n            \"2110\",\n            \"2110\",\n            \"0\",\n            \"335\",\n            \"3\",\n            \"3\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"10\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"3\",\n            \"642\",\n            \"642\",\n            \"0\",\n            \"100\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"21\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"8\",\n            \"140\",\n            \"0\",\n            \"140\",\n            \"25\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"18\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MACEIO\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAMACARI\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CABOTO\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MARIANA\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO ESTEVAO\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"70\",\n            \"527\",\n            \"527\",\n            \"0\",\n            \"81\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"12\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"6\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CABOTO\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"38\",\n            \"319\",\n            \"0\",\n            \"319\",\n            \"77\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"39\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"76\",\n            \"1916\",\n            \"1916\",\n            \"0\",\n            \"279\",\n            \"2\",\n            \"2\"\n          ],\n          [\n            \"CAROBA\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"23\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"137\",\n            \"1595\",\n            \"1595\",\n            \"0\",\n            \"204\",\n            \"2\",\n            \"2\"\n          ],\n          [\n            \"PASSE\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"4\",\n            \"592\",\n            \"592\",\n            \"0\",\n            \"88\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"SAO PAULO\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MONTE RECONCAVO\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAMPINHOS\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"32\",\n            \"537\",\n            \"336\",\n            \"201\",\n            \"78\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"PASSE\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"5\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"36\",\n            \"1614\",\n            \"835\",\n            \"779\",\n            \"267\",\n            \"3\",\n            \"3\"\n          ],\n          [\n            null,\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"3\",\n            \"247\",\n            \"247\",\n            \"0\",\n            \"44\",\n            \"1\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"83\",\n            \"1152\",\n            \"983\",\n            \"170\",\n            \"199\",\n            \"3\",\n            \"3\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"82\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"9\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ACUPE\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"5\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SALVADOR\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"124\",\n            \"9945\",\n            \"5384\",\n            \"4561\",\n            \"1955\",\n            \"6\",\n            \"5\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"34\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"13\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"45\",\n            \"1417\",\n            \"1306\",\n            \"110\",\n            \"213\",\n            \"2\",\n            \"2\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"6\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SIMOES FILHO\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"148\",\n            \"985\",\n            \"985\",\n            \"0\",\n            \"126\",\n            \"2\",\n            \"2\"\n          ],\n          [\n            \"ENTRE RIOS\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"218\",\n            \"503\",\n            \"503\",\n            \"0\",\n            \"88\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"31\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"37\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"5\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"RIO DE JANEIRO\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ILHEUS\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"197\",\n            \"5072\",\n            \"4830\",\n            \"243\",\n            \"890\",\n            \"7\",\n            \"7\"\n          ],\n          [\n            \"ACUPE\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"13\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"114\",\n            \"2394\",\n            \"2394\",\n            \"0\",\n            \"358\",\n            \"2\",\n            \"2\"\n          ],\n          [\n            \"DOCE GRANDE\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"IPIAU\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"89\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"11\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"50\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"10\",\n            \"1715\",\n            \"1715\",\n            \"0\",\n            \"248\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"13\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"5\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAMPINHOS\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SERROLANDIA\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"JOINVILLE\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO SEBASTIAO DO PASSE\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"4\",\n            \"142\",\n            \"0\",\n            \"142\",\n            \"25\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"68\",\n            \"2253\",\n            \"2074\",\n            \"179\",\n            \"361\",\n            \"3\",\n            \"3\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"39\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CABOTO\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CABOTO\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SERRINHA\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO SEBASTIAO DO PASSE\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"19\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"95\",\n            \"343\",\n            \"0\",\n            \"343\",\n            \"67\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"CAROBA\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CABOTO\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ACUPE\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"6\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"GODOY CRUZ\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ACUPE\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SALVADOR\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"TIJUANA\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"5\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ]\n        ]\n      }\n    }\n  },\n  \"timings\": [\n    {\n      \"label\": \"00_defs\",\n      \"dur\": 19.74\n    },\n    {\n      \"label\": \"010_env_bundle\",\n      \"dur\": 0\n    },\n    {\n      \"label\": \"011_env_init\",\n      \"dur\": 837.65\n    },\n    {\n      \"label\": \"012_env_pem\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"01_env\",\n      \"dur\": 838.21\n    },\n    {\n      \"label\": \"02_setup\",\n      \"dur\": 173.69\n    },\n    {\n      \"label\": \"03_permissions\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"04_op_response\",\n      \"dur\": 5844.55\n    },\n    {\n      \"label\": \"04_op\",\n      \"dur\": 5845.13\n    },\n    {\n      \"label\": \"05_track\",\n      \"dur\": 509.89\n    }\n  ]\n}"}}},"component":"data2-core-functions@JSONParse"},"prop":{"component":"data2-core-primitives@String","params":{"content":"body.data.manifest.schema.columns.3.name"}}}}},{"value":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m.4"}}},"component":"data2-core-types@Reference"},"key":{"component":"data2-core-types@Getter","params":{"module":{"params":{"text":{"component":"data2-core-primitives@String","params":{"content":"{\n  \"statusCode\": 200,\n  \"body\": {\n    \"data\": {\n      \"statement_id\": \"01f186b4-4f0b-1def-9235-a8ee961f1f68\",\n      \"status\": {\n        \"state\": \"SUCCEEDED\"\n      },\n      \"manifest\": {\n        \"format\": \"JSON_ARRAY\",\n        \"schema\": {\n          \"column_count\": 10,\n          \"columns\": [\n            {\n              \"name\": \"municipio\",\n              \"type_text\": \"STRING\",\n              \"type_name\": \"STRING\",\n              \"position\": 0\n            },\n            {\n              \"name\": \"grupo\",\n              \"type_text\": \"INT\",\n              \"type_name\": \"INT\",\n              \"position\": 1\n            },\n            {\n              \"name\": \"lider\",\n              \"type_text\": \"STRING\",\n              \"type_name\": \"STRING\",\n              \"position\": 2\n            },\n            {\n              \"name\": \"cbs\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 3\n            },\n            {\n              \"name\": \"receita\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 4,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"rec_nat\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 5,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"rec_avon\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 6,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"pontos\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 7,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"pedidos\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 8,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"ativas\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 9\n            }\n          ]\n        },\n        \"total_chunk_count\": 1,\n        \"chunks\": [\n          {\n            \"chunk_index\": 0,\n            \"row_offset\": 0,\n            \"row_count\": 122\n          }\n        ],\n        \"total_row_count\": 122,\n        \"truncated\": false\n      },\n      \"result\": {\n        \"chunk_index\": 0,\n        \"row_offset\": 0,\n        \"row_count\": 122,\n        \"data_array\": [\n          [\n            \"MADRE DE DEUS\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"28\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ACUPE\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"42\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"185\",\n            \"5603\",\n            \"5497\",\n            \"106\",\n            \"938\",\n            \"5\",\n            \"5\"\n          ],\n          [\n            \"SALVADOR\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"21\",\n            \"625\",\n            \"625\",\n            \"0\",\n            \"104\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"11\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MONTE RECONCAVO\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SALVADOR\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ACUPE\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"2\",\n            \"765\",\n            \"483\",\n            \"283\",\n            \"134\",\n            \"2\",\n            \"1\"\n          ],\n          [\n            null,\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO JOAO DA BARRA\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"71\",\n            \"2110\",\n            \"2110\",\n            \"0\",\n            \"335\",\n            \"3\",\n            \"3\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"10\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"3\",\n            \"642\",\n            \"642\",\n            \"0\",\n            \"100\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"21\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"8\",\n            \"140\",\n            \"0\",\n            \"140\",\n            \"25\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"18\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MACEIO\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAMACARI\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CABOTO\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MARIANA\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO ESTEVAO\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"70\",\n            \"527\",\n            \"527\",\n            \"0\",\n            \"81\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"12\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"6\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CABOTO\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"38\",\n            \"319\",\n            \"0\",\n            \"319\",\n            \"77\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"39\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"76\",\n            \"1916\",\n            \"1916\",\n            \"0\",\n            \"279\",\n            \"2\",\n            \"2\"\n          ],\n          [\n            \"CAROBA\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"23\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"137\",\n            \"1595\",\n            \"1595\",\n            \"0\",\n            \"204\",\n            \"2\",\n            \"2\"\n          ],\n          [\n            \"PASSE\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"4\",\n            \"592\",\n            \"592\",\n            \"0\",\n            \"88\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"SAO PAULO\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MONTE RECONCAVO\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAMPINHOS\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"32\",\n            \"537\",\n            \"336\",\n            \"201\",\n            \"78\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"PASSE\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"5\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"36\",\n            \"1614\",\n            \"835\",\n            \"779\",\n            \"267\",\n            \"3\",\n            \"3\"\n          ],\n          [\n            null,\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"3\",\n            \"247\",\n            \"247\",\n            \"0\",\n            \"44\",\n            \"1\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"83\",\n            \"1152\",\n            \"983\",\n            \"170\",\n            \"199\",\n            \"3\",\n            \"3\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"82\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"9\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ACUPE\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"5\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SALVADOR\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"124\",\n            \"9945\",\n            \"5384\",\n            \"4561\",\n            \"1955\",\n            \"6\",\n            \"5\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"34\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"13\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"45\",\n            \"1417\",\n            \"1306\",\n            \"110\",\n            \"213\",\n            \"2\",\n            \"2\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"6\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SIMOES FILHO\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"148\",\n            \"985\",\n            \"985\",\n            \"0\",\n            \"126\",\n            \"2\",\n            \"2\"\n          ],\n          [\n            \"ENTRE RIOS\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"218\",\n            \"503\",\n            \"503\",\n            \"0\",\n            \"88\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"31\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"37\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"5\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"RIO DE JANEIRO\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ILHEUS\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"197\",\n            \"5072\",\n            \"4830\",\n            \"243\",\n            \"890\",\n            \"7\",\n            \"7\"\n          ],\n          [\n            \"ACUPE\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"13\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"114\",\n            \"2394\",\n            \"2394\",\n            \"0\",\n            \"358\",\n            \"2\",\n            \"2\"\n          ],\n          [\n            \"DOCE GRANDE\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"IPIAU\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"89\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"11\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"50\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"10\",\n            \"1715\",\n            \"1715\",\n            \"0\",\n            \"248\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"13\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"5\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAMPINHOS\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SERROLANDIA\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"JOINVILLE\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO SEBASTIAO DO PASSE\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"4\",\n            \"142\",\n            \"0\",\n            \"142\",\n            \"25\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"68\",\n            \"2253\",\n            \"2074\",\n            \"179\",\n            \"361\",\n            \"3\",\n            \"3\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"39\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CABOTO\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CABOTO\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SERRINHA\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO SEBASTIAO DO PASSE\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"19\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"95\",\n            \"343\",\n            \"0\",\n            \"343\",\n            \"67\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"CAROBA\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CABOTO\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ACUPE\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"6\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"GODOY CRUZ\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ACUPE\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SALVADOR\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"TIJUANA\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"5\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ]\n        ]\n      }\n    }\n  },\n  \"timings\": [\n    {\n      \"label\": \"00_defs\",\n      \"dur\": 19.74\n    },\n    {\n      \"label\": \"010_env_bundle\",\n      \"dur\": 0\n    },\n    {\n      \"label\": \"011_env_init\",\n      \"dur\": 837.65\n    },\n    {\n      \"label\": \"012_env_pem\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"01_env\",\n      \"dur\": 838.21\n    },\n    {\n      \"label\": \"02_setup\",\n      \"dur\": 173.69\n    },\n    {\n      \"label\": \"03_permissions\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"04_op_response\",\n      \"dur\": 5844.55\n    },\n    {\n      \"label\": \"04_op\",\n      \"dur\": 5845.13\n    },\n    {\n      \"label\": \"05_track\",\n      \"dur\": 509.89\n    }\n  ]\n}"}}},"component":"data2-core-functions@JSONParse"},"prop":{"component":"data2-core-primitives@String","params":{"content":"body.data.manifest.schema.columns.4.name"}}}}},{"value":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m.5"}}},"component":"data2-core-types@Reference"},"key":{"component":"data2-core-types@Getter","params":{"module":{"params":{"text":{"component":"data2-core-primitives@String","params":{"content":"{\n  \"statusCode\": 200,\n  \"body\": {\n    \"data\": {\n      \"statement_id\": \"01f186b4-4f0b-1def-9235-a8ee961f1f68\",\n      \"status\": {\n        \"state\": \"SUCCEEDED\"\n      },\n      \"manifest\": {\n        \"format\": \"JSON_ARRAY\",\n        \"schema\": {\n          \"column_count\": 10,\n          \"columns\": [\n            {\n              \"name\": \"municipio\",\n              \"type_text\": \"STRING\",\n              \"type_name\": \"STRING\",\n              \"position\": 0\n            },\n            {\n              \"name\": \"grupo\",\n              \"type_text\": \"INT\",\n              \"type_name\": \"INT\",\n              \"position\": 1\n            },\n            {\n              \"name\": \"lider\",\n              \"type_text\": \"STRING\",\n              \"type_name\": \"STRING\",\n              \"position\": 2\n            },\n            {\n              \"name\": \"cbs\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 3\n            },\n            {\n              \"name\": \"receita\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 4,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"rec_nat\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 5,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"rec_avon\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 6,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"pontos\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 7,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"pedidos\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 8,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"ativas\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 9\n            }\n          ]\n        },\n        \"total_chunk_count\": 1,\n        \"chunks\": [\n          {\n            \"chunk_index\": 0,\n            \"row_offset\": 0,\n            \"row_count\": 122\n          }\n        ],\n        \"total_row_count\": 122,\n        \"truncated\": false\n      },\n      \"result\": {\n        \"chunk_index\": 0,\n        \"row_offset\": 0,\n        \"row_count\": 122,\n        \"data_array\": [\n          [\n            \"MADRE DE DEUS\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"28\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ACUPE\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"42\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"185\",\n            \"5603\",\n            \"5497\",\n            \"106\",\n            \"938\",\n            \"5\",\n            \"5\"\n          ],\n          [\n            \"SALVADOR\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"21\",\n            \"625\",\n            \"625\",\n            \"0\",\n            \"104\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"11\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MONTE RECONCAVO\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SALVADOR\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ACUPE\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"2\",\n            \"765\",\n            \"483\",\n            \"283\",\n            \"134\",\n            \"2\",\n            \"1\"\n          ],\n          [\n            null,\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO JOAO DA BARRA\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"71\",\n            \"2110\",\n            \"2110\",\n            \"0\",\n            \"335\",\n            \"3\",\n            \"3\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"10\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"3\",\n            \"642\",\n            \"642\",\n            \"0\",\n            \"100\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"21\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"8\",\n            \"140\",\n            \"0\",\n            \"140\",\n            \"25\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"18\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MACEIO\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAMACARI\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CABOTO\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MARIANA\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO ESTEVAO\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"70\",\n            \"527\",\n            \"527\",\n            \"0\",\n            \"81\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"12\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"6\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CABOTO\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"38\",\n            \"319\",\n            \"0\",\n            \"319\",\n            \"77\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"39\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"76\",\n            \"1916\",\n            \"1916\",\n            \"0\",\n            \"279\",\n            \"2\",\n            \"2\"\n          ],\n          [\n            \"CAROBA\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"23\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"137\",\n            \"1595\",\n            \"1595\",\n            \"0\",\n            \"204\",\n            \"2\",\n            \"2\"\n          ],\n          [\n            \"PASSE\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"4\",\n            \"592\",\n            \"592\",\n            \"0\",\n            \"88\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"SAO PAULO\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MONTE RECONCAVO\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAMPINHOS\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"32\",\n            \"537\",\n            \"336\",\n            \"201\",\n            \"78\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"PASSE\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"5\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"36\",\n            \"1614\",\n            \"835\",\n            \"779\",\n            \"267\",\n            \"3\",\n            \"3\"\n          ],\n          [\n            null,\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"3\",\n            \"247\",\n            \"247\",\n            \"0\",\n            \"44\",\n            \"1\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"83\",\n            \"1152\",\n            \"983\",\n            \"170\",\n            \"199\",\n            \"3\",\n            \"3\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"82\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"9\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ACUPE\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"5\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SALVADOR\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"124\",\n            \"9945\",\n            \"5384\",\n            \"4561\",\n            \"1955\",\n            \"6\",\n            \"5\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"34\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"13\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"45\",\n            \"1417\",\n            \"1306\",\n            \"110\",\n            \"213\",\n            \"2\",\n            \"2\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"6\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SIMOES FILHO\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"148\",\n            \"985\",\n            \"985\",\n            \"0\",\n            \"126\",\n            \"2\",\n            \"2\"\n          ],\n          [\n            \"ENTRE RIOS\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"218\",\n            \"503\",\n            \"503\",\n            \"0\",\n            \"88\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"31\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"37\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"5\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"RIO DE JANEIRO\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ILHEUS\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"197\",\n            \"5072\",\n            \"4830\",\n            \"243\",\n            \"890\",\n            \"7\",\n            \"7\"\n          ],\n          [\n            \"ACUPE\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"13\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"114\",\n            \"2394\",\n            \"2394\",\n            \"0\",\n            \"358\",\n            \"2\",\n            \"2\"\n          ],\n          [\n            \"DOCE GRANDE\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"IPIAU\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"89\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"11\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"50\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"10\",\n            \"1715\",\n            \"1715\",\n            \"0\",\n            \"248\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"13\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"5\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAMPINHOS\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SERROLANDIA\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"JOINVILLE\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO SEBASTIAO DO PASSE\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"4\",\n            \"142\",\n            \"0\",\n            \"142\",\n            \"25\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"68\",\n            \"2253\",\n            \"2074\",\n            \"179\",\n            \"361\",\n            \"3\",\n            \"3\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"39\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CABOTO\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CABOTO\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SERRINHA\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO SEBASTIAO DO PASSE\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"19\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"95\",\n            \"343\",\n            \"0\",\n            \"343\",\n            \"67\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"CAROBA\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CABOTO\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ACUPE\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"6\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"GODOY CRUZ\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ACUPE\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SALVADOR\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"TIJUANA\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"5\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ]\n        ]\n      }\n    }\n  },\n  \"timings\": [\n    {\n      \"label\": \"00_defs\",\n      \"dur\": 19.74\n    },\n    {\n      \"label\": \"010_env_bundle\",\n      \"dur\": 0\n    },\n    {\n      \"label\": \"011_env_init\",\n      \"dur\": 837.65\n    },\n    {\n      \"label\": \"012_env_pem\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"01_env\",\n      \"dur\": 838.21\n    },\n    {\n      \"label\": \"02_setup\",\n      \"dur\": 173.69\n    },\n    {\n      \"label\": \"03_permissions\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"04_op_response\",\n      \"dur\": 5844.55\n    },\n    {\n      \"label\": \"04_op\",\n      \"dur\": 5845.13\n    },\n    {\n      \"label\": \"05_track\",\n      \"dur\": 509.89\n    }\n  ]\n}"}}},"component":"data2-core-functions@JSONParse"},"prop":{"component":"data2-core-primitives@String","params":{"content":"body.data.manifest.schema.columns.5.name"}}}}},{"value":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m.6"}}},"component":"data2-core-types@Reference"},"key":{"component":"data2-core-types@Getter","params":{"module":{"params":{"text":{"component":"data2-core-primitives@String","params":{"content":"{\n  \"statusCode\": 200,\n  \"body\": {\n    \"data\": {\n      \"statement_id\": \"01f186b4-4f0b-1def-9235-a8ee961f1f68\",\n      \"status\": {\n        \"state\": \"SUCCEEDED\"\n      },\n      \"manifest\": {\n        \"format\": \"JSON_ARRAY\",\n        \"schema\": {\n          \"column_count\": 10,\n          \"columns\": [\n            {\n              \"name\": \"municipio\",\n              \"type_text\": \"STRING\",\n              \"type_name\": \"STRING\",\n              \"position\": 0\n            },\n            {\n              \"name\": \"grupo\",\n              \"type_text\": \"INT\",\n              \"type_name\": \"INT\",\n              \"position\": 1\n            },\n            {\n              \"name\": \"lider\",\n              \"type_text\": \"STRING\",\n              \"type_name\": \"STRING\",\n              \"position\": 2\n            },\n            {\n              \"name\": \"cbs\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 3\n            },\n            {\n              \"name\": \"receita\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 4,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"rec_nat\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 5,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"rec_avon\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 6,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"pontos\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 7,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"pedidos\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 8,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"ativas\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 9\n            }\n          ]\n        },\n        \"total_chunk_count\": 1,\n        \"chunks\": [\n          {\n            \"chunk_index\": 0,\n            \"row_offset\": 0,\n            \"row_count\": 122\n          }\n        ],\n        \"total_row_count\": 122,\n        \"truncated\": false\n      },\n      \"result\": {\n        \"chunk_index\": 0,\n        \"row_offset\": 0,\n        \"row_count\": 122,\n        \"data_array\": [\n          [\n            \"MADRE DE DEUS\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"28\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ACUPE\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"42\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"185\",\n            \"5603\",\n            \"5497\",\n            \"106\",\n            \"938\",\n            \"5\",\n            \"5\"\n          ],\n          [\n            \"SALVADOR\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"21\",\n            \"625\",\n            \"625\",\n            \"0\",\n            \"104\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"11\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MONTE RECONCAVO\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SALVADOR\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ACUPE\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"2\",\n            \"765\",\n            \"483\",\n            \"283\",\n            \"134\",\n            \"2\",\n            \"1\"\n          ],\n          [\n            null,\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO JOAO DA BARRA\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"71\",\n            \"2110\",\n            \"2110\",\n            \"0\",\n            \"335\",\n            \"3\",\n            \"3\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"10\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"3\",\n            \"642\",\n            \"642\",\n            \"0\",\n            \"100\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"21\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"8\",\n            \"140\",\n            \"0\",\n            \"140\",\n            \"25\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"18\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MACEIO\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAMACARI\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CABOTO\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MARIANA\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO ESTEVAO\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"70\",\n            \"527\",\n            \"527\",\n            \"0\",\n            \"81\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"12\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"6\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CABOTO\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"38\",\n            \"319\",\n            \"0\",\n            \"319\",\n            \"77\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"39\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"76\",\n            \"1916\",\n            \"1916\",\n            \"0\",\n            \"279\",\n            \"2\",\n            \"2\"\n          ],\n          [\n            \"CAROBA\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"23\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"137\",\n            \"1595\",\n            \"1595\",\n            \"0\",\n            \"204\",\n            \"2\",\n            \"2\"\n          ],\n          [\n            \"PASSE\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"4\",\n            \"592\",\n            \"592\",\n            \"0\",\n            \"88\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"SAO PAULO\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MONTE RECONCAVO\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAMPINHOS\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"32\",\n            \"537\",\n            \"336\",\n            \"201\",\n            \"78\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"PASSE\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"5\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"36\",\n            \"1614\",\n            \"835\",\n            \"779\",\n            \"267\",\n            \"3\",\n            \"3\"\n          ],\n          [\n            null,\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"3\",\n            \"247\",\n            \"247\",\n            \"0\",\n            \"44\",\n            \"1\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"83\",\n            \"1152\",\n            \"983\",\n            \"170\",\n            \"199\",\n            \"3\",\n            \"3\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"82\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"9\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ACUPE\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"5\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SALVADOR\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"124\",\n            \"9945\",\n            \"5384\",\n            \"4561\",\n            \"1955\",\n            \"6\",\n            \"5\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"34\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"13\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"45\",\n            \"1417\",\n            \"1306\",\n            \"110\",\n            \"213\",\n            \"2\",\n            \"2\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"6\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SIMOES FILHO\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"148\",\n            \"985\",\n            \"985\",\n            \"0\",\n            \"126\",\n            \"2\",\n            \"2\"\n          ],\n          [\n            \"ENTRE RIOS\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"218\",\n            \"503\",\n            \"503\",\n            \"0\",\n            \"88\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"31\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"37\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"5\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"RIO DE JANEIRO\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ILHEUS\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"197\",\n            \"5072\",\n            \"4830\",\n            \"243\",\n            \"890\",\n            \"7\",\n            \"7\"\n          ],\n          [\n            \"ACUPE\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"13\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"114\",\n            \"2394\",\n            \"2394\",\n            \"0\",\n            \"358\",\n            \"2\",\n            \"2\"\n          ],\n          [\n            \"DOCE GRANDE\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"IPIAU\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"89\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"11\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"50\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"10\",\n            \"1715\",\n            \"1715\",\n            \"0\",\n            \"248\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"13\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"5\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAMPINHOS\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SERROLANDIA\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"JOINVILLE\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO SEBASTIAO DO PASSE\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"4\",\n            \"142\",\n            \"0\",\n            \"142\",\n            \"25\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"68\",\n            \"2253\",\n            \"2074\",\n            \"179\",\n            \"361\",\n            \"3\",\n            \"3\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"39\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CABOTO\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CABOTO\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SERRINHA\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO SEBASTIAO DO PASSE\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"19\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"95\",\n            \"343\",\n            \"0\",\n            \"343\",\n            \"67\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"CAROBA\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CABOTO\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ACUPE\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"6\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"GODOY CRUZ\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ACUPE\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SALVADOR\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"TIJUANA\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"5\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ]\n        ]\n      }\n    }\n  },\n  \"timings\": [\n    {\n      \"label\": \"00_defs\",\n      \"dur\": 19.74\n    },\n    {\n      \"label\": \"010_env_bundle\",\n      \"dur\": 0\n    },\n    {\n      \"label\": \"011_env_init\",\n      \"dur\": 837.65\n    },\n    {\n      \"label\": \"012_env_pem\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"01_env\",\n      \"dur\": 838.21\n    },\n    {\n      \"label\": \"02_setup\",\n      \"dur\": 173.69\n    },\n    {\n      \"label\": \"03_permissions\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"04_op_response\",\n      \"dur\": 5844.55\n    },\n    {\n      \"label\": \"04_op\",\n      \"dur\": 5845.13\n    },\n    {\n      \"label\": \"05_track\",\n      \"dur\": 509.89\n    }\n  ]\n}"}}},"component":"data2-core-functions@JSONParse"},"prop":{"component":"data2-core-primitives@String","params":{"content":"body.data.manifest.schema.columns.6.name"}}}}},{"value":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m.7"}}},"component":"data2-core-types@Reference"},"key":{"component":"data2-core-types@Getter","params":{"module":{"params":{"text":{"component":"data2-core-primitives@String","params":{"content":"{\n  \"statusCode\": 200,\n  \"body\": {\n    \"data\": {\n      \"statement_id\": \"01f186b4-4f0b-1def-9235-a8ee961f1f68\",\n      \"status\": {\n        \"state\": \"SUCCEEDED\"\n      },\n      \"manifest\": {\n        \"format\": \"JSON_ARRAY\",\n        \"schema\": {\n          \"column_count\": 10,\n          \"columns\": [\n            {\n              \"name\": \"municipio\",\n              \"type_text\": \"STRING\",\n              \"type_name\": \"STRING\",\n              \"position\": 0\n            },\n            {\n              \"name\": \"grupo\",\n              \"type_text\": \"INT\",\n              \"type_name\": \"INT\",\n              \"position\": 1\n            },\n            {\n              \"name\": \"lider\",\n              \"type_text\": \"STRING\",\n              \"type_name\": \"STRING\",\n              \"position\": 2\n            },\n            {\n              \"name\": \"cbs\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 3\n            },\n            {\n              \"name\": \"receita\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 4,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"rec_nat\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 5,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"rec_avon\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 6,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"pontos\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 7,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"pedidos\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 8,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"ativas\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 9\n            }\n          ]\n        },\n        \"total_chunk_count\": 1,\n        \"chunks\": [\n          {\n            \"chunk_index\": 0,\n            \"row_offset\": 0,\n            \"row_count\": 122\n          }\n        ],\n        \"total_row_count\": 122,\n        \"truncated\": false\n      },\n      \"result\": {\n        \"chunk_index\": 0,\n        \"row_offset\": 0,\n        \"row_count\": 122,\n        \"data_array\": [\n          [\n            \"MADRE DE DEUS\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"28\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ACUPE\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"42\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"185\",\n            \"5603\",\n            \"5497\",\n            \"106\",\n            \"938\",\n            \"5\",\n            \"5\"\n          ],\n          [\n            \"SALVADOR\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"21\",\n            \"625\",\n            \"625\",\n            \"0\",\n            \"104\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"11\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MONTE RECONCAVO\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SALVADOR\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ACUPE\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"2\",\n            \"765\",\n            \"483\",\n            \"283\",\n            \"134\",\n            \"2\",\n            \"1\"\n          ],\n          [\n            null,\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO JOAO DA BARRA\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"71\",\n            \"2110\",\n            \"2110\",\n            \"0\",\n            \"335\",\n            \"3\",\n            \"3\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"10\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"3\",\n            \"642\",\n            \"642\",\n            \"0\",\n            \"100\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"21\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"8\",\n            \"140\",\n            \"0\",\n            \"140\",\n            \"25\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"18\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MACEIO\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAMACARI\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CABOTO\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MARIANA\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO ESTEVAO\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"70\",\n            \"527\",\n            \"527\",\n            \"0\",\n            \"81\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"12\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"6\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CABOTO\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"38\",\n            \"319\",\n            \"0\",\n            \"319\",\n            \"77\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"39\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"76\",\n            \"1916\",\n            \"1916\",\n            \"0\",\n            \"279\",\n            \"2\",\n            \"2\"\n          ],\n          [\n            \"CAROBA\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"23\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"137\",\n            \"1595\",\n            \"1595\",\n            \"0\",\n            \"204\",\n            \"2\",\n            \"2\"\n          ],\n          [\n            \"PASSE\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"4\",\n            \"592\",\n            \"592\",\n            \"0\",\n            \"88\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"SAO PAULO\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MONTE RECONCAVO\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAMPINHOS\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"32\",\n            \"537\",\n            \"336\",\n            \"201\",\n            \"78\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"PASSE\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"5\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"36\",\n            \"1614\",\n            \"835\",\n            \"779\",\n            \"267\",\n            \"3\",\n            \"3\"\n          ],\n          [\n            null,\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"3\",\n            \"247\",\n            \"247\",\n            \"0\",\n            \"44\",\n            \"1\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"83\",\n            \"1152\",\n            \"983\",\n            \"170\",\n            \"199\",\n            \"3\",\n            \"3\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"82\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"9\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ACUPE\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"5\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SALVADOR\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"124\",\n            \"9945\",\n            \"5384\",\n            \"4561\",\n            \"1955\",\n            \"6\",\n            \"5\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"34\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"13\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"45\",\n            \"1417\",\n            \"1306\",\n            \"110\",\n            \"213\",\n            \"2\",\n            \"2\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"6\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SIMOES FILHO\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"148\",\n            \"985\",\n            \"985\",\n            \"0\",\n            \"126\",\n            \"2\",\n            \"2\"\n          ],\n          [\n            \"ENTRE RIOS\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"218\",\n            \"503\",\n            \"503\",\n            \"0\",\n            \"88\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"31\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"37\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"5\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"RIO DE JANEIRO\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ILHEUS\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"197\",\n            \"5072\",\n            \"4830\",\n            \"243\",\n            \"890\",\n            \"7\",\n            \"7\"\n          ],\n          [\n            \"ACUPE\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"13\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"114\",\n            \"2394\",\n            \"2394\",\n            \"0\",\n            \"358\",\n            \"2\",\n            \"2\"\n          ],\n          [\n            \"DOCE GRANDE\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"IPIAU\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"89\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"11\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"50\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"10\",\n            \"1715\",\n            \"1715\",\n            \"0\",\n            \"248\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"13\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"5\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAMPINHOS\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SERROLANDIA\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"JOINVILLE\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO SEBASTIAO DO PASSE\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"4\",\n            \"142\",\n            \"0\",\n            \"142\",\n            \"25\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"68\",\n            \"2253\",\n            \"2074\",\n            \"179\",\n            \"361\",\n            \"3\",\n            \"3\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"39\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CABOTO\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CABOTO\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SERRINHA\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO SEBASTIAO DO PASSE\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"19\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"95\",\n            \"343\",\n            \"0\",\n            \"343\",\n            \"67\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"CAROBA\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CABOTO\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ACUPE\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"6\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"GODOY CRUZ\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ACUPE\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SALVADOR\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"TIJUANA\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"5\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ]\n        ]\n      }\n    }\n  },\n  \"timings\": [\n    {\n      \"label\": \"00_defs\",\n      \"dur\": 19.74\n    },\n    {\n      \"label\": \"010_env_bundle\",\n      \"dur\": 0\n    },\n    {\n      \"label\": \"011_env_init\",\n      \"dur\": 837.65\n    },\n    {\n      \"label\": \"012_env_pem\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"01_env\",\n      \"dur\": 838.21\n    },\n    {\n      \"label\": \"02_setup\",\n      \"dur\": 173.69\n    },\n    {\n      \"label\": \"03_permissions\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"04_op_response\",\n      \"dur\": 5844.55\n    },\n    {\n      \"label\": \"04_op\",\n      \"dur\": 5845.13\n    },\n    {\n      \"label\": \"05_track\",\n      \"dur\": 509.89\n    }\n  ]\n}"}}},"component":"data2-core-functions@JSONParse"},"prop":{"component":"data2-core-primitives@String","params":{"content":"body.data.manifest.schema.columns.7.name"}}}}},{"value":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m.8"}}},"component":"data2-core-types@Reference"},"key":{"component":"data2-core-types@Getter","params":{"module":{"params":{"text":{"component":"data2-core-primitives@String","params":{"content":"{\n  \"statusCode\": 200,\n  \"body\": {\n    \"data\": {\n      \"statement_id\": \"01f186b4-4f0b-1def-9235-a8ee961f1f68\",\n      \"status\": {\n        \"state\": \"SUCCEEDED\"\n      },\n      \"manifest\": {\n        \"format\": \"JSON_ARRAY\",\n        \"schema\": {\n          \"column_count\": 10,\n          \"columns\": [\n            {\n              \"name\": \"municipio\",\n              \"type_text\": \"STRING\",\n              \"type_name\": \"STRING\",\n              \"position\": 0\n            },\n            {\n              \"name\": \"grupo\",\n              \"type_text\": \"INT\",\n              \"type_name\": \"INT\",\n              \"position\": 1\n            },\n            {\n              \"name\": \"lider\",\n              \"type_text\": \"STRING\",\n              \"type_name\": \"STRING\",\n              \"position\": 2\n            },\n            {\n              \"name\": \"cbs\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 3\n            },\n            {\n              \"name\": \"receita\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 4,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"rec_nat\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 5,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"rec_avon\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 6,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"pontos\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 7,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"pedidos\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 8,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"ativas\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 9\n            }\n          ]\n        },\n        \"total_chunk_count\": 1,\n        \"chunks\": [\n          {\n            \"chunk_index\": 0,\n            \"row_offset\": 0,\n            \"row_count\": 122\n          }\n        ],\n        \"total_row_count\": 122,\n        \"truncated\": false\n      },\n      \"result\": {\n        \"chunk_index\": 0,\n        \"row_offset\": 0,\n        \"row_count\": 122,\n        \"data_array\": [\n          [\n            \"MADRE DE DEUS\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"28\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ACUPE\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"42\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"185\",\n            \"5603\",\n            \"5497\",\n            \"106\",\n            \"938\",\n            \"5\",\n            \"5\"\n          ],\n          [\n            \"SALVADOR\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"21\",\n            \"625\",\n            \"625\",\n            \"0\",\n            \"104\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"11\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MONTE RECONCAVO\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SALVADOR\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ACUPE\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"2\",\n            \"765\",\n            \"483\",\n            \"283\",\n            \"134\",\n            \"2\",\n            \"1\"\n          ],\n          [\n            null,\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO JOAO DA BARRA\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"71\",\n            \"2110\",\n            \"2110\",\n            \"0\",\n            \"335\",\n            \"3\",\n            \"3\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"10\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"3\",\n            \"642\",\n            \"642\",\n            \"0\",\n            \"100\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"21\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"8\",\n            \"140\",\n            \"0\",\n            \"140\",\n            \"25\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"18\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MACEIO\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAMACARI\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CABOTO\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MARIANA\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO ESTEVAO\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"70\",\n            \"527\",\n            \"527\",\n            \"0\",\n            \"81\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"12\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"6\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CABOTO\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"38\",\n            \"319\",\n            \"0\",\n            \"319\",\n            \"77\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"39\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"76\",\n            \"1916\",\n            \"1916\",\n            \"0\",\n            \"279\",\n            \"2\",\n            \"2\"\n          ],\n          [\n            \"CAROBA\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"23\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"137\",\n            \"1595\",\n            \"1595\",\n            \"0\",\n            \"204\",\n            \"2\",\n            \"2\"\n          ],\n          [\n            \"PASSE\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"4\",\n            \"592\",\n            \"592\",\n            \"0\",\n            \"88\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"SAO PAULO\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MONTE RECONCAVO\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAMPINHOS\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"32\",\n            \"537\",\n            \"336\",\n            \"201\",\n            \"78\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"PASSE\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"5\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"36\",\n            \"1614\",\n            \"835\",\n            \"779\",\n            \"267\",\n            \"3\",\n            \"3\"\n          ],\n          [\n            null,\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"3\",\n            \"247\",\n            \"247\",\n            \"0\",\n            \"44\",\n            \"1\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"83\",\n            \"1152\",\n            \"983\",\n            \"170\",\n            \"199\",\n            \"3\",\n            \"3\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"82\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"9\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ACUPE\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"5\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SALVADOR\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"124\",\n            \"9945\",\n            \"5384\",\n            \"4561\",\n            \"1955\",\n            \"6\",\n            \"5\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"34\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"13\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"45\",\n            \"1417\",\n            \"1306\",\n            \"110\",\n            \"213\",\n            \"2\",\n            \"2\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"6\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SIMOES FILHO\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"148\",\n            \"985\",\n            \"985\",\n            \"0\",\n            \"126\",\n            \"2\",\n            \"2\"\n          ],\n          [\n            \"ENTRE RIOS\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"218\",\n            \"503\",\n            \"503\",\n            \"0\",\n            \"88\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"31\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"37\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"5\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"RIO DE JANEIRO\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ILHEUS\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"197\",\n            \"5072\",\n            \"4830\",\n            \"243\",\n            \"890\",\n            \"7\",\n            \"7\"\n          ],\n          [\n            \"ACUPE\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"13\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"114\",\n            \"2394\",\n            \"2394\",\n            \"0\",\n            \"358\",\n            \"2\",\n            \"2\"\n          ],\n          [\n            \"DOCE GRANDE\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"IPIAU\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"89\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"11\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"50\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"10\",\n            \"1715\",\n            \"1715\",\n            \"0\",\n            \"248\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"13\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"5\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAMPINHOS\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SERROLANDIA\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"JOINVILLE\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO SEBASTIAO DO PASSE\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"4\",\n            \"142\",\n            \"0\",\n            \"142\",\n            \"25\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"68\",\n            \"2253\",\n            \"2074\",\n            \"179\",\n            \"361\",\n            \"3\",\n            \"3\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"39\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CABOTO\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CABOTO\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SERRINHA\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO SEBASTIAO DO PASSE\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"19\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"95\",\n            \"343\",\n            \"0\",\n            \"343\",\n            \"67\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"CAROBA\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CABOTO\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ACUPE\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"6\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"GODOY CRUZ\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ACUPE\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SALVADOR\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"TIJUANA\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"5\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ]\n        ]\n      }\n    }\n  },\n  \"timings\": [\n    {\n      \"label\": \"00_defs\",\n      \"dur\": 19.74\n    },\n    {\n      \"label\": \"010_env_bundle\",\n      \"dur\": 0\n    },\n    {\n      \"label\": \"011_env_init\",\n      \"dur\": 837.65\n    },\n    {\n      \"label\": \"012_env_pem\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"01_env\",\n      \"dur\": 838.21\n    },\n    {\n      \"label\": \"02_setup\",\n      \"dur\": 173.69\n    },\n    {\n      \"label\": \"03_permissions\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"04_op_response\",\n      \"dur\": 5844.55\n    },\n    {\n      \"label\": \"04_op\",\n      \"dur\": 5845.13\n    },\n    {\n      \"label\": \"05_track\",\n      \"dur\": 509.89\n    }\n  ]\n}"}}},"component":"data2-core-functions@JSONParse"},"prop":{"component":"data2-core-primitives@String","params":{"content":"body.data.manifest.schema.columns.8.name"}}}}},{"value":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m.9"}}},"component":"data2-core-types@Reference"},"key":{"component":"data2-core-types@Getter","params":{"module":{"params":{"text":{"component":"data2-core-primitives@String","params":{"content":"{\n  \"statusCode\": 200,\n  \"body\": {\n    \"data\": {\n      \"statement_id\": \"01f186b4-4f0b-1def-9235-a8ee961f1f68\",\n      \"status\": {\n        \"state\": \"SUCCEEDED\"\n      },\n      \"manifest\": {\n        \"format\": \"JSON_ARRAY\",\n        \"schema\": {\n          \"column_count\": 10,\n          \"columns\": [\n            {\n              \"name\": \"municipio\",\n              \"type_text\": \"STRING\",\n              \"type_name\": \"STRING\",\n              \"position\": 0\n            },\n            {\n              \"name\": \"grupo\",\n              \"type_text\": \"INT\",\n              \"type_name\": \"INT\",\n              \"position\": 1\n            },\n            {\n              \"name\": \"lider\",\n              \"type_text\": \"STRING\",\n              \"type_name\": \"STRING\",\n              \"position\": 2\n            },\n            {\n              \"name\": \"cbs\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 3\n            },\n            {\n              \"name\": \"receita\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 4,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"rec_nat\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 5,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"rec_avon\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 6,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"pontos\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 7,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"pedidos\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 8,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"ativas\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 9\n            }\n          ]\n        },\n        \"total_chunk_count\": 1,\n        \"chunks\": [\n          {\n            \"chunk_index\": 0,\n            \"row_offset\": 0,\n            \"row_count\": 122\n          }\n        ],\n        \"total_row_count\": 122,\n        \"truncated\": false\n      },\n      \"result\": {\n        \"chunk_index\": 0,\n        \"row_offset\": 0,\n        \"row_count\": 122,\n        \"data_array\": [\n          [\n            \"MADRE DE DEUS\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"28\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ACUPE\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"42\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"185\",\n            \"5603\",\n            \"5497\",\n            \"106\",\n            \"938\",\n            \"5\",\n            \"5\"\n          ],\n          [\n            \"SALVADOR\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"21\",\n            \"625\",\n            \"625\",\n            \"0\",\n            \"104\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"11\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MONTE RECONCAVO\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SALVADOR\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ACUPE\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"2\",\n            \"765\",\n            \"483\",\n            \"283\",\n            \"134\",\n            \"2\",\n            \"1\"\n          ],\n          [\n            null,\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO JOAO DA BARRA\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"71\",\n            \"2110\",\n            \"2110\",\n            \"0\",\n            \"335\",\n            \"3\",\n            \"3\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"10\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"3\",\n            \"642\",\n            \"642\",\n            \"0\",\n            \"100\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"21\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"8\",\n            \"140\",\n            \"0\",\n            \"140\",\n            \"25\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"18\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MACEIO\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAMACARI\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CABOTO\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MARIANA\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO ESTEVAO\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"70\",\n            \"527\",\n            \"527\",\n            \"0\",\n            \"81\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"12\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"6\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CABOTO\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"38\",\n            \"319\",\n            \"0\",\n            \"319\",\n            \"77\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"39\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"76\",\n            \"1916\",\n            \"1916\",\n            \"0\",\n            \"279\",\n            \"2\",\n            \"2\"\n          ],\n          [\n            \"CAROBA\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"23\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"137\",\n            \"1595\",\n            \"1595\",\n            \"0\",\n            \"204\",\n            \"2\",\n            \"2\"\n          ],\n          [\n            \"PASSE\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"4\",\n            \"592\",\n            \"592\",\n            \"0\",\n            \"88\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"SAO PAULO\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MONTE RECONCAVO\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAMPINHOS\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"32\",\n            \"537\",\n            \"336\",\n            \"201\",\n            \"78\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"PASSE\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"5\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"36\",\n            \"1614\",\n            \"835\",\n            \"779\",\n            \"267\",\n            \"3\",\n            \"3\"\n          ],\n          [\n            null,\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"3\",\n            \"247\",\n            \"247\",\n            \"0\",\n            \"44\",\n            \"1\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"83\",\n            \"1152\",\n            \"983\",\n            \"170\",\n            \"199\",\n            \"3\",\n            \"3\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"82\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"9\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ACUPE\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"5\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SALVADOR\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"124\",\n            \"9945\",\n            \"5384\",\n            \"4561\",\n            \"1955\",\n            \"6\",\n            \"5\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"34\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"13\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"45\",\n            \"1417\",\n            \"1306\",\n            \"110\",\n            \"213\",\n            \"2\",\n            \"2\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"6\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SIMOES FILHO\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"148\",\n            \"985\",\n            \"985\",\n            \"0\",\n            \"126\",\n            \"2\",\n            \"2\"\n          ],\n          [\n            \"ENTRE RIOS\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"218\",\n            \"503\",\n            \"503\",\n            \"0\",\n            \"88\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"31\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"37\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"5\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"RIO DE JANEIRO\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ILHEUS\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"197\",\n            \"5072\",\n            \"4830\",\n            \"243\",\n            \"890\",\n            \"7\",\n            \"7\"\n          ],\n          [\n            \"ACUPE\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"13\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CANDEIAS\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"114\",\n            \"2394\",\n            \"2394\",\n            \"0\",\n            \"358\",\n            \"2\",\n            \"2\"\n          ],\n          [\n            \"DOCE GRANDE\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"IPIAU\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"89\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"11\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"4\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"50\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"10\",\n            \"1715\",\n            \"1715\",\n            \"0\",\n            \"248\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"SAO FRANCISCO DO CONDE\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"13\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSE\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"5\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAMPINHOS\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SERROLANDIA\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"JOINVILLE\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAUBARA\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO SEBASTIAO DO PASSE\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            null,\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"4\",\n            \"142\",\n            \"0\",\n            \"142\",\n            \"25\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22645\",\n            \"SARAH SILVA CUNHA\",\n            \"68\",\n            \"2253\",\n            \"2074\",\n            \"179\",\n            \"361\",\n            \"3\",\n            \"3\"\n          ],\n          [\n            \"MADRE DE DEUS\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"39\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CABOTO\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CABOTO\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SERRINHA\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SAO SEBASTIAO DO PASSE\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"19\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SANTO AMARO\",\n            \"22647\",\n            \"ZULMIRA RIBEIRO SANTOS\",\n            \"95\",\n            \"343\",\n            \"0\",\n            \"343\",\n            \"67\",\n            \"1\",\n            \"1\"\n          ],\n          [\n            \"CAROBA\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CABOTO\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22644\",\n            \"LIVIANE ALMEIDA CARVALHO\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ACUPE\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"6\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"MENINO JESUS\",\n            \"22650\",\n            \"CARMEN VERONICA TEIXEIRA FAGUNDES\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"2\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"GODOY CRUZ\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"ACUPE\",\n            \"22646\",\n            \"MARIA DE FATIMA CONCEIÇAO DOS REIS ROSAD\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"SALVADOR\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"TIJUANA\",\n            \"22642\",\n            \"CARLA BARRETO DE JESUS BULCAO\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22648\",\n            \"CATIA FERREIRA DOS SANTOS\",\n            \"3\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"CAROBA\",\n            \"22643\",\n            \"MARIA JOSE MENEZES DA SILVA\",\n            \"5\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ],\n          [\n            \"PASSAGEM DOS TEIXEIRAS\",\n            \"22649\",\n            \"EDVANIA ALCANTARA SOUZA SILVA\",\n            \"1\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\",\n            \"0\"\n          ]\n        ]\n      }\n    }\n  },\n  \"timings\": [\n    {\n      \"label\": \"00_defs\",\n      \"dur\": 19.74\n    },\n    {\n      \"label\": \"010_env_bundle\",\n      \"dur\": 0\n    },\n    {\n      \"label\": \"011_env_init\",\n      \"dur\": 837.65\n    },\n    {\n      \"label\": \"012_env_pem\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"01_env\",\n      \"dur\": 838.21\n    },\n    {\n      \"label\": \"02_setup\",\n      \"dur\": 173.69\n    },\n    {\n      \"label\": \"03_permissions\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"04_op_response\",\n      \"dur\": 5844.55\n    },\n    {\n      \"label\": \"04_op\",\n      \"dur\": 5845.13\n    },\n    {\n      \"label\": \"05_track\",\n      \"dur\": 509.89\n    }\n  ]\n}"}}},"component":"data2-core-functions@JSONParse"},"prop":{"component":"data2-core-primitives@String","params":{"content":"body.data.manifest.schema.columns.9.name"}}}}}]},"component":"data2-core-types@FieldSet"}}}},"component":"data2-core-functions@ArrayMap"},"collapsed":{"component":"data2-core-primitives@Number","params":{"content":99}},"theme":"rjv-default"},"updatedAt":"2026-07-24T16:38:38.884Z","createdAt":"2026-07-24T16:36:14.312Z"},{"_id":"6a63958f4040249ac2ede734","parent":"6a625124203e921fd2513b21","component":"data2-blocks@JsonViewer","system":"6a57cfe9673eb7e3c5e57784","displayName":"Copy of Copy of Copy of Copy of Copy of Copy of input","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":680,"height":482,"exactWidth":false,"exactHeight":482.36}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":1,"y":286,"exactX":1,"exactY":285.64,"fixed":false,"left":true,"top":true,"bottom":true,"growV":false}},"style":{"flex":{"component":"data2-core-primitives@String","params":{"content":"1"}}},"scroll":{"disabled":false,"component":"data2-core-types@Scroll","params":{"y":true}}},"json":{"params":{"array":{"params":{"module":{"params":{"text":{"component":"data2-core-primitives@String","params":{"content":"{\n  \"statusCode\": 200,\n  \"body\": {\n    \"data\": {\n      \"statement_id\": \"01f186b4-5013-171b-8d52-724495a18500\",\n      \"status\": {\n        \"state\": \"SUCCEEDED\"\n      },\n      \"manifest\": {\n        \"format\": \"JSON_ARRAY\",\n        \"schema\": {\n          \"column_count\": 4,\n          \"columns\": [\n            {\n              \"name\": \"nivel\",\n              \"type_text\": \"STRING\",\n              \"type_name\": \"STRING\",\n              \"position\": 0\n            },\n            {\n              \"name\": \"cbs\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 1\n            },\n            {\n              \"name\": \"rec_nat\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 2,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"rec_avon\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 3,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            }\n          ]\n        },\n        \"total_chunk_count\": 1,\n        \"chunks\": [\n          {\n            \"chunk_index\": 0,\n            \"row_offset\": 0,\n            \"row_count\": 6\n          }\n        ],\n        \"total_row_count\": 6,\n        \"truncated\": false\n      },\n      \"result\": {\n        \"chunk_index\": 0,\n        \"row_offset\": 0,\n        \"row_count\": 6,\n        \"data_array\": [\n          [\n            \"Bronze\",\n            \"914\",\n            \"4010\",\n            \"1387\"\n          ],\n          [\n            \"Cristal\",\n            \"908\",\n            \"345\",\n            \"170\"\n          ],\n          [\n            \"Prata\",\n            \"517\",\n            \"11682\",\n            \"1381\"\n          ],\n          [\n            \"Ouro\",\n            \"205\",\n            \"9909\",\n            \"283\"\n          ],\n          [\n            \"Diamante\",\n            \"55\",\n            \"6999\",\n            \"0\"\n          ],\n          [\n            \"Diamante+\",\n            \"2\",\n            \"2634\",\n            \"4356\"\n          ]\n        ]\n      }\n    }\n  },\n  \"timings\": [\n    {\n      \"label\": \"00_defs\",\n      \"dur\": 10.08\n    },\n    {\n      \"label\": \"010_env_bundle\",\n      \"dur\": 0\n    },\n    {\n      \"label\": \"011_env_init\",\n      \"dur\": 1691.06\n    },\n    {\n      \"label\": \"012_env_pem\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"01_env\",\n      \"dur\": 1691.68\n    },\n    {\n      \"label\": \"02_setup\",\n      \"dur\": 122.16\n    },\n    {\n      \"label\": \"03_permissions\",\n      \"dur\": 0.02\n    },\n    {\n      \"label\": \"04_op_response\",\n      \"dur\": 5979.52\n    },\n    {\n      \"label\": \"04_op\",\n      \"dur\": 5979.93\n    },\n    {\n      \"label\": \"05_track\",\n      \"dur\": 488.67\n    }\n  ]\n}"}}},"component":"data2-core-functions@JSONParse"},"prop":{"component":"data2-core-primitives@String","params":{"content":"body.data.result.data_array"}}},"component":"data2-core-types@Getter"},"mapper":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"m"}},{"component":"data2-core-primitives@String","params":{"content":"i"}}],"body":{"params":{"fieldsList":[{"value":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m.0"}}},"component":"data2-core-types@Reference"},"key":{"component":"data2-core-types@Getter","params":{"module":{"params":{"text":{"component":"data2-core-primitives@String","params":{"content":"{\n  \"statusCode\": 200,\n  \"body\": {\n    \"data\": {\n      \"statement_id\": \"01f186b4-5013-171b-8d52-724495a18500\",\n      \"status\": {\n        \"state\": \"SUCCEEDED\"\n      },\n      \"manifest\": {\n        \"format\": \"JSON_ARRAY\",\n        \"schema\": {\n          \"column_count\": 4,\n          \"columns\": [\n            {\n              \"name\": \"nivel\",\n              \"type_text\": \"STRING\",\n              \"type_name\": \"STRING\",\n              \"position\": 0\n            },\n            {\n              \"name\": \"cbs\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 1\n            },\n            {\n              \"name\": \"rec_nat\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 2,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"rec_avon\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 3,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            }\n          ]\n        },\n        \"total_chunk_count\": 1,\n        \"chunks\": [\n          {\n            \"chunk_index\": 0,\n            \"row_offset\": 0,\n            \"row_count\": 6\n          }\n        ],\n        \"total_row_count\": 6,\n        \"truncated\": false\n      },\n      \"result\": {\n        \"chunk_index\": 0,\n        \"row_offset\": 0,\n        \"row_count\": 6,\n        \"data_array\": [\n          [\n            \"Bronze\",\n            \"914\",\n            \"4010\",\n            \"1387\"\n          ],\n          [\n            \"Cristal\",\n            \"908\",\n            \"345\",\n            \"170\"\n          ],\n          [\n            \"Prata\",\n            \"517\",\n            \"11682\",\n            \"1381\"\n          ],\n          [\n            \"Ouro\",\n            \"205\",\n            \"9909\",\n            \"283\"\n          ],\n          [\n            \"Diamante\",\n            \"55\",\n            \"6999\",\n            \"0\"\n          ],\n          [\n            \"Diamante+\",\n            \"2\",\n            \"2634\",\n            \"4356\"\n          ]\n        ]\n      }\n    }\n  },\n  \"timings\": [\n    {\n      \"label\": \"00_defs\",\n      \"dur\": 10.08\n    },\n    {\n      \"label\": \"010_env_bundle\",\n      \"dur\": 0\n    },\n    {\n      \"label\": \"011_env_init\",\n      \"dur\": 1691.06\n    },\n    {\n      \"label\": \"012_env_pem\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"01_env\",\n      \"dur\": 1691.68\n    },\n    {\n      \"label\": \"02_setup\",\n      \"dur\": 122.16\n    },\n    {\n      \"label\": \"03_permissions\",\n      \"dur\": 0.02\n    },\n    {\n      \"label\": \"04_op_response\",\n      \"dur\": 5979.52\n    },\n    {\n      \"label\": \"04_op\",\n      \"dur\": 5979.93\n    },\n    {\n      \"label\": \"05_track\",\n      \"dur\": 488.67\n    }\n  ]\n}"}}},"component":"data2-core-functions@JSONParse"},"prop":{"component":"data2-core-primitives@String","params":{"content":"body.data.manifest.schema.columns.0.name"}}}}},{"value":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m.1"}}},"component":"data2-core-types@Reference"},"key":{"component":"data2-core-types@Getter","params":{"module":{"params":{"text":{"component":"data2-core-primitives@String","params":{"content":"{\n  \"statusCode\": 200,\n  \"body\": {\n    \"data\": {\n      \"statement_id\": \"01f186b4-5013-171b-8d52-724495a18500\",\n      \"status\": {\n        \"state\": \"SUCCEEDED\"\n      },\n      \"manifest\": {\n        \"format\": \"JSON_ARRAY\",\n        \"schema\": {\n          \"column_count\": 4,\n          \"columns\": [\n            {\n              \"name\": \"nivel\",\n              \"type_text\": \"STRING\",\n              \"type_name\": \"STRING\",\n              \"position\": 0\n            },\n            {\n              \"name\": \"cbs\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 1\n            },\n            {\n              \"name\": \"rec_nat\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 2,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"rec_avon\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 3,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            }\n          ]\n        },\n        \"total_chunk_count\": 1,\n        \"chunks\": [\n          {\n            \"chunk_index\": 0,\n            \"row_offset\": 0,\n            \"row_count\": 6\n          }\n        ],\n        \"total_row_count\": 6,\n        \"truncated\": false\n      },\n      \"result\": {\n        \"chunk_index\": 0,\n        \"row_offset\": 0,\n        \"row_count\": 6,\n        \"data_array\": [\n          [\n            \"Bronze\",\n            \"914\",\n            \"4010\",\n            \"1387\"\n          ],\n          [\n            \"Cristal\",\n            \"908\",\n            \"345\",\n            \"170\"\n          ],\n          [\n            \"Prata\",\n            \"517\",\n            \"11682\",\n            \"1381\"\n          ],\n          [\n            \"Ouro\",\n            \"205\",\n            \"9909\",\n            \"283\"\n          ],\n          [\n            \"Diamante\",\n            \"55\",\n            \"6999\",\n            \"0\"\n          ],\n          [\n            \"Diamante+\",\n            \"2\",\n            \"2634\",\n            \"4356\"\n          ]\n        ]\n      }\n    }\n  },\n  \"timings\": [\n    {\n      \"label\": \"00_defs\",\n      \"dur\": 10.08\n    },\n    {\n      \"label\": \"010_env_bundle\",\n      \"dur\": 0\n    },\n    {\n      \"label\": \"011_env_init\",\n      \"dur\": 1691.06\n    },\n    {\n      \"label\": \"012_env_pem\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"01_env\",\n      \"dur\": 1691.68\n    },\n    {\n      \"label\": \"02_setup\",\n      \"dur\": 122.16\n    },\n    {\n      \"label\": \"03_permissions\",\n      \"dur\": 0.02\n    },\n    {\n      \"label\": \"04_op_response\",\n      \"dur\": 5979.52\n    },\n    {\n      \"label\": \"04_op\",\n      \"dur\": 5979.93\n    },\n    {\n      \"label\": \"05_track\",\n      \"dur\": 488.67\n    }\n  ]\n}"}}},"component":"data2-core-functions@JSONParse"},"prop":{"component":"data2-core-primitives@String","params":{"content":"body.data.manifest.schema.columns.1.name"}}}}},{"value":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m.2"}}},"component":"data2-core-types@Reference"},"key":{"component":"data2-core-types@Getter","params":{"module":{"params":{"text":{"component":"data2-core-primitives@String","params":{"content":"{\n  \"statusCode\": 200,\n  \"body\": {\n    \"data\": {\n      \"statement_id\": \"01f186b4-5013-171b-8d52-724495a18500\",\n      \"status\": {\n        \"state\": \"SUCCEEDED\"\n      },\n      \"manifest\": {\n        \"format\": \"JSON_ARRAY\",\n        \"schema\": {\n          \"column_count\": 4,\n          \"columns\": [\n            {\n              \"name\": \"nivel\",\n              \"type_text\": \"STRING\",\n              \"type_name\": \"STRING\",\n              \"position\": 0\n            },\n            {\n              \"name\": \"cbs\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 1\n            },\n            {\n              \"name\": \"rec_nat\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 2,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"rec_avon\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 3,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            }\n          ]\n        },\n        \"total_chunk_count\": 1,\n        \"chunks\": [\n          {\n            \"chunk_index\": 0,\n            \"row_offset\": 0,\n            \"row_count\": 6\n          }\n        ],\n        \"total_row_count\": 6,\n        \"truncated\": false\n      },\n      \"result\": {\n        \"chunk_index\": 0,\n        \"row_offset\": 0,\n        \"row_count\": 6,\n        \"data_array\": [\n          [\n            \"Bronze\",\n            \"914\",\n            \"4010\",\n            \"1387\"\n          ],\n          [\n            \"Cristal\",\n            \"908\",\n            \"345\",\n            \"170\"\n          ],\n          [\n            \"Prata\",\n            \"517\",\n            \"11682\",\n            \"1381\"\n          ],\n          [\n            \"Ouro\",\n            \"205\",\n            \"9909\",\n            \"283\"\n          ],\n          [\n            \"Diamante\",\n            \"55\",\n            \"6999\",\n            \"0\"\n          ],\n          [\n            \"Diamante+\",\n            \"2\",\n            \"2634\",\n            \"4356\"\n          ]\n        ]\n      }\n    }\n  },\n  \"timings\": [\n    {\n      \"label\": \"00_defs\",\n      \"dur\": 10.08\n    },\n    {\n      \"label\": \"010_env_bundle\",\n      \"dur\": 0\n    },\n    {\n      \"label\": \"011_env_init\",\n      \"dur\": 1691.06\n    },\n    {\n      \"label\": \"012_env_pem\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"01_env\",\n      \"dur\": 1691.68\n    },\n    {\n      \"label\": \"02_setup\",\n      \"dur\": 122.16\n    },\n    {\n      \"label\": \"03_permissions\",\n      \"dur\": 0.02\n    },\n    {\n      \"label\": \"04_op_response\",\n      \"dur\": 5979.52\n    },\n    {\n      \"label\": \"04_op\",\n      \"dur\": 5979.93\n    },\n    {\n      \"label\": \"05_track\",\n      \"dur\": 488.67\n    }\n  ]\n}"}}},"component":"data2-core-functions@JSONParse"},"prop":{"component":"data2-core-primitives@String","params":{"content":"body.data.manifest.schema.columns.2.name"}}}}}]},"component":"data2-core-types@FieldSet"}}}},"component":"data2-core-functions@ArrayMap"},"collapsed":{"component":"data2-core-primitives@Number","params":{"content":99}},"theme":"rjv-default"},"updatedAt":"2026-07-24T16:41:25.738Z","createdAt":"2026-07-24T16:41:25.738Z"},{"_id":"6a639f433458bb4b79ae4eca","parent":"6a625139203e921fd2513b26","component":"data2-blocks@JsonViewer","system":"6a57cfe9673eb7e3c5e57784","displayName":"Copy of Copy of Copy of Copy of Copy of Copy of Copy of Copy of input","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":680,"height":482,"exactWidth":false,"exactHeight":482.36}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":1,"y":286,"exactX":1,"exactY":285.64,"fixed":false,"left":true,"top":true,"bottom":true,"growV":false}},"style":{"flex":{"component":"data2-core-primitives@String","params":{"content":"1"}}},"scroll":{"disabled":false,"component":"data2-core-types@Scroll","params":{"y":true}}},"json":{"params":{"array":{"params":{"module":{"params":{"text":{"component":"data2-core-primitives@String","params":{"content":"{\n  \"statusCode\": 200,\n  \"body\": {\n    \"data\": {\n      \"statement_id\": \"01f186b4-5376-1a99-b689-d0a41d1ca86d\",\n      \"status\": {\n        \"state\": \"SUCCEEDED\"\n      },\n      \"manifest\": {\n        \"format\": \"JSON_ARRAY\",\n        \"schema\": {\n          \"column_count\": 5,\n          \"columns\": [\n            {\n              \"name\": \"ciclo\",\n              \"type_text\": \"INT\",\n              \"type_name\": \"INT\",\n              \"position\": 0\n            },\n            {\n              \"name\": \"cbs\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 1\n            },\n            {\n              \"name\": \"ativas\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 2\n            },\n            {\n              \"name\": \"receita\",\n              \"type_text\": \"DOUBLE\",\n              \"type_name\": \"DOUBLE\",\n              \"position\": 3\n            },\n            {\n              \"name\": \"pontos\",\n              \"type_text\": \"DOUBLE\",\n              \"type_name\": \"DOUBLE\",\n              \"position\": 4\n            }\n          ]\n        },\n        \"total_chunk_count\": 1,\n        \"chunks\": [\n          {\n            \"chunk_index\": 0,\n            \"row_offset\": 0,\n            \"row_count\": 8\n          }\n        ],\n        \"total_row_count\": 8,\n        \"truncated\": false\n      },\n      \"result\": {\n        \"chunk_index\": 0,\n        \"row_offset\": 0,\n        \"row_count\": 8,\n        \"data_array\": [\n          [\n            \"202612\",\n            \"2612\",\n            \"2601\",\n            \"52456.0\",\n            \"8343.0\"\n          ],\n          [\n            \"202611\",\n            \"2693\",\n            \"2656\",\n            \"906774.0\",\n            \"155675.0\"\n          ],\n          [\n            \"202610\",\n            \"2656\",\n            \"2630\",\n            \"972685.0\",\n            \"172207.0\"\n          ],\n          [\n            \"202609\",\n            \"2702\",\n            \"2658\",\n            \"940204.0\",\n            \"175128.0\"\n          ],\n          [\n            \"202608\",\n            \"2661\",\n            \"2631\",\n            \"895173.0\",\n            \"158986.0\"\n          ],\n          [\n            \"202607\",\n            \"2622\",\n            \"2614\",\n            \"652192.0\",\n            \"94839.0\"\n          ],\n          [\n            \"202606\",\n            \"2635\",\n            \"2623\",\n            \"1009029.0\",\n            \"163026.0\"\n          ],\n          [\n            \"202605\",\n            \"2631\",\n            \"2603\",\n            \"943406.0\",\n            \"142920.0\"\n          ]\n        ]\n      }\n    }\n  },\n  \"timings\": [\n    {\n      \"label\": \"00_defs\",\n      \"dur\": 26.13\n    },\n    {\n      \"label\": \"010_env_bundle\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"011_env_init\",\n      \"dur\": 1055.96\n    },\n    {\n      \"label\": \"012_env_pem\",\n      \"dur\": 0.02\n    },\n    {\n      \"label\": \"01_env\",\n      \"dur\": 1057.4\n    },\n    {\n      \"label\": \"02_setup\",\n      \"dur\": 610.56\n    },\n    {\n      \"label\": \"03_permissions\",\n      \"dur\": 0.03\n    },\n    {\n      \"label\": \"04_op_response\",\n      \"dur\": 6702.53\n    },\n    {\n      \"label\": \"04_op\",\n      \"dur\": 6703.44\n    },\n    {\n      \"label\": \"05_track\",\n      \"dur\": 609.23\n    }\n  ]\n}"}}},"component":"data2-core-functions@JSONParse"},"prop":{"component":"data2-core-primitives@String","params":{"content":"body.data.result.data_array"}}},"component":"data2-core-types@Getter"},"mapper":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"m"}},{"component":"data2-core-primitives@String","params":{"content":"i"}}],"body":{"params":{"fieldsList":[{"value":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m.0"}}},"component":"data2-core-types@Reference"},"key":{"component":"data2-core-types@Getter","params":{"module":{"params":{"text":{"component":"data2-core-primitives@String","params":{"content":"{\n  \"statusCode\": 200,\n  \"body\": {\n    \"data\": {\n      \"statement_id\": \"01f186b4-5376-1a99-b689-d0a41d1ca86d\",\n      \"status\": {\n        \"state\": \"SUCCEEDED\"\n      },\n      \"manifest\": {\n        \"format\": \"JSON_ARRAY\",\n        \"schema\": {\n          \"column_count\": 5,\n          \"columns\": [\n            {\n              \"name\": \"ciclo\",\n              \"type_text\": \"INT\",\n              \"type_name\": \"INT\",\n              \"position\": 0\n            },\n            {\n              \"name\": \"cbs\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 1\n            },\n            {\n              \"name\": \"ativas\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 2\n            },\n            {\n              \"name\": \"receita\",\n              \"type_text\": \"DOUBLE\",\n              \"type_name\": \"DOUBLE\",\n              \"position\": 3\n            },\n            {\n              \"name\": \"pontos\",\n              \"type_text\": \"DOUBLE\",\n              \"type_name\": \"DOUBLE\",\n              \"position\": 4\n            }\n          ]\n        },\n        \"total_chunk_count\": 1,\n        \"chunks\": [\n          {\n            \"chunk_index\": 0,\n            \"row_offset\": 0,\n            \"row_count\": 8\n          }\n        ],\n        \"total_row_count\": 8,\n        \"truncated\": false\n      },\n      \"result\": {\n        \"chunk_index\": 0,\n        \"row_offset\": 0,\n        \"row_count\": 8,\n        \"data_array\": [\n          [\n            \"202612\",\n            \"2612\",\n            \"2601\",\n            \"52456.0\",\n            \"8343.0\"\n          ],\n          [\n            \"202611\",\n            \"2693\",\n            \"2656\",\n            \"906774.0\",\n            \"155675.0\"\n          ],\n          [\n            \"202610\",\n            \"2656\",\n            \"2630\",\n            \"972685.0\",\n            \"172207.0\"\n          ],\n          [\n            \"202609\",\n            \"2702\",\n            \"2658\",\n            \"940204.0\",\n            \"175128.0\"\n          ],\n          [\n            \"202608\",\n            \"2661\",\n            \"2631\",\n            \"895173.0\",\n            \"158986.0\"\n          ],\n          [\n            \"202607\",\n            \"2622\",\n            \"2614\",\n            \"652192.0\",\n            \"94839.0\"\n          ],\n          [\n            \"202606\",\n            \"2635\",\n            \"2623\",\n            \"1009029.0\",\n            \"163026.0\"\n          ],\n          [\n            \"202605\",\n            \"2631\",\n            \"2603\",\n            \"943406.0\",\n            \"142920.0\"\n          ]\n        ]\n      }\n    }\n  },\n  \"timings\": [\n    {\n      \"label\": \"00_defs\",\n      \"dur\": 26.13\n    },\n    {\n      \"label\": \"010_env_bundle\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"011_env_init\",\n      \"dur\": 1055.96\n    },\n    {\n      \"label\": \"012_env_pem\",\n      \"dur\": 0.02\n    },\n    {\n      \"label\": \"01_env\",\n      \"dur\": 1057.4\n    },\n    {\n      \"label\": \"02_setup\",\n      \"dur\": 610.56\n    },\n    {\n      \"label\": \"03_permissions\",\n      \"dur\": 0.03\n    },\n    {\n      \"label\": \"04_op_response\",\n      \"dur\": 6702.53\n    },\n    {\n      \"label\": \"04_op\",\n      \"dur\": 6703.44\n    },\n    {\n      \"label\": \"05_track\",\n      \"dur\": 609.23\n    }\n  ]\n}"}}},"component":"data2-core-functions@JSONParse"},"prop":{"component":"data2-core-primitives@String","params":{"content":"body.data.manifest.schema.columns.0.name"}}}}},{"value":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m.1"}}},"component":"data2-core-types@Reference"},"key":{"component":"data2-core-types@Getter","params":{"module":{"params":{"text":{"component":"data2-core-primitives@String","params":{"content":"{\n  \"statusCode\": 200,\n  \"body\": {\n    \"data\": {\n      \"statement_id\": \"01f186b4-5376-1a99-b689-d0a41d1ca86d\",\n      \"status\": {\n        \"state\": \"SUCCEEDED\"\n      },\n      \"manifest\": {\n        \"format\": \"JSON_ARRAY\",\n        \"schema\": {\n          \"column_count\": 5,\n          \"columns\": [\n            {\n              \"name\": \"ciclo\",\n              \"type_text\": \"INT\",\n              \"type_name\": \"INT\",\n              \"position\": 0\n            },\n            {\n              \"name\": \"cbs\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 1\n            },\n            {\n              \"name\": \"ativas\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 2\n            },\n            {\n              \"name\": \"receita\",\n              \"type_text\": \"DOUBLE\",\n              \"type_name\": \"DOUBLE\",\n              \"position\": 3\n            },\n            {\n              \"name\": \"pontos\",\n              \"type_text\": \"DOUBLE\",\n              \"type_name\": \"DOUBLE\",\n              \"position\": 4\n            }\n          ]\n        },\n        \"total_chunk_count\": 1,\n        \"chunks\": [\n          {\n            \"chunk_index\": 0,\n            \"row_offset\": 0,\n            \"row_count\": 8\n          }\n        ],\n        \"total_row_count\": 8,\n        \"truncated\": false\n      },\n      \"result\": {\n        \"chunk_index\": 0,\n        \"row_offset\": 0,\n        \"row_count\": 8,\n        \"data_array\": [\n          [\n            \"202612\",\n            \"2612\",\n            \"2601\",\n            \"52456.0\",\n            \"8343.0\"\n          ],\n          [\n            \"202611\",\n            \"2693\",\n            \"2656\",\n            \"906774.0\",\n            \"155675.0\"\n          ],\n          [\n            \"202610\",\n            \"2656\",\n            \"2630\",\n            \"972685.0\",\n            \"172207.0\"\n          ],\n          [\n            \"202609\",\n            \"2702\",\n            \"2658\",\n            \"940204.0\",\n            \"175128.0\"\n          ],\n          [\n            \"202608\",\n            \"2661\",\n            \"2631\",\n            \"895173.0\",\n            \"158986.0\"\n          ],\n          [\n            \"202607\",\n            \"2622\",\n            \"2614\",\n            \"652192.0\",\n            \"94839.0\"\n          ],\n          [\n            \"202606\",\n            \"2635\",\n            \"2623\",\n            \"1009029.0\",\n            \"163026.0\"\n          ],\n          [\n            \"202605\",\n            \"2631\",\n            \"2603\",\n            \"943406.0\",\n            \"142920.0\"\n          ]\n        ]\n      }\n    }\n  },\n  \"timings\": [\n    {\n      \"label\": \"00_defs\",\n      \"dur\": 26.13\n    },\n    {\n      \"label\": \"010_env_bundle\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"011_env_init\",\n      \"dur\": 1055.96\n    },\n    {\n      \"label\": \"012_env_pem\",\n      \"dur\": 0.02\n    },\n    {\n      \"label\": \"01_env\",\n      \"dur\": 1057.4\n    },\n    {\n      \"label\": \"02_setup\",\n      \"dur\": 610.56\n    },\n    {\n      \"label\": \"03_permissions\",\n      \"dur\": 0.03\n    },\n    {\n      \"label\": \"04_op_response\",\n      \"dur\": 6702.53\n    },\n    {\n      \"label\": \"04_op\",\n      \"dur\": 6703.44\n    },\n    {\n      \"label\": \"05_track\",\n      \"dur\": 609.23\n    }\n  ]\n}"}}},"component":"data2-core-functions@JSONParse"},"prop":{"component":"data2-core-primitives@String","params":{"content":"body.data.manifest.schema.columns.1.name"}}}}},{"value":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m.2"}}},"component":"data2-core-types@Reference"},"key":{"component":"data2-core-types@Getter","params":{"module":{"params":{"text":{"component":"data2-core-primitives@String","params":{"content":"{\n  \"statusCode\": 200,\n  \"body\": {\n    \"data\": {\n      \"statement_id\": \"01f186b4-5376-1a99-b689-d0a41d1ca86d\",\n      \"status\": {\n        \"state\": \"SUCCEEDED\"\n      },\n      \"manifest\": {\n        \"format\": \"JSON_ARRAY\",\n        \"schema\": {\n          \"column_count\": 5,\n          \"columns\": [\n            {\n              \"name\": \"ciclo\",\n              \"type_text\": \"INT\",\n              \"type_name\": \"INT\",\n              \"position\": 0\n            },\n            {\n              \"name\": \"cbs\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 1\n            },\n            {\n              \"name\": \"ativas\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 2\n            },\n            {\n              \"name\": \"receita\",\n              \"type_text\": \"DOUBLE\",\n              \"type_name\": \"DOUBLE\",\n              \"position\": 3\n            },\n            {\n              \"name\": \"pontos\",\n              \"type_text\": \"DOUBLE\",\n              \"type_name\": \"DOUBLE\",\n              \"position\": 4\n            }\n          ]\n        },\n        \"total_chunk_count\": 1,\n        \"chunks\": [\n          {\n            \"chunk_index\": 0,\n            \"row_offset\": 0,\n            \"row_count\": 8\n          }\n        ],\n        \"total_row_count\": 8,\n        \"truncated\": false\n      },\n      \"result\": {\n        \"chunk_index\": 0,\n        \"row_offset\": 0,\n        \"row_count\": 8,\n        \"data_array\": [\n          [\n            \"202612\",\n            \"2612\",\n            \"2601\",\n            \"52456.0\",\n            \"8343.0\"\n          ],\n          [\n            \"202611\",\n            \"2693\",\n            \"2656\",\n            \"906774.0\",\n            \"155675.0\"\n          ],\n          [\n            \"202610\",\n            \"2656\",\n            \"2630\",\n            \"972685.0\",\n            \"172207.0\"\n          ],\n          [\n            \"202609\",\n            \"2702\",\n            \"2658\",\n            \"940204.0\",\n            \"175128.0\"\n          ],\n          [\n            \"202608\",\n            \"2661\",\n            \"2631\",\n            \"895173.0\",\n            \"158986.0\"\n          ],\n          [\n            \"202607\",\n            \"2622\",\n            \"2614\",\n            \"652192.0\",\n            \"94839.0\"\n          ],\n          [\n            \"202606\",\n            \"2635\",\n            \"2623\",\n            \"1009029.0\",\n            \"163026.0\"\n          ],\n          [\n            \"202605\",\n            \"2631\",\n            \"2603\",\n            \"943406.0\",\n            \"142920.0\"\n          ]\n        ]\n      }\n    }\n  },\n  \"timings\": [\n    {\n      \"label\": \"00_defs\",\n      \"dur\": 26.13\n    },\n    {\n      \"label\": \"010_env_bundle\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"011_env_init\",\n      \"dur\": 1055.96\n    },\n    {\n      \"label\": \"012_env_pem\",\n      \"dur\": 0.02\n    },\n    {\n      \"label\": \"01_env\",\n      \"dur\": 1057.4\n    },\n    {\n      \"label\": \"02_setup\",\n      \"dur\": 610.56\n    },\n    {\n      \"label\": \"03_permissions\",\n      \"dur\": 0.03\n    },\n    {\n      \"label\": \"04_op_response\",\n      \"dur\": 6702.53\n    },\n    {\n      \"label\": \"04_op\",\n      \"dur\": 6703.44\n    },\n    {\n      \"label\": \"05_track\",\n      \"dur\": 609.23\n    }\n  ]\n}"}}},"component":"data2-core-functions@JSONParse"},"prop":{"component":"data2-core-primitives@String","params":{"content":"body.data.manifest.schema.columns.2.name"}}}}},{"value":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m.3"}}},"component":"data2-core-types@Reference"},"key":{"component":"data2-core-types@Getter","params":{"module":{"params":{"text":{"component":"data2-core-primitives@String","params":{"content":"{\n  \"statusCode\": 200,\n  \"body\": {\n    \"data\": {\n      \"statement_id\": \"01f186b4-5376-1a99-b689-d0a41d1ca86d\",\n      \"status\": {\n        \"state\": \"SUCCEEDED\"\n      },\n      \"manifest\": {\n        \"format\": \"JSON_ARRAY\",\n        \"schema\": {\n          \"column_count\": 5,\n          \"columns\": [\n            {\n              \"name\": \"ciclo\",\n              \"type_text\": \"INT\",\n              \"type_name\": \"INT\",\n              \"position\": 0\n            },\n            {\n              \"name\": \"cbs\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 1\n            },\n            {\n              \"name\": \"ativas\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 2\n            },\n            {\n              \"name\": \"receita\",\n              \"type_text\": \"DOUBLE\",\n              \"type_name\": \"DOUBLE\",\n              \"position\": 3\n            },\n            {\n              \"name\": \"pontos\",\n              \"type_text\": \"DOUBLE\",\n              \"type_name\": \"DOUBLE\",\n              \"position\": 4\n            }\n          ]\n        },\n        \"total_chunk_count\": 1,\n        \"chunks\": [\n          {\n            \"chunk_index\": 0,\n            \"row_offset\": 0,\n            \"row_count\": 8\n          }\n        ],\n        \"total_row_count\": 8,\n        \"truncated\": false\n      },\n      \"result\": {\n        \"chunk_index\": 0,\n        \"row_offset\": 0,\n        \"row_count\": 8,\n        \"data_array\": [\n          [\n            \"202612\",\n            \"2612\",\n            \"2601\",\n            \"52456.0\",\n            \"8343.0\"\n          ],\n          [\n            \"202611\",\n            \"2693\",\n            \"2656\",\n            \"906774.0\",\n            \"155675.0\"\n          ],\n          [\n            \"202610\",\n            \"2656\",\n            \"2630\",\n            \"972685.0\",\n            \"172207.0\"\n          ],\n          [\n            \"202609\",\n            \"2702\",\n            \"2658\",\n            \"940204.0\",\n            \"175128.0\"\n          ],\n          [\n            \"202608\",\n            \"2661\",\n            \"2631\",\n            \"895173.0\",\n            \"158986.0\"\n          ],\n          [\n            \"202607\",\n            \"2622\",\n            \"2614\",\n            \"652192.0\",\n            \"94839.0\"\n          ],\n          [\n            \"202606\",\n            \"2635\",\n            \"2623\",\n            \"1009029.0\",\n            \"163026.0\"\n          ],\n          [\n            \"202605\",\n            \"2631\",\n            \"2603\",\n            \"943406.0\",\n            \"142920.0\"\n          ]\n        ]\n      }\n    }\n  },\n  \"timings\": [\n    {\n      \"label\": \"00_defs\",\n      \"dur\": 26.13\n    },\n    {\n      \"label\": \"010_env_bundle\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"011_env_init\",\n      \"dur\": 1055.96\n    },\n    {\n      \"label\": \"012_env_pem\",\n      \"dur\": 0.02\n    },\n    {\n      \"label\": \"01_env\",\n      \"dur\": 1057.4\n    },\n    {\n      \"label\": \"02_setup\",\n      \"dur\": 610.56\n    },\n    {\n      \"label\": \"03_permissions\",\n      \"dur\": 0.03\n    },\n    {\n      \"label\": \"04_op_response\",\n      \"dur\": 6702.53\n    },\n    {\n      \"label\": \"04_op\",\n      \"dur\": 6703.44\n    },\n    {\n      \"label\": \"05_track\",\n      \"dur\": 609.23\n    }\n  ]\n}"}}},"component":"data2-core-functions@JSONParse"},"prop":{"component":"data2-core-primitives@String","params":{"content":"body.data.manifest.schema.columns.3.name"}}}}}]},"component":"data2-core-types@FieldSet"}}}},"component":"data2-core-functions@ArrayMap"},"collapsed":{"component":"data2-core-primitives@Number","params":{"content":99}},"theme":"rjv-default"},"updatedAt":"2026-07-24T17:22:51.270Z","createdAt":"2026-07-24T17:22:51.270Z"},{"_id":"6a639f643458bb4b79ae4ece","parent":"6a625155203e921fd2513b2b","component":"data2-blocks@JsonViewer","system":"6a57cfe9673eb7e3c5e57784","displayName":"Copy of Copy of Copy of Copy of Copy of Copy of Copy of input","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":680,"height":448,"exactWidth":false,"exactHeight":448.46}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":1,"y":320,"exactX":1,"exactY":319.54,"fixed":false,"left":true,"top":true,"bottom":true,"growV":false}},"style":{"flex":{"component":"data2-core-primitives@String","params":{"content":"1"}}},"scroll":{"disabled":false,"component":"data2-core-types@Scroll","params":{"y":true}}},"json":{"params":{"array":{"params":{"array":{"params":{"module":{"params":{"text":{"component":"data2-core-primitives@String","params":{"content":"{\n  \"statusCode\": 200,\n  \"body\": {\n    \"data\": {\n      \"statement_id\": \"01f186b4-5aff-18b1-ac79-30605e087987\",\n      \"status\": {\n        \"state\": \"SUCCEEDED\"\n      },\n      \"manifest\": {\n        \"format\": \"JSON_ARRAY\",\n        \"schema\": {\n          \"column_count\": 3,\n          \"columns\": [\n            {\n              \"name\": \"municipio\",\n              \"type_text\": \"STRING\",\n              \"type_name\": \"STRING\",\n              \"position\": 0\n            },\n            {\n              \"name\": \"setor\",\n              \"type_text\": \"INT\",\n              \"type_name\": \"INT\",\n              \"position\": 1\n            },\n            {\n              \"name\": \"cbs\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 2\n            }\n          ]\n        },\n        \"total_chunk_count\": 1,\n        \"chunks\": [\n          {\n            \"chunk_index\": 0,\n            \"row_offset\": 0,\n            \"row_count\": 284\n          }\n        ],\n        \"total_row_count\": 284,\n        \"truncated\": false\n      },\n      \"result\": {\n        \"chunk_index\": 0,\n        \"row_offset\": 0,\n        \"row_count\": 284,\n        \"data_array\": [\n          [\n            \"SALVADOR\",\n            \"3434\",\n            \"3116\"\n          ],\n          [\n            \"SAO SEBASTIAO DO PASSE\",\n            \"3703\",\n            \"400\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3608\",\n            \"4\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3529\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3553\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3417\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3812\",\n            \"2\"\n          ],\n          [\n            \"MARAGOGIPE\",\n            \"3705\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3495\",\n            \"3\"\n          ],\n          [\n            \"MARAGOGIPE\",\n            \"3358\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3730\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3330\",\n            \"1\"\n          ],\n          [\n            \"CACHOEIRA\",\n            \"3471\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3193\",\n            \"1\"\n          ],\n          [\n            \"CAMPO BELO\",\n            \"3544\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3720\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3698\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3832\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3750\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3270\",\n            \"2189\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3321\",\n            \"44\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3602\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3309\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3674\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3272\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3701\",\n            \"2\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3261\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3269\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3327\",\n            \"1\"\n          ],\n          [\n            \"CONCEICAO DO JACUIPE\",\n            \"3292\",\n            \"1\"\n          ],\n          [\n            \"CONCEICAO DO JACUIPE\",\n            \"3492\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3821\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3527\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3358\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3507\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3705\",\n            \"2587\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3639\",\n            \"75\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3417\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3253\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3822\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3466\",\n            \"3\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3801\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3511\",\n            \"4\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3515\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3435\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3551\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3483\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3555\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3571\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3564\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3539\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3800\",\n            \"1\"\n          ],\n          [\n            \"CACHOEIRA\",\n            \"3639\",\n            \"1\"\n          ],\n          [\n            \"CONCEICAO DO JACUIPE\",\n            \"3471\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3632\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3369\",\n            \"3\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3376\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3865\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3667\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3373\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3321\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3691\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3277\",\n            \"1\"\n          ],\n          [\n            \"MARAGOGIPE\",\n            \"3808\",\n            \"279\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3269\",\n            \"10\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3492\",\n            \"5\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3315\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3612\",\n            \"8\"\n          ],\n          [\n            \"SAO SEBASTIAO DO PASSE\",\n            \"3304\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3773\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3328\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3245\",\n            \"1\"\n          ],\n          [\n            \"CACHOEIRA\",\n            \"3830\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3818\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3559\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3292\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3745\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3489\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3399\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3648\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"4012\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3314\",\n            \"2\"\n          ],\n          [\n            \"AMELIA RODRIGUES\",\n            \"3703\",\n            \"275\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3374\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3808\",\n            \"3\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3383\",\n            \"4\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3741\",\n            \"3\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3711\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3341\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3234\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3703\",\n            \"5\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3825\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3794\",\n            \"6\"\n          ],\n          [\n            \"CONCEICAO DO JACUIPE\",\n            \"3847\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3723\",\n            \"1\"\n          ],\n          [\n            \"CACHOEIRA\",\n            \"3667\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3582\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3646\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3304\",\n            \"3\"\n          ],\n          [\n            \"SAO SEBASTIAO DO PASSE\",\n            \"3639\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3338\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3243\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3696\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3389\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3822\",\n            \"2661\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3847\",\n            \"2424\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3540\",\n            \"4\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3820\",\n            \"1\"\n          ],\n          [\n            \"CONCEICAO DO JACUIPE\",\n            \"3703\",\n            \"314\"\n          ],\n          [\n            \"CAMPO BELO\",\n            \"3655\",\n            \"199\"\n          ],\n          [\n            \"SAO FRANCISCO DE PAULA\",\n            \"3509\",\n            \"116\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3644\",\n            \"1\"\n          ],\n          [\n            \"CACHOEIRA\",\n            \"3676\",\n            \"17\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3703\",\n            \"10\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3384\",\n            \"1\"\n          ],\n          [\n            \"AMELIA RODRIGUES\",\n            \"3392\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3608\",\n            \"2\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3706\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3696\",\n            \"3\"\n          ],\n          [\n            \"SAO SEBASTIAO DO PASSE\",\n            \"3219\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3789\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3379\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3667\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3724\",\n            \"1\"\n          ],\n          [\n            \"CACHOEIRA\",\n            \"3622\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3678\",\n            \"2413\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3488\",\n            \"3\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3471\",\n            \"24\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3540\",\n            \"8\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3343\",\n            \"1\"\n          ],\n          [\n            \"CAMPO BELO\",\n            \"3241\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3271\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3309\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3792\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3267\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3572\",\n            \"1\"\n          ],\n          [\n            \"CACHOEIRA\",\n            \"3494\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3206\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3490\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3623\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3754\",\n            \"1\"\n          ],\n          [\n            \"CACHOEIRA\",\n            \"3492\",\n            \"1\"\n          ],\n          [\n            \"SALINAS DA MARGARIDA\",\n            \"3358\",\n            \"205\"\n          ],\n          [\n            \"CACHOEIRA\",\n            \"3808\",\n            \"247\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3348\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3808\",\n            \"18\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3847\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3229\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3823\",\n            \"2\"\n          ],\n          [\n            \"CONCEICAO DO JACUIPE\",\n            \"3773\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3797\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3211\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3672\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3454\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3390\",\n            \"1\"\n          ],\n          [\n            \"SAO GONCALO DOS CAMPOS\",\n            \"3492\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3637\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3770\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3598\",\n            \"1\"\n          ],\n          [\n            \"CACHOEIRA\",\n            \"3723\",\n            \"1\"\n          ],\n          [\n            \"SAO FRANCISCO DE PAULA\",\n            \"3447\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3330\",\n            \"2688\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3781\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3647\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3228\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3442\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3432\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3717\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3436\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3811\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3213\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3690\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3568\",\n            \"1\"\n          ],\n          [\n            \"CONCEICAO DO JACUIPE\",\n            \"3612\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3350\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3704\",\n            \"1\"\n          ],\n          [\n            \"MARAGOGIPE\",\n            \"3639\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3303\",\n            \"1\"\n          ],\n          [\n            \"CONCEICAO DO JACUIPE\",\n            \"3384\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3509\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3328\",\n            \"1\"\n          ],\n          [\n            \"CRISTAIS\",\n            \"3248\",\n            \"1\"\n          ],\n          [\n            \"CACHOEIRA\",\n            \"3703\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3492\",\n            \"3148\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3392\",\n            \"2997\"\n          ],\n          [\n            \"FORMIGA\",\n            \"3221\",\n            \"289\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3552\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3817\",\n            \"3\"\n          ],\n          [\n            \"SAO SEBASTIAO DO PASSE\",\n            \"3347\",\n            \"1\"\n          ],\n          [\n            \"CAMACHO\",\n            \"3655\",\n            \"9\"\n          ],\n          [\n            \"SAO SEBASTIAO DO PASSE\",\n            \"3847\",\n            \"2\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3471\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3237\",\n            \"2\"\n          ],\n          [\n            \"FORMIGA\",\n            \"3688\",\n            \"1\"\n          ],\n          [\n            \"SAO GONCALO DOS CAMPOS\",\n            \"3392\",\n            \"5\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3519\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3367\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3576\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3517\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3398\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3219\",\n            \"1\"\n          ],\n          [\n            \"SAO GONCALO DOS CAMPOS\",\n            \"3612\",\n            \"259\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3217\",\n            \"2942\"\n          ],\n          [\n            \"CACHOEIRA\",\n            \"3568\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3339\",\n            \"1\"\n          ],\n          [\n            \"SAO FRANCISCO DE PAULA\",\n            \"3258\",\n            \"1\"\n          ],\n          [\n            \"CONCEICAO DO JACUIPE\",\n            \"3270\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3418\",\n            \"2\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3566\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3759\",\n            \"1\"\n          ],\n          [\n            \"SAO GONCALO DOS CAMPOS\",\n            \"3754\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3619\",\n            \"1\"\n          ],\n          [\n            \"SALINAS DA MARGARIDA\",\n            \"3270\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3583\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3435\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3560\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3213\",\n            \"1\"\n          ],\n          [\n            \"CRISTAIS\",\n            \"3655\",\n            \"44\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3404\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3263\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3706\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3612\",\n            \"9\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3795\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3488\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3428\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3241\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3416\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3782\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3261\",\n            \"1\"\n          ],\n          [\n            \"SAO FRANCISCO DE PAULA\",\n            \"3805\",\n            \"17\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3281\",\n            \"11\"\n          ],\n          [\n            \"SAO FRANCISCO DE PAULA\",\n            \"3279\",\n            \"13\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3336\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3392\",\n            \"6\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3629\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3381\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3572\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3285\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3358\",\n            \"6\"\n          ],\n          [\n            \"CACHOEIRA\",\n            \"3612\",\n            \"3\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3817\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3387\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3610\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3351\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3830\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3252\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3262\",\n            \"1\"\n          ],\n          [\n            \"SANTANA DO JACARE\",\n            \"3655\",\n            \"18\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3257\",\n            \"2\"\n          ],\n          [\n            \"CRISTAIS\",\n            \"3566\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3738\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3794\",\n            \"7\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3295\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3844\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3744\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3409\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3474\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3466\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3673\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3311\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3407\",\n            \"1\"\n          ],\n          [\n            \"AMELIA RODRIGUES\",\n            \"3808\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3326\",\n            \"1\"\n          ],\n          [\n            \"AMELIA RODRIGUES\",\n            \"3639\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3814\",\n            \"2788\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3391\",\n            \"2378\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3304\",\n            \"3623\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3689\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3764\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3830\",\n            \"7\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3264\",\n            \"3\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3681\",\n            \"6\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3725\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3635\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3208\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3658\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3456\",\n            \"1\"\n          ],\n          [\n            \"SAO SEBASTIAO DO PASSE\",\n            \"3705\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3809\",\n            \"1\"\n          ],\n          [\n            \"MARAGOGIPE\",\n            \"3304\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3434\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"4012\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3336\",\n            \"1\"\n          ],\n          [\n            \"AMELIA RODRIGUES\",\n            \"3471\",\n            \"1\"\n          ]\n        ]\n      }\n    }\n  },\n  \"timings\": [\n    {\n      \"label\": \"00_defs\",\n      \"dur\": 157.81\n    },\n    {\n      \"label\": \"010_env_bundle\",\n      \"dur\": 0\n    },\n    {\n      \"label\": \"011_env_init\",\n      \"dur\": 1374.25\n    },\n    {\n      \"label\": \"012_env_pem\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"01_env\",\n      \"dur\": 1375.67\n    },\n    {\n      \"label\": \"02_setup\",\n      \"dur\": 1386.83\n    },\n    {\n      \"label\": \"03_permissions\",\n      \"dur\": 0.02\n    },\n    {\n      \"label\": \"04_op_response\",\n      \"dur\": 2472.69\n    },\n    {\n      \"label\": \"04_op\",\n      \"dur\": 2473.42\n    },\n    {\n      \"label\": \"05_track\",\n      \"dur\": 562.87\n    }\n  ]\n}"}}},"component":"data2-core-functions@JSONParse"},"prop":{"component":"data2-core-primitives@String","params":{"content":"body.data.result.data_array"}}},"component":"data2-core-types@Getter"},"end":{"component":"data2-core-primitives@Number","params":{"content":80}}},"component":"data2-core-functions@ArraySlice"},"mapper":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"m"}},{"component":"data2-core-primitives@String","params":{"content":"i"}}],"body":{"params":{"fieldsList":[{"value":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m.0"}}},"component":"data2-core-types@Reference"},"key":{"component":"data2-core-types@Getter","params":{"module":{"params":{"text":{"component":"data2-core-primitives@String","params":{"content":"{\n  \"statusCode\": 200,\n  \"body\": {\n    \"data\": {\n      \"statement_id\": \"01f186b4-5aff-18b1-ac79-30605e087987\",\n      \"status\": {\n        \"state\": \"SUCCEEDED\"\n      },\n      \"manifest\": {\n        \"format\": \"JSON_ARRAY\",\n        \"schema\": {\n          \"column_count\": 3,\n          \"columns\": [\n            {\n              \"name\": \"municipio\",\n              \"type_text\": \"STRING\",\n              \"type_name\": \"STRING\",\n              \"position\": 0\n            },\n            {\n              \"name\": \"setor\",\n              \"type_text\": \"INT\",\n              \"type_name\": \"INT\",\n              \"position\": 1\n            },\n            {\n              \"name\": \"cbs\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 2\n            }\n          ]\n        },\n        \"total_chunk_count\": 1,\n        \"chunks\": [\n          {\n            \"chunk_index\": 0,\n            \"row_offset\": 0,\n            \"row_count\": 284\n          }\n        ],\n        \"total_row_count\": 284,\n        \"truncated\": false\n      },\n      \"result\": {\n        \"chunk_index\": 0,\n        \"row_offset\": 0,\n        \"row_count\": 284,\n        \"data_array\": [\n          [\n            \"SALVADOR\",\n            \"3434\",\n            \"3116\"\n          ],\n          [\n            \"SAO SEBASTIAO DO PASSE\",\n            \"3703\",\n            \"400\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3608\",\n            \"4\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3529\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3553\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3417\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3812\",\n            \"2\"\n          ],\n          [\n            \"MARAGOGIPE\",\n            \"3705\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3495\",\n            \"3\"\n          ],\n          [\n            \"MARAGOGIPE\",\n            \"3358\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3730\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3330\",\n            \"1\"\n          ],\n          [\n            \"CACHOEIRA\",\n            \"3471\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3193\",\n            \"1\"\n          ],\n          [\n            \"CAMPO BELO\",\n            \"3544\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3720\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3698\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3832\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3750\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3270\",\n            \"2189\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3321\",\n            \"44\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3602\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3309\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3674\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3272\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3701\",\n            \"2\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3261\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3269\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3327\",\n            \"1\"\n          ],\n          [\n            \"CONCEICAO DO JACUIPE\",\n            \"3292\",\n            \"1\"\n          ],\n          [\n            \"CONCEICAO DO JACUIPE\",\n            \"3492\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3821\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3527\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3358\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3507\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3705\",\n            \"2587\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3639\",\n            \"75\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3417\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3253\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3822\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3466\",\n            \"3\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3801\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3511\",\n            \"4\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3515\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3435\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3551\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3483\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3555\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3571\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3564\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3539\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3800\",\n            \"1\"\n          ],\n          [\n            \"CACHOEIRA\",\n            \"3639\",\n            \"1\"\n          ],\n          [\n            \"CONCEICAO DO JACUIPE\",\n            \"3471\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3632\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3369\",\n            \"3\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3376\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3865\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3667\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3373\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3321\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3691\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3277\",\n            \"1\"\n          ],\n          [\n            \"MARAGOGIPE\",\n            \"3808\",\n            \"279\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3269\",\n            \"10\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3492\",\n            \"5\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3315\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3612\",\n            \"8\"\n          ],\n          [\n            \"SAO SEBASTIAO DO PASSE\",\n            \"3304\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3773\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3328\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3245\",\n            \"1\"\n          ],\n          [\n            \"CACHOEIRA\",\n            \"3830\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3818\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3559\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3292\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3745\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3489\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3399\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3648\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"4012\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3314\",\n            \"2\"\n          ],\n          [\n            \"AMELIA RODRIGUES\",\n            \"3703\",\n            \"275\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3374\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3808\",\n            \"3\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3383\",\n            \"4\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3741\",\n            \"3\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3711\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3341\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3234\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3703\",\n            \"5\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3825\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3794\",\n            \"6\"\n          ],\n          [\n            \"CONCEICAO DO JACUIPE\",\n            \"3847\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3723\",\n            \"1\"\n          ],\n          [\n            \"CACHOEIRA\",\n            \"3667\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3582\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3646\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3304\",\n            \"3\"\n          ],\n          [\n            \"SAO SEBASTIAO DO PASSE\",\n            \"3639\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3338\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3243\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3696\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3389\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3822\",\n            \"2661\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3847\",\n            \"2424\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3540\",\n            \"4\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3820\",\n            \"1\"\n          ],\n          [\n            \"CONCEICAO DO JACUIPE\",\n            \"3703\",\n            \"314\"\n          ],\n          [\n            \"CAMPO BELO\",\n            \"3655\",\n            \"199\"\n          ],\n          [\n            \"SAO FRANCISCO DE PAULA\",\n            \"3509\",\n            \"116\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3644\",\n            \"1\"\n          ],\n          [\n            \"CACHOEIRA\",\n            \"3676\",\n            \"17\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3703\",\n            \"10\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3384\",\n            \"1\"\n          ],\n          [\n            \"AMELIA RODRIGUES\",\n            \"3392\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3608\",\n            \"2\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3706\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3696\",\n            \"3\"\n          ],\n          [\n            \"SAO SEBASTIAO DO PASSE\",\n            \"3219\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3789\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3379\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3667\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3724\",\n            \"1\"\n          ],\n          [\n            \"CACHOEIRA\",\n            \"3622\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3678\",\n            \"2413\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3488\",\n            \"3\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3471\",\n            \"24\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3540\",\n            \"8\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3343\",\n            \"1\"\n          ],\n          [\n            \"CAMPO BELO\",\n            \"3241\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3271\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3309\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3792\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3267\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3572\",\n            \"1\"\n          ],\n          [\n            \"CACHOEIRA\",\n            \"3494\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3206\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3490\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3623\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3754\",\n            \"1\"\n          ],\n          [\n            \"CACHOEIRA\",\n            \"3492\",\n            \"1\"\n          ],\n          [\n            \"SALINAS DA MARGARIDA\",\n            \"3358\",\n            \"205\"\n          ],\n          [\n            \"CACHOEIRA\",\n            \"3808\",\n            \"247\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3348\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3808\",\n            \"18\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3847\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3229\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3823\",\n            \"2\"\n          ],\n          [\n            \"CONCEICAO DO JACUIPE\",\n            \"3773\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3797\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3211\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3672\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3454\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3390\",\n            \"1\"\n          ],\n          [\n            \"SAO GONCALO DOS CAMPOS\",\n            \"3492\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3637\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3770\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3598\",\n            \"1\"\n          ],\n          [\n            \"CACHOEIRA\",\n            \"3723\",\n            \"1\"\n          ],\n          [\n            \"SAO FRANCISCO DE PAULA\",\n            \"3447\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3330\",\n            \"2688\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3781\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3647\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3228\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3442\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3432\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3717\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3436\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3811\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3213\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3690\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3568\",\n            \"1\"\n          ],\n          [\n            \"CONCEICAO DO JACUIPE\",\n            \"3612\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3350\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3704\",\n            \"1\"\n          ],\n          [\n            \"MARAGOGIPE\",\n            \"3639\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3303\",\n            \"1\"\n          ],\n          [\n            \"CONCEICAO DO JACUIPE\",\n            \"3384\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3509\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3328\",\n            \"1\"\n          ],\n          [\n            \"CRISTAIS\",\n            \"3248\",\n            \"1\"\n          ],\n          [\n            \"CACHOEIRA\",\n            \"3703\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3492\",\n            \"3148\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3392\",\n            \"2997\"\n          ],\n          [\n            \"FORMIGA\",\n            \"3221\",\n            \"289\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3552\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3817\",\n            \"3\"\n          ],\n          [\n            \"SAO SEBASTIAO DO PASSE\",\n            \"3347\",\n            \"1\"\n          ],\n          [\n            \"CAMACHO\",\n            \"3655\",\n            \"9\"\n          ],\n          [\n            \"SAO SEBASTIAO DO PASSE\",\n            \"3847\",\n            \"2\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3471\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3237\",\n            \"2\"\n          ],\n          [\n            \"FORMIGA\",\n            \"3688\",\n            \"1\"\n          ],\n          [\n            \"SAO GONCALO DOS CAMPOS\",\n            \"3392\",\n            \"5\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3519\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3367\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3576\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3517\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3398\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3219\",\n            \"1\"\n          ],\n          [\n            \"SAO GONCALO DOS CAMPOS\",\n            \"3612\",\n            \"259\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3217\",\n            \"2942\"\n          ],\n          [\n            \"CACHOEIRA\",\n            \"3568\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3339\",\n            \"1\"\n          ],\n          [\n            \"SAO FRANCISCO DE PAULA\",\n            \"3258\",\n            \"1\"\n          ],\n          [\n            \"CONCEICAO DO JACUIPE\",\n            \"3270\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3418\",\n            \"2\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3566\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3759\",\n            \"1\"\n          ],\n          [\n            \"SAO GONCALO DOS CAMPOS\",\n            \"3754\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3619\",\n            \"1\"\n          ],\n          [\n            \"SALINAS DA MARGARIDA\",\n            \"3270\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3583\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3435\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3560\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3213\",\n            \"1\"\n          ],\n          [\n            \"CRISTAIS\",\n            \"3655\",\n            \"44\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3404\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3263\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3706\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3612\",\n            \"9\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3795\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3488\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3428\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3241\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3416\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3782\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3261\",\n            \"1\"\n          ],\n          [\n            \"SAO FRANCISCO DE PAULA\",\n            \"3805\",\n            \"17\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3281\",\n            \"11\"\n          ],\n          [\n            \"SAO FRANCISCO DE PAULA\",\n            \"3279\",\n            \"13\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3336\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3392\",\n            \"6\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3629\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3381\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3572\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3285\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3358\",\n            \"6\"\n          ],\n          [\n            \"CACHOEIRA\",\n            \"3612\",\n            \"3\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3817\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3387\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3610\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3351\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3830\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3252\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3262\",\n            \"1\"\n          ],\n          [\n            \"SANTANA DO JACARE\",\n            \"3655\",\n            \"18\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3257\",\n            \"2\"\n          ],\n          [\n            \"CRISTAIS\",\n            \"3566\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3738\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3794\",\n            \"7\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3295\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3844\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3744\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3409\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3474\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3466\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3673\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3311\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3407\",\n            \"1\"\n          ],\n          [\n            \"AMELIA RODRIGUES\",\n            \"3808\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3326\",\n            \"1\"\n          ],\n          [\n            \"AMELIA RODRIGUES\",\n            \"3639\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3814\",\n            \"2788\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3391\",\n            \"2378\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3304\",\n            \"3623\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3689\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3764\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3830\",\n            \"7\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3264\",\n            \"3\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3681\",\n            \"6\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3725\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3635\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3208\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3658\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3456\",\n            \"1\"\n          ],\n          [\n            \"SAO SEBASTIAO DO PASSE\",\n            \"3705\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3809\",\n            \"1\"\n          ],\n          [\n            \"MARAGOGIPE\",\n            \"3304\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3434\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"4012\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3336\",\n            \"1\"\n          ],\n          [\n            \"AMELIA RODRIGUES\",\n            \"3471\",\n            \"1\"\n          ]\n        ]\n      }\n    }\n  },\n  \"timings\": [\n    {\n      \"label\": \"00_defs\",\n      \"dur\": 157.81\n    },\n    {\n      \"label\": \"010_env_bundle\",\n      \"dur\": 0\n    },\n    {\n      \"label\": \"011_env_init\",\n      \"dur\": 1374.25\n    },\n    {\n      \"label\": \"012_env_pem\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"01_env\",\n      \"dur\": 1375.67\n    },\n    {\n      \"label\": \"02_setup\",\n      \"dur\": 1386.83\n    },\n    {\n      \"label\": \"03_permissions\",\n      \"dur\": 0.02\n    },\n    {\n      \"label\": \"04_op_response\",\n      \"dur\": 2472.69\n    },\n    {\n      \"label\": \"04_op\",\n      \"dur\": 2473.42\n    },\n    {\n      \"label\": \"05_track\",\n      \"dur\": 562.87\n    }\n  ]\n}"}}},"component":"data2-core-functions@JSONParse"},"prop":{"component":"data2-core-primitives@String","params":{"content":"body.data.manifest.schema.columns.0.name"}}}}},{"value":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m.1"}}},"component":"data2-core-types@Reference"},"key":{"component":"data2-core-types@Getter","params":{"module":{"params":{"text":{"component":"data2-core-primitives@String","params":{"content":"{\n  \"statusCode\": 200,\n  \"body\": {\n    \"data\": {\n      \"statement_id\": \"01f186b4-5aff-18b1-ac79-30605e087987\",\n      \"status\": {\n        \"state\": \"SUCCEEDED\"\n      },\n      \"manifest\": {\n        \"format\": \"JSON_ARRAY\",\n        \"schema\": {\n          \"column_count\": 3,\n          \"columns\": [\n            {\n              \"name\": \"municipio\",\n              \"type_text\": \"STRING\",\n              \"type_name\": \"STRING\",\n              \"position\": 0\n            },\n            {\n              \"name\": \"setor\",\n              \"type_text\": \"INT\",\n              \"type_name\": \"INT\",\n              \"position\": 1\n            },\n            {\n              \"name\": \"cbs\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 2\n            }\n          ]\n        },\n        \"total_chunk_count\": 1,\n        \"chunks\": [\n          {\n            \"chunk_index\": 0,\n            \"row_offset\": 0,\n            \"row_count\": 284\n          }\n        ],\n        \"total_row_count\": 284,\n        \"truncated\": false\n      },\n      \"result\": {\n        \"chunk_index\": 0,\n        \"row_offset\": 0,\n        \"row_count\": 284,\n        \"data_array\": [\n          [\n            \"SALVADOR\",\n            \"3434\",\n            \"3116\"\n          ],\n          [\n            \"SAO SEBASTIAO DO PASSE\",\n            \"3703\",\n            \"400\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3608\",\n            \"4\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3529\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3553\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3417\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3812\",\n            \"2\"\n          ],\n          [\n            \"MARAGOGIPE\",\n            \"3705\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3495\",\n            \"3\"\n          ],\n          [\n            \"MARAGOGIPE\",\n            \"3358\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3730\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3330\",\n            \"1\"\n          ],\n          [\n            \"CACHOEIRA\",\n            \"3471\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3193\",\n            \"1\"\n          ],\n          [\n            \"CAMPO BELO\",\n            \"3544\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3720\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3698\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3832\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3750\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3270\",\n            \"2189\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3321\",\n            \"44\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3602\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3309\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3674\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3272\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3701\",\n            \"2\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3261\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3269\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3327\",\n            \"1\"\n          ],\n          [\n            \"CONCEICAO DO JACUIPE\",\n            \"3292\",\n            \"1\"\n          ],\n          [\n            \"CONCEICAO DO JACUIPE\",\n            \"3492\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3821\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3527\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3358\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3507\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3705\",\n            \"2587\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3639\",\n            \"75\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3417\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3253\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3822\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3466\",\n            \"3\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3801\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3511\",\n            \"4\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3515\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3435\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3551\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3483\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3555\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3571\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3564\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3539\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3800\",\n            \"1\"\n          ],\n          [\n            \"CACHOEIRA\",\n            \"3639\",\n            \"1\"\n          ],\n          [\n            \"CONCEICAO DO JACUIPE\",\n            \"3471\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3632\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3369\",\n            \"3\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3376\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3865\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3667\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3373\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3321\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3691\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3277\",\n            \"1\"\n          ],\n          [\n            \"MARAGOGIPE\",\n            \"3808\",\n            \"279\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3269\",\n            \"10\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3492\",\n            \"5\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3315\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3612\",\n            \"8\"\n          ],\n          [\n            \"SAO SEBASTIAO DO PASSE\",\n            \"3304\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3773\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3328\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3245\",\n            \"1\"\n          ],\n          [\n            \"CACHOEIRA\",\n            \"3830\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3818\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3559\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3292\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3745\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3489\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3399\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3648\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"4012\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3314\",\n            \"2\"\n          ],\n          [\n            \"AMELIA RODRIGUES\",\n            \"3703\",\n            \"275\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3374\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3808\",\n            \"3\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3383\",\n            \"4\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3741\",\n            \"3\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3711\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3341\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3234\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3703\",\n            \"5\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3825\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3794\",\n            \"6\"\n          ],\n          [\n            \"CONCEICAO DO JACUIPE\",\n            \"3847\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3723\",\n            \"1\"\n          ],\n          [\n            \"CACHOEIRA\",\n            \"3667\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3582\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3646\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3304\",\n            \"3\"\n          ],\n          [\n            \"SAO SEBASTIAO DO PASSE\",\n            \"3639\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3338\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3243\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3696\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3389\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3822\",\n            \"2661\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3847\",\n            \"2424\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3540\",\n            \"4\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3820\",\n            \"1\"\n          ],\n          [\n            \"CONCEICAO DO JACUIPE\",\n            \"3703\",\n            \"314\"\n          ],\n          [\n            \"CAMPO BELO\",\n            \"3655\",\n            \"199\"\n          ],\n          [\n            \"SAO FRANCISCO DE PAULA\",\n            \"3509\",\n            \"116\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3644\",\n            \"1\"\n          ],\n          [\n            \"CACHOEIRA\",\n            \"3676\",\n            \"17\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3703\",\n            \"10\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3384\",\n            \"1\"\n          ],\n          [\n            \"AMELIA RODRIGUES\",\n            \"3392\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3608\",\n            \"2\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3706\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3696\",\n            \"3\"\n          ],\n          [\n            \"SAO SEBASTIAO DO PASSE\",\n            \"3219\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3789\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3379\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3667\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3724\",\n            \"1\"\n          ],\n          [\n            \"CACHOEIRA\",\n            \"3622\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3678\",\n            \"2413\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3488\",\n            \"3\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3471\",\n            \"24\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3540\",\n            \"8\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3343\",\n            \"1\"\n          ],\n          [\n            \"CAMPO BELO\",\n            \"3241\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3271\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3309\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3792\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3267\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3572\",\n            \"1\"\n          ],\n          [\n            \"CACHOEIRA\",\n            \"3494\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3206\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3490\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3623\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3754\",\n            \"1\"\n          ],\n          [\n            \"CACHOEIRA\",\n            \"3492\",\n            \"1\"\n          ],\n          [\n            \"SALINAS DA MARGARIDA\",\n            \"3358\",\n            \"205\"\n          ],\n          [\n            \"CACHOEIRA\",\n            \"3808\",\n            \"247\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3348\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3808\",\n            \"18\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3847\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3229\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3823\",\n            \"2\"\n          ],\n          [\n            \"CONCEICAO DO JACUIPE\",\n            \"3773\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3797\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3211\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3672\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3454\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3390\",\n            \"1\"\n          ],\n          [\n            \"SAO GONCALO DOS CAMPOS\",\n            \"3492\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3637\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3770\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3598\",\n            \"1\"\n          ],\n          [\n            \"CACHOEIRA\",\n            \"3723\",\n            \"1\"\n          ],\n          [\n            \"SAO FRANCISCO DE PAULA\",\n            \"3447\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3330\",\n            \"2688\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3781\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3647\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3228\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3442\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3432\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3717\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3436\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3811\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3213\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3690\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3568\",\n            \"1\"\n          ],\n          [\n            \"CONCEICAO DO JACUIPE\",\n            \"3612\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3350\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3704\",\n            \"1\"\n          ],\n          [\n            \"MARAGOGIPE\",\n            \"3639\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3303\",\n            \"1\"\n          ],\n          [\n            \"CONCEICAO DO JACUIPE\",\n            \"3384\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3509\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3328\",\n            \"1\"\n          ],\n          [\n            \"CRISTAIS\",\n            \"3248\",\n            \"1\"\n          ],\n          [\n            \"CACHOEIRA\",\n            \"3703\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3492\",\n            \"3148\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3392\",\n            \"2997\"\n          ],\n          [\n            \"FORMIGA\",\n            \"3221\",\n            \"289\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3552\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3817\",\n            \"3\"\n          ],\n          [\n            \"SAO SEBASTIAO DO PASSE\",\n            \"3347\",\n            \"1\"\n          ],\n          [\n            \"CAMACHO\",\n            \"3655\",\n            \"9\"\n          ],\n          [\n            \"SAO SEBASTIAO DO PASSE\",\n            \"3847\",\n            \"2\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3471\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3237\",\n            \"2\"\n          ],\n          [\n            \"FORMIGA\",\n            \"3688\",\n            \"1\"\n          ],\n          [\n            \"SAO GONCALO DOS CAMPOS\",\n            \"3392\",\n            \"5\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3519\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3367\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3576\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3517\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3398\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3219\",\n            \"1\"\n          ],\n          [\n            \"SAO GONCALO DOS CAMPOS\",\n            \"3612\",\n            \"259\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3217\",\n            \"2942\"\n          ],\n          [\n            \"CACHOEIRA\",\n            \"3568\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3339\",\n            \"1\"\n          ],\n          [\n            \"SAO FRANCISCO DE PAULA\",\n            \"3258\",\n            \"1\"\n          ],\n          [\n            \"CONCEICAO DO JACUIPE\",\n            \"3270\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3418\",\n            \"2\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3566\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3759\",\n            \"1\"\n          ],\n          [\n            \"SAO GONCALO DOS CAMPOS\",\n            \"3754\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3619\",\n            \"1\"\n          ],\n          [\n            \"SALINAS DA MARGARIDA\",\n            \"3270\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3583\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3435\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3560\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3213\",\n            \"1\"\n          ],\n          [\n            \"CRISTAIS\",\n            \"3655\",\n            \"44\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3404\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3263\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3706\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3612\",\n            \"9\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3795\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3488\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3428\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3241\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3416\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3782\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3261\",\n            \"1\"\n          ],\n          [\n            \"SAO FRANCISCO DE PAULA\",\n            \"3805\",\n            \"17\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3281\",\n            \"11\"\n          ],\n          [\n            \"SAO FRANCISCO DE PAULA\",\n            \"3279\",\n            \"13\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3336\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3392\",\n            \"6\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3629\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3381\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3572\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3285\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3358\",\n            \"6\"\n          ],\n          [\n            \"CACHOEIRA\",\n            \"3612\",\n            \"3\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3817\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3387\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3610\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3351\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3830\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3252\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3262\",\n            \"1\"\n          ],\n          [\n            \"SANTANA DO JACARE\",\n            \"3655\",\n            \"18\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3257\",\n            \"2\"\n          ],\n          [\n            \"CRISTAIS\",\n            \"3566\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3738\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3794\",\n            \"7\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3295\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3844\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3744\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3409\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3474\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3466\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3673\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3311\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3407\",\n            \"1\"\n          ],\n          [\n            \"AMELIA RODRIGUES\",\n            \"3808\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3326\",\n            \"1\"\n          ],\n          [\n            \"AMELIA RODRIGUES\",\n            \"3639\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3814\",\n            \"2788\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3391\",\n            \"2378\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3304\",\n            \"3623\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3689\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3764\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3830\",\n            \"7\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3264\",\n            \"3\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3681\",\n            \"6\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3725\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3635\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3208\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3658\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3456\",\n            \"1\"\n          ],\n          [\n            \"SAO SEBASTIAO DO PASSE\",\n            \"3705\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3809\",\n            \"1\"\n          ],\n          [\n            \"MARAGOGIPE\",\n            \"3304\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3434\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"4012\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3336\",\n            \"1\"\n          ],\n          [\n            \"AMELIA RODRIGUES\",\n            \"3471\",\n            \"1\"\n          ]\n        ]\n      }\n    }\n  },\n  \"timings\": [\n    {\n      \"label\": \"00_defs\",\n      \"dur\": 157.81\n    },\n    {\n      \"label\": \"010_env_bundle\",\n      \"dur\": 0\n    },\n    {\n      \"label\": \"011_env_init\",\n      \"dur\": 1374.25\n    },\n    {\n      \"label\": \"012_env_pem\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"01_env\",\n      \"dur\": 1375.67\n    },\n    {\n      \"label\": \"02_setup\",\n      \"dur\": 1386.83\n    },\n    {\n      \"label\": \"03_permissions\",\n      \"dur\": 0.02\n    },\n    {\n      \"label\": \"04_op_response\",\n      \"dur\": 2472.69\n    },\n    {\n      \"label\": \"04_op\",\n      \"dur\": 2473.42\n    },\n    {\n      \"label\": \"05_track\",\n      \"dur\": 562.87\n    }\n  ]\n}"}}},"component":"data2-core-functions@JSONParse"},"prop":{"component":"data2-core-primitives@String","params":{"content":"body.data.manifest.schema.columns.1.name"}}}}},{"value":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m.2"}}},"component":"data2-core-types@Reference"},"key":{"component":"data2-core-types@Getter","params":{"module":{"params":{"text":{"component":"data2-core-primitives@String","params":{"content":"{\n  \"statusCode\": 200,\n  \"body\": {\n    \"data\": {\n      \"statement_id\": \"01f186b4-5aff-18b1-ac79-30605e087987\",\n      \"status\": {\n        \"state\": \"SUCCEEDED\"\n      },\n      \"manifest\": {\n        \"format\": \"JSON_ARRAY\",\n        \"schema\": {\n          \"column_count\": 3,\n          \"columns\": [\n            {\n              \"name\": \"municipio\",\n              \"type_text\": \"STRING\",\n              \"type_name\": \"STRING\",\n              \"position\": 0\n            },\n            {\n              \"name\": \"setor\",\n              \"type_text\": \"INT\",\n              \"type_name\": \"INT\",\n              \"position\": 1\n            },\n            {\n              \"name\": \"cbs\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 2\n            }\n          ]\n        },\n        \"total_chunk_count\": 1,\n        \"chunks\": [\n          {\n            \"chunk_index\": 0,\n            \"row_offset\": 0,\n            \"row_count\": 284\n          }\n        ],\n        \"total_row_count\": 284,\n        \"truncated\": false\n      },\n      \"result\": {\n        \"chunk_index\": 0,\n        \"row_offset\": 0,\n        \"row_count\": 284,\n        \"data_array\": [\n          [\n            \"SALVADOR\",\n            \"3434\",\n            \"3116\"\n          ],\n          [\n            \"SAO SEBASTIAO DO PASSE\",\n            \"3703\",\n            \"400\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3608\",\n            \"4\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3529\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3553\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3417\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3812\",\n            \"2\"\n          ],\n          [\n            \"MARAGOGIPE\",\n            \"3705\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3495\",\n            \"3\"\n          ],\n          [\n            \"MARAGOGIPE\",\n            \"3358\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3730\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3330\",\n            \"1\"\n          ],\n          [\n            \"CACHOEIRA\",\n            \"3471\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3193\",\n            \"1\"\n          ],\n          [\n            \"CAMPO BELO\",\n            \"3544\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3720\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3698\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3832\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3750\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3270\",\n            \"2189\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3321\",\n            \"44\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3602\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3309\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3674\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3272\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3701\",\n            \"2\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3261\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3269\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3327\",\n            \"1\"\n          ],\n          [\n            \"CONCEICAO DO JACUIPE\",\n            \"3292\",\n            \"1\"\n          ],\n          [\n            \"CONCEICAO DO JACUIPE\",\n            \"3492\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3821\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3527\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3358\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3507\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3705\",\n            \"2587\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3639\",\n            \"75\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3417\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3253\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3822\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3466\",\n            \"3\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3801\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3511\",\n            \"4\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3515\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3435\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3551\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3483\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3555\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3571\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3564\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3539\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3800\",\n            \"1\"\n          ],\n          [\n            \"CACHOEIRA\",\n            \"3639\",\n            \"1\"\n          ],\n          [\n            \"CONCEICAO DO JACUIPE\",\n            \"3471\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3632\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3369\",\n            \"3\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3376\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3865\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3667\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3373\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3321\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3691\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3277\",\n            \"1\"\n          ],\n          [\n            \"MARAGOGIPE\",\n            \"3808\",\n            \"279\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3269\",\n            \"10\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3492\",\n            \"5\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3315\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3612\",\n            \"8\"\n          ],\n          [\n            \"SAO SEBASTIAO DO PASSE\",\n            \"3304\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3773\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3328\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3245\",\n            \"1\"\n          ],\n          [\n            \"CACHOEIRA\",\n            \"3830\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3818\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3559\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3292\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3745\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3489\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3399\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3648\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"4012\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3314\",\n            \"2\"\n          ],\n          [\n            \"AMELIA RODRIGUES\",\n            \"3703\",\n            \"275\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3374\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3808\",\n            \"3\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3383\",\n            \"4\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3741\",\n            \"3\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3711\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3341\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3234\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3703\",\n            \"5\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3825\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3794\",\n            \"6\"\n          ],\n          [\n            \"CONCEICAO DO JACUIPE\",\n            \"3847\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3723\",\n            \"1\"\n          ],\n          [\n            \"CACHOEIRA\",\n            \"3667\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3582\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3646\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3304\",\n            \"3\"\n          ],\n          [\n            \"SAO SEBASTIAO DO PASSE\",\n            \"3639\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3338\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3243\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3696\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3389\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3822\",\n            \"2661\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3847\",\n            \"2424\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3540\",\n            \"4\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3820\",\n            \"1\"\n          ],\n          [\n            \"CONCEICAO DO JACUIPE\",\n            \"3703\",\n            \"314\"\n          ],\n          [\n            \"CAMPO BELO\",\n            \"3655\",\n            \"199\"\n          ],\n          [\n            \"SAO FRANCISCO DE PAULA\",\n            \"3509\",\n            \"116\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3644\",\n            \"1\"\n          ],\n          [\n            \"CACHOEIRA\",\n            \"3676\",\n            \"17\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3703\",\n            \"10\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3384\",\n            \"1\"\n          ],\n          [\n            \"AMELIA RODRIGUES\",\n            \"3392\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3608\",\n            \"2\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3706\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3696\",\n            \"3\"\n          ],\n          [\n            \"SAO SEBASTIAO DO PASSE\",\n            \"3219\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3789\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3379\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3667\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3724\",\n            \"1\"\n          ],\n          [\n            \"CACHOEIRA\",\n            \"3622\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3678\",\n            \"2413\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3488\",\n            \"3\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3471\",\n            \"24\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3540\",\n            \"8\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3343\",\n            \"1\"\n          ],\n          [\n            \"CAMPO BELO\",\n            \"3241\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3271\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3309\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3792\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3267\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3572\",\n            \"1\"\n          ],\n          [\n            \"CACHOEIRA\",\n            \"3494\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3206\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3490\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3623\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3754\",\n            \"1\"\n          ],\n          [\n            \"CACHOEIRA\",\n            \"3492\",\n            \"1\"\n          ],\n          [\n            \"SALINAS DA MARGARIDA\",\n            \"3358\",\n            \"205\"\n          ],\n          [\n            \"CACHOEIRA\",\n            \"3808\",\n            \"247\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3348\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3808\",\n            \"18\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3847\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3229\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3823\",\n            \"2\"\n          ],\n          [\n            \"CONCEICAO DO JACUIPE\",\n            \"3773\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3797\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3211\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3672\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3454\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3390\",\n            \"1\"\n          ],\n          [\n            \"SAO GONCALO DOS CAMPOS\",\n            \"3492\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3637\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3770\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3598\",\n            \"1\"\n          ],\n          [\n            \"CACHOEIRA\",\n            \"3723\",\n            \"1\"\n          ],\n          [\n            \"SAO FRANCISCO DE PAULA\",\n            \"3447\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3330\",\n            \"2688\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3781\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3647\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3228\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3442\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3432\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3717\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3436\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3811\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3213\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3690\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3568\",\n            \"1\"\n          ],\n          [\n            \"CONCEICAO DO JACUIPE\",\n            \"3612\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3350\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3704\",\n            \"1\"\n          ],\n          [\n            \"MARAGOGIPE\",\n            \"3639\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3303\",\n            \"1\"\n          ],\n          [\n            \"CONCEICAO DO JACUIPE\",\n            \"3384\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3509\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3328\",\n            \"1\"\n          ],\n          [\n            \"CRISTAIS\",\n            \"3248\",\n            \"1\"\n          ],\n          [\n            \"CACHOEIRA\",\n            \"3703\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3492\",\n            \"3148\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3392\",\n            \"2997\"\n          ],\n          [\n            \"FORMIGA\",\n            \"3221\",\n            \"289\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3552\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3817\",\n            \"3\"\n          ],\n          [\n            \"SAO SEBASTIAO DO PASSE\",\n            \"3347\",\n            \"1\"\n          ],\n          [\n            \"CAMACHO\",\n            \"3655\",\n            \"9\"\n          ],\n          [\n            \"SAO SEBASTIAO DO PASSE\",\n            \"3847\",\n            \"2\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3471\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3237\",\n            \"2\"\n          ],\n          [\n            \"FORMIGA\",\n            \"3688\",\n            \"1\"\n          ],\n          [\n            \"SAO GONCALO DOS CAMPOS\",\n            \"3392\",\n            \"5\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3519\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3367\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3576\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3517\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3398\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3219\",\n            \"1\"\n          ],\n          [\n            \"SAO GONCALO DOS CAMPOS\",\n            \"3612\",\n            \"259\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3217\",\n            \"2942\"\n          ],\n          [\n            \"CACHOEIRA\",\n            \"3568\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3339\",\n            \"1\"\n          ],\n          [\n            \"SAO FRANCISCO DE PAULA\",\n            \"3258\",\n            \"1\"\n          ],\n          [\n            \"CONCEICAO DO JACUIPE\",\n            \"3270\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3418\",\n            \"2\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3566\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3759\",\n            \"1\"\n          ],\n          [\n            \"SAO GONCALO DOS CAMPOS\",\n            \"3754\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3619\",\n            \"1\"\n          ],\n          [\n            \"SALINAS DA MARGARIDA\",\n            \"3270\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3583\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3435\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3560\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3213\",\n            \"1\"\n          ],\n          [\n            \"CRISTAIS\",\n            \"3655\",\n            \"44\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3404\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3263\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3706\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3612\",\n            \"9\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3795\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3488\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3428\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3241\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3416\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3782\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3261\",\n            \"1\"\n          ],\n          [\n            \"SAO FRANCISCO DE PAULA\",\n            \"3805\",\n            \"17\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3281\",\n            \"11\"\n          ],\n          [\n            \"SAO FRANCISCO DE PAULA\",\n            \"3279\",\n            \"13\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3336\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3392\",\n            \"6\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3629\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3381\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3572\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3285\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3358\",\n            \"6\"\n          ],\n          [\n            \"CACHOEIRA\",\n            \"3612\",\n            \"3\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3817\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3387\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3610\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3351\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3830\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3252\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3262\",\n            \"1\"\n          ],\n          [\n            \"SANTANA DO JACARE\",\n            \"3655\",\n            \"18\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3257\",\n            \"2\"\n          ],\n          [\n            \"CRISTAIS\",\n            \"3566\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3738\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3794\",\n            \"7\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3295\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3844\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3744\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3409\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3474\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3466\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3673\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3311\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3407\",\n            \"1\"\n          ],\n          [\n            \"AMELIA RODRIGUES\",\n            \"3808\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3326\",\n            \"1\"\n          ],\n          [\n            \"AMELIA RODRIGUES\",\n            \"3639\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3814\",\n            \"2788\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3391\",\n            \"2378\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3304\",\n            \"3623\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3689\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3764\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3830\",\n            \"7\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3264\",\n            \"3\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3681\",\n            \"6\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3725\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3635\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3208\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3658\",\n            \"1\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3456\",\n            \"1\"\n          ],\n          [\n            \"SAO SEBASTIAO DO PASSE\",\n            \"3705\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"3809\",\n            \"1\"\n          ],\n          [\n            \"MARAGOGIPE\",\n            \"3304\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3434\",\n            \"2\"\n          ],\n          [\n            \"SALVADOR\",\n            \"4012\",\n            \"1\"\n          ],\n          [\n            \"FEIRA DE SANTANA\",\n            \"3336\",\n            \"1\"\n          ],\n          [\n            \"AMELIA RODRIGUES\",\n            \"3471\",\n            \"1\"\n          ]\n        ]\n      }\n    }\n  },\n  \"timings\": [\n    {\n      \"label\": \"00_defs\",\n      \"dur\": 157.81\n    },\n    {\n      \"label\": \"010_env_bundle\",\n      \"dur\": 0\n    },\n    {\n      \"label\": \"011_env_init\",\n      \"dur\": 1374.25\n    },\n    {\n      \"label\": \"012_env_pem\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"01_env\",\n      \"dur\": 1375.67\n    },\n    {\n      \"label\": \"02_setup\",\n      \"dur\": 1386.83\n    },\n    {\n      \"label\": \"03_permissions\",\n      \"dur\": 0.02\n    },\n    {\n      \"label\": \"04_op_response\",\n      \"dur\": 2472.69\n    },\n    {\n      \"label\": \"04_op\",\n      \"dur\": 2473.42\n    },\n    {\n      \"label\": \"05_track\",\n      \"dur\": 562.87\n    }\n  ]\n}"}}},"component":"data2-core-functions@JSONParse"},"prop":{"component":"data2-core-primitives@String","params":{"content":"body.data.manifest.schema.columns.2.name"}}}}}]},"component":"data2-core-types@FieldSet"}}}},"component":"data2-core-functions@ArrayMap"},"collapsed":{"component":"data2-core-primitives@Number","params":{"content":99}},"theme":"rjv-default"},"updatedAt":"2026-07-24T17:24:05.647Z","createdAt":"2026-07-24T17:23:21.712Z"},{"_id":"6a639fcd3458bb4b79ae4ed2","parent":"6a62516b203e921fd2513b2f","component":"data2-blocks@JsonViewer","system":"6a57cfe9673eb7e3c5e57784","displayName":"Copy of Copy of Copy of Copy of Copy of Copy of Copy of Copy of Copy of input","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":680,"height":448,"exactWidth":false,"exactHeight":448.46}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":1,"y":320,"exactX":1,"exactY":319.54,"fixed":false,"left":true,"top":true,"bottom":true,"growV":false}},"style":{"flex":{"component":"data2-core-primitives@String","params":{"content":"1"}}},"scroll":{"disabled":false,"component":"data2-core-types@Scroll","params":{"y":true}}},"json":{"params":{"array":{"params":{"module":{"params":{"text":{"component":"data2-core-primitives@String","params":{"content":"{\n  \"statusCode\": 200,\n  \"body\": {\n    \"data\": {\n      \"statement_id\": \"01f186b4-5e07-1889-bb45-aaaa820b423c\",\n      \"status\": {\n        \"state\": \"SUCCEEDED\"\n      },\n      \"manifest\": {\n        \"format\": \"JSON_ARRAY\",\n        \"schema\": {\n          \"column_count\": 3,\n          \"columns\": [\n            {\n              \"name\": \"setor\",\n              \"type_text\": \"INT\",\n              \"type_name\": \"INT\",\n              \"position\": 0\n            },\n            {\n              \"name\": \"nivel\",\n              \"type_text\": \"STRING\",\n              \"type_name\": \"STRING\",\n              \"position\": 1\n            },\n            {\n              \"name\": \"cbs\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 2\n            }\n          ]\n        },\n        \"total_chunk_count\": 1,\n        \"chunks\": [\n          {\n            \"chunk_index\": 0,\n            \"row_offset\": 0,\n            \"row_count\": 36\n          }\n        ],\n        \"total_row_count\": 36,\n        \"truncated\": false\n      },\n      \"result\": {\n        \"chunk_index\": 0,\n        \"row_offset\": 0,\n        \"row_count\": 36,\n        \"data_array\": [\n          [\n            \"3703\",\n            \"Bronze\",\n            \"475\"\n          ],\n          [\n            \"3655\",\n            \"Diamante\",\n            \"50\"\n          ],\n          [\n            \"3655\",\n            \"Ouro\",\n            \"174\"\n          ],\n          [\n            \"3703\",\n            \"Ouro\",\n            \"129\"\n          ],\n          [\n            \"3612\",\n            \"Cristal\",\n            \"1161\"\n          ],\n          [\n            \"3221\",\n            \"Bronze\",\n            \"621\"\n          ],\n          [\n            \"3304\",\n            \"Diamante+\",\n            \"2\"\n          ],\n          [\n            \"3655\",\n            \"Diamante+\",\n            \"1\"\n          ],\n          [\n            \"3221\",\n            \"Cristal\",\n            \"607\"\n          ],\n          [\n            \"3808\",\n            \"Cristal\",\n            \"644\"\n          ],\n          [\n            \"3703\",\n            \"Cristal\",\n            \"387\"\n          ],\n          [\n            \"3612\",\n            \"Prata\",\n            \"751\"\n          ],\n          [\n            \"3808\",\n            \"Diamante\",\n            \"60\"\n          ],\n          [\n            \"3304\",\n            \"Ouro\",\n            \"314\"\n          ],\n          [\n            \"3304\",\n            \"Prata\",\n            \"769\"\n          ],\n          [\n            \"3612\",\n            \"Bronze\",\n            \"1094\"\n          ],\n          [\n            \"3612\",\n            \"Ouro\",\n            \"311\"\n          ],\n          [\n            \"3304\",\n            \"Diamante\",\n            \"95\"\n          ],\n          [\n            \"3808\",\n            \"Prata\",\n            \"610\"\n          ],\n          [\n            \"3304\",\n            \"Bronze\",\n            \"1263\"\n          ],\n          [\n            \"3655\",\n            \"Cristal\",\n            \"597\"\n          ],\n          [\n            \"3703\",\n            \"Diamante\",\n            \"46\"\n          ],\n          [\n            \"3655\",\n            \"Bronze\",\n            \"622\"\n          ],\n          [\n            \"3221\",\n            \"Prata\",\n            \"479\"\n          ],\n          [\n            \"3612\",\n            \"Diamante\",\n            \"99\"\n          ],\n          [\n            \"3221\",\n            \"Diamante+\",\n            \"2\"\n          ],\n          [\n            \"3808\",\n            \"Diamante+\",\n            \"1\"\n          ],\n          [\n            \"3655\",\n            \"Prata\",\n            \"478\"\n          ],\n          [\n            \"3304\",\n            \"Cristal\",\n            \"1271\"\n          ],\n          [\n            \"3221\",\n            \"Diamante\",\n            \"56\"\n          ],\n          [\n            \"3221\",\n            \"Ouro\",\n            \"174\"\n          ],\n          [\n            \"3808\",\n            \"Bronze\",\n            \"850\"\n          ],\n          [\n            \"3703\",\n            \"Prata\",\n            \"385\"\n          ],\n          [\n            \"3612\",\n            \"Diamante+\",\n            \"2\"\n          ],\n          [\n            \"3808\",\n            \"Ouro\",\n            \"211\"\n          ],\n          [\n            \"3703\",\n            \"Diamante+\",\n            \"1\"\n          ]\n        ]\n      }\n    }\n  },\n  \"timings\": [\n    {\n      \"label\": \"00_defs\",\n      \"dur\": 18.78\n    },\n    {\n      \"label\": \"010_env_bundle\",\n      \"dur\": 0\n    },\n    {\n      \"label\": \"011_env_init\",\n      \"dur\": 894.74\n    },\n    {\n      \"label\": \"012_env_pem\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"01_env\",\n      \"dur\": 895.36\n    },\n    {\n      \"label\": \"02_setup\",\n      \"dur\": 117.22\n    },\n    {\n      \"label\": \"03_permissions\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"04_op_response\",\n      \"dur\": 3976.89\n    },\n    {\n      \"label\": \"04_op\",\n      \"dur\": 3977.29\n    },\n    {\n      \"label\": \"05_track\",\n      \"dur\": 485.19\n    }\n  ]\n}"}}},"component":"data2-core-functions@JSONParse"},"prop":{"component":"data2-core-primitives@String","params":{"content":"body.data.result.data_array"}}},"component":"data2-core-types@Getter"},"mapper":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"m"}},{"component":"data2-core-primitives@String","params":{"content":"i"}}],"body":{"params":{"fieldsList":[{"value":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m.0"}}},"component":"data2-core-types@Reference"},"key":{"component":"data2-core-types@Getter","params":{"module":{"params":{"text":{"component":"data2-core-primitives@String","params":{"content":"{\n  \"statusCode\": 200,\n  \"body\": {\n    \"data\": {\n      \"statement_id\": \"01f186b4-5e07-1889-bb45-aaaa820b423c\",\n      \"status\": {\n        \"state\": \"SUCCEEDED\"\n      },\n      \"manifest\": {\n        \"format\": \"JSON_ARRAY\",\n        \"schema\": {\n          \"column_count\": 3,\n          \"columns\": [\n            {\n              \"name\": \"setor\",\n              \"type_text\": \"INT\",\n              \"type_name\": \"INT\",\n              \"position\": 0\n            },\n            {\n              \"name\": \"nivel\",\n              \"type_text\": \"STRING\",\n              \"type_name\": \"STRING\",\n              \"position\": 1\n            },\n            {\n              \"name\": \"cbs\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 2\n            }\n          ]\n        },\n        \"total_chunk_count\": 1,\n        \"chunks\": [\n          {\n            \"chunk_index\": 0,\n            \"row_offset\": 0,\n            \"row_count\": 36\n          }\n        ],\n        \"total_row_count\": 36,\n        \"truncated\": false\n      },\n      \"result\": {\n        \"chunk_index\": 0,\n        \"row_offset\": 0,\n        \"row_count\": 36,\n        \"data_array\": [\n          [\n            \"3703\",\n            \"Bronze\",\n            \"475\"\n          ],\n          [\n            \"3655\",\n            \"Diamante\",\n            \"50\"\n          ],\n          [\n            \"3655\",\n            \"Ouro\",\n            \"174\"\n          ],\n          [\n            \"3703\",\n            \"Ouro\",\n            \"129\"\n          ],\n          [\n            \"3612\",\n            \"Cristal\",\n            \"1161\"\n          ],\n          [\n            \"3221\",\n            \"Bronze\",\n            \"621\"\n          ],\n          [\n            \"3304\",\n            \"Diamante+\",\n            \"2\"\n          ],\n          [\n            \"3655\",\n            \"Diamante+\",\n            \"1\"\n          ],\n          [\n            \"3221\",\n            \"Cristal\",\n            \"607\"\n          ],\n          [\n            \"3808\",\n            \"Cristal\",\n            \"644\"\n          ],\n          [\n            \"3703\",\n            \"Cristal\",\n            \"387\"\n          ],\n          [\n            \"3612\",\n            \"Prata\",\n            \"751\"\n          ],\n          [\n            \"3808\",\n            \"Diamante\",\n            \"60\"\n          ],\n          [\n            \"3304\",\n            \"Ouro\",\n            \"314\"\n          ],\n          [\n            \"3304\",\n            \"Prata\",\n            \"769\"\n          ],\n          [\n            \"3612\",\n            \"Bronze\",\n            \"1094\"\n          ],\n          [\n            \"3612\",\n            \"Ouro\",\n            \"311\"\n          ],\n          [\n            \"3304\",\n            \"Diamante\",\n            \"95\"\n          ],\n          [\n            \"3808\",\n            \"Prata\",\n            \"610\"\n          ],\n          [\n            \"3304\",\n            \"Bronze\",\n            \"1263\"\n          ],\n          [\n            \"3655\",\n            \"Cristal\",\n            \"597\"\n          ],\n          [\n            \"3703\",\n            \"Diamante\",\n            \"46\"\n          ],\n          [\n            \"3655\",\n            \"Bronze\",\n            \"622\"\n          ],\n          [\n            \"3221\",\n            \"Prata\",\n            \"479\"\n          ],\n          [\n            \"3612\",\n            \"Diamante\",\n            \"99\"\n          ],\n          [\n            \"3221\",\n            \"Diamante+\",\n            \"2\"\n          ],\n          [\n            \"3808\",\n            \"Diamante+\",\n            \"1\"\n          ],\n          [\n            \"3655\",\n            \"Prata\",\n            \"478\"\n          ],\n          [\n            \"3304\",\n            \"Cristal\",\n            \"1271\"\n          ],\n          [\n            \"3221\",\n            \"Diamante\",\n            \"56\"\n          ],\n          [\n            \"3221\",\n            \"Ouro\",\n            \"174\"\n          ],\n          [\n            \"3808\",\n            \"Bronze\",\n            \"850\"\n          ],\n          [\n            \"3703\",\n            \"Prata\",\n            \"385\"\n          ],\n          [\n            \"3612\",\n            \"Diamante+\",\n            \"2\"\n          ],\n          [\n            \"3808\",\n            \"Ouro\",\n            \"211\"\n          ],\n          [\n            \"3703\",\n            \"Diamante+\",\n            \"1\"\n          ]\n        ]\n      }\n    }\n  },\n  \"timings\": [\n    {\n      \"label\": \"00_defs\",\n      \"dur\": 18.78\n    },\n    {\n      \"label\": \"010_env_bundle\",\n      \"dur\": 0\n    },\n    {\n      \"label\": \"011_env_init\",\n      \"dur\": 894.74\n    },\n    {\n      \"label\": \"012_env_pem\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"01_env\",\n      \"dur\": 895.36\n    },\n    {\n      \"label\": \"02_setup\",\n      \"dur\": 117.22\n    },\n    {\n      \"label\": \"03_permissions\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"04_op_response\",\n      \"dur\": 3976.89\n    },\n    {\n      \"label\": \"04_op\",\n      \"dur\": 3977.29\n    },\n    {\n      \"label\": \"05_track\",\n      \"dur\": 485.19\n    }\n  ]\n}"}}},"component":"data2-core-functions@JSONParse"},"prop":{"component":"data2-core-primitives@String","params":{"content":"body.data.manifest.schema.columns.0.name"}}}}},{"value":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m.1"}}},"component":"data2-core-types@Reference"},"key":{"component":"data2-core-types@Getter","params":{"module":{"params":{"text":{"component":"data2-core-primitives@String","params":{"content":"{\n  \"statusCode\": 200,\n  \"body\": {\n    \"data\": {\n      \"statement_id\": \"01f186b4-5e07-1889-bb45-aaaa820b423c\",\n      \"status\": {\n        \"state\": \"SUCCEEDED\"\n      },\n      \"manifest\": {\n        \"format\": \"JSON_ARRAY\",\n        \"schema\": {\n          \"column_count\": 3,\n          \"columns\": [\n            {\n              \"name\": \"setor\",\n              \"type_text\": \"INT\",\n              \"type_name\": \"INT\",\n              \"position\": 0\n            },\n            {\n              \"name\": \"nivel\",\n              \"type_text\": \"STRING\",\n              \"type_name\": \"STRING\",\n              \"position\": 1\n            },\n            {\n              \"name\": \"cbs\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 2\n            }\n          ]\n        },\n        \"total_chunk_count\": 1,\n        \"chunks\": [\n          {\n            \"chunk_index\": 0,\n            \"row_offset\": 0,\n            \"row_count\": 36\n          }\n        ],\n        \"total_row_count\": 36,\n        \"truncated\": false\n      },\n      \"result\": {\n        \"chunk_index\": 0,\n        \"row_offset\": 0,\n        \"row_count\": 36,\n        \"data_array\": [\n          [\n            \"3703\",\n            \"Bronze\",\n            \"475\"\n          ],\n          [\n            \"3655\",\n            \"Diamante\",\n            \"50\"\n          ],\n          [\n            \"3655\",\n            \"Ouro\",\n            \"174\"\n          ],\n          [\n            \"3703\",\n            \"Ouro\",\n            \"129\"\n          ],\n          [\n            \"3612\",\n            \"Cristal\",\n            \"1161\"\n          ],\n          [\n            \"3221\",\n            \"Bronze\",\n            \"621\"\n          ],\n          [\n            \"3304\",\n            \"Diamante+\",\n            \"2\"\n          ],\n          [\n            \"3655\",\n            \"Diamante+\",\n            \"1\"\n          ],\n          [\n            \"3221\",\n            \"Cristal\",\n            \"607\"\n          ],\n          [\n            \"3808\",\n            \"Cristal\",\n            \"644\"\n          ],\n          [\n            \"3703\",\n            \"Cristal\",\n            \"387\"\n          ],\n          [\n            \"3612\",\n            \"Prata\",\n            \"751\"\n          ],\n          [\n            \"3808\",\n            \"Diamante\",\n            \"60\"\n          ],\n          [\n            \"3304\",\n            \"Ouro\",\n            \"314\"\n          ],\n          [\n            \"3304\",\n            \"Prata\",\n            \"769\"\n          ],\n          [\n            \"3612\",\n            \"Bronze\",\n            \"1094\"\n          ],\n          [\n            \"3612\",\n            \"Ouro\",\n            \"311\"\n          ],\n          [\n            \"3304\",\n            \"Diamante\",\n            \"95\"\n          ],\n          [\n            \"3808\",\n            \"Prata\",\n            \"610\"\n          ],\n          [\n            \"3304\",\n            \"Bronze\",\n            \"1263\"\n          ],\n          [\n            \"3655\",\n            \"Cristal\",\n            \"597\"\n          ],\n          [\n            \"3703\",\n            \"Diamante\",\n            \"46\"\n          ],\n          [\n            \"3655\",\n            \"Bronze\",\n            \"622\"\n          ],\n          [\n            \"3221\",\n            \"Prata\",\n            \"479\"\n          ],\n          [\n            \"3612\",\n            \"Diamante\",\n            \"99\"\n          ],\n          [\n            \"3221\",\n            \"Diamante+\",\n            \"2\"\n          ],\n          [\n            \"3808\",\n            \"Diamante+\",\n            \"1\"\n          ],\n          [\n            \"3655\",\n            \"Prata\",\n            \"478\"\n          ],\n          [\n            \"3304\",\n            \"Cristal\",\n            \"1271\"\n          ],\n          [\n            \"3221\",\n            \"Diamante\",\n            \"56\"\n          ],\n          [\n            \"3221\",\n            \"Ouro\",\n            \"174\"\n          ],\n          [\n            \"3808\",\n            \"Bronze\",\n            \"850\"\n          ],\n          [\n            \"3703\",\n            \"Prata\",\n            \"385\"\n          ],\n          [\n            \"3612\",\n            \"Diamante+\",\n            \"2\"\n          ],\n          [\n            \"3808\",\n            \"Ouro\",\n            \"211\"\n          ],\n          [\n            \"3703\",\n            \"Diamante+\",\n            \"1\"\n          ]\n        ]\n      }\n    }\n  },\n  \"timings\": [\n    {\n      \"label\": \"00_defs\",\n      \"dur\": 18.78\n    },\n    {\n      \"label\": \"010_env_bundle\",\n      \"dur\": 0\n    },\n    {\n      \"label\": \"011_env_init\",\n      \"dur\": 894.74\n    },\n    {\n      \"label\": \"012_env_pem\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"01_env\",\n      \"dur\": 895.36\n    },\n    {\n      \"label\": \"02_setup\",\n      \"dur\": 117.22\n    },\n    {\n      \"label\": \"03_permissions\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"04_op_response\",\n      \"dur\": 3976.89\n    },\n    {\n      \"label\": \"04_op\",\n      \"dur\": 3977.29\n    },\n    {\n      \"label\": \"05_track\",\n      \"dur\": 485.19\n    }\n  ]\n}"}}},"component":"data2-core-functions@JSONParse"},"prop":{"component":"data2-core-primitives@String","params":{"content":"body.data.manifest.schema.columns.1.name"}}}}},{"value":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m.2"}}},"component":"data2-core-types@Reference"},"key":{"component":"data2-core-types@Getter","params":{"module":{"params":{"text":{"component":"data2-core-primitives@String","params":{"content":"{\n  \"statusCode\": 200,\n  \"body\": {\n    \"data\": {\n      \"statement_id\": \"01f186b4-5e07-1889-bb45-aaaa820b423c\",\n      \"status\": {\n        \"state\": \"SUCCEEDED\"\n      },\n      \"manifest\": {\n        \"format\": \"JSON_ARRAY\",\n        \"schema\": {\n          \"column_count\": 3,\n          \"columns\": [\n            {\n              \"name\": \"setor\",\n              \"type_text\": \"INT\",\n              \"type_name\": \"INT\",\n              \"position\": 0\n            },\n            {\n              \"name\": \"nivel\",\n              \"type_text\": \"STRING\",\n              \"type_name\": \"STRING\",\n              \"position\": 1\n            },\n            {\n              \"name\": \"cbs\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 2\n            }\n          ]\n        },\n        \"total_chunk_count\": 1,\n        \"chunks\": [\n          {\n            \"chunk_index\": 0,\n            \"row_offset\": 0,\n            \"row_count\": 36\n          }\n        ],\n        \"total_row_count\": 36,\n        \"truncated\": false\n      },\n      \"result\": {\n        \"chunk_index\": 0,\n        \"row_offset\": 0,\n        \"row_count\": 36,\n        \"data_array\": [\n          [\n            \"3703\",\n            \"Bronze\",\n            \"475\"\n          ],\n          [\n            \"3655\",\n            \"Diamante\",\n            \"50\"\n          ],\n          [\n            \"3655\",\n            \"Ouro\",\n            \"174\"\n          ],\n          [\n            \"3703\",\n            \"Ouro\",\n            \"129\"\n          ],\n          [\n            \"3612\",\n            \"Cristal\",\n            \"1161\"\n          ],\n          [\n            \"3221\",\n            \"Bronze\",\n            \"621\"\n          ],\n          [\n            \"3304\",\n            \"Diamante+\",\n            \"2\"\n          ],\n          [\n            \"3655\",\n            \"Diamante+\",\n            \"1\"\n          ],\n          [\n            \"3221\",\n            \"Cristal\",\n            \"607\"\n          ],\n          [\n            \"3808\",\n            \"Cristal\",\n            \"644\"\n          ],\n          [\n            \"3703\",\n            \"Cristal\",\n            \"387\"\n          ],\n          [\n            \"3612\",\n            \"Prata\",\n            \"751\"\n          ],\n          [\n            \"3808\",\n            \"Diamante\",\n            \"60\"\n          ],\n          [\n            \"3304\",\n            \"Ouro\",\n            \"314\"\n          ],\n          [\n            \"3304\",\n            \"Prata\",\n            \"769\"\n          ],\n          [\n            \"3612\",\n            \"Bronze\",\n            \"1094\"\n          ],\n          [\n            \"3612\",\n            \"Ouro\",\n            \"311\"\n          ],\n          [\n            \"3304\",\n            \"Diamante\",\n            \"95\"\n          ],\n          [\n            \"3808\",\n            \"Prata\",\n            \"610\"\n          ],\n          [\n            \"3304\",\n            \"Bronze\",\n            \"1263\"\n          ],\n          [\n            \"3655\",\n            \"Cristal\",\n            \"597\"\n          ],\n          [\n            \"3703\",\n            \"Diamante\",\n            \"46\"\n          ],\n          [\n            \"3655\",\n            \"Bronze\",\n            \"622\"\n          ],\n          [\n            \"3221\",\n            \"Prata\",\n            \"479\"\n          ],\n          [\n            \"3612\",\n            \"Diamante\",\n            \"99\"\n          ],\n          [\n            \"3221\",\n            \"Diamante+\",\n            \"2\"\n          ],\n          [\n            \"3808\",\n            \"Diamante+\",\n            \"1\"\n          ],\n          [\n            \"3655\",\n            \"Prata\",\n            \"478\"\n          ],\n          [\n            \"3304\",\n            \"Cristal\",\n            \"1271\"\n          ],\n          [\n            \"3221\",\n            \"Diamante\",\n            \"56\"\n          ],\n          [\n            \"3221\",\n            \"Ouro\",\n            \"174\"\n          ],\n          [\n            \"3808\",\n            \"Bronze\",\n            \"850\"\n          ],\n          [\n            \"3703\",\n            \"Prata\",\n            \"385\"\n          ],\n          [\n            \"3612\",\n            \"Diamante+\",\n            \"2\"\n          ],\n          [\n            \"3808\",\n            \"Ouro\",\n            \"211\"\n          ],\n          [\n            \"3703\",\n            \"Diamante+\",\n            \"1\"\n          ]\n        ]\n      }\n    }\n  },\n  \"timings\": [\n    {\n      \"label\": \"00_defs\",\n      \"dur\": 18.78\n    },\n    {\n      \"label\": \"010_env_bundle\",\n      \"dur\": 0\n    },\n    {\n      \"label\": \"011_env_init\",\n      \"dur\": 894.74\n    },\n    {\n      \"label\": \"012_env_pem\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"01_env\",\n      \"dur\": 895.36\n    },\n    {\n      \"label\": \"02_setup\",\n      \"dur\": 117.22\n    },\n    {\n      \"label\": \"03_permissions\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"04_op_response\",\n      \"dur\": 3976.89\n    },\n    {\n      \"label\": \"04_op\",\n      \"dur\": 3977.29\n    },\n    {\n      \"label\": \"05_track\",\n      \"dur\": 485.19\n    }\n  ]\n}"}}},"component":"data2-core-functions@JSONParse"},"prop":{"component":"data2-core-primitives@String","params":{"content":"body.data.manifest.schema.columns.2.name"}}}}}]},"component":"data2-core-types@FieldSet"}}}},"component":"data2-core-functions@ArrayMap"},"collapsed":{"component":"data2-core-primitives@Number","params":{"content":99}},"theme":"rjv-default"},"updatedAt":"2026-07-24T17:25:47.260Z","createdAt":"2026-07-24T17:25:18.180Z"},{"_id":"6a63a0483458bb4b79ae4ed6","parent":"6a625182203e921fd2513b33","component":"data2-blocks@JsonViewer","system":"6a57cfe9673eb7e3c5e57784","displayName":"Copy of Copy of Copy of Copy of Copy of Copy of Copy of Copy of Copy of Copy of Copy of input","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":680,"height":448,"exactWidth":false,"exactHeight":448.46}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":1,"y":320,"exactX":1,"exactY":319.54,"fixed":false,"left":true,"top":true,"bottom":true,"growV":false}},"style":{"flex":{"component":"data2-core-primitives@String","params":{"content":"1"}}},"scroll":{"disabled":false,"component":"data2-core-types@Scroll","params":{"y":true}}},"json":{"params":{"array":{"params":{"array":{"params":{"module":{"params":{"text":{"component":"data2-core-primitives@String","params":{"content":"{\n  \"statusCode\": 200,\n  \"body\": {\n    \"data\": {\n      \"statement_id\": \"01f186b4-5d0a-102c-9089-35fe99fb76d3\",\n      \"status\": {\n        \"state\": \"SUCCEEDED\"\n      },\n      \"manifest\": {\n        \"format\": \"JSON_ARRAY\",\n        \"schema\": {\n          \"column_count\": 8,\n          \"columns\": [\n            {\n              \"name\": \"setor\",\n              \"type_text\": \"INT\",\n              \"type_name\": \"INT\",\n              \"position\": 0\n            },\n            {\n              \"name\": \"cbs\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 1\n            },\n            {\n              \"name\": \"ativas\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 2\n            },\n            {\n              \"name\": \"receita\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 3,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"rec_nat\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 4,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"rec_avon\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 5,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"pontos\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 6,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"pedidos\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 7,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            }\n          ]\n        },\n        \"total_chunk_count\": 1,\n        \"chunks\": [\n          {\n            \"chunk_index\": 0,\n            \"row_offset\": 0,\n            \"row_count\": 6\n          }\n        ],\n        \"total_row_count\": 6,\n        \"truncated\": false\n      },\n      \"result\": {\n        \"chunk_index\": 0,\n        \"row_offset\": 0,\n        \"row_count\": 6,\n        \"data_array\": [\n          [\n            \"3808\",\n            \"2376\",\n            \"273\",\n            \"294252\",\n            \"256182\",\n            \"38069\",\n            \"48260\",\n            \"341\"\n          ],\n          [\n            \"3221\",\n            \"1939\",\n            \"747\",\n            \"647897\",\n            \"508219\",\n            \"139649\",\n            \"118759\",\n            \"1216\"\n          ],\n          [\n            \"3304\",\n            \"3714\",\n            \"1363\",\n            \"1344946\",\n            \"1131010\",\n            \"212544\",\n            \"234700\",\n            \"1891\"\n          ],\n          [\n            \"3655\",\n            \"1922\",\n            \"387\",\n            \"355872\",\n            \"291733\",\n            \"64126\",\n            \"62726\",\n            \"515\"\n          ],\n          [\n            \"3612\",\n            \"3418\",\n            \"394\",\n            \"362306\",\n            \"312889\",\n            \"49221\",\n            \"67096\",\n            \"507\"\n          ],\n          [\n            \"3703\",\n            \"1423\",\n            \"36\",\n            \"38180\",\n            \"34965\",\n            \"3215\",\n            \"6169\",\n            \"39\"\n          ]\n        ]\n      }\n    }\n  },\n  \"timings\": [\n    {\n      \"label\": \"00_defs\",\n      \"dur\": 21.04\n    },\n    {\n      \"label\": \"010_env_bundle\",\n      \"dur\": 0\n    },\n    {\n      \"label\": \"011_env_init\",\n      \"dur\": 1100.84\n    },\n    {\n      \"label\": \"012_env_pem\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"01_env\",\n      \"dur\": 1112.14\n    },\n    {\n      \"label\": \"02_setup\",\n      \"dur\": 118.72\n    },\n    {\n      \"label\": \"03_permissions\",\n      \"dur\": 0.02\n    },\n    {\n      \"label\": \"04_op_response\",\n      \"dur\": 2195.9\n    },\n    {\n      \"label\": \"04_op\",\n      \"dur\": 2196.54\n    },\n    {\n      \"label\": \"05_track\",\n      \"dur\": 510.91\n    }\n  ]\n}"}}},"component":"data2-core-functions@JSONParse"},"prop":{"component":"data2-core-primitives@String","params":{"content":"body.data.result.data_array"}}},"component":"data2-core-types@Getter"},"end":{"component":"data2-core-primitives@Number","params":{"content":80}}},"component":"data2-core-functions@ArraySlice"},"mapper":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"m"}},{"component":"data2-core-primitives@String","params":{"content":"i"}}],"body":{"params":{"fieldsList":[{"value":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m.0"}}},"component":"data2-core-types@Reference"},"key":{"component":"data2-core-types@Getter","params":{"module":{"params":{"text":{"component":"data2-core-primitives@String","params":{"content":"{\n  \"statusCode\": 200,\n  \"body\": {\n    \"data\": {\n      \"statement_id\": \"01f186b4-5d0a-102c-9089-35fe99fb76d3\",\n      \"status\": {\n        \"state\": \"SUCCEEDED\"\n      },\n      \"manifest\": {\n        \"format\": \"JSON_ARRAY\",\n        \"schema\": {\n          \"column_count\": 8,\n          \"columns\": [\n            {\n              \"name\": \"setor\",\n              \"type_text\": \"INT\",\n              \"type_name\": \"INT\",\n              \"position\": 0\n            },\n            {\n              \"name\": \"cbs\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 1\n            },\n            {\n              \"name\": \"ativas\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 2\n            },\n            {\n              \"name\": \"receita\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 3,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"rec_nat\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 4,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"rec_avon\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 5,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"pontos\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 6,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"pedidos\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 7,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            }\n          ]\n        },\n        \"total_chunk_count\": 1,\n        \"chunks\": [\n          {\n            \"chunk_index\": 0,\n            \"row_offset\": 0,\n            \"row_count\": 6\n          }\n        ],\n        \"total_row_count\": 6,\n        \"truncated\": false\n      },\n      \"result\": {\n        \"chunk_index\": 0,\n        \"row_offset\": 0,\n        \"row_count\": 6,\n        \"data_array\": [\n          [\n            \"3808\",\n            \"2376\",\n            \"273\",\n            \"294252\",\n            \"256182\",\n            \"38069\",\n            \"48260\",\n            \"341\"\n          ],\n          [\n            \"3221\",\n            \"1939\",\n            \"747\",\n            \"647897\",\n            \"508219\",\n            \"139649\",\n            \"118759\",\n            \"1216\"\n          ],\n          [\n            \"3304\",\n            \"3714\",\n            \"1363\",\n            \"1344946\",\n            \"1131010\",\n            \"212544\",\n            \"234700\",\n            \"1891\"\n          ],\n          [\n            \"3655\",\n            \"1922\",\n            \"387\",\n            \"355872\",\n            \"291733\",\n            \"64126\",\n            \"62726\",\n            \"515\"\n          ],\n          [\n            \"3612\",\n            \"3418\",\n            \"394\",\n            \"362306\",\n            \"312889\",\n            \"49221\",\n            \"67096\",\n            \"507\"\n          ],\n          [\n            \"3703\",\n            \"1423\",\n            \"36\",\n            \"38180\",\n            \"34965\",\n            \"3215\",\n            \"6169\",\n            \"39\"\n          ]\n        ]\n      }\n    }\n  },\n  \"timings\": [\n    {\n      \"label\": \"00_defs\",\n      \"dur\": 21.04\n    },\n    {\n      \"label\": \"010_env_bundle\",\n      \"dur\": 0\n    },\n    {\n      \"label\": \"011_env_init\",\n      \"dur\": 1100.84\n    },\n    {\n      \"label\": \"012_env_pem\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"01_env\",\n      \"dur\": 1112.14\n    },\n    {\n      \"label\": \"02_setup\",\n      \"dur\": 118.72\n    },\n    {\n      \"label\": \"03_permissions\",\n      \"dur\": 0.02\n    },\n    {\n      \"label\": \"04_op_response\",\n      \"dur\": 2195.9\n    },\n    {\n      \"label\": \"04_op\",\n      \"dur\": 2196.54\n    },\n    {\n      \"label\": \"05_track\",\n      \"dur\": 510.91\n    }\n  ]\n}"}}},"component":"data2-core-functions@JSONParse"},"prop":{"component":"data2-core-primitives@String","params":{"content":"body.data.manifest.schema.columns.0.name"}}}}},{"value":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m.1"}}},"component":"data2-core-types@Reference"},"key":{"component":"data2-core-types@Getter","params":{"module":{"params":{"text":{"component":"data2-core-primitives@String","params":{"content":"{\n  \"statusCode\": 200,\n  \"body\": {\n    \"data\": {\n      \"statement_id\": \"01f186b4-5d0a-102c-9089-35fe99fb76d3\",\n      \"status\": {\n        \"state\": \"SUCCEEDED\"\n      },\n      \"manifest\": {\n        \"format\": \"JSON_ARRAY\",\n        \"schema\": {\n          \"column_count\": 8,\n          \"columns\": [\n            {\n              \"name\": \"setor\",\n              \"type_text\": \"INT\",\n              \"type_name\": \"INT\",\n              \"position\": 0\n            },\n            {\n              \"name\": \"cbs\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 1\n            },\n            {\n              \"name\": \"ativas\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 2\n            },\n            {\n              \"name\": \"receita\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 3,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"rec_nat\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 4,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"rec_avon\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 5,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"pontos\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 6,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"pedidos\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 7,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            }\n          ]\n        },\n        \"total_chunk_count\": 1,\n        \"chunks\": [\n          {\n            \"chunk_index\": 0,\n            \"row_offset\": 0,\n            \"row_count\": 6\n          }\n        ],\n        \"total_row_count\": 6,\n        \"truncated\": false\n      },\n      \"result\": {\n        \"chunk_index\": 0,\n        \"row_offset\": 0,\n        \"row_count\": 6,\n        \"data_array\": [\n          [\n            \"3808\",\n            \"2376\",\n            \"273\",\n            \"294252\",\n            \"256182\",\n            \"38069\",\n            \"48260\",\n            \"341\"\n          ],\n          [\n            \"3221\",\n            \"1939\",\n            \"747\",\n            \"647897\",\n            \"508219\",\n            \"139649\",\n            \"118759\",\n            \"1216\"\n          ],\n          [\n            \"3304\",\n            \"3714\",\n            \"1363\",\n            \"1344946\",\n            \"1131010\",\n            \"212544\",\n            \"234700\",\n            \"1891\"\n          ],\n          [\n            \"3655\",\n            \"1922\",\n            \"387\",\n            \"355872\",\n            \"291733\",\n            \"64126\",\n            \"62726\",\n            \"515\"\n          ],\n          [\n            \"3612\",\n            \"3418\",\n            \"394\",\n            \"362306\",\n            \"312889\",\n            \"49221\",\n            \"67096\",\n            \"507\"\n          ],\n          [\n            \"3703\",\n            \"1423\",\n            \"36\",\n            \"38180\",\n            \"34965\",\n            \"3215\",\n            \"6169\",\n            \"39\"\n          ]\n        ]\n      }\n    }\n  },\n  \"timings\": [\n    {\n      \"label\": \"00_defs\",\n      \"dur\": 21.04\n    },\n    {\n      \"label\": \"010_env_bundle\",\n      \"dur\": 0\n    },\n    {\n      \"label\": \"011_env_init\",\n      \"dur\": 1100.84\n    },\n    {\n      \"label\": \"012_env_pem\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"01_env\",\n      \"dur\": 1112.14\n    },\n    {\n      \"label\": \"02_setup\",\n      \"dur\": 118.72\n    },\n    {\n      \"label\": \"03_permissions\",\n      \"dur\": 0.02\n    },\n    {\n      \"label\": \"04_op_response\",\n      \"dur\": 2195.9\n    },\n    {\n      \"label\": \"04_op\",\n      \"dur\": 2196.54\n    },\n    {\n      \"label\": \"05_track\",\n      \"dur\": 510.91\n    }\n  ]\n}"}}},"component":"data2-core-functions@JSONParse"},"prop":{"component":"data2-core-primitives@String","params":{"content":"body.data.manifest.schema.columns.1.name"}}}}},{"value":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m.2"}}},"component":"data2-core-types@Reference"},"key":{"component":"data2-core-types@Getter","params":{"module":{"params":{"text":{"component":"data2-core-primitives@String","params":{"content":"{\n  \"statusCode\": 200,\n  \"body\": {\n    \"data\": {\n      \"statement_id\": \"01f186b4-5d0a-102c-9089-35fe99fb76d3\",\n      \"status\": {\n        \"state\": \"SUCCEEDED\"\n      },\n      \"manifest\": {\n        \"format\": \"JSON_ARRAY\",\n        \"schema\": {\n          \"column_count\": 8,\n          \"columns\": [\n            {\n              \"name\": \"setor\",\n              \"type_text\": \"INT\",\n              \"type_name\": \"INT\",\n              \"position\": 0\n            },\n            {\n              \"name\": \"cbs\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 1\n            },\n            {\n              \"name\": \"ativas\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 2\n            },\n            {\n              \"name\": \"receita\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 3,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"rec_nat\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 4,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"rec_avon\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 5,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"pontos\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 6,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"pedidos\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 7,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            }\n          ]\n        },\n        \"total_chunk_count\": 1,\n        \"chunks\": [\n          {\n            \"chunk_index\": 0,\n            \"row_offset\": 0,\n            \"row_count\": 6\n          }\n        ],\n        \"total_row_count\": 6,\n        \"truncated\": false\n      },\n      \"result\": {\n        \"chunk_index\": 0,\n        \"row_offset\": 0,\n        \"row_count\": 6,\n        \"data_array\": [\n          [\n            \"3808\",\n            \"2376\",\n            \"273\",\n            \"294252\",\n            \"256182\",\n            \"38069\",\n            \"48260\",\n            \"341\"\n          ],\n          [\n            \"3221\",\n            \"1939\",\n            \"747\",\n            \"647897\",\n            \"508219\",\n            \"139649\",\n            \"118759\",\n            \"1216\"\n          ],\n          [\n            \"3304\",\n            \"3714\",\n            \"1363\",\n            \"1344946\",\n            \"1131010\",\n            \"212544\",\n            \"234700\",\n            \"1891\"\n          ],\n          [\n            \"3655\",\n            \"1922\",\n            \"387\",\n            \"355872\",\n            \"291733\",\n            \"64126\",\n            \"62726\",\n            \"515\"\n          ],\n          [\n            \"3612\",\n            \"3418\",\n            \"394\",\n            \"362306\",\n            \"312889\",\n            \"49221\",\n            \"67096\",\n            \"507\"\n          ],\n          [\n            \"3703\",\n            \"1423\",\n            \"36\",\n            \"38180\",\n            \"34965\",\n            \"3215\",\n            \"6169\",\n            \"39\"\n          ]\n        ]\n      }\n    }\n  },\n  \"timings\": [\n    {\n      \"label\": \"00_defs\",\n      \"dur\": 21.04\n    },\n    {\n      \"label\": \"010_env_bundle\",\n      \"dur\": 0\n    },\n    {\n      \"label\": \"011_env_init\",\n      \"dur\": 1100.84\n    },\n    {\n      \"label\": \"012_env_pem\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"01_env\",\n      \"dur\": 1112.14\n    },\n    {\n      \"label\": \"02_setup\",\n      \"dur\": 118.72\n    },\n    {\n      \"label\": \"03_permissions\",\n      \"dur\": 0.02\n    },\n    {\n      \"label\": \"04_op_response\",\n      \"dur\": 2195.9\n    },\n    {\n      \"label\": \"04_op\",\n      \"dur\": 2196.54\n    },\n    {\n      \"label\": \"05_track\",\n      \"dur\": 510.91\n    }\n  ]\n}"}}},"component":"data2-core-functions@JSONParse"},"prop":{"component":"data2-core-primitives@String","params":{"content":"body.data.manifest.schema.columns.2.name"}}}}},{"value":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m.3"}}},"component":"data2-core-types@Reference"},"key":{"component":"data2-core-types@Getter","params":{"module":{"params":{"text":{"component":"data2-core-primitives@String","params":{"content":"{\n  \"statusCode\": 200,\n  \"body\": {\n    \"data\": {\n      \"statement_id\": \"01f186b4-5d0a-102c-9089-35fe99fb76d3\",\n      \"status\": {\n        \"state\": \"SUCCEEDED\"\n      },\n      \"manifest\": {\n        \"format\": \"JSON_ARRAY\",\n        \"schema\": {\n          \"column_count\": 8,\n          \"columns\": [\n            {\n              \"name\": \"setor\",\n              \"type_text\": \"INT\",\n              \"type_name\": \"INT\",\n              \"position\": 0\n            },\n            {\n              \"name\": \"cbs\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 1\n            },\n            {\n              \"name\": \"ativas\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 2\n            },\n            {\n              \"name\": \"receita\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 3,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"rec_nat\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 4,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"rec_avon\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 5,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"pontos\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 6,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"pedidos\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 7,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            }\n          ]\n        },\n        \"total_chunk_count\": 1,\n        \"chunks\": [\n          {\n            \"chunk_index\": 0,\n            \"row_offset\": 0,\n            \"row_count\": 6\n          }\n        ],\n        \"total_row_count\": 6,\n        \"truncated\": false\n      },\n      \"result\": {\n        \"chunk_index\": 0,\n        \"row_offset\": 0,\n        \"row_count\": 6,\n        \"data_array\": [\n          [\n            \"3808\",\n            \"2376\",\n            \"273\",\n            \"294252\",\n            \"256182\",\n            \"38069\",\n            \"48260\",\n            \"341\"\n          ],\n          [\n            \"3221\",\n            \"1939\",\n            \"747\",\n            \"647897\",\n            \"508219\",\n            \"139649\",\n            \"118759\",\n            \"1216\"\n          ],\n          [\n            \"3304\",\n            \"3714\",\n            \"1363\",\n            \"1344946\",\n            \"1131010\",\n            \"212544\",\n            \"234700\",\n            \"1891\"\n          ],\n          [\n            \"3655\",\n            \"1922\",\n            \"387\",\n            \"355872\",\n            \"291733\",\n            \"64126\",\n            \"62726\",\n            \"515\"\n          ],\n          [\n            \"3612\",\n            \"3418\",\n            \"394\",\n            \"362306\",\n            \"312889\",\n            \"49221\",\n            \"67096\",\n            \"507\"\n          ],\n          [\n            \"3703\",\n            \"1423\",\n            \"36\",\n            \"38180\",\n            \"34965\",\n            \"3215\",\n            \"6169\",\n            \"39\"\n          ]\n        ]\n      }\n    }\n  },\n  \"timings\": [\n    {\n      \"label\": \"00_defs\",\n      \"dur\": 21.04\n    },\n    {\n      \"label\": \"010_env_bundle\",\n      \"dur\": 0\n    },\n    {\n      \"label\": \"011_env_init\",\n      \"dur\": 1100.84\n    },\n    {\n      \"label\": \"012_env_pem\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"01_env\",\n      \"dur\": 1112.14\n    },\n    {\n      \"label\": \"02_setup\",\n      \"dur\": 118.72\n    },\n    {\n      \"label\": \"03_permissions\",\n      \"dur\": 0.02\n    },\n    {\n      \"label\": \"04_op_response\",\n      \"dur\": 2195.9\n    },\n    {\n      \"label\": \"04_op\",\n      \"dur\": 2196.54\n    },\n    {\n      \"label\": \"05_track\",\n      \"dur\": 510.91\n    }\n  ]\n}"}}},"component":"data2-core-functions@JSONParse"},"prop":{"component":"data2-core-primitives@String","params":{"content":"body.data.manifest.schema.columns.3.name"}}}}},{"value":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m.4"}}},"component":"data2-core-types@Reference"},"key":{"component":"data2-core-types@Getter","params":{"module":{"params":{"text":{"component":"data2-core-primitives@String","params":{"content":"{\n  \"statusCode\": 200,\n  \"body\": {\n    \"data\": {\n      \"statement_id\": \"01f186b4-5d0a-102c-9089-35fe99fb76d3\",\n      \"status\": {\n        \"state\": \"SUCCEEDED\"\n      },\n      \"manifest\": {\n        \"format\": \"JSON_ARRAY\",\n        \"schema\": {\n          \"column_count\": 8,\n          \"columns\": [\n            {\n              \"name\": \"setor\",\n              \"type_text\": \"INT\",\n              \"type_name\": \"INT\",\n              \"position\": 0\n            },\n            {\n              \"name\": \"cbs\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 1\n            },\n            {\n              \"name\": \"ativas\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 2\n            },\n            {\n              \"name\": \"receita\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 3,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"rec_nat\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 4,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"rec_avon\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 5,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"pontos\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 6,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"pedidos\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 7,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            }\n          ]\n        },\n        \"total_chunk_count\": 1,\n        \"chunks\": [\n          {\n            \"chunk_index\": 0,\n            \"row_offset\": 0,\n            \"row_count\": 6\n          }\n        ],\n        \"total_row_count\": 6,\n        \"truncated\": false\n      },\n      \"result\": {\n        \"chunk_index\": 0,\n        \"row_offset\": 0,\n        \"row_count\": 6,\n        \"data_array\": [\n          [\n            \"3808\",\n            \"2376\",\n            \"273\",\n            \"294252\",\n            \"256182\",\n            \"38069\",\n            \"48260\",\n            \"341\"\n          ],\n          [\n            \"3221\",\n            \"1939\",\n            \"747\",\n            \"647897\",\n            \"508219\",\n            \"139649\",\n            \"118759\",\n            \"1216\"\n          ],\n          [\n            \"3304\",\n            \"3714\",\n            \"1363\",\n            \"1344946\",\n            \"1131010\",\n            \"212544\",\n            \"234700\",\n            \"1891\"\n          ],\n          [\n            \"3655\",\n            \"1922\",\n            \"387\",\n            \"355872\",\n            \"291733\",\n            \"64126\",\n            \"62726\",\n            \"515\"\n          ],\n          [\n            \"3612\",\n            \"3418\",\n            \"394\",\n            \"362306\",\n            \"312889\",\n            \"49221\",\n            \"67096\",\n            \"507\"\n          ],\n          [\n            \"3703\",\n            \"1423\",\n            \"36\",\n            \"38180\",\n            \"34965\",\n            \"3215\",\n            \"6169\",\n            \"39\"\n          ]\n        ]\n      }\n    }\n  },\n  \"timings\": [\n    {\n      \"label\": \"00_defs\",\n      \"dur\": 21.04\n    },\n    {\n      \"label\": \"010_env_bundle\",\n      \"dur\": 0\n    },\n    {\n      \"label\": \"011_env_init\",\n      \"dur\": 1100.84\n    },\n    {\n      \"label\": \"012_env_pem\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"01_env\",\n      \"dur\": 1112.14\n    },\n    {\n      \"label\": \"02_setup\",\n      \"dur\": 118.72\n    },\n    {\n      \"label\": \"03_permissions\",\n      \"dur\": 0.02\n    },\n    {\n      \"label\": \"04_op_response\",\n      \"dur\": 2195.9\n    },\n    {\n      \"label\": \"04_op\",\n      \"dur\": 2196.54\n    },\n    {\n      \"label\": \"05_track\",\n      \"dur\": 510.91\n    }\n  ]\n}"}}},"component":"data2-core-functions@JSONParse"},"prop":{"component":"data2-core-primitives@String","params":{"content":"body.data.manifest.schema.columns.4.name"}}}}},{"value":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m.5"}}},"component":"data2-core-types@Reference"},"key":{"component":"data2-core-types@Getter","params":{"module":{"params":{"text":{"component":"data2-core-primitives@String","params":{"content":"{\n  \"statusCode\": 200,\n  \"body\": {\n    \"data\": {\n      \"statement_id\": \"01f186b4-5d0a-102c-9089-35fe99fb76d3\",\n      \"status\": {\n        \"state\": \"SUCCEEDED\"\n      },\n      \"manifest\": {\n        \"format\": \"JSON_ARRAY\",\n        \"schema\": {\n          \"column_count\": 8,\n          \"columns\": [\n            {\n              \"name\": \"setor\",\n              \"type_text\": \"INT\",\n              \"type_name\": \"INT\",\n              \"position\": 0\n            },\n            {\n              \"name\": \"cbs\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 1\n            },\n            {\n              \"name\": \"ativas\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 2\n            },\n            {\n              \"name\": \"receita\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 3,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"rec_nat\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 4,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"rec_avon\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 5,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"pontos\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 6,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"pedidos\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 7,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            }\n          ]\n        },\n        \"total_chunk_count\": 1,\n        \"chunks\": [\n          {\n            \"chunk_index\": 0,\n            \"row_offset\": 0,\n            \"row_count\": 6\n          }\n        ],\n        \"total_row_count\": 6,\n        \"truncated\": false\n      },\n      \"result\": {\n        \"chunk_index\": 0,\n        \"row_offset\": 0,\n        \"row_count\": 6,\n        \"data_array\": [\n          [\n            \"3808\",\n            \"2376\",\n            \"273\",\n            \"294252\",\n            \"256182\",\n            \"38069\",\n            \"48260\",\n            \"341\"\n          ],\n          [\n            \"3221\",\n            \"1939\",\n            \"747\",\n            \"647897\",\n            \"508219\",\n            \"139649\",\n            \"118759\",\n            \"1216\"\n          ],\n          [\n            \"3304\",\n            \"3714\",\n            \"1363\",\n            \"1344946\",\n            \"1131010\",\n            \"212544\",\n            \"234700\",\n            \"1891\"\n          ],\n          [\n            \"3655\",\n            \"1922\",\n            \"387\",\n            \"355872\",\n            \"291733\",\n            \"64126\",\n            \"62726\",\n            \"515\"\n          ],\n          [\n            \"3612\",\n            \"3418\",\n            \"394\",\n            \"362306\",\n            \"312889\",\n            \"49221\",\n            \"67096\",\n            \"507\"\n          ],\n          [\n            \"3703\",\n            \"1423\",\n            \"36\",\n            \"38180\",\n            \"34965\",\n            \"3215\",\n            \"6169\",\n            \"39\"\n          ]\n        ]\n      }\n    }\n  },\n  \"timings\": [\n    {\n      \"label\": \"00_defs\",\n      \"dur\": 21.04\n    },\n    {\n      \"label\": \"010_env_bundle\",\n      \"dur\": 0\n    },\n    {\n      \"label\": \"011_env_init\",\n      \"dur\": 1100.84\n    },\n    {\n      \"label\": \"012_env_pem\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"01_env\",\n      \"dur\": 1112.14\n    },\n    {\n      \"label\": \"02_setup\",\n      \"dur\": 118.72\n    },\n    {\n      \"label\": \"03_permissions\",\n      \"dur\": 0.02\n    },\n    {\n      \"label\": \"04_op_response\",\n      \"dur\": 2195.9\n    },\n    {\n      \"label\": \"04_op\",\n      \"dur\": 2196.54\n    },\n    {\n      \"label\": \"05_track\",\n      \"dur\": 510.91\n    }\n  ]\n}"}}},"component":"data2-core-functions@JSONParse"},"prop":{"component":"data2-core-primitives@String","params":{"content":"body.data.manifest.schema.columns.5.name"}}}}},{"value":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m.6"}}},"component":"data2-core-types@Reference"},"key":{"component":"data2-core-types@Getter","params":{"module":{"params":{"text":{"component":"data2-core-primitives@String","params":{"content":"{\n  \"statusCode\": 200,\n  \"body\": {\n    \"data\": {\n      \"statement_id\": \"01f186b4-5d0a-102c-9089-35fe99fb76d3\",\n      \"status\": {\n        \"state\": \"SUCCEEDED\"\n      },\n      \"manifest\": {\n        \"format\": \"JSON_ARRAY\",\n        \"schema\": {\n          \"column_count\": 8,\n          \"columns\": [\n            {\n              \"name\": \"setor\",\n              \"type_text\": \"INT\",\n              \"type_name\": \"INT\",\n              \"position\": 0\n            },\n            {\n              \"name\": \"cbs\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 1\n            },\n            {\n              \"name\": \"ativas\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 2\n            },\n            {\n              \"name\": \"receita\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 3,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"rec_nat\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 4,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"rec_avon\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 5,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"pontos\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 6,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"pedidos\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 7,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            }\n          ]\n        },\n        \"total_chunk_count\": 1,\n        \"chunks\": [\n          {\n            \"chunk_index\": 0,\n            \"row_offset\": 0,\n            \"row_count\": 6\n          }\n        ],\n        \"total_row_count\": 6,\n        \"truncated\": false\n      },\n      \"result\": {\n        \"chunk_index\": 0,\n        \"row_offset\": 0,\n        \"row_count\": 6,\n        \"data_array\": [\n          [\n            \"3808\",\n            \"2376\",\n            \"273\",\n            \"294252\",\n            \"256182\",\n            \"38069\",\n            \"48260\",\n            \"341\"\n          ],\n          [\n            \"3221\",\n            \"1939\",\n            \"747\",\n            \"647897\",\n            \"508219\",\n            \"139649\",\n            \"118759\",\n            \"1216\"\n          ],\n          [\n            \"3304\",\n            \"3714\",\n            \"1363\",\n            \"1344946\",\n            \"1131010\",\n            \"212544\",\n            \"234700\",\n            \"1891\"\n          ],\n          [\n            \"3655\",\n            \"1922\",\n            \"387\",\n            \"355872\",\n            \"291733\",\n            \"64126\",\n            \"62726\",\n            \"515\"\n          ],\n          [\n            \"3612\",\n            \"3418\",\n            \"394\",\n            \"362306\",\n            \"312889\",\n            \"49221\",\n            \"67096\",\n            \"507\"\n          ],\n          [\n            \"3703\",\n            \"1423\",\n            \"36\",\n            \"38180\",\n            \"34965\",\n            \"3215\",\n            \"6169\",\n            \"39\"\n          ]\n        ]\n      }\n    }\n  },\n  \"timings\": [\n    {\n      \"label\": \"00_defs\",\n      \"dur\": 21.04\n    },\n    {\n      \"label\": \"010_env_bundle\",\n      \"dur\": 0\n    },\n    {\n      \"label\": \"011_env_init\",\n      \"dur\": 1100.84\n    },\n    {\n      \"label\": \"012_env_pem\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"01_env\",\n      \"dur\": 1112.14\n    },\n    {\n      \"label\": \"02_setup\",\n      \"dur\": 118.72\n    },\n    {\n      \"label\": \"03_permissions\",\n      \"dur\": 0.02\n    },\n    {\n      \"label\": \"04_op_response\",\n      \"dur\": 2195.9\n    },\n    {\n      \"label\": \"04_op\",\n      \"dur\": 2196.54\n    },\n    {\n      \"label\": \"05_track\",\n      \"dur\": 510.91\n    }\n  ]\n}"}}},"component":"data2-core-functions@JSONParse"},"prop":{"component":"data2-core-primitives@String","params":{"content":"body.data.manifest.schema.columns.6.name"}}}}},{"value":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m.7"}}},"component":"data2-core-types@Reference"},"key":{"component":"data2-core-types@Getter","params":{"module":{"params":{"text":{"component":"data2-core-primitives@String","params":{"content":"{\n  \"statusCode\": 200,\n  \"body\": {\n    \"data\": {\n      \"statement_id\": \"01f186b4-5d0a-102c-9089-35fe99fb76d3\",\n      \"status\": {\n        \"state\": \"SUCCEEDED\"\n      },\n      \"manifest\": {\n        \"format\": \"JSON_ARRAY\",\n        \"schema\": {\n          \"column_count\": 8,\n          \"columns\": [\n            {\n              \"name\": \"setor\",\n              \"type_text\": \"INT\",\n              \"type_name\": \"INT\",\n              \"position\": 0\n            },\n            {\n              \"name\": \"cbs\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 1\n            },\n            {\n              \"name\": \"ativas\",\n              \"type_text\": \"BIGINT\",\n              \"type_name\": \"LONG\",\n              \"position\": 2\n            },\n            {\n              \"name\": \"receita\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 3,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"rec_nat\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 4,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"rec_avon\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 5,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"pontos\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 6,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            },\n            {\n              \"name\": \"pedidos\",\n              \"type_text\": \"DECIMAL(25,0)\",\n              \"type_name\": \"DECIMAL\",\n              \"position\": 7,\n              \"type_precision\": 25,\n              \"type_scale\": 0\n            }\n          ]\n        },\n        \"total_chunk_count\": 1,\n        \"chunks\": [\n          {\n            \"chunk_index\": 0,\n            \"row_offset\": 0,\n            \"row_count\": 6\n          }\n        ],\n        \"total_row_count\": 6,\n        \"truncated\": false\n      },\n      \"result\": {\n        \"chunk_index\": 0,\n        \"row_offset\": 0,\n        \"row_count\": 6,\n        \"data_array\": [\n          [\n            \"3808\",\n            \"2376\",\n            \"273\",\n            \"294252\",\n            \"256182\",\n            \"38069\",\n            \"48260\",\n            \"341\"\n          ],\n          [\n            \"3221\",\n            \"1939\",\n            \"747\",\n            \"647897\",\n            \"508219\",\n            \"139649\",\n            \"118759\",\n            \"1216\"\n          ],\n          [\n            \"3304\",\n            \"3714\",\n            \"1363\",\n            \"1344946\",\n            \"1131010\",\n            \"212544\",\n            \"234700\",\n            \"1891\"\n          ],\n          [\n            \"3655\",\n            \"1922\",\n            \"387\",\n            \"355872\",\n            \"291733\",\n            \"64126\",\n            \"62726\",\n            \"515\"\n          ],\n          [\n            \"3612\",\n            \"3418\",\n            \"394\",\n            \"362306\",\n            \"312889\",\n            \"49221\",\n            \"67096\",\n            \"507\"\n          ],\n          [\n            \"3703\",\n            \"1423\",\n            \"36\",\n            \"38180\",\n            \"34965\",\n            \"3215\",\n            \"6169\",\n            \"39\"\n          ]\n        ]\n      }\n    }\n  },\n  \"timings\": [\n    {\n      \"label\": \"00_defs\",\n      \"dur\": 21.04\n    },\n    {\n      \"label\": \"010_env_bundle\",\n      \"dur\": 0\n    },\n    {\n      \"label\": \"011_env_init\",\n      \"dur\": 1100.84\n    },\n    {\n      \"label\": \"012_env_pem\",\n      \"dur\": 0.01\n    },\n    {\n      \"label\": \"01_env\",\n      \"dur\": 1112.14\n    },\n    {\n      \"label\": \"02_setup\",\n      \"dur\": 118.72\n    },\n    {\n      \"label\": \"03_permissions\",\n      \"dur\": 0.02\n    },\n    {\n      \"label\": \"04_op_response\",\n      \"dur\": 2195.9\n    },\n    {\n      \"label\": \"04_op\",\n      \"dur\": 2196.54\n    },\n    {\n      \"label\": \"05_track\",\n      \"dur\": 510.91\n    }\n  ]\n}"}}},"component":"data2-core-functions@JSONParse"},"prop":{"component":"data2-core-primitives@String","params":{"content":"body.data.manifest.schema.columns.7.name"}}}}}]},"component":"data2-core-types@FieldSet"}}}},"component":"data2-core-functions@ArrayMap"},"collapsed":{"component":"data2-core-primitives@Number","params":{"content":99}},"theme":"rjv-default"},"updatedAt":"2026-07-24T17:35:15.094Z","createdAt":"2026-07-24T17:35:15.094Z"},{"_id":"6a63f9b3644b4ebe5ede5114","parent":"6a5f9aaea5529ef885ca965d","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"logo","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":211,"height":60,"exactHeight":60}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":"20","y":"40","left":true,"exactX":false,"exactY":false,"top":true}},"text":""},"reference":"logo","updatedAt":"2026-07-25T03:35:34.090Z","createdAt":"2026-07-24T23:48:45.999Z"},{"_id":"6a63f9b3644b4ebe5ede5115","parent":"6a63f9b3644b4ebe5ede5114","component":"data2-blocks@Html","system":"6a57cfe9673eb7e3c5e57784","displayName":"logo1","params":{"super":{"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"},"disabled":true},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":false,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":40,"height":30,"exactWidth":40,"exactHeight":30}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":15,"exactX":false,"exactY":false,"top":true,"left":true}},"transitions":[{"component":"data2-core-types@Transition","params":{"scope":"ALL","duration":"200"}}],"shadow":[{"component":"data2-core-types@Shadow","params":{"type":"complex","offsetX":"0","offsetY":"1","blur":"1","color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(108,92,224,1)"}}}},{"component":"data2-core-types@Shadow","params":{"type":"complex","offsetX":"0","offsetY":"1","blur":"1","color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(108,92,224,1)"}}}}]},"text":{"component":"data2-core-primitives@String","params":{"content":"<svg version=\"1.1\" id=\"Layer_1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\" viewBox=\"0 0 139.2 98\" fill=\"#fff\" style=\"enable-background:new 0 0 139.2 98;\" xml:space=\"preserve\">\n <path d=\"M65.5,14c-3.1,6-6.8,19-6.8,19s-0.3,1-1-0.1c-0.4-0.7-5.6-7.8-8.2-11c-3-3.7-16.4-17.8-31.7-9.8C4,19.3,9.3,36.9,13.5,43.6\n\tc2.6,4,7.5,10.3,9,12.1c0.2,0.3,0.2,0.4-0.2,0.3c-1.2-0.3-4.3-1.1-9.9-2.6c-5.1-1.3-10-1.1-11.4,1.1c-1,1.6-1.6,4,0.4,7.8\n\tC5.4,69.5,16.6,81.2,35,85c0.4,0,0.3,0.4,0,0.9c-0.9,1.5-0.8,3.4,0.3,4.7c2.7,3.3,5.8,4.5,18,6.6c16.9,2.9,22.9-2.8,23.6-3.6\n\tc0.1,0,0.1,0,0.2,0c8.8,2.1,18,1.2,26.2-2.4c11.8-4.9,16.3-9.6,16.4-12.4s-6.1-2.2-7.9-2.7c-0.6-0.1-0.4-0.4,0-0.6\n\tc0.8-0.5,2.9-1.4,4.6-2.3c1.7-0.9,18.9-9.6,22.4-24.2c3.4-14.7-9.9-14.8-17-11.7s-13.9,6.4-15.4,7.1c-0.2,0.1-0.3,0-0.2-0.2\n\tc1.9-4.6,3.4-9.4,4.6-14.2c1.5-7,0.8-26-18.1-29.6C91.1,0.1,89.8,0,88.4,0C78.7,0.1,69.9,5.4,65.5,14 M66.2,43.9\n\tc1.5-4.2,2-6.3,4.5-14.4c3.1-10.1,9.7-18,20.4-14.8c12.5,3.8,9.6,16.4,7.6,21.7c-1.6,4.1-2.9,8.4-5.6,15.3c-2.1,5.6,2.5,5.7,4.9,5.2\n\tc2.8-0.6,11-4.8,16.1-7.2c3.8-1.7,10.8-6,14.8-1.9s-0.5,11.3-5.3,15.5c-4.8,4.3-17.5,9.6-21.4,11.2c-3.9,1.6-5.4,3.8-3.5,5\n\tc1.9,1.2,7.5,2.2,9.2,2.4c1.4,0.2,2.8,0.5,2.8,1.5c0,1.2-3.3,3.7-11,6.3c-5.2,1.6-10.7,2.2-16.1,1.6c-6.7-1.3-7.8-2.3-11-1.1\n\tc-2.3,0.9-2.5,2.8-5.9,4.2s-8.4,1.1-12.3,0.4s-10.6-1.3-11.3-4.4c-0.3-1.2,1.1-2,2.2-3.3c1.1-1.3,2.1-3.6-2.8-4.6\n\tc-1.3-0.3-14.7-2.4-23-6.6S8.1,65.1,8.9,62.7c0.7-1.9,2.6-2.1,5.2-1.6c2.9,0.6,15.8,4.1,19.7,4.1c1.6,0,2.8-0.3,3.4-1.3\n\tc1.5-2.7-3.2-5.9-7-10.5c-5.6-6.6-16.1-17.6-8.2-27.5c5.3-6.6,15.7-2.3,20,2.7c3.3,3.9,9.1,11.7,13.5,17.1c1.3,1.8,3.3,2.9,5.4,3.1\n\tc2.2,0,4.2-1.6,5.4-4.9\">\n </path>\n</svg>"}}},"reference":"logo1","updatedAt":"2026-07-25T03:52:40.047Z","createdAt":"2026-07-24T23:48:45.999Z"},{"_id":"6a63f9b3644b4ebe5ede5116","parent":"6a63f9b3644b4ebe5ede5114","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"logo2","params":{"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"},"disabled":true},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"params":{"content":"https://natura-hr-demo.data2.media/file/COiL3GBKUjCMIQHLigPb4"},"component":"data2-core-primitives@String"},"positionX":"center","positionY":"center","repeat":"no-repeat","size":"contain"},"component":"data2-core-types@Background","break":true}]},"component":"data2-core-types@Fill","break":true},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":120,"height":28,"exactWidth":120,"exactHeight":27.72}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":"50","y":"4","exactX":false,"exactY":false,"left":true,"top":true}},"filter":[{"component":"data2-core-types@BitmapFilter","params":{"type":"invert","unit":"%","value":100}}],"shadow":[{"component":"data2-core-types@Shadow","params":{"type":"complex","offsetX":"0","offsetY":"1","blur":"1","color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(108,92,224,1)"}}}},{"component":"data2-core-types@Shadow","params":{"type":"complex","offsetX":"0","offsetY":"1","blur":"1","color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(108,92,224,1)"}}}}],"transitions":[{"component":"data2-core-types@Transition","params":{"scope":"ALL","duration":"220","easing":"cubic-bezier(0.013157894736842105,0.0063750000000000195,0.2894736842105263,0.830375)"}}]},"reference":"logo2","updatedAt":"2026-07-25T00:21:22.638Z","createdAt":"2026-07-24T23:48:45.999Z"},{"_id":"6a63f9b3644b4ebe5ede5117","parent":"6a63f9b3644b4ebe5ede5114","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"logo3","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":140,"height":28,"exactWidth":140,"exactHeight":27.63}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":"50","y":"33","exactX":false,"exactY":false,"left":true,"top":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"top"}},"text":{"component":"data2-core-primitives@String","params":{"content":"Geomarketing"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"19"}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"shadow":[{"component":"data2-core-types@Shadow","params":{"type":"complex","offsetX":"0","offsetY":"1","blur":"1","color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(108,92,224,1)"}}}},{"component":"data2-core-types@Shadow","params":{"type":"complex","offsetX":"0","offsetY":"1","blur":"1","color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(108,92,224,1)"}}}}],"transitions":[{"component":"data2-core-types@Transition","params":{"scope":"ALL","duration":"220","easing":"cubic-bezier(0.013157894736842105,0.0063750000000000195,0.2894736842105263,0.830375)"}}]},"reference":"logo3","updatedAt":"2026-07-25T00:21:28.702Z","createdAt":"2026-07-24T23:48:45.999Z"},{"_id":"6a63fa19644b4ebe5ede511e","parent":"6a5f9b1ba5529ef885ca9686","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"logo","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":211,"height":60,"exactHeight":60}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":"20","y":"40","left":true,"exactX":false,"exactY":false,"top":true}},"text":""},"reference":"logo","updatedAt":"2026-07-25T03:33:32.554Z","createdAt":"2026-07-24T23:50:25.831Z"},{"_id":"6a63fa19644b4ebe5ede511f","parent":"6a63fa19644b4ebe5ede511e","component":"data2-blocks@Html","system":"6a57cfe9673eb7e3c5e57784","displayName":"logo1","params":{"super":{"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"},"disabled":true},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":false,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":40,"height":30,"exactWidth":40,"exactHeight":30}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":15,"exactX":false,"exactY":false,"top":true,"left":true}},"transitions":[{"component":"data2-core-types@Transition","params":{"scope":"ALL","duration":"200"}}],"shadow":[{"component":"data2-core-types@Shadow","params":{"type":"complex","offsetX":"0","offsetY":"1","blur":"1","color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(108,92,224,1)"}}}},{"component":"data2-core-types@Shadow","params":{"type":"complex","offsetX":"0","offsetY":"1","blur":"1","color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(108,92,224,1)"}}}}]},"text":{"component":"data2-core-primitives@String","params":{"content":"<svg version=\"1.1\" id=\"Layer_1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\" viewBox=\"0 0 139.2 98\" fill=\"#fff\" style=\"enable-background:new 0 0 139.2 98;\" xml:space=\"preserve\">\n <path d=\"M65.5,14c-3.1,6-6.8,19-6.8,19s-0.3,1-1-0.1c-0.4-0.7-5.6-7.8-8.2-11c-3-3.7-16.4-17.8-31.7-9.8C4,19.3,9.3,36.9,13.5,43.6\n\tc2.6,4,7.5,10.3,9,12.1c0.2,0.3,0.2,0.4-0.2,0.3c-1.2-0.3-4.3-1.1-9.9-2.6c-5.1-1.3-10-1.1-11.4,1.1c-1,1.6-1.6,4,0.4,7.8\n\tC5.4,69.5,16.6,81.2,35,85c0.4,0,0.3,0.4,0,0.9c-0.9,1.5-0.8,3.4,0.3,4.7c2.7,3.3,5.8,4.5,18,6.6c16.9,2.9,22.9-2.8,23.6-3.6\n\tc0.1,0,0.1,0,0.2,0c8.8,2.1,18,1.2,26.2-2.4c11.8-4.9,16.3-9.6,16.4-12.4s-6.1-2.2-7.9-2.7c-0.6-0.1-0.4-0.4,0-0.6\n\tc0.8-0.5,2.9-1.4,4.6-2.3c1.7-0.9,18.9-9.6,22.4-24.2c3.4-14.7-9.9-14.8-17-11.7s-13.9,6.4-15.4,7.1c-0.2,0.1-0.3,0-0.2-0.2\n\tc1.9-4.6,3.4-9.4,4.6-14.2c1.5-7,0.8-26-18.1-29.6C91.1,0.1,89.8,0,88.4,0C78.7,0.1,69.9,5.4,65.5,14 M66.2,43.9\n\tc1.5-4.2,2-6.3,4.5-14.4c3.1-10.1,9.7-18,20.4-14.8c12.5,3.8,9.6,16.4,7.6,21.7c-1.6,4.1-2.9,8.4-5.6,15.3c-2.1,5.6,2.5,5.7,4.9,5.2\n\tc2.8-0.6,11-4.8,16.1-7.2c3.8-1.7,10.8-6,14.8-1.9s-0.5,11.3-5.3,15.5c-4.8,4.3-17.5,9.6-21.4,11.2c-3.9,1.6-5.4,3.8-3.5,5\n\tc1.9,1.2,7.5,2.2,9.2,2.4c1.4,0.2,2.8,0.5,2.8,1.5c0,1.2-3.3,3.7-11,6.3c-5.2,1.6-10.7,2.2-16.1,1.6c-6.7-1.3-7.8-2.3-11-1.1\n\tc-2.3,0.9-2.5,2.8-5.9,4.2s-8.4,1.1-12.3,0.4s-10.6-1.3-11.3-4.4c-0.3-1.2,1.1-2,2.2-3.3c1.1-1.3,2.1-3.6-2.8-4.6\n\tc-1.3-0.3-14.7-2.4-23-6.6S8.1,65.1,8.9,62.7c0.7-1.9,2.6-2.1,5.2-1.6c2.9,0.6,15.8,4.1,19.7,4.1c1.6,0,2.8-0.3,3.4-1.3\n\tc1.5-2.7-3.2-5.9-7-10.5c-5.6-6.6-16.1-17.6-8.2-27.5c5.3-6.6,15.7-2.3,20,2.7c3.3,3.9,9.1,11.7,13.5,17.1c1.3,1.8,3.3,2.9,5.4,3.1\n\tc2.2,0,4.2-1.6,5.4-4.9\">\n </path>\n</svg>"}}},"reference":"logo1","updatedAt":"2026-07-25T03:52:36.471Z","createdAt":"2026-07-24T23:50:25.831Z"},{"_id":"6a63fa19644b4ebe5ede5120","parent":"6a63fa19644b4ebe5ede511e","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"logo2","params":{"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"},"disabled":true},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"params":{"content":"https://natura-hr-demo.data2.media/file/COiL3GBKUjCMIQHLigPb4"},"component":"data2-core-primitives@String"},"positionX":"center","positionY":"center","repeat":"no-repeat","size":"contain"},"component":"data2-core-types@Background","break":true}]},"component":"data2-core-types@Fill","break":true},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":120,"height":28,"exactWidth":120,"exactHeight":27.72}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":"50","y":"4","exactX":false,"exactY":false,"left":true,"top":true}},"filter":[{"component":"data2-core-types@BitmapFilter","params":{"type":"invert","unit":"%","value":100}}],"shadow":[{"component":"data2-core-types@Shadow","params":{"type":"complex","offsetX":"0","offsetY":"1","blur":"1","color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(108,92,224,1)"}}}},{"component":"data2-core-types@Shadow","params":{"type":"complex","offsetX":"0","offsetY":"1","blur":"1","color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(108,92,224,1)"}}}}],"opacity":{"disabled":false,"component":"data2-core-types@Opacity","params":{"value":0}},"transitions":[{"component":"data2-core-types@Transition","params":{"scope":"ALL","duration":"220","easing":"cubic-bezier(0.013157894736842105,0.0063750000000000195,0.2894736842105263,0.830375)"}}]},"reference":"logo2","updatedAt":"2026-07-25T00:21:11.415Z","createdAt":"2026-07-24T23:50:25.831Z"},{"_id":"6a63fa19644b4ebe5ede5121","parent":"6a63fa19644b4ebe5ede511e","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"logo3","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":140,"height":28,"exactWidth":140,"exactHeight":27.63}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":"50","y":"33","exactX":false,"exactY":false,"left":true,"top":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"top"}},"text":{"component":"data2-core-primitives@String","params":{"content":"Geomarketing"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"19"}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"shadow":[{"component":"data2-core-types@Shadow","params":{"type":"complex","offsetX":"0","offsetY":"1","blur":"1","color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(108,92,224,1)"}}}},{"component":"data2-core-types@Shadow","params":{"type":"complex","offsetX":"0","offsetY":"1","blur":"1","color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(108,92,224,1)"}}}}],"opacity":{"disabled":false,"component":"data2-core-types@Opacity","params":{"value":0}},"transitions":[{"component":"data2-core-types@Transition","params":{"scope":"ALL","duration":"220","easing":"cubic-bezier(0.013157894736842105,0.0063750000000000195,0.2894736842105263,0.830375)"}}]},"reference":"logo3","updatedAt":"2026-07-25T00:21:18.486Z","createdAt":"2026-07-24T23:50:25.831Z"},{"_id":"6a643a2a3cf95d21cfe3c83d","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"HubTopBarComponent","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":60,"exactHeight":60}},"componentClass":{"disabled":false,"component":"data2-core-types@ComponentClass","params":{}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"reference":"n-E3kblbz0EwqfdH7YVjX","updatedAt":"2026-07-26T19:42:48.959Z","createdAt":"2026-07-25T04:23:44.066Z"},{"_id":"6a643cfc70fbd195b8e6a9cc","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"New Artboard (44)","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768}},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"reference":"YlFUOc8WJsn_gAZBy8xDv","updatedAt":"2026-07-25T04:35:46.234Z","createdAt":"2026-07-25T04:35:46.234Z"},{"_id":"6a643ef570fbd195b8e6a9de","parent":"6a650c67879c2f24acad741b","component":"data2-blocks@Html","system":"6a57cfe9673eb7e3c5e57784","displayName":"logo","params":{"super":{"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"},"disabled":true},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":false,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":43,"height":31,"exactWidth":42.74,"exactHeight":31.17}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"y":3,"exactX":false,"exactY":false,"top":false,"left":true,"x":0,"fixed":false}},"transitions":[{"component":"data2-core-types@Transition","params":{"scope":"ALL","duration":"200"}}],"shadow":[{"component":"data2-core-types@Shadow","params":{"type":"complex","offsetX":"-1","offsetY":"-1","color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(168,157,243,1)"}},"blur":"1"}},{"component":"data2-core-types@Shadow","params":{"type":"complex","offsetX":"0","offsetY":"0","color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(168,157,243,1)"}},"blur":"2"}}],"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"text":{"component":"data2-core-primitives@String","params":{"content":"<svg version=\"1.1\" id=\"Layer_1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\" viewBox=\"0 0 149.2 118\" fill=\"#fff\" style=\"enable-background:new 0 0 139.2 98;\" xml:space=\"preserve\">\n <path d=\"M65.5,14c-3.1,6-6.8,19-6.8,19s-0.3,1-1-0.1c-0.4-0.7-5.6-7.8-8.2-11c-3-3.7-16.4-17.8-31.7-9.8C4,19.3,9.3,36.9,13.5,43.6\n\tc2.6,4,7.5,10.3,9,12.1c0.2,0.3,0.2,0.4-0.2,0.3c-1.2-0.3-4.3-1.1-9.9-2.6c-5.1-1.3-10-1.1-11.4,1.1c-1,1.6-1.6,4,0.4,7.8\n\tC5.4,69.5,16.6,81.2,35,85c0.4,0,0.3,0.4,0,0.9c-0.9,1.5-0.8,3.4,0.3,4.7c2.7,3.3,5.8,4.5,18,6.6c16.9,2.9,22.9-2.8,23.6-3.6\n\tc0.1,0,0.1,0,0.2,0c8.8,2.1,18,1.2,26.2-2.4c11.8-4.9,16.3-9.6,16.4-12.4s-6.1-2.2-7.9-2.7c-0.6-0.1-0.4-0.4,0-0.6\n\tc0.8-0.5,2.9-1.4,4.6-2.3c1.7-0.9,18.9-9.6,22.4-24.2c3.4-14.7-9.9-14.8-17-11.7s-13.9,6.4-15.4,7.1c-0.2,0.1-0.3,0-0.2-0.2\n\tc1.9-4.6,3.4-9.4,4.6-14.2c1.5-7,0.8-26-18.1-29.6C91.1,0.1,89.8,0,88.4,0C78.7,0.1,69.9,5.4,65.5,14 M66.2,43.9\n\tc1.5-4.2,2-6.3,4.5-14.4c3.1-10.1,9.7-18,20.4-14.8c12.5,3.8,9.6,16.4,7.6,21.7c-1.6,4.1-2.9,8.4-5.6,15.3c-2.1,5.6,2.5,5.7,4.9,5.2\n\tc2.8-0.6,11-4.8,16.1-7.2c3.8-1.7,10.8-6,14.8-1.9s-0.5,11.3-5.3,15.5c-4.8,4.3-17.5,9.6-21.4,11.2c-3.9,1.6-5.4,3.8-3.5,5\n\tc1.9,1.2,7.5,2.2,9.2,2.4c1.4,0.2,2.8,0.5,2.8,1.5c0,1.2-3.3,3.7-11,6.3c-5.2,1.6-10.7,2.2-16.1,1.6c-6.7-1.3-7.8-2.3-11-1.1\n\tc-2.3,0.9-2.5,2.8-5.9,4.2s-8.4,1.1-12.3,0.4s-10.6-1.3-11.3-4.4c-0.3-1.2,1.1-2,2.2-3.3c1.1-1.3,2.1-3.6-2.8-4.6\n\tc-1.3-0.3-14.7-2.4-23-6.6S8.1,65.1,8.9,62.7c0.7-1.9,2.6-2.1,5.2-1.6c2.9,0.6,15.8,4.1,19.7,4.1c1.6,0,2.8-0.3,3.4-1.3\n\tc1.5-2.7-3.2-5.9-7-10.5c-5.6-6.6-16.1-17.6-8.2-27.5c5.3-6.6,15.7-2.3,20,2.7c3.3,3.9,9.1,11.7,13.5,17.1c1.3,1.8,3.3,2.9,5.4,3.1\n\tc2.2,0,4.2-1.6,5.4-4.9\">\n </path>\n</svg>"}}},"index":0,"reference":"logo","updatedAt":"2026-08-05T02:48:51.829Z","createdAt":"2026-07-25T04:44:10.845Z"},{"_id":"6a643f3d70fbd195b8e6a9e0","parent":"6a643cfc70fbd195b8e6a9cc","component":"natura-geomarketing@n-E3kblbz0EwqfdH7YVjX","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":70,"exactWidth":false,"exactHeight":70}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":0,"exactY":0,"top":true,"left":true,"right":true,"growH":false}},"fill":{"disabled":false,"component":"data2-core-types@Fill","params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(241,241,248,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}},"index":1,"updatedAt":"2026-07-26T19:52:23.430Z","createdAt":"2026-07-25T04:45:28.421Z"},{"_id":"6a64462670fbd195b8e6a9f1","parent":"6a643cfc70fbd195b8e6a9cc","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":715,"exactWidth":false,"exactHeight":715.08}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":53,"exactX":false,"exactY":false,"fixed":false,"bottom":true,"right":true,"top":true,"growV":false,"left":true,"growH":false}},"style":{"flex":{"component":"data2-core-primitives@String","params":{"content":"1"}}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"index":0,"updatedAt":"2026-07-26T19:52:23.786Z","createdAt":"2026-07-25T05:15:01.549Z"},{"_id":"6a64462670fbd195b8e6a9f2","parent":"6a64462670fbd195b8e6a9f1","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"13"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":675,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":40,"exactX":false,"exactY":false,"bottom":true,"left":true,"top":true,"growV":false,"right":true,"growH":false}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"index":0,"updatedAt":"2026-07-25T05:21:10.868Z","createdAt":"2026-07-25T05:15:01.549Z"},{"_id":"6a64462670fbd195b8e6a9f3","parent":"6a64462670fbd195b8e6a9f2","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1306,"height":588,"exactWidth":1306,"exactHeight":false,"growHeightWithContent":true,"minHeight":588}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":30,"y":5,"exactX":false,"exactY":false,"fixed":false,"left":true,"top":true,"right":true,"growH":false}},"style":{"flex":{"component":"data2-core-primitives@String","params":{"content":"1"}}},"text":"","childrenMode":"cols"},"index":1,"updatedAt":"2026-07-25T05:16:30.418Z","createdAt":"2026-07-25T05:15:01.549Z"},{"_id":"6a64462670fbd195b8e6a9f4","parent":"6a64462670fbd195b8e6a9f3","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":420,"height":600,"exactWidth":false,"exactHeight":600}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":9,"y":-6,"exactX":8.5,"exactY":-6,"top":true,"left":true,"bottom":true,"growV":false,"fixed":false}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":17}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(26,26,26,1)"}},"style":{"flex":{"component":"data2-core-primitives@String","params":{"content":"1"}}},"text":"","childrenMode":"rows","repeat":{"params":{"end":{"component":"data2-core-primitives@Number","params":{"content":13}},"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"tFznon1CqdR98RwcHH1w_"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"}},"component":"data2-core-functions@ArraySlice"},"repeatReference":{"component":"data2-core-primitives@String","params":{"content":"col1"}}},"updatedAt":"2026-07-25T05:15:01.549Z","createdAt":"2026-07-25T05:15:01.549Z"},{"_id":"6a64462670fbd195b8e6a9f5","parent":"6a64462670fbd195b8e6a9f4","component":"natura-geomarketing@0CZ7pC6NULlDQhV3hv-0G","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"9"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":180,"height":40,"exactWidth":179.8,"exactHeight":40,"growWidthWithContent":true}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":10,"y":"10","exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"stateDefinitions":[{"component":"data2-core-user-interface@StateDefinition","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"hover"}},"component":"data2-core-primitives@Boolean"}}],"onMouseEnter":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6a64462670fbd195b8e6a9f5"}},"key":{"component":"data2-core-primitives@String","params":{"content":"hover"}}}},"value":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-types@Setter"},"onMouseLeave":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6a64462670fbd195b8e6a9f5"}},"key":{"component":"data2-core-primitives@String","params":{"content":"hover"}}}},"value":{"params":{"content":false},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-types@Setter"}},"componentState":{"params":{"content":{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6a64462670fbd195b8e6a9f5"}},"key":{"component":"data2-core-primitives@String","params":{"content":"hover"}}}}}},"comparisonSubject":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-comparison-operators@Equal"}},"component":"data2-core-primitives@String","break":true},"label":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"col1Repeater.email"}}},"component":"data2-core-types@Reference"}},"updatedAt":"2026-07-25T05:15:01.549Z","createdAt":"2026-07-25T05:15:01.549Z"},{"_id":"6a64462670fbd195b8e6a9f6","parent":"6a64462670fbd195b8e6a9f3","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":420,"height":600,"exactWidth":false,"exactHeight":600}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":9,"y":-6,"exactX":8.5,"exactY":-6,"top":true,"left":true,"bottom":true,"growV":false,"fixed":false}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":17}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(26,26,26,1)"}},"style":{"flex":{"component":"data2-core-primitives@String","params":{"content":"1"}}},"text":"","childrenMode":"rows","repeat":{"params":{"end":{"component":"data2-core-primitives@Number","params":{"content":26}},"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"tFznon1CqdR98RwcHH1w_"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"start":{"component":"data2-core-primitives@Number","params":{"content":13}}},"component":"data2-core-functions@ArraySlice"},"repeatReference":{"component":"data2-core-primitives@String","params":{"content":"col2"}}},"updatedAt":"2026-07-25T05:15:01.549Z","createdAt":"2026-07-25T05:15:01.549Z"},{"_id":"6a64462670fbd195b8e6a9f7","parent":"6a64462670fbd195b8e6a9f6","component":"natura-geomarketing@0CZ7pC6NULlDQhV3hv-0G","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"9"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":180,"height":40,"exactWidth":179.8,"exactHeight":40,"growWidthWithContent":true}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":10,"y":"10","exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"stateDefinitions":[{"component":"data2-core-user-interface@StateDefinition","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"hover"}},"component":"data2-core-primitives@Boolean"}}],"onMouseEnter":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6a64462670fbd195b8e6a9f7"}},"key":{"component":"data2-core-primitives@String","params":{"content":"hover"}}}},"value":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-types@Setter"},"onMouseLeave":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6a64462670fbd195b8e6a9f7"}},"key":{"component":"data2-core-primitives@String","params":{"content":"hover"}}}},"value":{"params":{"content":false},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-types@Setter"}},"componentState":{"params":{"content":{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6a64462670fbd195b8e6a9f7"}},"key":{"component":"data2-core-primitives@String","params":{"content":"hover"}}}}}},"comparisonSubject":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-comparison-operators@Equal"}},"component":"data2-core-primitives@String","break":true},"label":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"col2Repeater.email"}}},"component":"data2-core-types@Reference"}},"updatedAt":"2026-07-25T05:15:01.549Z","createdAt":"2026-07-25T05:15:01.549Z"},{"_id":"6a64462670fbd195b8e6a9f8","parent":"6a64462670fbd195b8e6a9f3","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":420,"height":600,"exactWidth":false,"exactHeight":600}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":9,"y":-6,"exactX":8.5,"exactY":-6,"top":true,"left":true,"bottom":true,"growV":false,"fixed":false}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":17}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(26,26,26,1)"}},"style":{"flex":{"component":"data2-core-primitives@String","params":{"content":"1"}}},"text":"","childrenMode":"rows","repeat":{"params":{"end":{"component":"data2-core-primitives@Number","params":{"content":39}},"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"tFznon1CqdR98RwcHH1w_"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"start":{"component":"data2-core-primitives@Number","params":{"content":26}}},"component":"data2-core-functions@ArraySlice"},"repeatReference":{"component":"data2-core-primitives@String","params":{"content":"col3"}}},"updatedAt":"2026-07-25T05:15:01.549Z","createdAt":"2026-07-25T05:15:01.549Z"},{"_id":"6a64462670fbd195b8e6a9f9","parent":"6a64462670fbd195b8e6a9f8","component":"natura-geomarketing@0CZ7pC6NULlDQhV3hv-0G","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"9"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":180,"height":40,"exactWidth":179.8,"exactHeight":40,"growWidthWithContent":true}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":10,"y":"10","exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"stateDefinitions":[{"component":"data2-core-user-interface@StateDefinition","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"hover"}},"component":"data2-core-primitives@Boolean"}}],"onMouseEnter":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6a64462670fbd195b8e6a9f9"}},"key":{"component":"data2-core-primitives@String","params":{"content":"hover"}}}},"value":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-types@Setter"},"onMouseLeave":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6a64462670fbd195b8e6a9f9"}},"key":{"component":"data2-core-primitives@String","params":{"content":"hover"}}}},"value":{"params":{"content":false},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-types@Setter"}},"componentState":{"params":{"content":{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6a64462670fbd195b8e6a9f9"}},"key":{"component":"data2-core-primitives@String","params":{"content":"hover"}}}}}},"comparisonSubject":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-comparison-operators@Equal"}},"component":"data2-core-primitives@String","break":true},"label":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"col3Repeater.email"}}},"component":"data2-core-types@Reference"}},"updatedAt":"2026-07-25T05:15:01.549Z","createdAt":"2026-07-25T05:15:01.549Z"},{"_id":"6a64462670fbd195b8e6a9fa","parent":"6a64462670fbd195b8e6a9f2","component":"natura-geomarketing@4hvch1V6MXqBr9rL-nvAu","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1326,"height":60,"exactWidth":1326,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"20","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true,"top":true,"right":true,"growH":false}},"border":{"disabled":false,"component":"data2-core-types@Border","params":{"width":{"bottom":"1"},"color":"#e7e7e7"}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"text":""},"componentState":{"component":"data2-core-primitives@String","params":{"content":"gestaoDeAcessos"}}},"index":0,"updatedAt":"2026-07-25T05:20:34.425Z","createdAt":"2026-07-25T05:15:01.549Z"},{"_id":"6a64487c70fbd195b8e6aa1f","parent":"6a5f1bc4951c23b0077674d1","component":"natura-geomarketing@n-E3kblbz0EwqfdH7YVjX","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":70,"exactWidth":false,"exactHeight":70}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":0,"exactY":0,"top":true,"left":true,"right":true,"growH":false}},"fill":{"disabled":false,"component":"data2-core-types@Fill","params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(241,241,248,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}},"index":1,"updatedAt":"2026-07-27T18:23:26.982Z","createdAt":"2026-07-25T05:24:51.742Z"},{"_id":"6a6448f470fbd195b8e6aa21","parent":"6a5ecd59c28b758182f0d35f","component":"natura-geomarketing@n-E3kblbz0EwqfdH7YVjX","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":70,"exactWidth":false,"exactHeight":70}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":false,"exactY":false,"top":true,"left":true,"right":true,"growH":false}},"fill":{"disabled":false,"component":"data2-core-types@Fill","params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(241,241,248,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}},"index":1,"updatedAt":"2026-07-27T18:23:25.416Z","createdAt":"2026-07-25T05:26:54.706Z"},{"_id":"6a64494170fbd195b8e6aa2b","parent":"6a5f1bc4951c23b0077674d1","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"13"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":675,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":90,"exactX":false,"exactY":false,"bottom":true,"left":true,"top":true,"growV":false,"right":true,"growH":false}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"index":0,"updatedAt":"2026-07-25T05:28:11.678Z","createdAt":"2026-07-25T05:28:11.678Z"},{"_id":"6a64494170fbd195b8e6aa2c","parent":"6a64494170fbd195b8e6aa2b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1306,"height":588,"exactWidth":1306,"exactHeight":false,"growHeightWithContent":true,"minHeight":588}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":30,"y":5,"exactX":false,"exactY":false,"fixed":false,"left":true,"top":true,"right":true,"growH":false}},"style":{"flex":{"component":"data2-core-primitives@String","params":{"content":"1"}}},"text":"","childrenMode":"cols"},"index":1,"updatedAt":"2026-07-25T05:28:11.678Z","createdAt":"2026-07-25T05:28:11.678Z"},{"_id":"6a64494170fbd195b8e6aa2d","parent":"6a64494170fbd195b8e6aa2c","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":420,"height":600,"exactWidth":false,"exactHeight":600}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":9,"y":-6,"exactX":8.5,"exactY":-6,"top":true,"left":true,"bottom":true,"growV":false,"fixed":false}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":17}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(26,26,26,1)"}},"style":{"flex":{"component":"data2-core-primitives@String","params":{"content":"1"}}},"text":"","childrenMode":"rows","repeat":{"params":{"end":{"component":"data2-core-primitives@Number","params":{"content":13}},"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"tFznon1CqdR98RwcHH1w_"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"}},"component":"data2-core-functions@ArraySlice"},"repeatReference":{"component":"data2-core-primitives@String","params":{"content":"col1"}}},"updatedAt":"2026-07-25T05:28:11.678Z","createdAt":"2026-07-25T05:28:11.678Z"},{"_id":"6a64494170fbd195b8e6aa2e","parent":"6a64494170fbd195b8e6aa2d","component":"natura-geomarketing@0CZ7pC6NULlDQhV3hv-0G","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"9"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":180,"height":40,"exactWidth":179.8,"exactHeight":40,"growWidthWithContent":true}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":10,"y":"10","exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"stateDefinitions":[{"component":"data2-core-user-interface@StateDefinition","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"hover"}},"component":"data2-core-primitives@Boolean"}}],"onMouseEnter":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6a64494170fbd195b8e6aa2e"}},"key":{"component":"data2-core-primitives@String","params":{"content":"hover"}}}},"value":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-types@Setter"},"onMouseLeave":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6a64494170fbd195b8e6aa2e"}},"key":{"component":"data2-core-primitives@String","params":{"content":"hover"}}}},"value":{"params":{"content":false},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-types@Setter"}},"componentState":{"params":{"content":{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6a64494170fbd195b8e6aa2e"}},"key":{"component":"data2-core-primitives@String","params":{"content":"hover"}}}}}},"comparisonSubject":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-comparison-operators@Equal"}},"component":"data2-core-primitives@String","break":true},"label":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"col1Repeater.email"}}},"component":"data2-core-types@Reference"}},"updatedAt":"2026-07-25T05:28:11.678Z","createdAt":"2026-07-25T05:28:11.678Z"},{"_id":"6a64494170fbd195b8e6aa2f","parent":"6a64494170fbd195b8e6aa2c","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":420,"height":600,"exactWidth":false,"exactHeight":600}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":9,"y":-6,"exactX":8.5,"exactY":-6,"top":true,"left":true,"bottom":true,"growV":false,"fixed":false}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":17}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(26,26,26,1)"}},"style":{"flex":{"component":"data2-core-primitives@String","params":{"content":"1"}}},"text":"","childrenMode":"rows","repeat":{"params":{"end":{"component":"data2-core-primitives@Number","params":{"content":26}},"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"tFznon1CqdR98RwcHH1w_"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"start":{"component":"data2-core-primitives@Number","params":{"content":13}}},"component":"data2-core-functions@ArraySlice"},"repeatReference":{"component":"data2-core-primitives@String","params":{"content":"col2"}}},"updatedAt":"2026-07-25T05:28:11.678Z","createdAt":"2026-07-25T05:28:11.678Z"},{"_id":"6a64494170fbd195b8e6aa30","parent":"6a64494170fbd195b8e6aa2f","component":"natura-geomarketing@0CZ7pC6NULlDQhV3hv-0G","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"9"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":180,"height":40,"exactWidth":179.8,"exactHeight":40,"growWidthWithContent":true}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":10,"y":"10","exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"stateDefinitions":[{"component":"data2-core-user-interface@StateDefinition","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"hover"}},"component":"data2-core-primitives@Boolean"}}],"onMouseEnter":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6a64494170fbd195b8e6aa30"}},"key":{"component":"data2-core-primitives@String","params":{"content":"hover"}}}},"value":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-types@Setter"},"onMouseLeave":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6a64494170fbd195b8e6aa30"}},"key":{"component":"data2-core-primitives@String","params":{"content":"hover"}}}},"value":{"params":{"content":false},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-types@Setter"}},"componentState":{"params":{"content":{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6a64494170fbd195b8e6aa30"}},"key":{"component":"data2-core-primitives@String","params":{"content":"hover"}}}}}},"comparisonSubject":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-comparison-operators@Equal"}},"component":"data2-core-primitives@String","break":true},"label":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"col2Repeater.email"}}},"component":"data2-core-types@Reference"}},"updatedAt":"2026-07-25T05:28:11.678Z","createdAt":"2026-07-25T05:28:11.678Z"},{"_id":"6a64494170fbd195b8e6aa31","parent":"6a64494170fbd195b8e6aa2c","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":420,"height":600,"exactWidth":false,"exactHeight":600}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":9,"y":-6,"exactX":8.5,"exactY":-6,"top":true,"left":true,"bottom":true,"growV":false,"fixed":false}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":17}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(26,26,26,1)"}},"style":{"flex":{"component":"data2-core-primitives@String","params":{"content":"1"}}},"text":"","childrenMode":"rows","repeat":{"params":{"end":{"component":"data2-core-primitives@Number","params":{"content":39}},"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"tFznon1CqdR98RwcHH1w_"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"start":{"component":"data2-core-primitives@Number","params":{"content":26}}},"component":"data2-core-functions@ArraySlice"},"repeatReference":{"component":"data2-core-primitives@String","params":{"content":"col3"}}},"updatedAt":"2026-07-25T05:28:11.678Z","createdAt":"2026-07-25T05:28:11.678Z"},{"_id":"6a64494170fbd195b8e6aa32","parent":"6a64494170fbd195b8e6aa31","component":"natura-geomarketing@0CZ7pC6NULlDQhV3hv-0G","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"9"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":180,"height":40,"exactWidth":179.8,"exactHeight":40,"growWidthWithContent":true}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":10,"y":"10","exactX":false,"exactY":false,"fixed":false,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"stateDefinitions":[{"component":"data2-core-user-interface@StateDefinition","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"hover"}},"component":"data2-core-primitives@Boolean"}}],"onMouseEnter":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6a64494170fbd195b8e6aa32"}},"key":{"component":"data2-core-primitives@String","params":{"content":"hover"}}}},"value":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-types@Setter"},"onMouseLeave":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6a64494170fbd195b8e6aa32"}},"key":{"component":"data2-core-primitives@String","params":{"content":"hover"}}}},"value":{"params":{"content":false},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-types@Setter"}},"componentState":{"params":{"content":{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6a64494170fbd195b8e6aa32"}},"key":{"component":"data2-core-primitives@String","params":{"content":"hover"}}}}}},"comparisonSubject":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-comparison-operators@Equal"}},"component":"data2-core-primitives@String","break":true},"label":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"col3Repeater.email"}}},"component":"data2-core-types@Reference"}},"updatedAt":"2026-07-25T05:28:11.678Z","createdAt":"2026-07-25T05:28:11.678Z"},{"_id":"6a64494170fbd195b8e6aa33","parent":"6a64494170fbd195b8e6aa2b","component":"natura-geomarketing@4hvch1V6MXqBr9rL-nvAu","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1326,"height":60,"exactWidth":1326,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"20","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true,"top":true,"right":true,"growH":false}},"border":{"disabled":false,"component":"data2-core-types@Border","params":{"width":{"bottom":"1"},"color":"#e7e7e7"}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"text":""},"componentState":{"component":"data2-core-primitives@String","params":{"content":"gestaoDeAcessos"}}},"index":0,"updatedAt":"2026-07-25T05:28:11.678Z","createdAt":"2026-07-25T05:28:11.678Z"},{"_id":"6a64499070fbd195b8e6aa5d","parent":"6a5ecd59c28b758182f0d35f","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"13"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":678,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":90,"exactX":false,"exactY":false,"bottom":true,"left":true,"top":true,"growV":false,"right":true,"growH":false}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"fill":{"disabled":false,"component":"data2-core-types@Fill","params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]}},"childrenMode":"rows"},"index":0,"updatedAt":"2026-07-27T18:23:25.406Z","createdAt":"2026-07-25T05:29:42.525Z"},{"_id":"6a64499070fbd195b8e6aa5f","parent":"6a64499070fbd195b8e6aa5d","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#f2f2f2","radius":{"leftTop":"0"},"width":{"left":"0","top":"0","right":"0","bottom":"1"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1304,"height":588,"exactWidth":1304,"exactHeight":false,"growHeightWithContent":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":60,"y":0,"exactX":false,"exactY":false,"fixed":false,"left":true,"top":true,"right":true,"growH":false}},"childrenMode":"cols","textFormat":{"disabled":true,"component":"data2-core-types@TextFormat","params":{}},"style":{"flex":{"component":"data2-core-primitives@String","params":{"content":"1"}}},"scroll":{"disabled":false,"component":"data2-core-types@Scroll","params":{"y":true}},"hide":{"params":{"subject":{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Y0MVeSB0t_bjBEppVYgQJ"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.state"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"done"}}},"component":"data2-core-comparison-operators@Equal"}},"component":"data2-core-logical-operators@Not"}},"index":1,"updatedAt":"2026-07-31T08:30:53.356Z","createdAt":"2026-07-25T05:29:42.525Z"},{"_id":"6a64499070fbd195b8e6aa60","parent":"6a64499070fbd195b8e6aa5f","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":566,"height":1007,"exactWidth":false,"exactHeight":1007,"growHeightWithContent":true}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":20,"y":0,"exactX":false,"exactY":false,"bottom":false,"right":false,"top":true,"growV":false,"fixed":false,"left":true,"growH":false}},"childrenMode":"rows","style":{"flex":{"component":"data2-core-primitives@String","params":{"content":"1.33"}}}},"index":2,"updatedAt":"2026-08-04T04:50:46.155Z","createdAt":"2026-07-25T05:29:42.525Z"},{"_id":"6a64499070fbd195b8e6aa61","parent":"6a64499070fbd195b8e6aa60","component":"natura-geomarketing@gm34nI8iHui1SSuwobYTT","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":546,"height":200,"exactWidth":546,"exactHeight":200,"growHeightWithContent":true}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":20,"left":true,"exactX":false,"exactY":false,"top":true,"fixed":false,"right":true,"growH":false}},"childrenMode":"grid"}},"index":3,"updatedAt":"2026-07-29T13:53:58.340Z","createdAt":"2026-07-25T05:29:42.525Z"},{"_id":"6a64499070fbd195b8e6aa62","parent":"6a64499070fbd195b8e6aa60","component":"natura-geomarketing@ONebofT7KQiRJeb0mlziC","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":546,"height":100,"exactWidth":546,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"left":true,"exactX":false,"exactY":false,"top":true,"fixed":false,"right":true,"growH":false}},"childrenMode":"grid","childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}},"index":2,"updatedAt":"2026-07-25T05:29:42.525Z","createdAt":"2026-07-25T05:29:42.525Z"},{"_id":"6a64499070fbd195b8e6aa63","parent":"6a64499070fbd195b8e6aa60","component":"natura-geomarketing@gfyeGJI77tJzdwSZTKCnV","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":546,"height":550,"growHeightWithContent":true}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":20,"fixed":false,"exactX":0,"exactY":20,"left":true,"top":true,"right":true,"growH":false}},"childrenMode":{"params":{"compare":{"params":{"components":[{"params":{"subject":{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__DeviceController"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"width"}}}},"comparisonSubject":{"component":"data2-core-primitives@Number","params":{"content":1600}}},"component":"data2-core-comparison-operators@EqualOrLesserThan"}},"component":"data2-core-logical-operators@Not"},{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"builder"}}},"component":"data2-core-types@Reference"}]},"component":"data2-core-logical-operators@Or"},"then":"cols","else":{"component":"data2-core-primitives@String","params":{"content":"rows"}}},"component":"data2-core-flow@If"},"text":""},"componentState":{"params":{"compare":{"params":{"components":[{"params":{"subject":{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__DeviceController"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"width"}}}},"comparisonSubject":{"component":"data2-core-primitives@Number","params":{"content":1900}}},"component":"data2-core-comparison-operators@EqualOrLesserThan"}},"component":"data2-core-logical-operators@Not"},{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"builder"}}},"component":"data2-core-types@Reference"}]},"component":"data2-core-logical-operators@Or"},"then":{"component":"data2-core-primitives@String","params":{"content":"cols"}},"else":{"component":"data2-core-primitives@String","params":{"content":"rows"}}},"component":"data2-core-flow@If"}},"updatedAt":"2026-07-25T05:29:42.525Z","createdAt":"2026-07-25T05:29:42.525Z"},{"_id":"6a64499070fbd195b8e6aa64","parent":"6a64499070fbd195b8e6aa5f","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":640,"height":540,"growHeightWithContent":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":20,"fixed":false,"exactX":0,"exactY":20,"top":true,"left":true,"growH":false,"bottom":true,"growV":false}},"childrenMode":"rows","childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"style":{"flex":{"component":"data2-core-primitives@String","params":{"content":"1.5"}}}},"index":1,"updatedAt":"2026-08-04T04:50:46.420Z","createdAt":"2026-07-25T05:29:42.525Z"},{"_id":"6a64499070fbd195b8e6aa65","parent":"6a64499070fbd195b8e6aa64","component":"natura-geomarketing@O4-zOAoAC9BwIp-XZ0ekO","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":184,"height":60,"exactWidth":183.77,"exactHeight":60}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":10,"exactX":false,"exactY":false,"top":true,"left":true,"right":false}},"text":"","textSize":{"component":"data2-core-primitives@Number","params":{"content":14}},"children":{"locked":true}},"text":""},"index":0,"updatedAt":"2026-07-25T05:29:42.525Z","createdAt":"2026-07-25T05:29:42.525Z"},{"_id":"6a64499070fbd195b8e6aa66","parent":"6a64499070fbd195b8e6aa64","component":"natura-geomarketing@yJwIwtjYNeYGoGF68aYQM","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#9a9b9c","radius":{"leftTop":"13"},"width":{"left":"1","top":"1","right":"1","bottom":"1"}},"disabled":false},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":640,"height":440,"exactWidth":640,"exactHeight":440}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":3,"y":100,"exactX":2.59,"exactY":100,"left":true,"top":true,"bottom":false,"growV":false,"growH":false,"right":true,"fixed":false}},"style":{"transformOrigin":{"component":"data2-core-primitives@String","params":{"content":"top left"}},"flex":{"component":"data2-core-primitives@String","params":{"content":"1"}}}},"assignments":{"params":{"fieldsList":{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"ziIl3zJpxF2x8qsRQy10a"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.municipios_normalized"}}},"component":"data2-core-types@Getter"},"mapper":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"m"}}],"body":{"key":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m"}}},"component":"data2-core-types@Reference"},"value":{"component":"data2-core-primitives@String","params":{}}}}}},"component":"data2-core-functions@ArrayMap"}},"component":"data2-core-types@FieldSet"},"groups":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"ziIl3zJpxF2x8qsRQy10a"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.setores_destino"}}},"component":"data2-core-types@Getter"},"ufs":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"ziIl3zJpxF2x8qsRQy10a"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.UF"}}}},"store":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"NLO6dHteJxVmbynNHsqPv"}},"municipio":{"params":{"portions":{"params":{"array":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"ziIl3zJpxF2x8qsRQy10a"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.municipios"}}}},"mapper":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"m"}},{"component":"data2-core-primitives@String","params":{"content":"i"}},{"component":"data2-core-primitives@String","params":{"content":"l"}}],"body":{"params":{"portions":[{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m"}}},"component":"data2-core-types@Reference"},{"params":{"compare":{"params":{"subject":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"l.length"}}},"component":"data2-core-types@Reference"},"comparisonSubject":{"params":{"components":[{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"i"}}},"component":"data2-core-types@Reference"},{"component":"data2-core-primitives@Number","params":{"content":1}}]},"component":"data2-core-numerical-operators@Add"}},"component":"data2-core-comparison-operators@Equal"},"else":{"component":"data2-core-primitives@String","params":{"content":","}}},"component":"data2-core-flow@If"}]},"component":"data2-core-functions@StringConcat"}}}},"component":"data2-core-functions@ArrayMap"}},"component":"data2-core-functions@StringConcat"},"colors":{"params":{"fieldsList":{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"ziIl3zJpxF2x8qsRQy10a"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.setores_destino"}}},"component":"data2-core-types@Getter"},"mapper":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"m"}},{"component":"data2-core-primitives@String","params":{"content":"i"}},{"component":"data2-core-primitives@String","params":{"content":"l"}}],"body":{"key":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m.sector"}}},"component":"data2-core-types@Reference"},"value":{"params":{"color":{"params":{"color":{"h":{"params":{"components":[{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"i"}}},"component":"data2-core-types@Reference"},{"params":{"components":[{"params":{"components":[{"component":"data2-core-primitives@Number","params":{"content":10}},{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"l.length"}}},"component":"data2-core-types@Reference"}]},"component":"data2-core-numerical-operators@Multiply"},{"component":"data2-core-primitives@Number","params":{"content":36}}]},"component":"data2-core-numerical-operators@Divide"}]},"component":"data2-core-numerical-operators@Multiply"},"s":{"component":"data2-core-primitives@String","params":{"content":"1"}},"l":{"component":"data2-core-primitives@String","params":{"content":"0.5"}},"alpha":{"component":"data2-core-primitives@String","params":{"content":"1"}}}},"component":"data2-core-color@ColorFormatHsl"}},"component":"data2-core-color@ColorFormatHex"}}}}},"component":"data2-core-functions@ArrayMap"}},"component":"data2-core-types@FieldSet"}},"index":1,"updatedAt":"2026-07-31T08:25:56.716Z","createdAt":"2026-07-25T05:29:42.525Z"},{"_id":"6a64499070fbd195b8e6aa67","parent":"6a64499070fbd195b8e6aa64","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":640,"height":40,"exactWidth":640,"exactHeight":40,"growHeightWithContent":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":20,"exactX":false,"exactY":false,"fixed":false,"left":true,"top":true,"right":true,"growH":false}},"text":"","childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"updatedAt":"2026-07-25T05:29:42.525Z","createdAt":"2026-07-25T05:29:42.525Z"},{"_id":"6a64499070fbd195b8e6aa68","parent":"6a64499070fbd195b8e6aa67","component":"natura-geomarketing@1S_fB3hvzwUro47iuZ55p","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":640,"height":40,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"left":true,"exactX":false,"exactY":false,"top":true,"fixed":false,"right":false,"growH":false}},"childrenMode":"cols","textFormat":{"disabled":true,"component":"data2-core-types@TextFormat","params":{}}}},"index":2,"updatedAt":"2026-07-25T05:29:42.525Z","createdAt":"2026-07-25T05:29:42.525Z"},{"_id":"6a64499070fbd195b8e6aa69","parent":"6a64499070fbd195b8e6aa67","component":"natura-geomarketing@_3BHHDtVc0ZK0wlfcnLM3","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":640,"height":284,"exactWidth":false,"exactHeight":false,"growHeightWithContent":true,"minHeight":500}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":20,"fixed":false,"exactX":0,"exactY":20,"left":true,"top":true,"right":true,"growH":false}}},"componentState":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kfqDiL83O6CTlKOfellwq"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.additionalInfo"}}}}},"updatedAt":"2026-07-25T05:29:42.525Z","createdAt":"2026-07-25T05:29:42.525Z"},{"_id":"6a650c67879c2f24acad741b","parent":"6a643a2a3cf95d21cfe3c83d","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"logoContainer","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":163,"height":34,"exactWidth":163.06}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":"20","y":"16","exactX":false,"exactY":false,"left":true}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"onMouseDown":{"disabled":false,"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"MNv9vHdKUB_s3iOqiMkiBInterface"}},"prop":"goTo","args":[{"component":"data2-core-primitives@String","params":{"content":"/"}}]}},"cursor":"pointer"},"index":0,"updatedAt":"2026-07-27T18:33:24.572Z","createdAt":"2026-07-25T19:20:50.444Z"},{"_id":"6a665f2d93f1e5c0b6a198b9","parent":"6a643a2a3cf95d21cfe3c83d","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"body","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":323,"height":47,"exactWidth":323.07,"exactHeight":47.04}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":"1003","y":13,"exactX":false,"exactY":false,"top":false,"left":false,"bottom":true,"growV":false,"fixed":false,"right":true,"growH":false}},"childrenMode":"reversed-cols","font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(27,27,43,1)"}},"hide":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"index":2,"reference":"body","updatedAt":"2026-07-31T08:29:29.351Z","createdAt":"2026-07-26T19:26:16.589Z"},{"_id":"6a665f2d93f1e5c0b6a198ba","parent":"6a665f2d93f1e5c0b6a198b9","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":159,"height":40,"exactWidth":159.09,"exactHeight":false,"growWidthWithContent":true}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":8,"y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"text":{"component":"data2-core-primitives@String","params":{"content":"lucca@data2.app"}},"textColor":{"disabled":true,"component":"data2-core-types@Color","params":{}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle","letterSpacing":""}}},"index":1,"updatedAt":"2026-07-26T19:29:02.247Z","createdAt":"2026-07-26T19:26:16.589Z"},{"_id":"6a665f2d93f1e5c0b6a198bb","parent":"6a665f2d93f1e5c0b6a198b9","component":"data2-blocks@Html","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":16,"height":21,"exactWidth":16.009999999999998,"exactHeight":20.56}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":10,"exactX":false,"exactY":false,"fixed":false,"left":true}}},"text":{"component":"data2-core-primitives@String","params":{"content":"<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"100% \" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#1B1B2B\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"feather feather-chevron-down\"><polyline points=\"6 9 12 15 18 9\"></polyline></svg>"}}},"index":0,"updatedAt":"2026-07-26T19:36:14.837Z","createdAt":"2026-07-26T19:26:16.589Z"},{"_id":"6a665fa593f1e5c0b6a198c1","parent":"6a665f2d93f1e5c0b6a198b9","component":"data2-blocks@Html","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":22,"height":37,"exactWidth":22,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"5","y":"8","exactX":false,"exactY":false,"fixed":false,"left":true}}},"text":{"component":"data2-core-primitives@String","params":{"content":"<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"#1B1B2B\" class=\"size-6\">\n  <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M15.75 6a3.75 3.75 0 1 1-7.5 0 3.75 3.75 0 0 1 7.5 0ZM4.501 20.118a7.5 7.5 0 0 1 14.998 0A17.933 17.933 0 0 1 12 21.75c-2.676 0-5.216-.584-7.499-1.632Z\" />\n</svg>"}}},"index":2,"updatedAt":"2026-07-26T19:37:44.092Z","createdAt":"2026-07-26T19:28:54.316Z"},{"_id":"6a666284607e9bc66b1bae7a","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"HubTopBarShortcut","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":284,"height":40,"exactWidth":284.24,"exactHeight":false,"growWidthWithContent":true}},"componentClass":{"disabled":false,"component":"data2-core-types@ComponentClass","params":{}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"componentStates":[{"component":"data2-core-types@ComponentState","params":{"state":{"component":"data2-core-primitives@String","params":{"content":"simuladores"}},"artboard":{"disabled":false,"component":"data2-core-types@ArtboardReference","params":{"reference":"c2WTvq5i85sOrTkEXFRti"}}}},{"component":"data2-core-types@ComponentState","params":{"state":{"component":"data2-core-primitives@String","params":{"content":"admin"}},"artboard":{"disabled":false,"component":"data2-core-types@ArtboardReference","params":{"reference":"w5AERCyEk8sidBQr-3na4"}}}},{"component":"data2-core-types@ComponentState","params":{"state":{"component":"data2-core-primitives@String","params":{"content":"cenarios"}},"artboard":{"disabled":false,"component":"data2-core-types@ArtboardReference","params":{"reference":"12HGth08_9P_9lz97RYRE"}}}}]},"reference":"f2_yWxSf4RxX4sceM8HEg","updatedAt":"2026-07-27T18:29:06.560Z","createdAt":"2026-07-26T19:40:27.668Z"},{"_id":"6a6664093733859be08fd69a","parent":"6a643a2a3cf95d21cfe3c83d","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Copy of routesContainer","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1095,"height":47,"exactWidth":1095.13,"exactHeight":47.04}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":"225","y":13,"exactX":false,"exactY":false,"top":false,"left":true,"bottom":true,"growV":false,"fixed":false,"right":false,"growH":false}},"childrenMode":"cols","textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(27,27,43,1)"}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"index":1,"reference":"routesContainer","updatedAt":"2026-07-27T13:33:01.782Z","createdAt":"2026-07-26T19:46:58.699Z"},{"_id":"6a6664093733859be08fd69b","parent":"6a6664093733859be08fd69a","component":"natura-geomarketing@f2_yWxSf4RxX4sceM8HEg","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":116,"height":40,"exactWidth":false,"exactHeight":false,"growWidthWithContent":true}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"30","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textColor":{"disabled":true,"component":"data2-core-types@Color","params":{}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"componentState":{"component":"data2-core-primitives@String","params":{"content":"cenarios"}}},"index":3,"updatedAt":"2026-07-27T18:30:53.320Z","createdAt":"2026-07-26T19:46:58.699Z"},{"_id":"6a6664093733859be08fd69c","parent":"6a6664093733859be08fd69a","component":"natura-geomarketing@f2_yWxSf4RxX4sceM8HEg","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":50,"height":40,"exactWidth":false,"exactHeight":false,"growWidthWithContent":true}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"50","y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"textColor":{"disabled":true,"component":"data2-core-types@Color","params":{}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"componentState":{"component":"data2-core-primitives@String","params":{"content":"admin"}}},"index":5,"updatedAt":"2026-07-27T18:30:56.418Z","createdAt":"2026-07-26T19:46:58.699Z"},{"_id":"6a6664093733859be08fd69f","parent":"6a6664093733859be08fd69a","component":"natura-geomarketing@f2_yWxSf4RxX4sceM8HEg","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":123,"height":40,"exactWidth":122.8,"exactHeight":false,"growWidthWithContent":true}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":false,"exactY":false,"fixed":false,"left":true}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"componentState":{"component":"data2-core-primitives@String","params":{"content":"simuladores"}}},"index":1,"updatedAt":"2026-07-27T17:20:13.604Z","createdAt":"2026-07-26T19:46:58.699Z"},{"_id":"6a6792457c969e738b8c3044","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"HubTopBarShortcutSimuladores","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":284,"height":40,"exactWidth":284.24,"exactHeight":false,"growWidthWithContent":true}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"reference":"c2WTvq5i85sOrTkEXFRti","updatedAt":"2026-07-27T17:19:25.380Z","createdAt":"2026-07-27T17:16:31.663Z"},{"_id":"6a6792cd7c969e738b8c3054","parent":"6a6792457c969e738b8c3044","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":128,"height":40,"growWidthWithContent":true,"exactWidth":127.86}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"fixed":false,"exactX":false,"exactY":false,"left":true}},"childrenMode":"cols","childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"0px 10px 0px 10px"}}},"border":{"disabled":false,"component":"data2-core-types@Border","params":{"radius":{"leftTop":"7"}}},"fill":{"params":{"compare":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6a6792cd7c969e738b8c3054"}},"key":{"component":"data2-core-primitives@String","params":{"content":"hovered"}}}}}},"then":{"params":{"rgba":"rgba(0,0,0,0.1)"},"component":"data2-core-types@Color"},"else":{"params":{"rgba":"rgba(0,0,0,0)"},"component":"data2-core-types@Color"}},"component":"data2-core-flow@If"},"stateDefinitions":[{"component":"data2-core-user-interface@StateDefinition","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"hovered"}},"component":"data2-core-primitives@Boolean"}}],"onMouseEnter":{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6a6792cd7c969e738b8c3054"}},"key":{"component":"data2-core-primitives@String","params":{"content":"hovered"}}}},"value":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}}},"onMouseLeave":{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6a6792cd7c969e738b8c3054"}},"key":{"component":"data2-core-primitives@String","params":{"content":"hovered"}}}},"value":{"params":{"content":false},"component":"data2-core-primitives@Boolean"}}},"cursor":"pointer"},"index":1,"updatedAt":"2026-07-29T06:10:45.823Z","createdAt":"2026-07-27T17:18:49.083Z"},{"_id":"6a6792cd7c969e738b8c3055","parent":"6a6792cd7c969e738b8c3054","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":92,"height":40,"exactWidth":false,"exactHeight":false,"growWidthWithContent":true}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":0,"exactY":0,"fixed":false,"left":true}},"text":{"component":"data2-core-primitives@String","params":{"content":"Simulador"}},"textColor":{"disabled":true,"component":"data2-core-types@Color","params":{}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle","letterSpacing":1}},"index":{"component":"data2-core-primitives@Number","params":{"content":"1"}},"font":{"params":{"content":"NaturaCo"},"component":"data2-core-primitives@String"},"fill":{"disabled":true,"component":"data2-core-types@Fill","params":{}},"onMouseDown":{"disabled":false,"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"MNv9vHdKUB_s3iOqiMkiBInterface"}},"prop":"goTo","args":[{"component":"data2-core-primitives@String","params":{"content":"/simulador"}}]}}},"index":1,"updatedAt":"2026-07-29T06:11:25.876Z","createdAt":"2026-07-27T17:18:49.083Z"},{"_id":"6a6793087c969e738b8c3057","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"HubTopBarShortcutAdmin","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":284,"height":40,"exactWidth":284.24,"exactHeight":false,"growWidthWithContent":true}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"reference":"w5AERCyEk8sidBQr-3na4","updatedAt":"2026-07-27T17:19:54.566Z","createdAt":"2026-07-27T17:19:54.566Z"},{"_id":"6a6793087c969e738b8c3058","parent":"6a6793087c969e738b8c3057","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1,"height":40,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":false,"exactY":false,"left":true}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"index":0,"updatedAt":"2026-07-27T17:19:54.566Z","createdAt":"2026-07-27T17:19:54.566Z"},{"_id":"6a6793087c969e738b8c305b","parent":"6a6793087c969e738b8c3057","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":128,"height":40,"growWidthWithContent":true,"exactWidth":127.86}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"fixed":false,"exactX":false,"exactY":false,"left":true}},"childrenMode":"cols","childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"0px 10px 0px 10px"}}},"border":{"disabled":false,"component":"data2-core-types@Border","params":{"radius":{"leftTop":"7"}}},"fill":{"params":{"compare":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6a6793087c969e738b8c305b"}},"key":{"component":"data2-core-primitives@String","params":{"content":"hovered"}}}}}},"then":{"params":{"rgba":"rgba(0,0,0,0.1)"},"component":"data2-core-types@Color"},"else":{"params":{"rgba":"rgba(0,0,0,0)"},"component":"data2-core-types@Color"}},"component":"data2-core-flow@If"},"shadow":[{"params":{"then":{"component":"data2-core-types@Shadow","params":{"type":"inset","spread":"1","color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(108,92,224,1)"}}}},"compare":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6a6793087c969e738b8c305b"}},"key":{"component":"data2-core-primitives@String","params":{"content":"displayList"}}}}}},"else":{"component":"data2-core-types@Shadow","params":{"type":"inset","spread":"0","color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(108,92,224,1)"}}}}},"component":"data2-core-flow@If"}],"stateDefinitions":[{"component":"data2-core-user-interface@StateDefinition","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"hovered"}},"component":"data2-core-primitives@Boolean"}},{"component":"data2-core-user-interface@StateDefinition","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"displayList"}},"component":"data2-core-primitives@Boolean"}}],"onMouseEnter":{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6a6793087c969e738b8c305b"}},"key":{"component":"data2-core-primitives@String","params":{"content":"hovered"}}}},"value":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}}},"onMouseLeave":{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6a6793087c969e738b8c305b"}},"key":{"component":"data2-core-primitives@String","params":{"content":"hovered"}}}},"value":{"params":{"content":false},"component":"data2-core-primitives@Boolean"}}},"cursor":"pointer","onMouseDown":{"disabled":false,"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"MNv9vHdKUB_s3iOqiMkiBInterface"}},"prop":"goTo","args":[{"component":"data2-core-primitives@String","params":{"content":"/acessos"}}]}}},"index":1,"updatedAt":"2026-07-27T18:33:06.481Z","createdAt":"2026-07-27T17:19:54.566Z"},{"_id":"6a6793087c969e738b8c305c","parent":"6a6793087c969e738b8c305b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":92,"height":40,"exactWidth":false,"exactHeight":false,"growWidthWithContent":true}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":0,"exactY":0,"fixed":false,"left":true}},"text":{"component":"data2-core-primitives@String","params":{"content":"Admin"}},"textColor":{"disabled":true,"component":"data2-core-types@Color","params":{}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle","letterSpacing":1}},"index":{"component":"data2-core-primitives@Number","params":{"content":"1"}},"font":{"params":{"content":"NaturaCo"},"component":"data2-core-primitives@String"},"fill":{"disabled":true,"component":"data2-core-types@Fill","params":{}}},"index":1,"updatedAt":"2026-07-27T17:20:00.022Z","createdAt":"2026-07-27T17:19:54.566Z"},{"_id":"6a67a32519eeef7ac1c378d0","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"HubTopBarShortcutCenarios","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":284,"height":40,"exactWidth":284.24,"exactHeight":false,"growWidthWithContent":true}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"reference":"12HGth08_9P_9lz97RYRE","updatedAt":"2026-07-27T18:28:39.326Z","createdAt":"2026-07-27T18:28:39.326Z"},{"_id":"6a67a32519eeef7ac1c378d1","parent":"6a67a32519eeef7ac1c378d0","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1,"height":40,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":false,"exactY":false,"left":true}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"index":0,"updatedAt":"2026-07-27T18:28:39.326Z","createdAt":"2026-07-27T18:28:39.326Z"},{"_id":"6a67a32519eeef7ac1c378d2","parent":"6a67a32519eeef7ac1c378d0","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":128,"height":40,"growWidthWithContent":true,"exactWidth":127.86}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"fixed":false,"exactX":false,"exactY":false,"left":true}},"childrenMode":"cols","childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"0px 10px 0px 10px"}}},"border":{"disabled":false,"component":"data2-core-types@Border","params":{"radius":{"leftTop":"7"}}},"fill":{"params":{"compare":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6a67a32519eeef7ac1c378d2"}},"key":{"component":"data2-core-primitives@String","params":{"content":"hovered"}}}}}},"then":{"params":{"rgba":"rgba(0,0,0,0.1)"},"component":"data2-core-types@Color"},"else":{"params":{"rgba":"rgba(0,0,0,0)"},"component":"data2-core-types@Color"}},"component":"data2-core-flow@If"},"shadow":[{"params":{"then":{"component":"data2-core-types@Shadow","params":{"type":"inset","spread":"1","color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(108,92,224,1)"}}}},"compare":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6a67a32519eeef7ac1c378d2"}},"key":{"component":"data2-core-primitives@String","params":{"content":"displayList"}}}}}},"else":{"component":"data2-core-types@Shadow","params":{"type":"inset","spread":"0","color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(108,92,224,1)"}}}}},"component":"data2-core-flow@If"}],"stateDefinitions":[{"component":"data2-core-user-interface@StateDefinition","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"hovered"}},"component":"data2-core-primitives@Boolean"}},{"component":"data2-core-user-interface@StateDefinition","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"displayList"}},"component":"data2-core-primitives@Boolean"}}],"onMouseEnter":{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6a67a32519eeef7ac1c378d2"}},"key":{"component":"data2-core-primitives@String","params":{"content":"hovered"}}}},"value":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}}},"onMouseLeave":{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6a67a32519eeef7ac1c378d2"}},"key":{"component":"data2-core-primitives@String","params":{"content":"hovered"}}}},"value":{"params":{"content":false},"component":"data2-core-primitives@Boolean"}}},"onMouseDown":{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6a67a32519eeef7ac1c378d2"}},"key":{"component":"data2-core-primitives@String","params":{"content":"displayList"}}}},"value":{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6a67a32519eeef7ac1c378d2"}},"key":{"component":"data2-core-primitives@String","params":{"content":"displayList"}}}}}}},"component":"data2-core-logical-operators@Not"}}},"onClickOutside":{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6a67a32519eeef7ac1c378d2"}},"key":{"component":"data2-core-primitives@String","params":{"content":"displayList"}}}},"value":{"params":{"content":false},"component":"data2-core-primitives@Boolean"}}},"cursor":"pointer"},"index":1,"updatedAt":"2026-07-27T18:32:16.388Z","createdAt":"2026-07-27T18:28:39.326Z"},{"_id":"6a67a32519eeef7ac1c378d3","parent":"6a67a32519eeef7ac1c378d2","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":92,"height":40,"exactWidth":false,"exactHeight":false,"growWidthWithContent":true}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":0,"exactY":0,"fixed":false,"left":true}},"text":{"component":"data2-core-primitives@String","params":{"content":"Cenários"}},"textColor":{"disabled":true,"component":"data2-core-types@Color","params":{}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle","letterSpacing":1}},"index":{"component":"data2-core-primitives@Number","params":{"content":"1"}},"font":{"params":{"content":"NaturaCo"},"component":"data2-core-primitives@String"},"fill":{"disabled":true,"component":"data2-core-types@Fill","params":{}}},"index":1,"updatedAt":"2026-07-27T18:28:47.724Z","createdAt":"2026-07-27T18:28:39.326Z"},{"_id":"6a67a38e19eeef7ac1c378d5","parent":"6a5face141de3fb32ace7537","component":"natura-geomarketing@n-E3kblbz0EwqfdH7YVjX","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":70,"exactWidth":false,"exactHeight":70}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":0,"exactY":0,"top":true,"left":true,"right":true,"growH":false}},"fill":{"disabled":false,"component":"data2-core-types@Fill","params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(241,241,248,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}},"index":1,"updatedAt":"2026-07-27T18:30:21.610Z","createdAt":"2026-07-27T18:30:21.610Z"},{"_id":"6a699b27e1053d806729ea00","parent":"6a5fcabb3a34c57f2ac6b344","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":268,"height":278,"exactWidth":268,"exactHeight":277.86}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":271,"y":10,"exactX":false,"exactY":false,"bottom":false,"right":false,"top":true,"growV":false,"fixed":false,"left":false,"growH":false}},"border":{"component":"data2-core-types@Border","params":{"color":"#e6e6e6","radius":{"leftTop":"3"},"width":{"left":"1","top":"1","right":"1","bottom":"1"}}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"fill":{"disabled":false,"component":"data2-core-types@Fill","params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(241,241,248,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]}},"style":{"transform":{"params":{"compare":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6a5fcabb3a34c57f2ac6b344"}},"key":{"component":"data2-core-primitives@String","params":{"content":"focused"}}}}},"component":"data2-core-types@Getter"},"else":{"component":"data2-core-primitives@String","params":{"content":"scale(1,0)"}},"then":{"component":"data2-core-primitives@String","params":{"content":"scale(1,1)"}}},"component":"data2-core-flow@If"},"transformOrigin":{"component":"data2-core-primitives@String","params":{"content":"top center"}},"padding":{"component":"data2-core-primitives@String","params":{"content":"10px 0px 10px 0px"}}},"scroll":{"disabled":false,"component":"data2-core-types@Scroll","params":{"y":true}},"repeat":{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@DataSetReference","params":{"reference":"FhlWyAglkQB5EL4hrbzmq"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"f"}}],"body":{"params":{"compare":{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6a5fcabb3a34c57f2ac6b344"}},"key":{"component":"data2-core-primitives@String","params":{"content":"sector"}}}}}}},"component":"data2-core-comparison-operators@Equal"},"then":{"params":{"content":true},"component":"data2-core-primitives@Boolean"},"else":{"params":{"module":{"params":{"pattern":{"params":{"flags":{"component":"data2-core-primitives@String","params":{"content":"i"}},"pattern":{"params":{"portions":[{"component":"data2-core-primitives@String","params":{"content":"("}},{"params":{"array":{"params":{"array":{"params":{"haystack":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6a5fcabb3a34c57f2ac6b344"}},"key":{"component":"data2-core-primitives@String","params":{"content":"sector"}}}}}}},"component":"data2-core-functions@Split"},"mapper":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"elm"}}],"body":{"params":{"compare":[{"params":{"pattern":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"elm"}}}},"subject":{"component":"data2-core-primitives@String","params":{"content":"$^[]().,?{}|\\/:=*-+"}}},"component":"data2-core-functions@Includes"}],"else":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"elm"}}}},"then":{"params":{"portions":[{"component":"data2-core-primitives@String","params":{"content":"\\"}},{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"elm"}}}}]},"component":"data2-core-functions@StringConcat"}},"component":"data2-core-flow@If"}}}},"component":"data2-core-functions@ArrayMap"}},"component":"data2-core-functions@ArrayJoin"},{"component":"data2-core-primitives@String","params":{"content":")"}}]},"component":"data2-core-functions@StringConcat"}},"component":"data2-core-types@Regex","pattern":"[A-Z]","flags":"gm","break":true},"excludesInput":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"text":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"f.setor"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-functions@Match"},"prop":{"component":"data2-core-primitives@String","params":{"content":"0"}}},"component":"data2-core-types@Getter"}},"component":"data2-core-flow@If"}}}},"component":"data2-core-functions@ArrayFilter"},"childrenMode":"grid","repeatReference":{"component":"data2-core-primitives@String","params":{"content":"s"}}},"updatedAt":"2026-08-04T18:17:47.962Z","createdAt":"2026-07-29T06:19:34.430Z"},{"_id":"6a699b27e1053d806729ea02","parent":"6a699b27e1053d806729ea00","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":358,"height":22,"exactWidth":false,"exactHeight":22}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":false,"exactY":false,"fixed":false,"top":true,"left":true,"right":true,"growH":false}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"center","textOverflow":false,"verticalAlignment":"middle"}},"text":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"sRepeater.setor"}}},"component":"data2-core-types@Reference"},"textSize":{"component":"data2-core-primitives@Number","params":{"content":20}},"onMouseDown":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6a5fcabb3a34c57f2ac6b344"}},"key":{"component":"data2-core-primitives@String","params":{"content":"sector"}}}},"value":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"sRepeater.setor"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-types@Setter"},"cursor":"pointer"},"index":0,"updatedAt":"2026-08-04T16:46:34.299Z","createdAt":"2026-07-29T06:19:34.430Z"},{"_id":"6a6a086d097f6f7e71d00ff3","parent":"6a626d5561501108689e9733","component":"data2-blocks@JsonViewer","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":640,"height":293,"exactWidth":false,"exactHeight":false,"growHeightWithContent":true,"minHeight":1240}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":false,"exactY":false,"fixed":false,"bottom":false,"left":true,"top":true,"growV":false,"right":true,"growH":false}},"scroll":{"disabled":false,"component":"data2-core-types@Scroll","params":{"y":true}},"fill":{"disabled":false,"component":"data2-core-types@Fill","params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(20,20,20,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]}}},"json":{"map":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"ziIl3zJpxF2x8qsRQy10a"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data"}}}},"ds":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"umJZo_TTyw0E3lOwBNmk2"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}}},"query":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"umJZo_TTyw0E3lOwBNmk2"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"filterSettings"}}}}}},"updatedAt":"2026-07-31T06:11:12.337Z","createdAt":"2026-07-29T14:05:16.703Z"},{"_id":"6a6b49e36f0503cc9898fe3a","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"New Artboard (49)","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768}},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"reference":"AZOSpujQJxgnHKbB6LnB-","updatedAt":"2026-07-30T12:56:51.690Z","createdAt":"2026-07-30T12:56:51.690Z"},{"_id":"6a6b49e56f0503cc9898fe3b","parent":"6a6b49e36f0503cc9898fe3a","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":256,"height":181}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":219,"y":218,"exactX":219,"exactY":218}},"text":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"8pfGOG8wIc_wl6VGodn94"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"files.1.fileUrl"}}},"component":"data2-core-types@Getter"}},"updatedAt":"2026-07-30T12:57:35.438Z","createdAt":"2026-07-30T12:56:53.193Z"},{"_id":"6a6c5b8c40da54940c0f9c49","parent":"6a64499070fbd195b8e6aa5d","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1304,"height":588,"exactWidth":1304,"exactHeight":false,"growHeightWithContent":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":60,"y":0,"exactX":false,"exactY":false,"fixed":false,"left":true,"top":true,"right":true,"growH":false}},"style":{"flex":{"component":"data2-core-primitives@String","params":{"content":"0"}}},"hide":{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Y0MVeSB0t_bjBEppVYgQJ"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.state"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"done"}}},"component":"data2-core-comparison-operators@Equal"}},"index":2,"updatedAt":"2026-08-04T05:03:32.211Z","createdAt":"2026-07-31T08:24:24.922Z"},{"_id":"6a6c5ba940da54940c0f9c4b","parent":"6a6c5b8c40da54940c0f9c49","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":323,"height":18,"exactWidth":323.07,"exactHeight":18.439999999999998}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":491,"y":285,"exactX":false,"exactY":false,"top":false,"left":false}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"center"}},"text":{"component":"data2-core-primitives@String","params":{"content":"Nenhum setor selecionado"}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(97,97,97,1)"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":16}}},"updatedAt":"2026-07-31T08:25:43.109Z","createdAt":"2026-07-31T08:25:43.109Z"},{"_id":"6a703258ccd3de82a7eb07a3","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"New Artboard (51)","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768}},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"reference":"4AeRau2SS_G8ul32AmygC","updatedAt":"2026-08-03T06:17:48.740Z","createdAt":"2026-08-03T06:17:48.740Z"},{"_id":"6a70325dccd3de82a7eb07aa","parent":"6a703258ccd3de82a7eb07a3","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":820,"height":748,"growHeightWithContent":false,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":20,"fixed":false,"exactX":0,"exactY":20,"top":true,"left":true,"growH":false,"bottom":true,"growV":false}},"childrenMode":"rows","childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"style":{"flex":{"component":"data2-core-primitives@String","params":{"content":"1.5"}}}},"index":0,"updatedAt":"2026-08-03T07:40:11.236Z","createdAt":"2026-08-03T06:17:54.547Z"},{"_id":"6a70325dccd3de82a7eb07ab","parent":"6a70325dccd3de82a7eb07aa","component":"natura-geomarketing@O4-zOAoAC9BwIp-XZ0ekO","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":184,"height":60,"exactWidth":183.77,"exactHeight":60}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":10,"exactX":false,"exactY":false,"top":true,"left":true,"right":false}},"text":"","textSize":{"component":"data2-core-primitives@Number","params":{"content":14}},"children":{"locked":true}},"text":""},"index":0,"updatedAt":"2026-08-03T06:17:54.547Z","createdAt":"2026-08-03T06:17:54.547Z"},{"_id":"6a70325dccd3de82a7eb07ac","parent":"6a70325dccd3de82a7eb07aa","component":"natura-geomarketing@yJwIwtjYNeYGoGF68aYQM","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#9a9b9c","radius":{"leftTop":13},"width":{"left":0,"top":0,"right":0,"bottom":0},"type":"solid"},"disabled":false},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":817,"height":620,"exactWidth":false,"exactHeight":620}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":6,"y":102,"exactX":6.41,"exactY":101.5,"left":true,"top":true,"bottom":false,"growV":false,"growH":false,"right":true,"fixed":false}},"style":{"transformOrigin":{"component":"data2-core-primitives@String","params":{"content":"top left"}},"flex":{"component":"data2-core-primitives@String","params":{"content":"1"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"shadow":[{"component":"data2-core-types@Shadow","params":{"spread":3,"blur":30,"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0.23)"}}}}]},"assignments":{"params":{"fieldsList":{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"ziIl3zJpxF2x8qsRQy10a"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.municipios_normalized"}}},"component":"data2-core-types@Getter"},"mapper":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"m"}}],"body":{"key":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m"}}},"component":"data2-core-types@Reference"},"value":{"component":"data2-core-primitives@String","params":{}}}}}},"component":"data2-core-functions@ArrayMap"}},"component":"data2-core-types@FieldSet"},"groups":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"ziIl3zJpxF2x8qsRQy10a"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.setores_destino"}}},"component":"data2-core-types@Getter"},"ufs":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"ziIl3zJpxF2x8qsRQy10a"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.UF"}}}},"store":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"NLO6dHteJxVmbynNHsqPv"}},"municipio":{"params":{"portions":{"params":{"array":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"ziIl3zJpxF2x8qsRQy10a"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.municipios"}}}},"mapper":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"m"}},{"component":"data2-core-primitives@String","params":{"content":"i"}},{"component":"data2-core-primitives@String","params":{"content":"l"}}],"body":{"params":{"portions":[{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m"}}},"component":"data2-core-types@Reference"},{"params":{"compare":{"params":{"subject":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"l.length"}}},"component":"data2-core-types@Reference"},"comparisonSubject":{"params":{"components":[{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"i"}}},"component":"data2-core-types@Reference"},{"component":"data2-core-primitives@Number","params":{"content":1}}]},"component":"data2-core-numerical-operators@Add"}},"component":"data2-core-comparison-operators@Equal"},"else":{"component":"data2-core-primitives@String","params":{"content":","}}},"component":"data2-core-flow@If"}]},"component":"data2-core-functions@StringConcat"}}}},"component":"data2-core-functions@ArrayMap"}},"component":"data2-core-functions@StringConcat"},"colors":{"params":{"fieldsList":{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"ziIl3zJpxF2x8qsRQy10a"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.setores_destino"}}},"component":"data2-core-types@Getter"},"mapper":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"m"}},{"component":"data2-core-primitives@String","params":{"content":"i"}},{"component":"data2-core-primitives@String","params":{"content":"l"}}],"body":{"key":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m.sector"}}},"component":"data2-core-types@Reference"},"value":{"params":{"color":{"params":{"color":{"h":{"params":{"components":[{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"i"}}},"component":"data2-core-types@Reference"},{"params":{"components":[{"params":{"components":[{"component":"data2-core-primitives@Number","params":{"content":10}},{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"l.length"}}},"component":"data2-core-types@Reference"}]},"component":"data2-core-numerical-operators@Multiply"},{"component":"data2-core-primitives@Number","params":{"content":36}}]},"component":"data2-core-numerical-operators@Divide"}]},"component":"data2-core-numerical-operators@Multiply"},"s":{"component":"data2-core-primitives@String","params":{"content":"1"}},"l":{"component":"data2-core-primitives@String","params":{"content":"0.5"}},"alpha":{"component":"data2-core-primitives@String","params":{"content":"1"}}}},"component":"data2-core-color@ColorFormatHsl"}},"component":"data2-core-color@ColorFormatHex"}}}}},"component":"data2-core-functions@ArrayMap"}},"component":"data2-core-types@FieldSet"}},"index":1,"updatedAt":"2026-08-03T07:08:32.517Z","createdAt":"2026-08-03T06:17:54.547Z"},{"_id":"6a70325dccd3de82a7eb07ad","parent":"6a70325dccd3de82a7eb07aa","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":640,"height":40,"exactWidth":640,"exactHeight":40,"growHeightWithContent":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":20,"exactX":false,"exactY":false,"fixed":false,"left":true,"top":true,"right":true,"growH":false}},"text":"","childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"updatedAt":"2026-08-03T06:17:54.547Z","createdAt":"2026-08-03T06:17:54.547Z"},{"_id":"6a70325dccd3de82a7eb07ae","parent":"6a70325dccd3de82a7eb07ad","component":"natura-geomarketing@1S_fB3hvzwUro47iuZ55p","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":640,"height":40,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"left":true,"exactX":false,"exactY":false,"top":true,"fixed":false,"right":false,"growH":false}},"childrenMode":"cols","textFormat":{"disabled":true,"component":"data2-core-types@TextFormat","params":{}}}},"index":2,"updatedAt":"2026-08-03T06:17:54.547Z","createdAt":"2026-08-03T06:17:54.547Z"},{"_id":"6a70325dccd3de82a7eb07af","parent":"6a70325dccd3de82a7eb07ad","component":"natura-geomarketing@_3BHHDtVc0ZK0wlfcnLM3","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":640,"height":284,"exactWidth":false,"exactHeight":false,"growHeightWithContent":true,"minHeight":500}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":20,"fixed":false,"exactX":0,"exactY":20,"left":true,"top":true,"right":true,"growH":false}}},"componentState":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kfqDiL83O6CTlKOfellwq"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.additionalInfo"}}}}},"updatedAt":"2026-08-03T06:17:54.547Z","createdAt":"2026-08-03T06:17:54.547Z"},{"_id":"6a703267ccd3de82a7eb07b0","parent":"6a70325dccd3de82a7eb07aa","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(241,241,241,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":242,"height":532,"exactWidth":242,"exactHeight":532}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":21,"y":126,"exactX":20.540000000000003,"exactY":126.15}},"border":{"params":{"width":{"top":0,"right":0,"bottom":0,"left":0},"radius":{"leftTop":13,"rightTop":13,"leftBottom":13,"rightBottom":13},"color":"#3a7bff","type":"solid"},"component":"data2-core-types@Border"},"shadow":[{"component":"data2-core-types@Shadow","params":{"type":"inset","spread":1,"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(113,113,113,0.52)"}}}},{"component":"data2-core-types@Shadow","params":{"blur":10,"spread":-6}}],"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-04T00:09:16.101Z","createdAt":"2026-08-03T06:18:03.186Z"},{"_id":"6a7034dbccd3de82a7eb07b4","parent":"6a703267ccd3de82a7eb07b0","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":241,"height":40,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":false,"exactY":false,"fixed":false}},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0.04)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"updatedAt":"2026-08-04T00:09:04.416Z","createdAt":"2026-08-03T06:28:31.483Z"},{"_id":"6a703502ccd3de82a7eb07b6","parent":"6a7034dbccd3de82a7eb07b4","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":166,"height":37,"exactWidth":166,"exactHeight":37.15}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":20,"y":3,"exactX":20,"exactY":3}},"text":{"component":"data2-core-primitives@String","params":{"content":"Visão por municipio"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left","fontStyle":"normal","fontWeight":700},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(74,74,74,1)"},"component":"data2-core-types@Color"}},"updatedAt":"2026-08-04T05:02:03.816Z","createdAt":"2026-08-03T06:29:42.525Z"},{"_id":"6a70352dccd3de82a7eb07b7","parent":"6a7034dbccd3de82a7eb07b4","component":"data2-blocks@IconBlock","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":24,"height":24,"exactWidth":24,"exactHeight":24.15}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":208,"y":9,"exactY":8.89,"exactX":208.21}},"opacity":{"params":{"value":38},"component":"data2-core-types@Opacity"}},"icon":{"params":{"iconSet":"remix","icon":"ri-menu-line"},"component":"data2-core-web@Icon"}},"updatedAt":"2026-08-03T06:51:02.206Z","createdAt":"2026-08-03T06:29:53.392Z"},{"_id":"6a70362dccd3de82a7eb07b9","parent":"6a703267ccd3de82a7eb07b0","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":240,"height":132,"exactWidth":240,"exactHeight":131.95}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":1,"y":-1,"exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":""}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"bottom","horizontalAlignment":"center","fontStyle":"italic"},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"}},"updatedAt":"2026-08-03T07:42:19.375Z","createdAt":"2026-08-03T06:34:55.429Z"},{"_id":"6a70365dccd3de82a7eb07bb","parent":"6a70362dccd3de82a7eb07b9","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":220,"height":28,"exactWidth":220,"exactHeight":28.38}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":18,"y":15,"exactX":18.21,"exactY":14.58,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"Adustina"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left","fontStyle":"normal"},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"}},"updatedAt":"2026-08-03T06:35:34.720Z","createdAt":"2026-08-03T06:35:34.720Z"},{"_id":"6a703682ccd3de82a7eb07bc","parent":"6a70362dccd3de82a7eb07b9","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":6,"rightTop":6,"leftBottom":6,"rightBottom":6},"width":{"left":0,"top":0,"right":0,"bottom":0},"type":"solid"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":43,"height":20,"exactWidth":43,"exactHeight":20.49}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":18,"y":-1,"exactX":18.23,"exactY":-0.91,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"BA"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"center","fontStyle":"normal"},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0.07)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"updatedAt":"2026-08-03T06:36:35.355Z","createdAt":"2026-08-03T06:36:13.392Z"},{"_id":"6a7036d1ccd3de82a7eb07be","parent":"6a7036f4ccd3de82a7eb07c1","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":43,"height":40,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"3740"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left","fontStyle":"normal"},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(173,173,173,1)"},"component":"data2-core-types@Color"},"textDecoration":{"params":{"line":"line-through"},"component":"data2-core-types@TextDecoration"}},"updatedAt":"2026-08-03T06:45:43.839Z","createdAt":"2026-08-03T06:37:09.117Z"},{"_id":"6a7036eeccd3de82a7eb07c0","parent":"6a7036f4ccd3de82a7eb07c1","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":14,"height":40,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":2,"y":0,"exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"~ "}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"18"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left","fontStyle":"normal"},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"}},"updatedAt":"2026-08-03T06:45:42.536Z","createdAt":"2026-08-03T06:37:28.461Z"},{"_id":"6a7036f4ccd3de82a7eb07c1","parent":"6a70362dccd3de82a7eb07b9","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":213,"height":40,"exactWidth":213.45,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":18,"y":5,"exactX":false,"exactY":false,"fixed":false}},"childrenMode":"cols","childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"updatedAt":"2026-08-03T07:08:30.427Z","createdAt":"2026-08-03T06:37:28.461Z"},{"_id":"6a7037f9ccd3de82a7eb07c3","parent":"6a7036f4ccd3de82a7eb07c1","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":6,"rightTop":6,"leftBottom":6,"rightBottom":6},"width":{"left":0,"top":0,"right":0,"bottom":0},"type":"solid"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":150,"height":40,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":4,"y":1,"exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"   3576"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left","fontStyle":"normal","fontWeight":700,"lineHeight":1.8},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(212,54,54,1)"},"component":"data2-core-types@Color"},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"shadow":[{"component":"data2-core-types@Shadow","params":{"type":"inset","spread":1,"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0.1)"}}}}]},"updatedAt":"2026-08-03T07:12:29.055Z","createdAt":"2026-08-03T06:42:04.527Z"},{"_id":"6a703863ccd3de82a7eb07c5","parent":"6a7036f4ccd3de82a7eb07c1","component":"data2-blocks@IconBlock","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":24,"height":24,"exactWidth":24,"exactHeight":24.15}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":183,"y":10,"exactY":9.95,"exactX":182.82}},"opacity":{"params":{"value":38},"component":"data2-core-types@Opacity"}},"icon":{"params":{"iconSet":"remix","icon":"ri-layout-grid-fill"},"component":"data2-core-web@Icon"}},"updatedAt":"2026-08-03T06:58:19.574Z","createdAt":"2026-08-03T06:43:47.832Z"},{"_id":"6a703d56ccd3de82a7eb07d6","parent":"6a70362dccd3de82a7eb07b9","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0.12)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":240,"height":1,"exactWidth":false,"exactHeight":1}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":131,"exactX":false,"exactY":false}}},"updatedAt":"2026-08-03T07:42:22.850Z","createdAt":"2026-08-03T07:04:42.105Z"},{"_id":"6a703f02ccd3de82a7eb07f2","parent":"6a703267ccd3de82a7eb07b0","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":240,"height":122,"exactWidth":240,"exactHeight":121.88}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":1,"y":-1,"exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":""}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"bottom","horizontalAlignment":"center","fontStyle":"italic"},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"}},"updatedAt":"2026-08-03T07:11:50.561Z","createdAt":"2026-08-03T07:11:50.561Z"},{"_id":"6a703f02ccd3de82a7eb07f3","parent":"6a703f02ccd3de82a7eb07f2","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":220,"height":28,"exactWidth":220,"exactHeight":28.38}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":18,"y":15,"exactX":18.21,"exactY":14.58,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"Salvador"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left","fontStyle":"normal"},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"}},"updatedAt":"2026-08-03T07:11:57.934Z","createdAt":"2026-08-03T07:11:50.561Z"},{"_id":"6a703f02ccd3de82a7eb07f4","parent":"6a703f02ccd3de82a7eb07f2","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":6,"rightTop":6,"leftBottom":6,"rightBottom":6},"width":{"left":0,"top":0,"right":0,"bottom":0},"type":"solid"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":43,"height":20,"exactWidth":43,"exactHeight":20.49}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":18,"y":-1,"exactX":18.23,"exactY":-0.91,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"BA"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"center","fontStyle":"normal"},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0.07)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"updatedAt":"2026-08-03T07:11:50.561Z","createdAt":"2026-08-03T07:11:50.561Z"},{"_id":"6a703f02ccd3de82a7eb07f5","parent":"6a703f02ccd3de82a7eb07f2","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":213,"height":40,"exactWidth":213.45,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":18,"y":5,"exactX":false,"exactY":false,"fixed":false}},"childrenMode":"cols","childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"updatedAt":"2026-08-03T07:11:50.561Z","createdAt":"2026-08-03T07:11:50.561Z"},{"_id":"6a703f02ccd3de82a7eb07f6","parent":"6a703f02ccd3de82a7eb07f5","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":43,"height":40,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"3740"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left","fontStyle":"normal"},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(173,173,173,1)"},"component":"data2-core-types@Color"},"textDecoration":{"params":{"line":"line-through"},"component":"data2-core-types@TextDecoration"}},"updatedAt":"2026-08-03T07:11:50.561Z","createdAt":"2026-08-03T07:11:50.561Z"},{"_id":"6a703f02ccd3de82a7eb07f7","parent":"6a703f02ccd3de82a7eb07f5","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":14,"height":40,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":2,"y":0,"exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"~ "}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"18"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left","fontStyle":"normal"},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"}},"updatedAt":"2026-08-03T07:11:50.561Z","createdAt":"2026-08-03T07:11:50.561Z"},{"_id":"6a703f02ccd3de82a7eb07f8","parent":"6a703f02ccd3de82a7eb07f5","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":6,"rightTop":6,"leftBottom":6,"rightBottom":6},"width":{"left":0,"top":0,"right":0,"bottom":0},"type":"solid"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":150,"height":40,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":4,"y":1,"exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"   3576"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left","fontStyle":"normal","fontWeight":700,"lineHeight":1.8},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(212,54,54,1)"},"component":"data2-core-types@Color"},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"shadow":[{"component":"data2-core-types@Shadow","params":{"type":"inset","spread":1,"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0.1)"}}}}]},"updatedAt":"2026-08-03T07:12:29.060Z","createdAt":"2026-08-03T07:11:50.561Z"},{"_id":"6a703f02ccd3de82a7eb07f9","parent":"6a703f02ccd3de82a7eb07f5","component":"data2-blocks@IconBlock","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":24,"height":24,"exactWidth":24,"exactHeight":24.15}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":183,"y":10,"exactY":9.95,"exactX":182.82}},"opacity":{"params":{"value":38},"component":"data2-core-types@Opacity"}},"icon":{"params":{"iconSet":"remix","icon":"ri-layout-grid-fill"},"component":"data2-core-web@Icon"}},"updatedAt":"2026-08-03T07:11:50.561Z","createdAt":"2026-08-03T07:11:50.561Z"},{"_id":"6a703f02ccd3de82a7eb07fa","parent":"6a703f02ccd3de82a7eb07f2","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0.12)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":240,"height":1,"exactWidth":false,"exactHeight":1}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":121,"exactX":false,"exactY":false}}},"updatedAt":"2026-08-03T07:11:50.561Z","createdAt":"2026-08-03T07:11:50.561Z"},{"_id":"6a704036ccd3de82a7eb0811","parent":"6a703258ccd3de82a7eb07a3","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(241,241,241,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":242,"height":532,"exactWidth":242,"exactHeight":532}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":846,"y":137,"exactX":846.35,"exactY":137.31}},"border":{"params":{"width":{"top":0,"right":0,"bottom":0,"left":0},"radius":{"leftTop":13,"rightTop":13,"leftBottom":13,"rightBottom":13},"color":"#3a7bff","type":"solid"},"component":"data2-core-types@Border"},"shadow":[{"component":"data2-core-types@Shadow","params":{"type":"inset","spread":1,"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(113,113,113,0.52)"}}}},{"component":"data2-core-types@Shadow","params":{"blur":10,"spread":-6}}],"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-03T07:23:57.217Z","createdAt":"2026-08-03T07:17:07.188Z"},{"_id":"6a704036ccd3de82a7eb0812","parent":"6a704036ccd3de82a7eb0811","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":241,"height":40,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":20,"exactX":false,"exactY":false,"fixed":false}},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0.04)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"updatedAt":"2026-08-03T07:17:07.188Z","createdAt":"2026-08-03T07:17:07.188Z"},{"_id":"6a704036ccd3de82a7eb0813","parent":"6a704036ccd3de82a7eb0812","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":179,"height":37,"exactWidth":178.94,"exactHeight":37}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":20,"y":3,"exactX":false,"exactY":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"Visão por setores de venda"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left","fontStyle":"normal"},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"}},"updatedAt":"2026-08-03T07:24:39.480Z","createdAt":"2026-08-03T07:17:07.188Z"},{"_id":"6a704036ccd3de82a7eb0814","parent":"6a704036ccd3de82a7eb0812","component":"data2-blocks@IconBlock","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":24,"height":24,"exactWidth":24,"exactHeight":24.15}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":208,"y":9,"exactY":8.89,"exactX":208.21}},"opacity":{"params":{"value":38},"component":"data2-core-types@Opacity"}},"icon":{"params":{"iconSet":"remix","icon":"ri-menu-line"},"component":"data2-core-web@Icon"}},"updatedAt":"2026-08-03T07:17:07.188Z","createdAt":"2026-08-03T07:17:07.188Z"},{"_id":"6a704036ccd3de82a7eb0815","parent":"6a704036ccd3de82a7eb0811","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":240,"height":122,"exactWidth":240,"exactHeight":121.88}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":1,"y":-1,"exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":""}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"bottom","horizontalAlignment":"center","fontStyle":"italic"},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"}},"updatedAt":"2026-08-03T07:17:07.188Z","createdAt":"2026-08-03T07:17:07.188Z"},{"_id":"6a704036ccd3de82a7eb0816","parent":"6a704036ccd3de82a7eb0815","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":220,"height":28,"exactWidth":220,"exactHeight":28.38}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":18,"y":15,"exactX":18.21,"exactY":14.58,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"3740"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left","fontStyle":"normal"},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"}},"updatedAt":"2026-08-03T07:19:53.236Z","createdAt":"2026-08-03T07:17:07.188Z"},{"_id":"6a704036ccd3de82a7eb0817","parent":"6a704036ccd3de82a7eb0815","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":6,"rightTop":6,"leftBottom":6,"rightBottom":6},"width":{"left":0,"top":0,"right":0,"bottom":0},"type":"solid"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":81,"height":20,"exactWidth":80.78,"exactHeight":20}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":18,"y":-1,"exactX":18.23,"exactY":-0.91,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"Adustina"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"center","fontStyle":"normal"},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0.07)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"updatedAt":"2026-08-03T07:20:05.482Z","createdAt":"2026-08-03T07:17:07.188Z"},{"_id":"6a704036ccd3de82a7eb0818","parent":"6a704036ccd3de82a7eb0815","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":213,"height":40,"exactWidth":213.45,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":18,"y":5,"exactX":false,"exactY":false,"fixed":false}},"childrenMode":"cols","childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"updatedAt":"2026-08-03T07:17:07.188Z","createdAt":"2026-08-03T07:17:07.188Z"},{"_id":"6a704036ccd3de82a7eb0819","parent":"6a704036ccd3de82a7eb0818","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":43,"height":40,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":0,"exactY":0,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"24140"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left","fontStyle":"normal"},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(173,173,173,1)"},"component":"data2-core-types@Color"}},"updatedAt":"2026-08-03T07:22:06.248Z","createdAt":"2026-08-03T07:17:07.188Z"},{"_id":"6a704036ccd3de82a7eb081a","parent":"6a704036ccd3de82a7eb0818","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":14,"height":40,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":10,"y":0,"exactX":9.98,"exactY":0.42,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"-> "}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left","fontStyle":"normal"},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"}},"updatedAt":"2026-08-03T07:21:56.254Z","createdAt":"2026-08-03T07:17:07.188Z"},{"_id":"6a704036ccd3de82a7eb081b","parent":"6a704036ccd3de82a7eb0818","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":6,"rightTop":6,"leftBottom":6,"rightBottom":6},"width":{"left":0,"top":0,"right":0,"bottom":0},"type":"solid"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":135,"height":40,"exactWidth":134.75,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":10,"y":1,"exactX":9.6,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"   3576"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left","fontStyle":"normal","fontWeight":700,"lineHeight":1.8},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(212,54,54,1)"},"component":"data2-core-types@Color"},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"shadow":[{"component":"data2-core-types@Shadow","params":{"type":"inset","spread":1,"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0.1)"}}}}]},"updatedAt":"2026-08-03T07:21:59.307Z","createdAt":"2026-08-03T07:17:07.188Z"},{"_id":"6a704036ccd3de82a7eb081c","parent":"6a704036ccd3de82a7eb0818","component":"data2-blocks@IconBlock","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":24,"height":24,"exactWidth":24,"exactHeight":24.15}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":183,"y":10,"exactY":9.95,"exactX":182.82}},"opacity":{"params":{"value":38},"component":"data2-core-types@Opacity"}},"icon":{"params":{"iconSet":"remix","icon":"ri-layout-grid-fill"},"component":"data2-core-web@Icon"}},"updatedAt":"2026-08-03T07:17:07.188Z","createdAt":"2026-08-03T07:17:07.188Z"},{"_id":"6a704036ccd3de82a7eb081d","parent":"6a704036ccd3de82a7eb0815","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0.12)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":240,"height":1,"exactWidth":false,"exactHeight":1}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":121,"exactX":false,"exactY":false}}},"updatedAt":"2026-08-03T07:17:07.188Z","createdAt":"2026-08-03T07:17:07.188Z"},{"_id":"6a7041d9ccd3de82a7eb0827","parent":"6a703258ccd3de82a7eb07a3","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(241,241,241,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":242,"height":532,"exactWidth":242,"exactHeight":532}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":1101,"y":131,"exactX":1101.1100000000001,"exactY":130.84}},"border":{"params":{"width":{"top":0,"right":0,"bottom":0,"left":0},"radius":{"leftTop":13,"rightTop":13,"leftBottom":13,"rightBottom":13},"color":"#3a7bff","type":"solid"},"component":"data2-core-types@Border"},"shadow":[{"component":"data2-core-types@Shadow","params":{"type":"inset","spread":1,"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(113,113,113,0.52)"}}}},{"component":"data2-core-types@Shadow","params":{"blur":10,"spread":-6}}],"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-03T07:26:20.091Z","createdAt":"2026-08-03T07:23:59.849Z"},{"_id":"6a7041d9ccd3de82a7eb0828","parent":"6a7041d9ccd3de82a7eb0827","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":241,"height":40,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":20,"exactX":false,"exactY":false,"fixed":false}},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0.04)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"updatedAt":"2026-08-03T07:23:59.849Z","createdAt":"2026-08-03T07:23:59.849Z"},{"_id":"6a7041d9ccd3de82a7eb0829","parent":"6a7041d9ccd3de82a7eb0828","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":175,"height":37,"exactWidth":174.63,"exactHeight":37}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":20,"y":3,"exactX":false,"exactY":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"Visão por grupos de venda"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left","fontStyle":"normal"},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"}},"updatedAt":"2026-08-03T07:24:17.819Z","createdAt":"2026-08-03T07:23:59.849Z"},{"_id":"6a7041d9ccd3de82a7eb082a","parent":"6a7041d9ccd3de82a7eb0828","component":"data2-blocks@IconBlock","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":24,"height":24,"exactWidth":24,"exactHeight":24.15}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":208,"y":9,"exactY":8.89,"exactX":208.21}},"opacity":{"params":{"value":38},"component":"data2-core-types@Opacity"}},"icon":{"params":{"iconSet":"remix","icon":"ri-menu-line"},"component":"data2-core-web@Icon"}},"updatedAt":"2026-08-03T07:23:59.849Z","createdAt":"2026-08-03T07:23:59.849Z"},{"_id":"6a7041d9ccd3de82a7eb082b","parent":"6a7041d9ccd3de82a7eb0827","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":240,"height":122,"exactWidth":240,"exactHeight":121.88}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":-1,"exactX":0.27,"exactY":-1,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":""}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"bottom","horizontalAlignment":"center","fontStyle":"italic"},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"}},"updatedAt":"2026-08-03T07:28:02.682Z","createdAt":"2026-08-03T07:23:59.849Z"},{"_id":"6a7041d9ccd3de82a7eb082c","parent":"6a7041d9ccd3de82a7eb082b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":220,"height":28,"exactWidth":220,"exactHeight":28.38}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":18,"y":15,"exactX":18.21,"exactY":14.58,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"324140"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left","fontStyle":"normal"},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"}},"updatedAt":"2026-08-03T07:24:46.035Z","createdAt":"2026-08-03T07:23:59.849Z"},{"_id":"6a7041d9ccd3de82a7eb082d","parent":"6a7041d9ccd3de82a7eb082b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":6,"rightTop":6,"leftBottom":6,"rightBottom":6},"width":{"left":0,"top":0,"right":0,"bottom":0},"type":"solid"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":56,"height":20,"exactWidth":56.44,"exactHeight":20}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":19,"y":-1,"exactX":19,"exactY":-0.91,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"3740"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"center","fontStyle":"normal"},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0.07)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"updatedAt":"2026-08-03T07:24:54.520Z","createdAt":"2026-08-03T07:23:59.849Z"},{"_id":"6a7041d9ccd3de82a7eb082e","parent":"6a7041d9ccd3de82a7eb082b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":213,"height":40,"exactWidth":213.45,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":18,"y":5,"exactX":false,"exactY":false,"fixed":false}},"childrenMode":"cols","childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"updatedAt":"2026-08-03T07:23:59.849Z","createdAt":"2026-08-03T07:23:59.849Z"},{"_id":"6a7041d9ccd3de82a7eb082f","parent":"6a7041d9ccd3de82a7eb082e","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":67,"height":40,"exactWidth":66.79,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":0,"exactY":0,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"83740856"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left","fontStyle":"normal"},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(173,173,173,1)"},"component":"data2-core-types@Color"}},"updatedAt":"2026-08-03T07:26:29.193Z","createdAt":"2026-08-03T07:23:59.849Z"},{"_id":"6a7041d9ccd3de82a7eb0830","parent":"6a7041d9ccd3de82a7eb082e","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":14,"height":40,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":10,"y":0,"exactX":9.98,"exactY":0.42,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"-> "}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left","fontStyle":"normal"},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"}},"updatedAt":"2026-08-03T07:23:59.849Z","createdAt":"2026-08-03T07:23:59.849Z"},{"_id":"6a7041d9ccd3de82a7eb0831","parent":"6a7041d9ccd3de82a7eb082e","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":6,"rightTop":6,"leftBottom":6,"rightBottom":6},"width":{"left":0,"top":0,"right":0,"bottom":0},"type":"solid"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":117,"height":40,"exactWidth":116.58,"exactHeight":40}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":10,"y":1,"exactX":9.6,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"\n    24140"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left","fontStyle":"normal","fontWeight":700,"lineHeight":0.5},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(212,54,54,1)"},"component":"data2-core-types@Color"},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"shadow":[{"component":"data2-core-types@Shadow","params":{"type":"inset","spread":1,"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0.1)"}}}}]},"updatedAt":"2026-08-03T07:30:15.779Z","createdAt":"2026-08-03T07:23:59.849Z"},{"_id":"6a7041d9ccd3de82a7eb0832","parent":"6a7041d9ccd3de82a7eb082e","component":"data2-blocks@IconBlock","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":24,"height":24,"exactWidth":24,"exactHeight":24.15}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":183,"y":13,"exactY":12.91,"exactX":182.82000000000002}},"opacity":{"params":{"value":38},"component":"data2-core-types@Opacity"}},"icon":{"params":{"iconSet":"remix","icon":"ri-layout-grid-fill"},"component":"data2-core-web@Icon"}},"updatedAt":"2026-08-03T07:30:22.087Z","createdAt":"2026-08-03T07:23:59.849Z"},{"_id":"6a7041d9ccd3de82a7eb0833","parent":"6a7041d9ccd3de82a7eb082b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0.12)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":240,"height":1,"exactWidth":false,"exactHeight":1}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":121,"exactX":false,"exactY":false}}},"updatedAt":"2026-08-03T07:23:59.849Z","createdAt":"2026-08-03T07:23:59.849Z"},{"_id":"6a7042b7ccd3de82a7eb0835","parent":"6a7041d9ccd3de82a7eb082b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":6,"rightTop":6,"leftBottom":6,"rightBottom":6},"width":{"left":0,"top":0,"right":0,"bottom":0},"type":"solid"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":99,"height":16,"exactWidth":98.7,"exactHeight":16}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":128,"y":65,"exactX":128.34,"exactY":64.77,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"3740"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"12"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"top","horizontalAlignment":"center","fontStyle":"normal","fontWeight":700,"lineHeight":1.4},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(255,255,255,1)"},"component":"data2-core-types@Color"},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(212,54,54,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"updatedAt":"2026-08-03T07:30:24.435Z","createdAt":"2026-08-03T07:27:48.479Z"},{"_id":"6a70462bccd3de82a7eb0837","parent":"6a70362dccd3de82a7eb07b9","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":500,"rightTop":500,"leftBottom":500,"rightBottom":500},"width":{"left":0,"top":0,"right":0,"bottom":0},"type":"solid"}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0.12)"},"disabled":true},"gradient":{"disabled":false,"component":"data2-core-types@ColorGradient","params":{"colors":[{"component":"data2-core-types@ColorGradientStop","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255,0,0,1)"}},"offset":"40.699999999999996%"}},{"component":"data2-core-types@ColorGradientStop","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(200,200,200,1)"}},"offset":"44.4%"}}],"angle":90}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":119,"height":7,"exactWidth":118.86,"exactHeight":7}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":82,"y":115,"exactX":82.14,"exactY":115.38}}},"updatedAt":"2026-08-03T07:47:53.575Z","createdAt":"2026-08-03T07:42:45.678Z"},{"_id":"6a70466accd3de82a7eb0838","parent":"6a70362dccd3de82a7eb07b9","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":500,"rightTop":500,"leftBottom":500,"rightBottom":500},"width":{"left":0,"top":0,"right":0,"bottom":0},"type":"solid"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":29,"height":14,"exactWidth":29,"exactHeight":14.4}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":206,"y":113,"exactX":206.32,"exactY":112.71}},"text":"+759 ","textColor":{"params":{"rgba":"rgba(111,228,69,1)"},"component":"data2-core-types@Color"},"textFormat":{"params":{"fontWeight":600},"component":"data2-core-types@TextFormat"},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"11"}}},"updatedAt":"2026-08-03T07:48:07.600Z","createdAt":"2026-08-03T07:44:02.660Z"},{"_id":"6a713d22a5ba5229796f36d0","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"Copy of Big Sur Design Tokens — Light Mode","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Big Sur Design Tokens — Light Mode"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1600,"height":3220}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontFamily":{"component":"data2-core-web@GoogleFont","params":{"family":"Inter"}}}},"fill":{"disabled":false,"component":"data2-core-types@Fill","params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]}}},"reference":"LH8foIFBrsmW6ZlTaHiod","updatedAt":"2026-08-04T01:17:03.853Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f36d1","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Type Label 2","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":2140,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":0,"exactY":2140}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":340,"height":32}},"text":"Large Title Regular · 26/32","textSize":11,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label-2"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"verticalAlignment":"middle"}}},"index":29,"reference":"Y6KVFhjNvmZHIWsZBQikK","updatedAt":"2026-08-04T01:17:22.937Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f36d2","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Material Tooltip","params":{"position":{"component":"data2-core-types@Position","params":{"x":1119,"y":1896,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":1119,"exactY":1896}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":353,"height":100}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,252,0.95)"}}}}]}},"backdropFilter":[{"component":"data2-core-types@BitmapFilter","params":{"type":"blur","value":20}}],"border":{"component":"data2-core-types@Border","params":{"radius":{"leftTop":"10","rightTop":"10","rightBottom":"10","leftBottom":"10"},"width":{"left":"1","top":"1","right":"1","bottom":"1"},"color":"rgba(0,0,0,0.06)"}},"shadow":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-shadow-tooltip"}},"prop":"shadow"}}},"index":23,"reference":"--qwfZDEWtcICGJENZ3FB","updatedAt":"2026-08-04T01:17:22.944Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f36d3","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Material Titlebar","params":{"position":{"component":"data2-core-types@Position","params":{"x":373,"y":1776,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":373,"exactY":1776}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":353,"height":100}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(246,246,247,0.75)"}}}}]}},"backdropFilter":[{"component":"data2-core-types@BitmapFilter","params":{"type":"blur","value":20}}],"border":{"component":"data2-core-types@Border","params":{"radius":{"leftTop":"10","rightTop":"10","rightBottom":"10","leftBottom":"10"},"width":{"left":"1","top":"1","right":"1","bottom":"1"},"color":"rgba(0,0,0,0.06)"}}},"index":5,"reference":"lxWRSqCFF5IwMeBFl0b_k","updatedAt":"2026-08-04T01:17:22.668Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f36d4","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Type Sample 3","params":{"position":{"component":"data2-core-types@Position","params":{"x":356,"y":2184,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":356,"exactY":2184}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1100,"height":30}},"text":"The quick brown fox jumps","textSize":22,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"700","lineHeight":1.182}}},"index":32,"reference":"2EXbDTfDozSXAdvFr8htQ","updatedAt":"2026-08-04T01:17:22.684Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f36d5","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Type Label 22","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":3020,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":0,"exactY":3020}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":340,"height":16}},"text":"Caption 2 Regular · 10/13","textSize":11,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label-2"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"verticalAlignment":"middle"}}},"index":69,"reference":"0IrhZoFC-D5uoAoEeDETQ","updatedAt":"2026-08-04T01:17:22.679Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f36d6","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch Pink Name","params":{"position":{"component":"data2-core-types@Position","params":{"x":840,"y":450,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":840,"exactY":450}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":16}},"text":"Pink","textSize":13,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"600"}}},"index":30,"reference":"FyQ3gU7O3SO2CxdyN1JiF","updatedAt":"2026-08-04T01:17:22.621Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f36d7","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Shadow Popover Sample","params":{"position":{"component":"data2-core-types@Position","params":{"x":280,"y":1522,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":280,"exactY":1522}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":100}},"fill":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-surface"}},"prop":"fill"}},"border":{"component":"data2-core-types@Border","params":{"radius":{"leftTop":"12","rightTop":"12","rightBottom":"12","leftBottom":"12"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"shadow":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-shadow-popover"}},"prop":"shadow"}}},"index":20,"reference":"mkC8Tnt0crl_Ds8I9W3xn","updatedAt":"2026-08-04T01:17:22.692Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f36d8","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Type Label 3","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":2184,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":0,"exactY":2184}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":340,"height":30}},"text":"Title 1 Bold · 22/26","textSize":11,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label-2"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"verticalAlignment":"middle"}}},"index":31,"reference":"7Ji1i3YFoT4qP1tPXBvzW","updatedAt":"2026-08-04T01:17:22.679Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f36d9","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Border Popover Name","params":{"position":{"component":"data2-core-types@Position","params":{"x":1120,"y":1412,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":1120,"exactY":1412}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":16}},"text":"Popover Border","textSize":13,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"600"}}},"index":14,"reference":"hQKAP5Kaags9ZIFtgYnxa","updatedAt":"2026-08-04T01:17:22.663Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f36da","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Border Window Spec","params":{"position":{"component":"data2-core-types@Position","params":{"x":840,"y":1430,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":840,"exactY":1430}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":14}},"text":"1px · 15% black · radius 10","textSize":11,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label-2"}},"prop":"textColor"}}},"index":12,"reference":"YYesG6mFul2Xhk6DnKjey","updatedAt":"2026-08-04T01:17:22.682Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f36db","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Material Sheet Spec","params":{"position":{"component":"data2-core-types@Position","params":{"x":762,"y":1934,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":762,"exactY":1934}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":320,"height":14}},"text":"blur 24 · sat 180%","textSize":11,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label-2"}},"prop":"textColor"}}},"index":22,"reference":"CJENJ1qXGrhuEjIWtSSaU","updatedAt":"2026-08-04T01:17:25.667Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f36dc","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch Purple Name","params":{"position":{"component":"data2-core-types@Position","params":{"x":560,"y":450,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":560,"exactY":450}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":16}},"text":"Purple","textSize":13,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"600"}}},"index":27,"reference":"ppBn0oXVo6DeHw00yIQCi","updatedAt":"2026-08-04T01:17:25.711Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f36dd","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Header Title","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":0,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":0,"exactY":0}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1000,"height":44}},"text":"Big Sur Design Tokens — Light Mode","textSize":34,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"700","letterSpacing":{"component":"data2-core-numerical-operators@Subtract","params":{"components":[0,0.5]}}}}},"index":0,"reference":"l2tJ7ba9cc6D6FQUHJgAs","updatedAt":"2026-08-04T01:17:25.709Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f36de","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Type Label 14","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":2668,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":0,"exactY":2668}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":340,"height":20}},"text":"Body Regular · 13/16","textSize":11,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label-2"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"verticalAlignment":"middle"}}},"index":53,"reference":"6SNMJLGMcEA4kEnqRTzEk","updatedAt":"2026-08-04T01:17:25.694Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f36df","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Header Subtitle","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":52,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":0,"exactY":52}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1100,"height":24}},"text":"Semantic AppKit system colors, materials, and type styles for macOS Big Sur — Light appearance.","textSize":15,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label-2"}},"prop":"textColor"}}},"index":1,"reference":"0sm6l9PP0H0-l8vNRmnj9","updatedAt":"2026-08-04T01:17:25.623Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f36e0","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch Blue","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":362,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":0,"exactY":362}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":80}},"fill":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-accent"}},"prop":"fill"}},"border":{"component":"data2-core-types@Border","params":{"radius":{"leftTop":"12","rightTop":"12","rightBottom":"12","leftBottom":"12"},"width":{"left":"1","top":"1","right":"1","bottom":"1"},"color":"rgba(0,0,0,0.10)"}}},"index":20,"reference":"6vDH8gnxclAsTdaKbeV-W","updatedAt":"2026-08-04T01:17:25.660Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f36e1","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch Grid Name","params":{"position":{"component":"data2-core-types@Position","params":{"x":280,"y":1184,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":280,"exactY":1184}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":16}},"text":"Grid","textSize":13,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"600"}}},"index":81,"reference":"DOqSiCwAuHYzyvcq6lES-","updatedAt":"2026-08-04T01:17:25.533Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f36e2","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch Orange Name","params":{"position":{"component":"data2-core-types@Position","params":{"x":280,"y":320,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":280,"exactY":320}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":16}},"text":"Orange","textSize":13,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"600"}}},"index":9,"reference":"wznGU-piMDTuotZAwBvOC","updatedAt":"2026-08-04T01:17:25.538Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f36e3","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Type Sample 7","params":{"position":{"component":"data2-core-types@Position","params":{"x":356,"y":2360,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":356,"exactY":2360}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1100,"height":24}},"text":"The quick brown fox jumps","textSize":15,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"700","lineHeight":1.333}}},"index":40,"reference":"ajyXVD_CvT_5kf6Yke57c","updatedAt":"2026-08-04T01:17:25.599Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f36e4","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch Link Name","params":{"position":{"component":"data2-core-types@Position","params":{"x":560,"y":896,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":560,"exactY":896}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":16}},"text":"Link","textSize":13,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"600"}}},"index":59,"reference":"kfF-G1O9hZCzz0xpR0dTM","updatedAt":"2026-08-04T01:17:25.566Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f36e5","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Shadow Sunken Sample","params":{"position":{"component":"data2-core-types@Position","params":{"x":1120,"y":1522,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":1120,"exactY":1522}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":100}},"fill":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-bg"}},"prop":"fill"}},"border":{"component":"data2-core-types@Border","params":{"radius":{"leftTop":"8","rightTop":"8","rightBottom":"8","leftBottom":"8"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"shadow":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-shadow-sunken"}},"prop":"shadow"}}},"index":29,"reference":"FsGQhuhCqFDudFWsXJBCZ","updatedAt":"2026-08-04T01:17:25.545Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f36e6","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch Label Sub","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":756,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":0,"exactY":756}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":14}},"text":"labelColor · #000000","textSize":11,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label-2"}},"prop":"textColor"}}},"index":41,"reference":"_g9ScWdOlwDkGpFjShJYP","updatedAt":"2026-08-04T01:17:25.502Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f36e7","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Type Sample 12","params":{"position":{"component":"data2-core-types@Position","params":{"x":356,"y":2580,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":356,"exactY":2580}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1100,"height":18}},"text":"The quick brown fox jumps","textSize":11,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"400","lineHeight":1.273}}},"index":50,"reference":"iG_Q9eqYATNEWVSrNXcMe","updatedAt":"2026-08-04T01:17:25.556Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f36e8","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch Label2 Sub","params":{"position":{"component":"data2-core-types@Position","params":{"x":280,"y":756,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":280,"exactY":756}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":14}},"text":"secondaryLabelColor · 50% black","textSize":11,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label-2"}},"prop":"textColor"}}},"index":44,"reference":"3kaQJxve_0H3_VRfU0B-l","updatedAt":"2026-08-04T01:17:25.532Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f36e9","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Type Sample 8","params":{"position":{"component":"data2-core-types@Position","params":{"x":356,"y":2404,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":356,"exactY":2404}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1100,"height":24}},"text":"The quick brown fox jumps","textSize":15,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"400","lineHeight":1.333}}},"index":42,"reference":"SjFL5H6lTCGrp3Jk2aNHu","updatedAt":"2026-08-04T01:17:25.528Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f36ea","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Material Sheet Name","params":{"position":{"component":"data2-core-types@Position","params":{"x":762,"y":1912,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":762,"exactY":1912}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":320,"height":18}},"text":"Sheet","textSize":14,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"700"}}},"index":21,"reference":"wOBy-y0K_iv3cGGO6wMi_","updatedAt":"2026-08-04T01:17:25.480Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f36eb","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch SelectedBG Name","params":{"position":{"component":"data2-core-types@Position","params":{"x":840,"y":1054,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":840,"exactY":1054}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":16}},"text":"Selected Content Bg","textSize":13,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"600"}}},"index":72,"reference":"UPbMijO4Uv4zuXmMg2r9v","updatedAt":"2026-08-04T01:17:25.414Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f36ec","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Type Label 12","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":2580,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":0,"exactY":2580}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":340,"height":18}},"text":"Subheadline Regular · 11/14","textSize":11,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label-2"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"verticalAlignment":"middle"}}},"index":49,"reference":"1luqYesElf8LDG6U9wYFd","updatedAt":"2026-08-04T01:17:25.425Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f36ed","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Border Popover Spec","params":{"position":{"component":"data2-core-types@Position","params":{"x":1120,"y":1430,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":1120,"exactY":1430}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":14}},"text":"1px · 8% black · radius 12","textSize":11,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label-2"}},"prop":"textColor"}}},"index":15,"reference":"mKL8zi_waKFxfiG9w7QKj","updatedAt":"2026-08-04T01:17:25.421Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f36ee","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Material Menu Name","params":{"position":{"component":"data2-core-types@Position","params":{"x":1135,"y":1792,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":1135,"exactY":1792}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":320,"height":18}},"text":"Menu","textSize":14,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"700"}}},"index":12,"reference":"JWJcTCj3y8JTrJ46Kc_IP","updatedAt":"2026-08-04T01:17:25.403Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f36ef","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Type Sample 16","params":{"position":{"component":"data2-core-types@Position","params":{"x":356,"y":2756,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":356,"exactY":2756}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1100,"height":18}},"text":"The quick brown fox jumps","textSize":12,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"400","lineHeight":1.25}}},"index":58,"reference":"gJjp2TpyiN1RXEisHJLl1","updatedAt":"2026-08-04T01:17:25.385Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f36f0","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Type Sample 10","params":{"position":{"component":"data2-core-types@Position","params":{"x":356,"y":2492,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":356,"exactY":2492}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1100,"height":20}},"text":"The quick brown fox jumps","textSize":13,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"400","lineHeight":1.231}}},"index":46,"reference":"AB88lR4v46Gg1dkO57ghO","updatedAt":"2026-08-04T01:17:25.350Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f36f1","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Type Label 13","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":2624,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":0,"exactY":2624}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":340,"height":20}},"text":"Body Bold · 13/16","textSize":11,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label-2"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"verticalAlignment":"middle"}}},"index":51,"reference":"oY_uxv7mfK_S4fX5OSdeL","updatedAt":"2026-08-04T01:17:25.364Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f36f2","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch Yellow Sub","params":{"position":{"component":"data2-core-types@Position","params":{"x":560,"y":338,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":560,"exactY":338}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":14}},"text":"systemYellowColor · #FFCC00","textSize":11,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label-2"}},"prop":"textColor"}}},"index":13,"reference":"YrYmCLCg5A-QwOt5H_bLG","updatedAt":"2026-08-04T01:17:25.306Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f36f3","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Material Tooltip Spec","params":{"position":{"component":"data2-core-types@Position","params":{"x":1135,"y":1934,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":1135,"exactY":1934}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":320,"height":14}},"text":"blur 20 · sat 150%","textSize":11,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label-2"}},"prop":"textColor"}}},"index":25,"reference":"9e9IoUu5KSjxsHNuewOOK","updatedAt":"2026-08-04T01:17:25.306Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f36f4","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch TextColor","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":808,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":0,"exactY":808}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":80}},"fill":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"fill"}},"border":{"component":"data2-core-types@Border","params":{"radius":{"leftTop":"12","rightTop":"12","rightBottom":"12","leftBottom":"12"},"width":{"left":"1","top":"1","right":"1","bottom":"1"},"color":"rgba(0,0,0,0.10)"}}},"index":52,"reference":"N4VreVnh6mkBr7BpViPWw","updatedAt":"2026-08-04T01:17:25.371Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f36f5","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Shadow Popover Spec","params":{"position":{"component":"data2-core-types@Position","params":{"x":280,"y":1664,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":280,"exactY":1664}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":14}},"text":"y8 · blur24 · 20% black","textSize":11,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label-2"}},"prop":"textColor"}}},"index":22,"reference":"BUaEnKKpTQoiM5Jd5DXb4","updatedAt":"2026-08-04T01:17:25.203Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f36f6","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch Pink Sub","params":{"position":{"component":"data2-core-types@Position","params":{"x":840,"y":468,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":840,"exactY":468}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":14}},"text":"systemPinkColor · #FF2D55","textSize":11,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label-2"}},"prop":"textColor"}}},"index":31,"reference":"U5YKE9IJfKTwOjCqdlADe","updatedAt":"2026-08-04T01:17:25.255Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f36f7","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Border Control Spec","params":{"position":{"component":"data2-core-types@Position","params":{"x":280,"y":1430,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":280,"exactY":1430}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":14}},"text":"1px · 10% black · radius 6","textSize":11,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label-2"}},"prop":"textColor"}}},"index":6,"reference":"5MuFEVvD6Bl9MEs5s2w93","updatedAt":"2026-08-04T01:17:25.367Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f36f8","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch Gray Sub","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":598,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":0,"exactY":598}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":14}},"text":"systemGrayColor · #8E8E93","textSize":11,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label-2"}},"prop":"textColor"}}},"index":37,"reference":"8WatVUxZ7SXCQ-aQNzo7D","updatedAt":"2026-08-04T01:17:25.238Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f36f9","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Type Label 1","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":2096,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":0,"exactY":2096}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":340,"height":32}},"text":"Large Title Bold · 26/32","textSize":11,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label-2"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"verticalAlignment":"middle"}}},"index":27,"reference":"JoA7s60lz6hvt9ULx7Ra-","updatedAt":"2026-08-04T01:17:25.220Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f36fa","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Border Control Name","params":{"position":{"component":"data2-core-types@Position","params":{"x":280,"y":1412,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":280,"exactY":1412}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":16}},"text":"Control Border","textSize":13,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"600"}}},"index":5,"reference":"rHv0oo5pbwmsalrW-xqzK","updatedAt":"2026-08-04T01:17:25.369Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f36fb","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch Gray Name","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":580,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":0,"exactY":580}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":16}},"text":"Gray","textSize":13,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"600"}}},"index":36,"reference":"rK71_K60K8cdrHTQeQhv0","updatedAt":"2026-08-04T01:17:25.173Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f36fc","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Shadow Button Name","params":{"position":{"component":"data2-core-types@Position","params":{"x":840,"y":1646,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":840,"exactY":1646}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":16}},"text":"Control / Button Shadow","textSize":13,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"600"}}},"index":27,"reference":"pclwOrczJAYaPDRvaohCM","updatedAt":"2026-08-04T01:17:25.164Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f36fd","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch WindowBG Name","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":1054,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":0,"exactY":1054}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":16}},"text":"Window Background","textSize":13,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"600"}}},"index":63,"reference":"ooVvLY69o07G7rJl8XZdd","updatedAt":"2026-08-04T01:17:25.162Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f36fe","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Shadow Window Spec","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":1664,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":0,"exactY":1664}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":14}},"text":"y20 · blur60 · 35% black","textSize":11,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label-2"}},"prop":"textColor"}}},"index":19,"reference":"WxhC3lv-EFregs2EqcLaz","updatedAt":"2026-08-04T01:17:25.107Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f36ff","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch UnderPageBG Name","params":{"position":{"component":"data2-core-types@Position","params":{"x":280,"y":1054,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":280,"exactY":1054}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":16}},"text":"Under Page Background","textSize":13,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"600"}}},"index":66,"reference":"plB6e-APcWcHP9qQZ-LxD","updatedAt":"2026-08-04T01:17:25.038Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f3700","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch Orange","params":{"position":{"component":"data2-core-types@Position","params":{"x":280,"y":232,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":280,"exactY":232}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":80}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#FF9500"}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":{"leftTop":"12","rightTop":"12","rightBottom":"12","leftBottom":"12"},"width":{"left":"1","top":"1","right":"1","bottom":"1"},"color":"rgba(0,0,0,0.10)"}}},"index":8,"reference":"sbzYJcae_d-vqSyd0kJJC","updatedAt":"2026-08-04T01:17:25.091Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f3701","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Material Titlebar Spec","params":{"position":{"component":"data2-core-types@Position","params":{"x":389,"y":1814,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":389,"exactY":1814}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":320,"height":14}},"text":"blur 20 · sat 180%","textSize":11,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label-2"}},"prop":"textColor"}}},"index":7,"reference":"cLoFJ3NXtsZ3gn0B6lIdT","updatedAt":"2026-08-04T01:17:25.079Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f3702","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch Grid Sub","params":{"position":{"component":"data2-core-types@Position","params":{"x":280,"y":1202,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":280,"exactY":1202}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":14}},"text":"gridColor · 8% black","textSize":11,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label-2"}},"prop":"textColor"}}},"index":82,"reference":"a7xn77f_31STFx4znkath","updatedAt":"2026-08-04T01:17:25.023Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f3703","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch TextColor Sub","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":914,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":0,"exactY":914}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":14}},"text":"textColor · #000000","textSize":11,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label-2"}},"prop":"textColor"}}},"index":54,"reference":"r9V_XRIM099CRaESjfuf2","updatedAt":"2026-08-04T01:17:25.036Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f3704","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Type Label 10","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":2492,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":0,"exactY":2492}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":340,"height":20}},"text":"Headline Regular · 13/16","textSize":11,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label-2"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"verticalAlignment":"middle"}}},"index":45,"reference":"CrL_pimfRVQxy1pBb2Slb","updatedAt":"2026-08-04T01:17:25.053Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f3705","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch Brown","params":{"position":{"component":"data2-core-types@Position","params":{"x":1120,"y":362,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":1120,"exactY":362}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":80}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#A2845E"}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":{"leftTop":"12","rightTop":"12","rightBottom":"12","leftBottom":"12"},"width":{"left":"1","top":"1","right":"1","bottom":"1"},"color":"rgba(0,0,0,0.10)"}}},"index":32,"reference":"e5gTmME46vJtpiGUe7_Mo","updatedAt":"2026-08-04T01:17:25.054Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f3706","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Shadow Tooltip Spec","params":{"position":{"component":"data2-core-types@Position","params":{"x":560,"y":1664,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":560,"exactY":1664}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":14}},"text":"y2 · blur8 · 15% black","textSize":11,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label-2"}},"prop":"textColor"}}},"index":25,"reference":"UzZhmaG-wCuhYTIVIiw08","updatedAt":"2026-08-04T01:17:25.064Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f3707","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch SelectedBG Sub","params":{"position":{"component":"data2-core-types@Position","params":{"x":840,"y":1072,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":840,"exactY":1072}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":14}},"text":"selectedContentBackgroundColor","textSize":11,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label-2"}},"prop":"textColor"}}},"index":73,"reference":"c0BpopVcAgngpwp7bE2Fg","updatedAt":"2026-08-04T01:17:24.976Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f3708","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch UnemphSelectedBG","params":{"position":{"component":"data2-core-types@Position","params":{"x":1120,"y":966,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":1120,"exactY":966}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":80}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#D4D4D4"}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":{"leftTop":"12","rightTop":"12","rightBottom":"12","leftBottom":"12"},"width":{"left":"1","top":"1","right":"1","bottom":"1"},"color":"rgba(0,0,0,0.10)"}}},"index":74,"reference":"I3JJFTRYxcEVZXYORms-o","updatedAt":"2026-08-04T01:17:24.929Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f3709","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Type Sample 1","params":{"position":{"component":"data2-core-types@Position","params":{"x":356,"y":2092,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":356,"exactY":2092}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1100,"height":36}},"text":"The quick brown fox jumps","textSize":26,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"700","lineHeight":1.231}}},"index":28,"reference":"pvcXqzmvJdwZziCpTomLq","updatedAt":"2026-08-04T01:17:24.993Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f370a","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Type Sample 11","params":{"position":{"component":"data2-core-types@Position","params":{"x":356,"y":2536,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":356,"exactY":2536}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1100,"height":18}},"text":"The quick brown fox jumps","textSize":11,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"700","lineHeight":1.273}}},"index":48,"reference":"HtcAwRknioB4OUrn47pKS","updatedAt":"2026-08-04T01:17:24.906Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f370b","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Group D Heading","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":938,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":0,"exactY":938}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":400,"height":16}},"text":"BACKGROUND & FILL COLORS","textSize":12,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label-2"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"700","letterSpacing":0.6}}},"index":61,"reference":"wWv4OfabclnvK2UTLqaTN","updatedAt":"2026-08-04T01:17:24.898Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f370c","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch Link Sub","params":{"position":{"component":"data2-core-types@Position","params":{"x":560,"y":914,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":560,"exactY":914}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":14}},"text":"linkColor · #0068DA","textSize":11,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label-2"}},"prop":"textColor"}}},"index":60,"reference":"QgPoMlGc7fboWCh1u41ID","updatedAt":"2026-08-04T01:17:24.918Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f370d","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Border Window Name","params":{"position":{"component":"data2-core-types@Position","params":{"x":840,"y":1412,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":840,"exactY":1412}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":16}},"text":"Window Border","textSize":13,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"600"}}},"index":11,"reference":"ll6qE6oLezFwNJpMRBbzu","updatedAt":"2026-08-04T01:17:24.928Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f370e","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Shadow Button Sample","params":{"position":{"component":"data2-core-types@Position","params":{"x":840,"y":1522,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":840,"exactY":1522}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":100}},"fill":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-surface"}},"prop":"fill"}},"border":{"component":"data2-core-types@Border","params":{"radius":{"leftTop":"6","rightTop":"6","rightBottom":"6","leftBottom":"6"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"shadow":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-shadow-button"}},"prop":"shadow"}}},"index":26,"reference":"gk9Oli-FQfXE0Tk0htHY2","updatedAt":"2026-08-04T01:17:24.834Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f370f","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Type Label 16","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":2756,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":0,"exactY":2756}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":340,"height":18}},"text":"Callout Regular · 12/15","textSize":11,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label-2"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"verticalAlignment":"middle"}}},"index":57,"reference":"W5POGjbYhy1EelIkIDDv1","updatedAt":"2026-08-04T01:17:24.850Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f3710","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Material Sidebar Name","params":{"position":{"component":"data2-core-types@Position","params":{"x":16,"y":1792,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":16,"exactY":1792}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":320,"height":18}},"text":"Sidebar","textSize":14,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"700"}}},"index":3,"reference":"wXKbJdstUsT7Hgkb_jFHi","updatedAt":"2026-08-04T01:17:24.880Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f3711","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Border Focus Sample","params":{"position":{"component":"data2-core-types@Position","params":{"x":560,"y":1304,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":560,"exactY":1304}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":100}},"fill":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-surface"}},"prop":"fill"}},"border":{"component":"data2-core-types@Border","params":{"radius":{"leftTop":"6","rightTop":"6","rightBottom":"6","leftBottom":"6"},"width":{"left":"2","top":"2","right":"2","bottom":"2"},"color":"#0064e1"}},"shadow":{"component":"data2-core-types@Shadow","params":{"x":0,"y":0,"blur":4,"spread":2,"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(10,132,255,0.5)"}}}}},"index":7,"reference":"kasIxt1gNUK73bVPLGXX7","updatedAt":"2026-08-04T01:18:05.220Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f3712","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Material Popover","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":1896,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":0,"exactY":1896}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":353,"height":100}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,0.78)"}}}}]}},"backdropFilter":[{"component":"data2-core-types@BitmapFilter","params":{"type":"blur","value":30}}],"border":{"component":"data2-core-types@Border","params":{"radius":{"leftTop":"10","rightTop":"10","rightBottom":"10","leftBottom":"10"},"width":{"left":"1","top":"1","right":"1","bottom":"1"},"color":"rgba(0,0,0,0.06)"}},"shadow":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-shadow-popover"}},"prop":"shadow"}}},"index":14,"reference":"VUqGWYuTNrXeHSGwfk5Kt","updatedAt":"2026-08-04T01:17:24.884Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f3713","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch Pink","params":{"position":{"component":"data2-core-types@Position","params":{"x":840,"y":362,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":840,"exactY":362}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":80}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#FF2D55"}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":{"leftTop":"12","rightTop":"12","rightBottom":"12","leftBottom":"12"},"width":{"left":"1","top":"1","right":"1","bottom":"1"},"color":"rgba(0,0,0,0.10)"}}},"index":29,"reference":"DSq_57JBz_MTrdkTbQqzD","updatedAt":"2026-08-04T01:17:24.827Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f3714","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch Placeholder","params":{"position":{"component":"data2-core-types@Position","params":{"x":280,"y":808,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":280,"exactY":808}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":80}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0.25)"}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":{"leftTop":"12","rightTop":"12","rightBottom":"12","leftBottom":"12"},"width":{"left":"1","top":"1","right":"1","bottom":"1"},"color":"rgba(0,0,0,0.10)"}}},"index":55,"reference":"iMBvwki4zInQmIebRtGNN","updatedAt":"2026-08-04T01:17:24.735Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f3715","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Type Label 19","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":2888,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":0,"exactY":2888}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":340,"height":16}},"text":"Caption 1 Bold · 10/13","textSize":11,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label-2"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"verticalAlignment":"middle"}}},"index":63,"reference":"43WvMBdfAMQ2ukH8wAhgF","updatedAt":"2026-08-04T01:17:24.756Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f3716","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch Placeholder Name","params":{"position":{"component":"data2-core-types@Position","params":{"x":280,"y":896,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":280,"exactY":896}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":16}},"text":"Placeholder Text","textSize":13,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"600"}}},"index":56,"reference":"wD2rWhKccW52pw6nP3KDX","updatedAt":"2026-08-04T01:17:24.761Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f3717","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch SelectedBG","params":{"position":{"component":"data2-core-types@Position","params":{"x":840,"y":966,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":840,"exactY":966}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":80}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#0064E1"}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":{"leftTop":"12","rightTop":"12","rightBottom":"12","leftBottom":"12"},"width":{"left":"1","top":"1","right":"1","bottom":"1"},"color":"rgba(0,0,0,0.10)"}}},"index":71,"reference":"KEeYCy3DX2IskjZlN_pSz","updatedAt":"2026-08-04T01:17:24.721Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f3718","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Type Sample 19","params":{"position":{"component":"data2-core-types@Position","params":{"x":356,"y":2888,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":356,"exactY":2888}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1100,"height":16}},"text":"The quick brown fox jumps","textSize":10,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"700","lineHeight":1.3}}},"index":64,"reference":"ykG0HythniUKc9KpfiArt","updatedAt":"2026-08-04T01:17:24.761Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f3719","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Type Sample 15","params":{"position":{"component":"data2-core-types@Position","params":{"x":356,"y":2712,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":356,"exactY":2712}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1100,"height":18}},"text":"The quick brown fox jumps","textSize":12,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"700","lineHeight":1.25}}},"index":56,"reference":"G7YCDPMGih7q8HxQtjfcm","updatedAt":"2026-08-04T01:17:24.748Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f371a","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch Red","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":232,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":0,"exactY":232}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":80}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#FF3B30"}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":{"leftTop":"12","rightTop":"12","rightBottom":"12","leftBottom":"12"},"width":{"left":"1","top":"1","right":"1","bottom":"1"},"color":"rgba(0,0,0,0.10)"}}},"index":5,"reference":"isIB6vRypme7IhXUCbfgE","updatedAt":"2026-08-04T01:17:24.709Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f371b","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Type Sample 14","params":{"position":{"component":"data2-core-types@Position","params":{"x":356,"y":2668,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":356,"exactY":2668}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1100,"height":20}},"text":"The quick brown fox jumps","textSize":13,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"400","lineHeight":1.231}}},"index":54,"reference":"YGlmguEVuMsoJIJOAh42r","updatedAt":"2026-08-04T01:17:24.723Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f371c","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Border Separator Spec","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":1430,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":0,"exactY":1430}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":14}},"text":"1px · separatorColor","textSize":11,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label-2"}},"prop":"textColor"}}},"index":3,"reference":"MKSxkBmmEG7-q30-5qP92","updatedAt":"2026-08-04T01:17:24.603Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f371d","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Type Label 4","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":2228,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":0,"exactY":2228}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":340,"height":30}},"text":"Title 1 Regular · 22/26","textSize":11,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label-2"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"verticalAlignment":"middle"}}},"index":33,"reference":"9xyPnHc1IjqkvURpzONTE","updatedAt":"2026-08-04T01:17:24.629Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f371e","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Border Focus Name","params":{"position":{"component":"data2-core-types@Position","params":{"x":560,"y":1412,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":560,"exactY":1412}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":16}},"text":"Focus Ring","textSize":13,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"600"}}},"index":8,"reference":"DxMT9fRFn99IAIMLrqhMn","updatedAt":"2026-08-04T01:17:24.608Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f371f","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Shadow Sunken Spec","params":{"position":{"component":"data2-core-types@Position","params":{"x":1120,"y":1664,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":1120,"exactY":1664}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":14}},"text":"inset y1 · blur2 · 12% black","textSize":11,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label-2"}},"prop":"textColor"}}},"index":31,"reference":"CodvrdxjrS6nvYOgdb1Y7","updatedAt":"2026-08-04T01:17:24.661Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f3720","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch Teal","params":{"position":{"component":"data2-core-types@Position","params":{"x":1120,"y":232,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":1120,"exactY":232}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":80}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#30B0C7"}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":{"leftTop":"12","rightTop":"12","rightBottom":"12","leftBottom":"12"},"width":{"left":"1","top":"1","right":"1","bottom":"1"},"color":"rgba(0,0,0,0.10)"}}},"index":17,"reference":"qCmjviUmGowsZMhiSLbmX","updatedAt":"2026-08-04T01:17:24.669Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f3721","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch Green","params":{"position":{"component":"data2-core-types@Position","params":{"x":840,"y":232,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":840,"exactY":232}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":80}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#28CD41"}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":{"leftTop":"12","rightTop":"12","rightBottom":"12","leftBottom":"12"},"width":{"left":"1","top":"1","right":"1","bottom":"1"},"color":"rgba(0,0,0,0.10)"}}},"index":14,"reference":"m6RZXUviupcdn-ViPtolq","updatedAt":"2026-08-04T01:17:24.592Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f3722","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch Separator Sub","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":1202,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":0,"exactY":1202}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":14}},"text":"separatorColor · 10% black","textSize":11,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label-2"}},"prop":"textColor"}}},"index":79,"reference":"VldMEiSt-zndpzgS4yf0Y","updatedAt":"2026-08-04T01:17:24.582Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f3723","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch Purple","params":{"position":{"component":"data2-core-types@Position","params":{"x":560,"y":362,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":560,"exactY":362}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":80}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#AF52DE"}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":{"leftTop":"12","rightTop":"12","rightBottom":"12","leftBottom":"12"},"width":{"left":"1","top":"1","right":"1","bottom":"1"},"color":"rgba(0,0,0,0.10)"}}},"index":26,"reference":"_nBC4YCI8qKKTumZIFaL7","updatedAt":"2026-08-04T01:17:24.497Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f3724","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch Grid","params":{"position":{"component":"data2-core-types@Position","params":{"x":280,"y":1096,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":280,"exactY":1096}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":80}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0.08)"}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":{"leftTop":"12","rightTop":"12","rightBottom":"12","leftBottom":"12"},"width":{"left":"1","top":"1","right":"1","bottom":"1"},"color":"rgba(0,0,0,0.10)"}}},"index":80,"reference":"_uihRKYyJG5kVtxkh6dy3","updatedAt":"2026-08-04T01:17:24.501Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f3725","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch Indigo Sub","params":{"position":{"component":"data2-core-types@Position","params":{"x":280,"y":468,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":280,"exactY":468}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":14}},"text":"systemIndigoColor · #5856D6","textSize":11,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label-2"}},"prop":"textColor"}}},"index":25,"reference":"VIYNGSyQm2hzhi0w_rkTF","updatedAt":"2026-08-04T01:17:24.621Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f3726","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch Brown Name","params":{"position":{"component":"data2-core-types@Position","params":{"x":1120,"y":450,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":1120,"exactY":450}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":16}},"text":"Brown","textSize":13,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"600"}}},"index":33,"reference":"Zm-pIU5iNQM3eGpMOENmF","updatedAt":"2026-08-04T01:17:24.482Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f3727","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Type Label 21","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":2976,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":0,"exactY":2976}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":340,"height":16}},"text":"Caption 2 Bold · 10/13","textSize":11,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label-2"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"verticalAlignment":"middle"}}},"index":67,"reference":"82ofRk2vjNrMLHBRgd7Dx","updatedAt":"2026-08-04T01:17:24.527Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f3728","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Blur Backdrop","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":1756,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":0,"exactY":1756}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1472,"height":260}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"disabled":true,"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,1)"}},"gradient":{"disabled":false,"component":"data2-core-types@ColorGradient","params":{"type":"linear","angle":120,"colors":[{"component":"data2-core-types@ColorGradientStop","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#FF3B30"}},"offset":"0%"}},{"component":"data2-core-types@ColorGradientStop","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#FF9500"}},"offset":"20%"}},{"component":"data2-core-types@ColorGradientStop","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#FFCC00"}},"offset":"40%"}},{"component":"data2-core-types@ColorGradientStop","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#28CD41"}},"offset":"60%"}},{"component":"data2-core-types@ColorGradientStop","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#007AFF"}},"offset":"80%"}},{"component":"data2-core-types@ColorGradientStop","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#AF52DE"}},"offset":"100%"}}]}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":{"leftTop":"14","rightTop":"14","rightBottom":"14","leftBottom":"14"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}}},"index":1,"reference":"O9hq3mZNVH7I1wBohMbl0","updatedAt":"2026-08-04T01:17:24.482Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f3729","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch Label Name","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":738,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":0,"exactY":738}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":16}},"text":"Label","textSize":13,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"600"}}},"index":40,"reference":"7F7wBe0wHiMZN3GPo94x7","updatedAt":"2026-08-04T01:17:24.486Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f372a","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Material Tooltip Name","params":{"position":{"component":"data2-core-types@Position","params":{"x":1135,"y":1912,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":1135,"exactY":1912}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":320,"height":18}},"text":"Tooltip","textSize":14,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"700"}}},"index":24,"reference":"LmpZ_AuGsujra37D8mHWX","updatedAt":"2026-08-04T01:17:24.370Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f372b","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Shadows Heading","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":1484,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":0,"exactY":1484}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":400,"height":28}},"text":"03 — Shadows","textSize":22,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"700"}}},"index":16,"reference":"vk48gHxIIl4d45kAfZyts","updatedAt":"2026-08-04T01:17:24.414Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f372c","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch UnemphSelectedBG Sub","params":{"position":{"component":"data2-core-types@Position","params":{"x":1120,"y":1072,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":1120,"exactY":1072}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":14}},"text":"unemphasizedSelectedContentBg","textSize":11,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label-2"}},"prop":"textColor"}}},"index":76,"reference":"fhi8haO9OZuRV9jZWPyU7","updatedAt":"2026-08-04T01:17:24.431Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f372d","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch ControlBG","params":{"position":{"component":"data2-core-types@Position","params":{"x":560,"y":966,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":560,"exactY":966}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":80}},"fill":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-surface"}},"prop":"fill"}},"border":{"component":"data2-core-types@Border","params":{"radius":{"leftTop":"12","rightTop":"12","rightBottom":"12","leftBottom":"12"},"width":{"left":"1","top":"1","right":"1","bottom":"1"},"color":"rgba(0,0,0,0.10)"}}},"index":68,"reference":"iC5jvakWJIRVpJu5Gy3Kq","updatedAt":"2026-08-04T01:17:24.349Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f372e","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Material HUD Name","params":{"position":{"component":"data2-core-types@Position","params":{"x":389,"y":1912,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":389,"exactY":1912}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":320,"height":18}},"text":"HUD Window","textSize":14,"textColor":{"component":"data2-core-types@Color","params":{"rgba":"#ffffff"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"700"}}},"index":18,"reference":"sZbuuEiYvi-nZn1jC0kaQ","updatedAt":"2026-08-04T01:17:24.368Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f372f","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Material Menu","params":{"position":{"component":"data2-core-types@Position","params":{"x":1119,"y":1776,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":1119,"exactY":1776}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":353,"height":100}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,0.7)"}}}}]}},"backdropFilter":[{"component":"data2-core-types@BitmapFilter","params":{"type":"blur","value":30}}],"border":{"component":"data2-core-types@Border","params":{"radius":{"leftTop":"10","rightTop":"10","rightBottom":"10","leftBottom":"10"},"width":{"left":"1","top":"1","right":"1","bottom":"1"},"color":"rgba(0,0,0,0.06)"}},"shadow":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-shadow-popover"}},"prop":"shadow"}}},"index":11,"reference":"mgUxWbLjMBf8fP0x6eahP","updatedAt":"2026-08-04T01:17:24.366Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f3730","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Colors Disclaimer","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":156,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":0,"exactY":156}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1300,"height":34}},"text":"Reference values only. Resolve system & semantic colors via NSColor APIs (e.g. NSColor.systemBlueColor, NSColor.labelColor) — exact pixels vary by OS release, accessibility settings, and accent color preference.","textSize":11,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label-2"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"lineHeight":1.4,"wordWrap":"break-word"}}},"index":3,"reference":"9apfzuWXCQ0IMA8H_nmM0","updatedAt":"2026-08-04T01:17:24.349Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f3731","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Blurs Heading","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":1718,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":0,"exactY":1718}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":400,"height":28}},"text":"04 — Background Blurs","textSize":22,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"700"}}},"index":0,"reference":"IJ4jFUKZeyH50TXubdQvo","updatedAt":"2026-08-04T01:17:24.263Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f3732","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Border Popover Sample","params":{"position":{"component":"data2-core-types@Position","params":{"x":1120,"y":1304,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":1120,"exactY":1304}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":100}},"fill":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-surface"}},"prop":"fill"}},"border":{"component":"data2-core-types@Border","params":{"radius":{"leftTop":"12","rightTop":"12","rightBottom":"12","leftBottom":"12"},"width":{"left":"1","top":"1","right":"1","bottom":"1"},"color":"rgba(0,0,0,0.08)"}}},"index":13,"reference":"oQ1CmmlIqfBVnKI2q9ndy","updatedAt":"2026-08-04T01:17:24.537Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f3733","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch Yellow Name","params":{"position":{"component":"data2-core-types@Position","params":{"x":560,"y":320,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":560,"exactY":320}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":16}},"text":"Yellow","textSize":13,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"600"}}},"index":12,"reference":"MRoVp5LADJM5VdngtaELV","updatedAt":"2026-08-04T01:17:24.311Z","createdAt":"2026-08-04T01:16:14.870Z"},{"_id":"6a713d22a5ba5229796f3734","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch Red Name","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":320,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":0,"exactY":320}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":16}},"text":"Red","textSize":13,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"600"}}},"index":6,"reference":"5bYRzWvCu4RWE33HiApSO","updatedAt":"2026-08-04T01:17:24.231Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f3735","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch Red Sub","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":338,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":0,"exactY":338}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":14}},"text":"systemRedColor · #FF3B30","textSize":11,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label-2"}},"prop":"textColor"}}},"index":7,"reference":"qaIBwXUC8Z97vJR1KVCCY","updatedAt":"2026-08-04T01:17:24.238Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f3736","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Type Sample 6","params":{"position":{"component":"data2-core-types@Position","params":{"x":356,"y":2316,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":356,"exactY":2316}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1100,"height":26}},"text":"The quick brown fox jumps","textSize":17,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"400","lineHeight":1.294}}},"index":38,"reference":"cpOYO1rx-RrfyFXqz1_bU","updatedAt":"2026-08-04T01:17:24.204Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f3737","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Type Label 18","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":2844,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":0,"exactY":2844}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":340,"height":16}},"text":"Footnote Regular · 10/13","textSize":11,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label-2"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"verticalAlignment":"middle"}}},"index":61,"reference":"hhfULs2tpBMIg3qvkv7WB","updatedAt":"2026-08-04T01:17:24.244Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f3738","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch Label3 Name","params":{"position":{"component":"data2-core-types@Position","params":{"x":560,"y":738,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":560,"exactY":738}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":16}},"text":"Tertiary Label","textSize":13,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"600"}}},"index":46,"reference":"xbU7b8weNz_cZRjO5x54r","updatedAt":"2026-08-04T01:17:24.244Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f3739","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch Label","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":650,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":0,"exactY":650}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":80}},"fill":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"fill"}},"border":{"component":"data2-core-types@Border","params":{"radius":{"leftTop":"12","rightTop":"12","rightBottom":"12","leftBottom":"12"},"width":{"left":"1","top":"1","right":"1","bottom":"1"},"color":"rgba(0,0,0,0.10)"}}},"index":39,"reference":"Jx91GS4oU5LkvF7QNvu38","updatedAt":"2026-08-04T01:17:24.153Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f373a","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch Label2 Name","params":{"position":{"component":"data2-core-types@Position","params":{"x":280,"y":738,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":280,"exactY":738}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":16}},"text":"Secondary Label","textSize":13,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"600"}}},"index":43,"reference":"aEK9bG6AYWqswJQjfdHHh","updatedAt":"2026-08-04T01:17:24.190Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f373b","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Shadow Window Name","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":1646,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":0,"exactY":1646}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":16}},"text":"Window Shadow","textSize":13,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"600"}}},"index":18,"reference":"jfVttgLN1KLpsv7bmLyzp","updatedAt":"2026-08-04T01:17:24.102Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f373c","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Type Label 5","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":2272,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":0,"exactY":2272}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":340,"height":26}},"text":"Title 2 Bold · 17/22","textSize":11,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label-2"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"verticalAlignment":"middle"}}},"index":35,"reference":"NIlctfIT1WJaopuvLYIsV","updatedAt":"2026-08-04T01:17:24.132Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f373d","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Material Titlebar Name","params":{"position":{"component":"data2-core-types@Position","params":{"x":389,"y":1792,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":389,"exactY":1792}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":320,"height":18}},"text":"Titlebar","textSize":14,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"700"}}},"index":6,"reference":"s4jcvcq8D4BSWZHMGJLOw","updatedAt":"2026-08-04T01:17:24.138Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f373e","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Type Sample 17","params":{"position":{"component":"data2-core-types@Position","params":{"x":356,"y":2800,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":356,"exactY":2800}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1100,"height":16}},"text":"The quick brown fox jumps","textSize":10,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"700","lineHeight":1.3}}},"index":60,"reference":"_IUj5W0xUEoHtV_Y-9iu6","updatedAt":"2026-08-04T01:17:24.290Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f373f","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Type Label 11","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":2536,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":0,"exactY":2536}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":340,"height":18}},"text":"Subheadline Bold · 11/14","textSize":11,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label-2"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"verticalAlignment":"middle"}}},"index":47,"reference":"IVB4OwIpdYiKlnxZrvtbI","updatedAt":"2026-08-04T01:17:24.045Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f3740","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Type Sample 9","params":{"position":{"component":"data2-core-types@Position","params":{"x":356,"y":2448,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":356,"exactY":2448}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1100,"height":20}},"text":"The quick brown fox jumps","textSize":13,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"700","lineHeight":1.231}}},"index":44,"reference":"dIqvFRKEPqEX0RbgNLirJ","updatedAt":"2026-08-04T01:17:24.067Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f3741","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch Separator Name","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":1184,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":0,"exactY":1184}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":16}},"text":"Separator","textSize":13,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"600"}}},"index":78,"reference":"Y8MPsQVmGlAw_6S28c9Fg","updatedAt":"2026-08-04T01:17:24.070Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f3742","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch Label4","params":{"position":{"component":"data2-core-types@Position","params":{"x":840,"y":650,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":840,"exactY":650}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":80}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0.1)"}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":{"leftTop":"12","rightTop":"12","rightBottom":"12","leftBottom":"12"},"width":{"left":"1","top":"1","right":"1","bottom":"1"},"color":"rgba(0,0,0,0.10)"}}},"index":48,"reference":"Upxrre4YjwTGgxr0x_Xjb","updatedAt":"2026-08-04T01:17:24.068Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f3743","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch UnemphSelectedBG Name","params":{"position":{"component":"data2-core-types@Position","params":{"x":1120,"y":1054,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":1120,"exactY":1054}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":16}},"text":"Unemph. Selected Bg","textSize":13,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"600"}}},"index":75,"reference":"06yiahGtAM0H3NJUUtm2q","updatedAt":"2026-08-04T01:17:24.033Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f3744","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Material Popover Spec","params":{"position":{"component":"data2-core-types@Position","params":{"x":16,"y":1934,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":16,"exactY":1934}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":320,"height":14}},"text":"blur 30 · sat 180%","textSize":11,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label-2"}},"prop":"textColor"}}},"index":16,"reference":"7a1RKPaJgtOWas9KnVDCg","updatedAt":"2026-08-04T01:17:23.977Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f3745","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Shadow Window Sample","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":1522,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":0,"exactY":1522}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":100}},"fill":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-surface"}},"prop":"fill"}},"border":{"component":"data2-core-types@Border","params":{"radius":{"leftTop":"10","rightTop":"10","rightBottom":"10","leftBottom":"10"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"shadow":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-shadow-window"}},"prop":"shadow"}}},"index":17,"reference":"cfv9KHEE7ajPCNy7fxWa-","updatedAt":"2026-08-04T01:17:23.929Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f3746","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Type Label 7","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":2360,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":0,"exactY":2360}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":340,"height":24}},"text":"Title 3 Bold · 15/20","textSize":11,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label-2"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"verticalAlignment":"middle"}}},"index":39,"reference":"gQ_ZCb4PyB2SSJlfROwi4","updatedAt":"2026-08-04T01:17:24.107Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f3747","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Type Sample 5","params":{"position":{"component":"data2-core-types@Position","params":{"x":356,"y":2272,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":356,"exactY":2272}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1100,"height":26}},"text":"The quick brown fox jumps","textSize":17,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"700","lineHeight":1.294}}},"index":36,"reference":"IVlkYMueThiRFWM7G6T0-","updatedAt":"2026-08-04T01:17:23.939Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f3748","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch Teal Name","params":{"position":{"component":"data2-core-types@Position","params":{"x":1120,"y":320,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":1120,"exactY":320}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":16}},"text":"Teal","textSize":13,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"600"}}},"index":18,"reference":"Qn7p5YIiACE4-DI46SGAv","updatedAt":"2026-08-04T01:17:23.950Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f3749","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch Blue Sub","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":468,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":0,"exactY":468}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":14}},"text":"systemBlueColor · #007AFF","textSize":11,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label-2"}},"prop":"textColor"}}},"index":22,"reference":"8f1I7kBmDkR2Hn6p-u0YX","updatedAt":"2026-08-04T01:17:23.963Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f374a","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Type Sample 18","params":{"position":{"component":"data2-core-types@Position","params":{"x":356,"y":2844,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":356,"exactY":2844}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1100,"height":16}},"text":"The quick brown fox jumps","textSize":10,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"400","lineHeight":1.3}}},"index":62,"reference":"GcJG6DAQRdpaep6no7nZf","updatedAt":"2026-08-04T01:17:23.904Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f374b","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Type Label 8","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":2404,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":0,"exactY":2404}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":340,"height":24}},"text":"Title 3 Regular · 15/20","textSize":11,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label-2"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"verticalAlignment":"middle"}}},"index":41,"reference":"Zja-x8P_0jQ5OuYzooklq","updatedAt":"2026-08-04T01:17:23.838Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f374c","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch UnderPageBG Sub","params":{"position":{"component":"data2-core-types@Position","params":{"x":280,"y":1072,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":280,"exactY":1072}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":14}},"text":"underPageBackgroundColor · #E8E8E8","textSize":11,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label-2"}},"prop":"textColor"}}},"index":67,"reference":"4ZUhuG00Gq12NFKsnP6Cc","updatedAt":"2026-08-04T01:17:23.903Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f374d","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch ControlBG Name","params":{"position":{"component":"data2-core-types@Position","params":{"x":560,"y":1054,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":560,"exactY":1054}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":16}},"text":"Control Background","textSize":13,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"600"}}},"index":69,"reference":"bfnTXcbbYlao10XLEJTGq","updatedAt":"2026-08-04T01:17:23.933Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f374e","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Type Label 15","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":2712,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":0,"exactY":2712}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":340,"height":18}},"text":"Callout Bold · 12/15","textSize":11,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label-2"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"verticalAlignment":"middle"}}},"index":55,"reference":"aEZBYs3X60OOaN3RiR6wx","updatedAt":"2026-08-04T01:17:23.803Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f374f","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Border Separator Sample","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":1304,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":0,"exactY":1304}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":100}},"fill":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-surface"}},"prop":"fill"}},"border":{"component":"data2-core-types@Border","params":{"radius":{"leftTop":"10","rightTop":"10","rightBottom":"10","leftBottom":"10"},"width":{"top":"0","right":"0","bottom":"1","left":"0"},"color":"@light-separator"}}},"index":1,"reference":"Uxztq7buRcEoZQ8apH1mI","updatedAt":"2026-08-04T01:17:23.784Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f3750","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch Indigo","params":{"position":{"component":"data2-core-types@Position","params":{"x":280,"y":362,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":280,"exactY":362}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":80}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#5856D6"}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":{"leftTop":"12","rightTop":"12","rightBottom":"12","leftBottom":"12"},"width":{"left":"1","top":"1","right":"1","bottom":"1"},"color":"rgba(0,0,0,0.10)"}}},"index":23,"reference":"MwE-jGm1Y-BQ2bXuG1arL","updatedAt":"2026-08-04T01:17:23.873Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f3751","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Material Popover Name","params":{"position":{"component":"data2-core-types@Position","params":{"x":16,"y":1912,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":16,"exactY":1912}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":320,"height":18}},"text":"Popover","textSize":14,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"700"}}},"index":15,"reference":"5cc1t66oOaVtOlac9nAwz","updatedAt":"2026-08-04T01:17:23.788Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f3752","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Material HeaderView","params":{"position":{"component":"data2-core-types@Position","params":{"x":746,"y":1776,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":746,"exactY":1776}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":353,"height":100}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(246,246,247,0.6)"}}}}]}},"backdropFilter":[{"component":"data2-core-types@BitmapFilter","params":{"type":"blur","value":16}}],"border":{"component":"data2-core-types@Border","params":{"radius":{"leftTop":"10","rightTop":"10","rightBottom":"10","leftBottom":"10"},"width":{"left":"1","top":"1","right":"1","bottom":"1"},"color":"rgba(0,0,0,0.06)"}}},"index":8,"reference":"-eFHoo_gHd6tCBb6tcruq","updatedAt":"2026-08-04T01:17:23.745Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f3753","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Type Label 9","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":2448,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":0,"exactY":2448}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":340,"height":20}},"text":"Headline Bold · 13/16","textSize":11,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label-2"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"verticalAlignment":"middle"}}},"index":43,"reference":"LOZKNiv_0VEBik6lVSFWw","updatedAt":"2026-08-04T01:17:23.754Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f3754","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch Green Sub","params":{"position":{"component":"data2-core-types@Position","params":{"x":840,"y":338,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":840,"exactY":338}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":14}},"text":"systemGreenColor · #28CD41","textSize":11,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label-2"}},"prop":"textColor"}}},"index":16,"reference":"8hg8fpS6xayuLYmrFSNOi","updatedAt":"2026-08-04T01:17:23.697Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f3755","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch Label4 Sub","params":{"position":{"component":"data2-core-types@Position","params":{"x":840,"y":756,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":840,"exactY":756}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":14}},"text":"quaternaryLabelColor · 10% black","textSize":11,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label-2"}},"prop":"textColor"}}},"index":50,"reference":"t_U0KZHspVuhHq2BGnw0N","updatedAt":"2026-08-04T01:17:23.652Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f3756","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch Teal Sub","params":{"position":{"component":"data2-core-types@Position","params":{"x":1120,"y":338,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":1120,"exactY":338}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":14}},"text":"systemTealColor · #30B0C7","textSize":11,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label-2"}},"prop":"textColor"}}},"index":19,"reference":"-CJRriaXPzUQHKewcip9d","updatedAt":"2026-08-04T01:17:23.700Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f3757","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Group B Heading","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":622,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":0,"exactY":622}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":400,"height":16}},"text":"LABEL COLORS","textSize":12,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label-2"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"700","letterSpacing":0.6}}},"index":38,"reference":"2f-Xe7uOFRX1OlUDn9nPd","updatedAt":"2026-08-04T01:17:23.703Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f3758","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Type Sample 4","params":{"position":{"component":"data2-core-types@Position","params":{"x":356,"y":2228,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":356,"exactY":2228}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1100,"height":30}},"text":"The quick brown fox jumps","textSize":22,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"400","lineHeight":1.182}}},"index":34,"reference":"Eulbh9-l0kN-O-32BG91D","updatedAt":"2026-08-04T01:17:23.637Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f3759","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch Brown Sub","params":{"position":{"component":"data2-core-types@Position","params":{"x":1120,"y":468,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":1120,"exactY":468}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":14}},"text":"systemBrownColor · #A2845E","textSize":11,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label-2"}},"prop":"textColor"}}},"index":34,"reference":"nOetNZJu4RBQ6j2MEgs7s","updatedAt":"2026-08-04T01:17:23.719Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f375a","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Material Sheet","params":{"position":{"component":"data2-core-types@Position","params":{"x":746,"y":1896,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":746,"exactY":1896}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":353,"height":100}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,0.85)"}}}}]}},"backdropFilter":[{"component":"data2-core-types@BitmapFilter","params":{"type":"blur","value":24}}],"border":{"component":"data2-core-types@Border","params":{"radius":{"leftTop":"10","rightTop":"10","rightBottom":"10","leftBottom":"10"},"width":{"left":"1","top":"1","right":"1","bottom":"1"},"color":"rgba(0,0,0,0.06)"}},"shadow":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-shadow-popover"}},"prop":"shadow"}}},"index":20,"reference":"TTwQKqwuDCHhBDrqxPjiv","updatedAt":"2026-08-04T01:17:23.562Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f375b","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Type Sample 21","params":{"position":{"component":"data2-core-types@Position","params":{"x":356,"y":2976,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":356,"exactY":2976}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1100,"height":16}},"text":"The quick brown fox jumps","textSize":10,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"700","lineHeight":1.3}}},"index":68,"reference":"lIJyZo9QQ6WTjGcQBQdxZ","updatedAt":"2026-08-04T01:17:23.605Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f375c","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch Label3","params":{"position":{"component":"data2-core-types@Position","params":{"x":560,"y":650,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":560,"exactY":650}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":80}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0.28)"}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":{"leftTop":"12","rightTop":"12","rightBottom":"12","leftBottom":"12"},"width":{"left":"1","top":"1","right":"1","bottom":"1"},"color":"rgba(0,0,0,0.10)"}}},"index":45,"reference":"kQCbCR3gS-Fq5hpC7Si_3","updatedAt":"2026-08-04T01:17:23.554Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f375d","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Shadow Tooltip Sample","params":{"position":{"component":"data2-core-types@Position","params":{"x":560,"y":1522,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":560,"exactY":1522}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":100}},"fill":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-surface"}},"prop":"fill"}},"border":{"component":"data2-core-types@Border","params":{"radius":{"leftTop":"8","rightTop":"8","rightBottom":"8","leftBottom":"8"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"shadow":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-shadow-tooltip"}},"prop":"shadow"}}},"index":23,"reference":"2zElJzqoK4scw_esIrxXY","updatedAt":"2026-08-04T01:17:23.582Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f375e","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Border Control Sample","params":{"position":{"component":"data2-core-types@Position","params":{"x":280,"y":1304,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":280,"exactY":1304}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":100}},"fill":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-surface"}},"prop":"fill"}},"border":{"component":"data2-core-types@Border","params":{"radius":{"leftTop":"6","rightTop":"6","rightBottom":"6","leftBottom":"6"},"width":{"left":"1","top":"1","right":"1","bottom":"1"},"color":"rgba(0,0,0,0.1)"}}},"index":4,"reference":"U88QDl7NAH8KYTPSGFn-8","updatedAt":"2026-08-04T01:17:23.586Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f375f","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch Green Name","params":{"position":{"component":"data2-core-types@Position","params":{"x":840,"y":320,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":840,"exactY":320}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":16}},"text":"Green","textSize":13,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"600"}}},"index":15,"reference":"dr_tBzLNtWTAD6pzlxTQf","updatedAt":"2026-08-04T01:17:23.520Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f3760","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch Indigo Name","params":{"position":{"component":"data2-core-types@Position","params":{"x":280,"y":450,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":280,"exactY":450}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":16}},"text":"Indigo","textSize":13,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"600"}}},"index":24,"reference":"yKNXmyml5RElizdH785UV","updatedAt":"2026-08-04T01:17:23.501Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f3761","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Border Focus Spec","params":{"position":{"component":"data2-core-types@Position","params":{"x":560,"y":1430,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":560,"exactY":1430}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":14}},"text":"2px accent · glow blur 4","textSize":11,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label-2"}},"prop":"textColor"}}},"index":9,"reference":"rrpUaDf602T0qt1RIKU7N","updatedAt":"2026-08-04T01:17:23.533Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f3762","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch ControlBG Sub","params":{"position":{"component":"data2-core-types@Position","params":{"x":560,"y":1072,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":560,"exactY":1072}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":14}},"text":"controlBackgroundColor · #FFFFFF","textSize":11,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label-2"}},"prop":"textColor"}}},"index":70,"reference":"iH9OmVakP_HDBvvUhvzZ3","updatedAt":"2026-08-04T01:17:23.532Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f3763","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch Orange Sub","params":{"position":{"component":"data2-core-types@Position","params":{"x":280,"y":338,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":280,"exactY":338}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":14}},"text":"systemOrangeColor · #FF9500","textSize":11,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label-2"}},"prop":"textColor"}}},"index":10,"reference":"gSuN0LLdjZdU7rlKBLIfM","updatedAt":"2026-08-04T01:17:23.449Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f3764","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Colors Heading","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":124,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":0,"exactY":124}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":400,"height":28}},"text":"01 — Colors","textSize":22,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"700"}}},"index":2,"reference":"0TxPKQw56FavXWEo1PWde","updatedAt":"2026-08-04T01:17:23.487Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f3765","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Type Sample 20","params":{"position":{"component":"data2-core-types@Position","params":{"x":356,"y":2932,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":356,"exactY":2932}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1100,"height":16}},"text":"The quick brown fox jumps","textSize":10,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"400","lineHeight":1.3}}},"index":66,"reference":"4aCRNPFRfg0dzHZc2a0be","updatedAt":"2026-08-04T01:17:23.418Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f3766","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Group A Heading","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":204,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":0,"exactY":204}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":400,"height":16}},"text":"SYSTEM COLORS","textSize":12,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label-2"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"700","letterSpacing":0.6}}},"index":4,"reference":"BZw0hTpsZD2QqwlJqZFLt","updatedAt":"2026-08-04T01:17:23.445Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f3767","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Type Label 6","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":2316,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":0,"exactY":2316}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":340,"height":26}},"text":"Title 2 Regular · 17/22","textSize":11,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label-2"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"verticalAlignment":"middle"}}},"index":37,"reference":"1ol00MuEXUsg2AOQ0A696","updatedAt":"2026-08-04T01:17:23.429Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f3768","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Group C Heading","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":780,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":0,"exactY":780}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":400,"height":16}},"text":"TEXT & LINK COLORS","textSize":12,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label-2"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"700","letterSpacing":0.6}}},"index":51,"reference":"1qHHmPBMtHBbvbNajlpu5","updatedAt":"2026-08-04T01:17:23.340Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f3769","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Type Heading","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":2056,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":0,"exactY":2056}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":400,"height":28}},"text":"05 — Typography","textSize":22,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"700"}}},"index":26,"reference":"UPIJpFI9h6byngE5zsiUr","updatedAt":"2026-08-04T01:17:23.367Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f376a","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch Label4 Name","params":{"position":{"component":"data2-core-types@Position","params":{"x":840,"y":738,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":840,"exactY":738}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":16}},"text":"Quaternary Label","textSize":13,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"600"}}},"index":49,"reference":"PaM6Qce_wB784h3T-DaP0","updatedAt":"2026-08-04T01:17:23.399Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f376b","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Material HUD Spec","params":{"position":{"component":"data2-core-types@Position","params":{"x":389,"y":1934,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":389,"exactY":1934}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":320,"height":14}},"text":"blur 40 · sat 180% (always dark)","textSize":11,"textColor":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,0.6)"}}},"index":19,"reference":"n2zemAVEqDcZmo0v5h-2p","updatedAt":"2026-08-04T01:17:23.391Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f376c","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch TextColor Name","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":896,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":0,"exactY":896}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":16}},"text":"Text","textSize":13,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"600"}}},"index":53,"reference":"5KLd8wSINDwIsc0S2QHCa","updatedAt":"2026-08-04T01:17:23.359Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f376d","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Type Sample 2","params":{"position":{"component":"data2-core-types@Position","params":{"x":356,"y":2136,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":356,"exactY":2136}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1100,"height":36}},"text":"The quick brown fox jumps","textSize":26,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"400","lineHeight":1.231}}},"index":30,"reference":"IdbGKfmcDN4u6b3azLPvi","updatedAt":"2026-08-04T01:17:23.242Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f376e","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Shadow Sunken Name","params":{"position":{"component":"data2-core-types@Position","params":{"x":1120,"y":1646,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":1120,"exactY":1646}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":16}},"text":"Sunken / Well Shadow","textSize":13,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"600"}}},"index":30,"reference":"f2FJZQc4xv5Uid3Cv1FpF","updatedAt":"2026-08-04T01:17:23.322Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f376f","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch Link","params":{"position":{"component":"data2-core-types@Position","params":{"x":560,"y":808,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":560,"exactY":808}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":80}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#0068DA"}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":{"leftTop":"12","rightTop":"12","rightBottom":"12","leftBottom":"12"},"width":{"left":"1","top":"1","right":"1","bottom":"1"},"color":"rgba(0,0,0,0.10)"}}},"index":58,"reference":"CSg7dY9W7mmSCcqykCur4","updatedAt":"2026-08-04T01:17:23.276Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f3770","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Type Sample 13","params":{"position":{"component":"data2-core-types@Position","params":{"x":356,"y":2624,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":356,"exactY":2624}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1100,"height":20}},"text":"The quick brown fox jumps","textSize":13,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"700","lineHeight":1.231}}},"index":52,"reference":"vG4mqidA5CuOJPwZ98T1j","updatedAt":"2026-08-04T01:17:23.303Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f3771","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch Purple Sub","params":{"position":{"component":"data2-core-types@Position","params":{"x":560,"y":468,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":560,"exactY":468}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":14}},"text":"systemPurpleColor · #AF52DE","textSize":11,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label-2"}},"prop":"textColor"}}},"index":28,"reference":"XrPeHXuMyynrHT5Nntme1","updatedAt":"2026-08-04T01:17:23.204Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f3772","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch Separator","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":1096,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":0,"exactY":1096}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":80}},"fill":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-separator"}},"prop":"fill"}},"border":{"component":"data2-core-types@Border","params":{"radius":{"leftTop":"12","rightTop":"12","rightBottom":"12","leftBottom":"12"},"width":{"left":"1","top":"1","right":"1","bottom":"1"},"color":"rgba(0,0,0,0.10)"}}},"index":77,"reference":"mMLC40jUzsi3-rqdPCpBJ","updatedAt":"2026-08-04T01:17:23.240Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f3773","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Material HeaderView Spec","params":{"position":{"component":"data2-core-types@Position","params":{"x":762,"y":1814,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":762,"exactY":1814}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":320,"height":14}},"text":"blur 16 · sat 150%","textSize":11,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label-2"}},"prop":"textColor"}}},"index":10,"reference":"eUTj8_oXXV7svJGOvE54V","updatedAt":"2026-08-04T01:17:23.218Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f3774","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch UnderPageBG","params":{"position":{"component":"data2-core-types@Position","params":{"x":280,"y":966,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":280,"exactY":966}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":80}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#E8E8E8"}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":{"leftTop":"12","rightTop":"12","rightBottom":"12","leftBottom":"12"},"width":{"left":"1","top":"1","right":"1","bottom":"1"},"color":"rgba(0,0,0,0.10)"}}},"index":65,"reference":"jRigyDxZCOv6TpIDc0awD","updatedAt":"2026-08-04T01:17:23.268Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f3775","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Material Sidebar","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":1776,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":0,"exactY":1776}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":353,"height":100}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(246,246,247,0.72)"}}}}]}},"backdropFilter":[{"component":"data2-core-types@BitmapFilter","params":{"type":"blur","value":24}}],"border":{"component":"data2-core-types@Border","params":{"radius":{"leftTop":"10","rightTop":"10","rightBottom":"10","leftBottom":"10"},"width":{"left":"1","top":"1","right":"1","bottom":"1"},"color":"rgba(0,0,0,0.06)"}}},"index":2,"reference":"c1Jd_KpAuyruOGzWl0y8j","updatedAt":"2026-08-04T01:17:23.231Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f3776","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Border Separator Name","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":1412,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":0,"exactY":1412}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":16}},"text":"Hairline Separator","textSize":13,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"600"}}},"index":2,"reference":"Qq6CGtI_sjHuWuAX9tHdQ","updatedAt":"2026-08-04T01:17:23.133Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f3777","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Type Label 17","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":2800,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":0,"exactY":2800}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":340,"height":16}},"text":"Footnote Bold · 10/13","textSize":11,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label-2"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"verticalAlignment":"middle"}}},"index":59,"reference":"Acv0iTUC07NLCLu7heYHF","updatedAt":"2026-08-04T01:17:23.065Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f3778","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Material HeaderView Name","params":{"position":{"component":"data2-core-types@Position","params":{"x":762,"y":1792,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":762,"exactY":1792}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":320,"height":18}},"text":"Header View","textSize":14,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"700"}}},"index":9,"reference":"WNCl4xA5iXwJ_z6gp-cNP","updatedAt":"2026-08-04T01:17:23.115Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f3779","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch Gray","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":492,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":0,"exactY":492}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":80}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#8E8E93"}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":{"leftTop":"12","rightTop":"12","rightBottom":"12","leftBottom":"12"},"width":{"left":"1","top":"1","right":"1","bottom":"1"},"color":"rgba(0,0,0,0.10)"}}},"index":35,"reference":"tT8RlLA2X2PQJOZj30va7","updatedAt":"2026-08-04T01:17:23.167Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f377a","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch Blue Name","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":450,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":0,"exactY":450}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":16}},"text":"Blue","textSize":13,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"600"}}},"index":21,"reference":"DazuDpqiavYdKyR6ZJFs3","updatedAt":"2026-08-04T01:17:23.055Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f377b","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Material Sidebar Spec","params":{"position":{"component":"data2-core-types@Position","params":{"x":16,"y":1814,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":16,"exactY":1814}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":320,"height":14}},"text":"blur 24 · sat 180%","textSize":11,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label-2"}},"prop":"textColor"}}},"index":4,"reference":"Mo7qQxoRQh1QDlzCOr-Iy","updatedAt":"2026-08-04T01:17:23.094Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f377c","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Border Window Sample","params":{"position":{"component":"data2-core-types@Position","params":{"x":840,"y":1304,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":840,"exactY":1304}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":100}},"fill":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-surface"}},"prop":"fill"}},"border":{"component":"data2-core-types@Border","params":{"radius":{"leftTop":"10","rightTop":"10","rightBottom":"10","leftBottom":"10"},"width":{"left":"1","top":"1","right":"1","bottom":"1"},"color":"rgba(0,0,0,0.15)"}}},"index":10,"reference":"hI8RR0gS2KMcWhcR7SyB5","updatedAt":"2026-08-04T01:17:23.061Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f377d","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch Yellow","params":{"position":{"component":"data2-core-types@Position","params":{"x":560,"y":232,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":560,"exactY":232}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":80}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#FFCC00"}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":{"leftTop":"12","rightTop":"12","rightBottom":"12","leftBottom":"12"},"width":{"left":"1","top":"1","right":"1","bottom":"1"},"color":"rgba(0,0,0,0.10)"}}},"index":11,"reference":"90D0vS0hfooUptZ3tpNvw","updatedAt":"2026-08-04T01:17:23.074Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f377e","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Type Sample 22","params":{"position":{"component":"data2-core-types@Position","params":{"x":356,"y":3020,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":356,"exactY":3020}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1100,"height":16}},"text":"The quick brown fox jumps","textSize":10,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"400","lineHeight":1.3}}},"index":70,"reference":"3_k3LOg5M192iRwQl7mDo","updatedAt":"2026-08-04T01:17:23.066Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f377f","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch WindowBG","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":966,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":0,"exactY":966}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":80}},"fill":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-bg"}},"prop":"fill"}},"border":{"component":"data2-core-types@Border","params":{"radius":{"leftTop":"12","rightTop":"12","rightBottom":"12","leftBottom":"12"},"width":{"left":"1","top":"1","right":"1","bottom":"1"},"color":"rgba(0,0,0,0.10)"}}},"index":62,"reference":"EwbptjcuYxP_fXW0moTdz","updatedAt":"2026-08-04T01:17:23.066Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f3780","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch WindowBG Sub","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":1072,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":0,"exactY":1072}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":14}},"text":"windowBackgroundColor · #ECECEC","textSize":11,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label-2"}},"prop":"textColor"}}},"index":64,"reference":"_ouNTsrgQGELLv2hqTbJI","updatedAt":"2026-08-04T01:17:23.009Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f3781","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Shadow Tooltip Name","params":{"position":{"component":"data2-core-types@Position","params":{"x":560,"y":1646,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":560,"exactY":1646}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":16}},"text":"Tooltip Shadow","textSize":13,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"600"}}},"index":24,"reference":"7lsiZdgkXCuJevEfetI6y","updatedAt":"2026-08-04T01:17:22.937Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f3782","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Type Label 20","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":2932,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":0,"exactY":2932}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":340,"height":16}},"text":"Caption 1 Regular · 10/13","textSize":11,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label-2"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"verticalAlignment":"middle"}}},"index":65,"reference":"d-e9-V4b3OQG_tCNolUMy","updatedAt":"2026-08-04T01:17:22.917Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f3783","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Material Menu Spec","params":{"position":{"component":"data2-core-types@Position","params":{"x":1135,"y":1814,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":1135,"exactY":1814}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":320,"height":14}},"text":"blur 30 · sat 180%","textSize":11,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label-2"}},"prop":"textColor"}}},"index":13,"reference":"uBq9XzX0AQMML0xxMiW8k","updatedAt":"2026-08-04T01:17:22.899Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f3784","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Material HUD","params":{"position":{"component":"data2-core-types@Position","params":{"x":373,"y":1896,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":373,"exactY":1896}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":353,"height":100}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(40,40,40,0.75)"}}}}]}},"backdropFilter":[{"component":"data2-core-types@BitmapFilter","params":{"type":"blur","value":40}}],"border":{"component":"data2-core-types@Border","params":{"radius":{"leftTop":"10","rightTop":"10","rightBottom":"10","leftBottom":"10"},"width":{"left":"1","top":"1","right":"1","bottom":"1"},"color":"rgba(255,255,255,0.08)"}},"shadow":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-shadow-popover"}},"prop":"shadow"}}},"index":17,"reference":"zSOyulbdoJS2pDnMHlmeo","updatedAt":"2026-08-04T01:17:22.884Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f3785","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch Label2","params":{"position":{"component":"data2-core-types@Position","params":{"x":280,"y":650,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":280,"exactY":650}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":80}},"fill":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label-2"}},"prop":"fill"}},"border":{"component":"data2-core-types@Border","params":{"radius":{"leftTop":"12","rightTop":"12","rightBottom":"12","leftBottom":"12"},"width":{"left":"1","top":"1","right":"1","bottom":"1"},"color":"rgba(0,0,0,0.10)"}}},"index":42,"reference":"fwOT2Z_UGwGbWbPr17kbI","updatedAt":"2026-08-04T01:17:22.883Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f3786","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Borders Heading","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":1266,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":0,"exactY":1266}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":400,"height":28}},"text":"02 — Borders","textSize":22,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"700"}}},"index":0,"reference":"ytXLz3STbMuGR_hoMM5GT","updatedAt":"2026-08-04T01:17:22.890Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f3787","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Shadow Popover Name","params":{"position":{"component":"data2-core-types@Position","params":{"x":280,"y":1646,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":280,"exactY":1646}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":16}},"text":"Popover / Menu Shadow","textSize":13,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label"}},"prop":"textColor"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"600"}}},"index":21,"reference":"0ZFp5JTHDwf8BRdlxaLab","updatedAt":"2026-08-04T01:17:22.886Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f3788","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch Label3 Sub","params":{"position":{"component":"data2-core-types@Position","params":{"x":560,"y":756,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":560,"exactY":756}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":14}},"text":"tertiaryLabelColor · 28% black","textSize":11,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label-2"}},"prop":"textColor"}}},"index":47,"reference":"xVsMkwhwvP2EnYm-7BZFn","updatedAt":"2026-08-04T01:17:22.792Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f3789","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Shadow Button Spec","params":{"position":{"component":"data2-core-types@Position","params":{"x":840,"y":1664,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":840,"exactY":1664}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":14}},"text":"y1 · blur3 · 15% black","textSize":11,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label-2"}},"prop":"textColor"}}},"index":28,"reference":"9y9tBLaUSvYTAi0uWKWcK","updatedAt":"2026-08-04T01:17:22.798Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d22a5ba5229796f378a","parent":"6a713d60a5ba5229796f378b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Swatch Placeholder Sub","params":{"position":{"component":"data2-core-types@Position","params":{"x":280,"y":914,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"exactX":280,"exactY":914}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":14}},"text":"placeholderTextColor · 25% black","textSize":11,"textColor":{"component":"data2-core-presets@PresetLink","params":{"module":{"component":"data2-core-types@ProcessReference","params":{"reference":"light-label-2"}},"prop":"textColor"}}},"index":57,"reference":"K3yVGJo9LS0ybMado1LB3","updatedAt":"2026-08-04T01:17:22.882Z","createdAt":"2026-08-04T01:16:14.903Z"},{"_id":"6a713d60a5ba5229796f378b","parent":"6a713d22a5ba5229796f36d0","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1472,"height":3036}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":64,"y":47,"exactX":64,"exactY":46.67}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-04T01:18:16.480Z","createdAt":"2026-08-04T01:17:22.505Z"},{"_id":"6a7172879c26d69dd14e2548","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"Copy of Simulador | Fechamento de setores","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768}},"fill":{"params":{"content":"#ffffff"},"component":"data2-core-primitives@String"},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"reference":"VsA1mMsQjiEDvYTBWVMtO","updatedAt":"2026-08-04T16:28:59.506Z","createdAt":"2026-08-04T05:03:59.246Z"},{"_id":"6a7172879c26d69dd14e2549","parent":"6a7172879c26d69dd14e2548","component":"natura-geomarketing@n-E3kblbz0EwqfdH7YVjX","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":70,"exactWidth":false,"exactHeight":70}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":false,"exactY":false,"top":true,"left":true,"right":true,"growH":false}},"fill":{"disabled":false,"component":"data2-core-types@Fill","params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(241,241,248,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}},"index":1,"updatedAt":"2026-08-04T05:03:59.246Z","createdAt":"2026-08-04T05:03:59.246Z"},{"_id":"6a7172879c26d69dd14e254a","parent":"6a7172879c26d69dd14e2548","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":678,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":90,"exactX":false,"exactY":false,"bottom":true,"left":true,"top":true,"growV":false,"right":true,"growH":false}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"childrenMode":"rows"},"index":0,"updatedAt":"2026-08-04T17:00:06.070Z","createdAt":"2026-08-04T05:03:59.246Z"},{"_id":"6a7172879c26d69dd14e254b","parent":"6a7172879c26d69dd14e254a","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1326,"height":618,"exactWidth":false,"exactHeight":false,"growHeightWithContent":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":20,"y":0,"exactX":false,"exactY":false,"fixed":false,"left":true,"top":true,"right":true,"growH":false}},"childrenMode":"cols","textFormat":{"disabled":true,"component":"data2-core-types@TextFormat","params":{}},"style":{"flex":{"component":"data2-core-primitives@String","params":{"content":"1"}}},"scroll":{"disabled":false,"component":"data2-core-types@Scroll","params":{"y":true}}},"index":1,"updatedAt":"2026-08-04T17:59:09.470Z","createdAt":"2026-08-04T05:03:59.246Z"},{"_id":"6a7172879c26d69dd14e254c","parent":"6a7172879c26d69dd14e254b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":259,"height":531,"exactWidth":259,"exactHeight":530.54,"growHeightWithContent":false,"maintainAspectRatio":true}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":20,"y":30,"exactX":false,"exactY":false,"bottom":true,"right":false,"top":true,"growV":false,"fixed":false,"left":true,"growH":false}},"childrenMode":"rows","fill":{"disabled":false,"component":"data2-core-types@Fill","params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]}},"border":{"disabled":false,"component":"data2-core-types@Border","params":{"radius":{"leftTop":"27"},"width":{"top":"1","bottom":"1","left":"1","right":"1"},"color":"#d4d4d4"}},"shadow":[{"component":"data2-core-types@Shadow","params":{"type":"outset","spread":"-15","blur":"25","color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(132,132,132,1)"}},"offsetY":"10"}}],"stateDefinitions":[{"component":"data2-core-user-interface@StateDefinition","params":{"key":"viewMenuOpen","initialValue":false}},{"component":"data2-core-user-interface@StateDefinition","params":{"key":"currentView","initialValue":{"component":"data2-core-primitives@String","params":{"content":"Município"}}}},{"component":"data2-core-user-interface@StateDefinition","params":{"key":"selectedRow","initialValue":{"component":"data2-core-primitives@String","params":{"content":""}}}}],"childrenOverflow":true},"index":1,"updatedAt":"2026-08-05T23:35:57.494Z","createdAt":"2026-08-04T05:03:59.246Z"},{"_id":"6a7172879c26d69dd14e2556","parent":"6a7172879c26d69dd14e254a","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1304,"height":588,"exactWidth":1304,"exactHeight":false,"growHeightWithContent":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":60,"y":0,"exactX":false,"exactY":false,"fixed":false,"left":true,"top":true,"right":true,"growH":false}},"style":{"flex":{"component":"data2-core-primitives@String","params":{"content":"0"}}},"hide":{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Y0MVeSB0t_bjBEppVYgQJ"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.state"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"done"}}},"component":"data2-core-comparison-operators@Equal"}},"index":2,"updatedAt":"2026-08-04T05:03:59.246Z","createdAt":"2026-08-04T05:03:59.246Z"},{"_id":"6a7172879c26d69dd14e2557","parent":"6a7172879c26d69dd14e2556","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":323,"height":18,"exactWidth":323.07,"exactHeight":18.439999999999998}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":491,"y":285,"exactX":false,"exactY":false,"top":false,"left":false}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"center"}},"text":{"component":"data2-core-primitives@String","params":{"content":"Nenhum setor selecionado"}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(97,97,97,1)"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":16}}},"updatedAt":"2026-08-04T05:03:59.246Z","createdAt":"2026-08-04T05:03:59.246Z"},{"_id":"6a71741d9c26d69dd14e255b","parent":"6a7172879c26d69dd14e254c","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(116,116,211,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":258,"height":99,"exactWidth":258,"exactHeight":false,"maintainAspectRatio":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":false,"exactY":false,"left":true,"top":true,"right":true,"growH":false}},"onClick":{"component":"data2-core-flow@Series","params":{"actions":[{"component":"data2-core-flow@Step","params":{"action":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":"6a7172879c26d69dd14e254c","key":"viewMenuOpen"}}}},"resultName":"open"}},{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":"6a7172879c26d69dd14e254c","key":"viewMenuOpen"}},"value":{"component":"data2-core-logical-operators@Not","params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":"open"}}}}}}]}}},"updatedAt":"2026-08-05T23:36:51.491Z","createdAt":"2026-08-04T05:10:42.217Z"},{"_id":"6a7174579c26d69dd14e255c","parent":"6a71741d9c26d69dd14e255b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":217,"height":62,"exactWidth":false,"exactHeight":62.39}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":20,"y":22,"exactX":false,"exactY":21.8}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"bottom"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":22}},"text":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":"6a7172879c26d69dd14e254c","key":{"component":"data2-core-primitives@String","params":{"content":"currentView"}}}}}},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T23:36:27.079Z","createdAt":"2026-08-04T05:11:40.347Z"},{"_id":"6a7174aa9c26d69dd14e255d","parent":"6a71741d9c26d69dd14e255b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":217,"height":51,"exactWidth":false,"exactHeight":51.38}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":20,"y":1,"exactX":20,"exactY":1.3900000000000001}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(229,229,229,1)"}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"bottom"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":16}},"text":{"component":"data2-core-primitives@String","params":{"content":"Visão por"}},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-04T15:24:33.046Z","createdAt":"2026-08-04T05:13:20.203Z"},{"_id":"6a717762dce5924aba1393ec","parent":"6a7172879c26d69dd14e254c","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":257,"height":429,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":100,"exactX":false,"exactY":false,"bottom":true,"left":true,"top":true,"growV":false,"right":true,"growH":false}}},"updatedAt":"2026-08-04T18:27:12.907Z","createdAt":"2026-08-04T05:24:39.294Z"},{"_id":"6a7177b1dce5924aba1393f9","parent":"6a717762dce5924aba1393ec","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":246,"height":170,"exactWidth":246,"exactHeight":169.94}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":1,"y":10,"exactX":false,"exactY":false,"fixed":false,"top":true,"left":true,"right":true,"growH":false}},"text":{"component":"data2-core-primitives@String","params":{"content":""}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"bottom","horizontalAlignment":"center","fontStyle":"italic"},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"stateDefinitions":[{"component":"data2-core-user-interface@StateDefinition","params":{"key":"removed","initialValue":false}}],"hide":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":"6a7177b1dce5924aba1393f9","key":{"component":"data2-core-primitives@String","params":{"content":"removed"}}}}}}},"index":1,"updatedAt":"2026-08-05T23:36:04.283Z","createdAt":"2026-08-04T05:25:59.293Z"},{"_id":"6a7177b1dce5924aba1393fa","parent":"6a72289748537d17e1a1d3c7","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":131,"height":28,"exactWidth":130.86,"exactHeight":28,"growHeightWithContent":true}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":false,"exactY":false,"fixed":false,"left":true,"top":true,"right":true,"growH":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"Campinas (3)"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"18"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"top","horizontalAlignment":"left","fontStyle":"normal","fontWeight":700},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(100,100,104,1)"},"component":"data2-core-types@Color"},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"3px 0px 3px 0px"}}},"repeat":{"params":{},"component":"data2-core-types@DataSetReference","disabled":true}},"index":1,"updatedAt":"2026-08-04T18:06:15.568Z","createdAt":"2026-08-04T05:25:59.293Z"},{"_id":"6a7177b1dce5924aba1393fb","parent":"6a7177b1dce5924aba1393f9","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":6,"rightTop":6,"leftBottom":6,"rightBottom":6},"width":{"left":0,"top":0,"right":0,"bottom":0},"type":"solid"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":43,"height":20,"exactWidth":43,"exactHeight":20.49}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":20,"y":"0","exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"BA"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"center","fontStyle":"normal"},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0.07)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"index":0,"updatedAt":"2026-08-04T18:00:54.062Z","createdAt":"2026-08-04T05:25:59.293Z"},{"_id":"6a7177b1dce5924aba1393fc","parent":"6a7177b1dce5924aba1393f9","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":216,"height":32,"exactWidth":216,"exactHeight":31.970000000000002}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":20,"y":0,"exactX":false,"exactY":false,"fixed":false}},"childrenMode":"cols","childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Equal","params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":"6a7172879c26d69dd14e254c","key":"selectedRow"}}}},"comparisonSubject":"row1"}}],"then":{"component":"data2-core-types@Color","params":{"rgba":"rgba(116,116,211,0.14)"}},"else":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0)"}}}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":{"leftTop":8,"rightTop":8,"leftBottom":8,"rightBottom":8}}},"cursor":"pointer","onClick":{"component":"data2-core-flow@Series","params":{"actions":[{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":"6a7172879c26d69dd14e254c","key":"selectedRow"}},"value":"row1"}},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__DialogsService"}},"prop":"confirm","args":[{"component":"data2-core-types@Reference","params":{"reference":"event"}},"Campinas — zona 1: transferindo 228 CBs do setor 3576 para o setor 2778."]}}]}}},"index":2,"updatedAt":"2026-08-05T23:40:42.065Z","createdAt":"2026-08-04T05:25:59.293Z"},{"_id":"6a71fde39153a8cf85bac6ee","parent":"6a7206739153a8cf85bac74d","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"2"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(48,209,88,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":12,"height":12,"exactWidth":12,"exactHeight":12}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":"49","y":5,"exactX":false,"exactY":false}}},"updatedAt":"2026-08-04T15:35:26.713Z","createdAt":"2026-08-04T14:58:36.058Z"},{"_id":"6a71fe089153a8cf85bac6f0","parent":"6a7177b1dce5924aba1393fc","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":39,"height":22,"exactWidth":39.36,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":5,"exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"3576"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left","fontStyle":"normal","fontWeight":400},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"NaturaCo"},"component":"data2-core-primitives@String"},"textDecoration":{"params":{"line":"line-through"},"component":"data2-core-types@TextDecoration"}},"updatedAt":"2026-08-04T15:27:48.950Z","createdAt":"2026-08-04T15:00:15.870Z"},{"_id":"6a7202b99153a8cf85bac6f8","parent":"6a7177b1dce5924aba1393fc","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":14,"height":22,"exactWidth":13.58,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":46,"y":5,"exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"->"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left","fontStyle":"normal","fontWeight":400},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-04T15:27:50.457Z","createdAt":"2026-08-04T15:19:30.958Z"},{"_id":"6a7202c99153a8cf85bac6f9","parent":"6a7206739153a8cf85bac74d","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":40,"height":22,"exactWidth":40.38,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":5,"y":0,"exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"2778"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left","fontStyle":"normal","fontWeight":400},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"NaturaCo"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-04T15:35:15.758Z","createdAt":"2026-08-04T15:19:32.734Z"},{"_id":"6a7203fd9153a8cf85bac6fb","parent":"6a71741d9c26d69dd14e255b","component":"data2-blocks@Html","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":25,"height":23,"exactWidth":24.72,"exactHeight":23.47}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":124,"y":62,"exactX":124.06,"exactY":61.6}}},"text":{"component":"data2-core-primitives@String","params":{"content":"<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#ffffff\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"feather feather-chevron-down\"><polyline points=\"6 9 12 15 18 9\"></polyline></svg>"}}},"updatedAt":"2026-08-04T15:24:46.639Z","createdAt":"2026-08-04T15:24:39.556Z"},{"_id":"6a7204cc9153a8cf85bac718","parent":"6a7177b1dce5924aba1393f9","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":216,"height":32,"exactWidth":216,"exactHeight":31.970000000000002}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":20,"y":0,"exactX":false,"exactY":false,"fixed":false,"top":true,"left":true}},"childrenMode":"cols","childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Equal","params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":"6a7172879c26d69dd14e254c","key":"selectedRow"}}}},"comparisonSubject":"row2"}}],"then":{"component":"data2-core-types@Color","params":{"rgba":"rgba(116,116,211,0.14)"}},"else":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0)"}}}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":{"leftTop":8,"rightTop":8,"leftBottom":8,"rightBottom":8}}},"cursor":"pointer","onClick":{"component":"data2-core-flow@Series","params":{"actions":[{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":"6a7172879c26d69dd14e254c","key":"selectedRow"}},"value":"row2"}},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__DialogsService"}},"prop":"confirm","args":[{"component":"data2-core-types@Reference","params":{"reference":"event"}},"Campinas — zona 2: 228 CBs já confirmados no setor 2778."]}}]}}},"index":3,"updatedAt":"2026-08-05T23:40:42.560Z","createdAt":"2026-08-04T15:28:05.196Z"},{"_id":"6a7204cc9153a8cf85bac719","parent":"6a7204cc9153a8cf85bac718","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"2"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(48,209,88,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":12,"height":12,"exactWidth":12,"exactHeight":12}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":44,"y":10,"exactX":false,"exactY":false}}},"updatedAt":"2026-08-04T15:28:17.245Z","createdAt":"2026-08-04T15:28:05.196Z"},{"_id":"6a7204cc9153a8cf85bac71b","parent":"6a7204cc9153a8cf85bac718","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"999"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":40,"height":40,"exactWidth":40,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":178,"y":-4,"exactX":false,"exactY":false}}},"updatedAt":"2026-08-04T15:28:05.196Z","createdAt":"2026-08-04T15:28:05.196Z"},{"_id":"6a7204cc9153a8cf85bac71d","parent":"6a7204cc9153a8cf85bac718","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":40,"height":22,"exactWidth":40.38,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":5,"exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"2778"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left","fontStyle":"normal","fontWeight":400},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"NaturaCo"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-04T15:28:16.627Z","createdAt":"2026-08-04T15:28:05.196Z"},{"_id":"6a7204ee9153a8cf85bac722","parent":"6a7177b1dce5924aba1393f9","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":216,"height":32,"exactWidth":216,"exactHeight":31.970000000000002}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":20,"y":0,"exactX":false,"exactY":false,"fixed":false,"top":true,"left":true}},"childrenMode":"cols","childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Equal","params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":"6a7172879c26d69dd14e254c","key":"selectedRow"}}}},"comparisonSubject":"row3"}}],"then":{"component":"data2-core-types@Color","params":{"rgba":"rgba(116,116,211,0.14)"}},"else":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0)"}}}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":{"leftTop":8,"rightTop":8,"leftBottom":8,"rightBottom":8}}},"cursor":"pointer","onClick":{"component":"data2-core-flow@Series","params":{"actions":[{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":"6a7172879c26d69dd14e254c","key":"selectedRow"}},"value":"row3"}},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__DialogsService"}},"prop":"confirm","args":[{"component":"data2-core-types@Reference","params":{"reference":"event"}},"Campinas — zona 3: 228 CBs já confirmados no setor 2778."]}}]}}},"index":4,"updatedAt":"2026-08-05T23:40:43.055Z","createdAt":"2026-08-04T15:28:40.856Z"},{"_id":"6a7204ee9153a8cf85bac723","parent":"6a7204ee9153a8cf85bac722","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"2"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(48,209,88,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":12,"height":12,"exactWidth":12,"exactHeight":12}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":44,"y":10,"exactX":false,"exactY":false}}},"updatedAt":"2026-08-04T15:28:40.856Z","createdAt":"2026-08-04T15:28:40.856Z"},{"_id":"6a7204ee9153a8cf85bac724","parent":"6a7204ee9153a8cf85bac722","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"999"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":40,"height":40,"exactWidth":40,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":178,"y":-4,"exactX":false,"exactY":false}}},"updatedAt":"2026-08-04T15:28:40.856Z","createdAt":"2026-08-04T15:28:40.856Z"},{"_id":"6a7204ee9153a8cf85bac725","parent":"6a7204ee9153a8cf85bac722","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":40,"height":22,"exactWidth":40.38,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":5,"exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"2778"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left","fontStyle":"normal","fontWeight":400},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"NaturaCo"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-04T15:28:40.856Z","createdAt":"2026-08-04T15:28:40.856Z"},{"_id":"6a7205049153a8cf85bac726","parent":"6a7177b1dce5924aba1393f9","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(191,191,191,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":226,"height":1,"exactWidth":226,"exactHeight":1,"growWidthWithContent":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":"15","exactX":false,"exactY":false,"fixed":false}}},"index":5,"updatedAt":"2026-08-04T18:27:32.356Z","createdAt":"2026-08-04T15:29:01.206Z"},{"_id":"6a7206409153a8cf85bac74c","parent":"6a7177b1dce5924aba1393fc","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":72,"height":22,"exactWidth":72.30999999999999,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":144,"y":5,"exactX":144.07,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"228 CBs"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"right","fontStyle":"normal","fontWeight":400},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-04T15:35:05.244Z","createdAt":"2026-08-04T15:35:05.244Z"},{"_id":"6a7206739153a8cf85bac74d","parent":"6a7177b1dce5924aba1393fc","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":66,"height":22,"exactWidth":66}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":66,"y":5}},"childrenMode":"cols","border":{"disabled":false,"component":"data2-core-types@Border","params":{"radius":{"leftTop":"5"}}},"fill":{"disabled":false,"component":"data2-core-types@Fill","params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(244,245,245,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]}}},"updatedAt":"2026-08-04T15:35:53.048Z","createdAt":"2026-08-04T15:35:11.932Z"},{"_id":"6a7206db9153a8cf85bac74f","parent":"6a7204cc9153a8cf85bac718","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":72,"height":22,"exactWidth":72.30999999999999,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":144,"y":5,"exactX":144.07,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"228 CBs"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"right","fontStyle":"normal","fontWeight":400},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-04T15:36:52.891Z","createdAt":"2026-08-04T15:36:52.891Z"},{"_id":"6a7206dc9153a8cf85bac751","parent":"6a7204ee9153a8cf85bac722","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":72,"height":22,"exactWidth":72.30999999999999,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":144,"y":5,"exactX":144.07,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"228 CBs"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"right","fontStyle":"normal","fontWeight":400},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-04T15:36:53.620Z","createdAt":"2026-08-04T15:36:53.620Z"},{"_id":"6a7206e59153a8cf85bac753","parent":"6a72289748537d17e1a1d3c7","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":84,"height":22,"exactWidth":83.84,"exactHeight":22}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":132,"y":3,"exactX":false,"exactY":false,"fixed":false,"right":true,"top":true}},"text":{"component":"data2-core-primitives@String","params":{"content":"2440 CBs"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"right","fontStyle":"normal","fontWeight":600},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(100,100,104,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-04T18:07:19.078Z","createdAt":"2026-08-04T15:37:11.090Z"},{"_id":"6a7207999153a8cf85bac755","parent":"6a7177b1dce5924aba1393f9","component":"data2-blocks@Html","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":22,"height":28,"exactWidth":22.259999999999998,"exactHeight":28}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":218,"y":0,"exactX":218,"exactY":0}}},"text":{"component":"data2-core-primitives@String","params":{"content":"<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\" class=\"size-6\">\n  <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M8.625 12a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0Zm0 0H8.25m4.125 0a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0Zm0 0H12m4.125 0a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0Zm0 0h-.375M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z\" />\n</svg>\n"}},"onClick":{"component":"data2-core-flow@Series","params":{"actions":[{"component":"data2-core-flow@Step","params":{"action":{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__DialogsService"}},"prop":"confirm","args":[{"component":"data2-core-types@Reference","params":{"reference":"event"}},"Remover o grupo Campinas desta simulação?"]}},"resultName":"ok"}},{"component":"data2-core-flow@If","params":{"compare":{"component":"data2-core-types@Reference","params":{"reference":"ok"}},"then":{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":"6a7177b1dce5924aba1393f9","key":"removed"}},"value":true}}}}]}}},"index":6,"updatedAt":"2026-08-05T23:37:11.341Z","createdAt":"2026-08-04T15:40:32.434Z"},{"_id":"6a72114540a65f13df6470f6","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"New Artboard (54)","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768}},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"reference":"Jvka2sxx36N8TCjM1O0hE","updatedAt":"2026-08-04T16:21:17.679Z","createdAt":"2026-08-04T16:21:17.679Z"},{"_id":"6a7211cd40a65f13df647100","parent":"6a72114540a65f13df6470f6","component":"natura-geomarketing@FjpgPxu84sgMMjMKJhyUm","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":false,"exactY":false,"left":true,"top":true,"bottom":true,"growV":false,"growH":false,"right":true,"fixed":false}},"style":{"transformOrigin":{"component":"data2-core-primitives@String","params":{"content":"top left"}}}},"should_render_neighbors":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"region_list":[{"location_id":{"component":"data2-core-primitives@String","params":{"content":"SE"}},"location_label":{"component":"data2-core-primitives@String","params":{"content":"Sudestao"}},"location_colors":[{"color":{"params":{"rgba":"rgba(255,0,0,1)"},"component":"data2-core-types@Color"},"color_id":{"component":"data2-core-primitives@String","params":{"content":"red"}},"color_label":{"component":"data2-core-primitives@String","params":{"content":"vermelho"}},"onClick":{"params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__DialogsService"}},"prop":"confirm","args":[{"component":"data2-core-primitives@String","params":{"content":"vermlho!!"}}]},"component":"data2-core-types@Interaction"}},{"color":{"params":{"rgba":"rgba(2,0,255,1)"},"component":"data2-core-types@Color"},"color_id":{"component":"data2-core-primitives@String","params":{"content":"red"}},"color_label":{"component":"data2-core-primitives@String","params":{"content":"vermelho"}},"onClick":{"params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__DialogsService"}},"prop":"confirm","args":[{"component":"data2-core-primitives@String","params":{"content":"azul!!"}}]},"component":"data2-core-types@Interaction"}}]}]},"index":0,"updatedAt":"2026-08-04T16:24:05.394Z","createdAt":"2026-08-04T16:24:05.394Z"},{"_id":"6a72139640a65f13df647118","parent":"6a717762dce5924aba1393ec","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":246,"height":106,"exactWidth":246,"exactHeight":106.06}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":1,"y":10,"exactX":false,"exactY":false,"fixed":false,"top":true,"right":true,"left":true,"growH":false}},"text":{"component":"data2-core-primitives@String","params":{"content":""}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"bottom","horizontalAlignment":"center","fontStyle":"italic"},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"stateDefinitions":[{"component":"data2-core-user-interface@StateDefinition","params":{"key":"removed","initialValue":false}}],"hide":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":"6a72139640a65f13df647118","key":{"component":"data2-core-primitives@String","params":{"content":"removed"}}}}}}},"index":1,"updatedAt":"2026-08-05T23:36:07.421Z","createdAt":"2026-08-04T16:31:21.887Z"},{"_id":"6a72139640a65f13df647119","parent":"6a72139640a65f13df647118","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":220,"height":28,"exactWidth":220,"exactHeight":28.38}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":20,"y":10,"exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"Valinhos (1)"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"18"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left","fontStyle":"normal","fontWeight":700},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(100,100,104,1)"},"component":"data2-core-types@Color"}},"index":1,"updatedAt":"2026-08-04T17:08:08.904Z","createdAt":"2026-08-04T16:31:21.887Z"},{"_id":"6a72139640a65f13df64711a","parent":"6a72139640a65f13df647118","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":6,"rightTop":6,"leftBottom":6,"rightBottom":6},"width":{"left":0,"top":0,"right":0,"bottom":0},"type":"solid"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":43,"height":20,"exactWidth":43,"exactHeight":20.49}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":20,"y":0,"exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"BA"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"center","fontStyle":"normal"},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0.07)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"index":0,"updatedAt":"2026-08-04T16:31:21.887Z","createdAt":"2026-08-04T16:31:21.887Z"},{"_id":"6a72139640a65f13df647127","parent":"6a72139640a65f13df647118","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":216,"height":32,"exactWidth":216,"exactHeight":31.970000000000002}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":20,"y":0,"exactX":false,"exactY":false,"fixed":false}},"childrenMode":"cols","childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Equal","params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":"6a7172879c26d69dd14e254c","key":"selectedRow"}}}},"comparisonSubject":"row4"}}],"then":{"component":"data2-core-types@Color","params":{"rgba":"rgba(116,116,211,0.14)"}},"else":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0)"}}}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":{"leftTop":8,"rightTop":8,"leftBottom":8,"rightBottom":8}}},"cursor":"pointer","onClick":{"component":"data2-core-flow@Series","params":{"actions":[{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":"6a7172879c26d69dd14e254c","key":"selectedRow"}},"value":"row4"}},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__DialogsService"}},"prop":"confirm","args":[{"component":"data2-core-types@Reference","params":{"reference":"event"}},"Valinhos: 228 CBs já confirmados no setor 2778."]}}]}}},"index":2,"updatedAt":"2026-08-05T23:40:43.638Z","createdAt":"2026-08-04T16:31:21.887Z"},{"_id":"6a72139640a65f13df647128","parent":"6a72139640a65f13df647127","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"2"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(48,209,88,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":12,"height":12,"exactWidth":12,"exactHeight":12}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":44,"y":10,"exactX":false,"exactY":false}}},"updatedAt":"2026-08-04T16:31:21.887Z","createdAt":"2026-08-04T16:31:21.887Z"},{"_id":"6a72139640a65f13df647129","parent":"6a72139640a65f13df647127","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"999"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":40,"height":40,"exactWidth":40,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":178,"y":-4,"exactX":false,"exactY":false}}},"updatedAt":"2026-08-04T16:31:21.887Z","createdAt":"2026-08-04T16:31:21.887Z"},{"_id":"6a72139640a65f13df64712a","parent":"6a72139640a65f13df647127","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":40,"height":22,"exactWidth":40.38,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":5,"exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"2778"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left","fontStyle":"normal","fontWeight":400},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"NaturaCo"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-04T16:31:21.887Z","createdAt":"2026-08-04T16:31:21.887Z"},{"_id":"6a72139640a65f13df64712b","parent":"6a72139640a65f13df647127","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":72,"height":22,"exactWidth":72.30999999999999,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":144,"y":5,"exactX":144.07,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"228 CBs"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"right","fontStyle":"normal","fontWeight":400},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-04T16:31:21.887Z","createdAt":"2026-08-04T16:31:21.887Z"},{"_id":"6a72139640a65f13df64712c","parent":"6a72139640a65f13df647118","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(191,191,191,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":226,"height":1,"exactWidth":226,"exactHeight":1,"growWidthWithContent":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":"10","y":105,"exactX":false,"exactY":false}}},"updatedAt":"2026-08-04T17:07:47.343Z","createdAt":"2026-08-04T16:31:21.887Z"},{"_id":"6a72139640a65f13df64712d","parent":"6a72139640a65f13df647118","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":71,"height":22,"exactWidth":71.24,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":165,"y":32,"exactX":165.04,"exactY":32.16,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"2440 CBs"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"right","fontStyle":"normal","fontWeight":600},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(100,100,104,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-04T16:31:21.887Z","createdAt":"2026-08-04T16:31:21.887Z"},{"_id":"6a72139640a65f13df64712e","parent":"6a72139640a65f13df647118","component":"data2-blocks@Html","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":22,"height":28,"exactWidth":22.259999999999998,"exactHeight":28}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":218,"y":0,"exactX":218,"exactY":0}}},"text":{"component":"data2-core-primitives@String","params":{"content":"<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\" class=\"size-6\">\n  <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M8.625 12a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0Zm0 0H8.25m4.125 0a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0Zm0 0H12m4.125 0a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0Zm0 0h-.375M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z\" />\n</svg>\n"}},"onClick":{"component":"data2-core-flow@Series","params":{"actions":[{"component":"data2-core-flow@Step","params":{"action":{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__DialogsService"}},"prop":"confirm","args":[{"component":"data2-core-types@Reference","params":{"reference":"event"}},"Remover o grupo Valinhos desta simulação?"]}},"resultName":"ok"}},{"component":"data2-core-flow@If","params":{"compare":{"component":"data2-core-types@Reference","params":{"reference":"ok"}},"then":{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":"6a72139640a65f13df647118","key":"removed"}},"value":true}}}}]}}},"updatedAt":"2026-08-05T23:37:15.263Z","createdAt":"2026-08-04T16:31:21.887Z"},{"_id":"6a72149640a65f13df647133","parent":"6a5fcabb3a34c57f2ac6b340","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":268,"height":40,"exactWidth":267.6,"exactHeight":40,"growHeightWithContent":false,"maintainAspectRatio":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":491,"y":10,"exactX":false,"exactY":false,"bottom":false,"right":false,"top":true,"growV":false,"fixed":false,"left":false,"growH":false}},"childrenMode":"rows","fill":{"disabled":false,"component":"data2-core-types@Fill","params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]}},"border":{"component":"data2-core-types@Border","params":{"color":{"params":{"then":{"params":{"content":"#6C5CE0"},"component":"data2-core-primitives@String"},"compare":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6a72149640a65f13df647133"}},"key":{"component":"data2-core-primitives@String","params":{"content":"focused"}}}}},"component":"data2-core-types@Getter"},"else":"#e6e6e6"},"component":"data2-core-flow@If"},"radius":{"leftTop":"9"},"width":{"left":"1","top":"1","right":"1","bottom":"1"}},"break":true},"shadow":[{"component":"data2-core-types@Shadow","params":{"type":"outset","spread":"-15","blur":"25","color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(132,132,132,1)"}}}}],"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"stateDefinitions":[{"component":"data2-core-user-interface@StateDefinition","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"focused"}},"component":"data2-core-primitives@Boolean"}},{"component":"data2-core-user-interface@StateDefinition","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"sector"}},"component":"data2-core-primitives@String"}}],"onMouseDown":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6a72149640a65f13df647133"}},"key":{"component":"data2-core-primitives@String","params":{"content":"focused"}}}},"value":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-types@Setter"},"onClickOutside":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6a72149640a65f13df647133"}},"key":{"component":"data2-core-primitives@String","params":{"content":"focused"}}}},"value":{"params":{"content":false},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-types@Setter"}},"index":2,"updatedAt":"2026-08-05T03:17:56.102Z","createdAt":"2026-08-04T16:35:30.610Z"},{"_id":"6a72149640a65f13df647134","parent":"6a72149640a65f13df647133","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":222,"height":36,"exactWidth":221.64999999999998,"exactHeight":36}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":8,"y":1,"exactX":7.950000000000001,"exactY":false,"top":true,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"center","textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"Fechamento do setor 3786"}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(26,26,26,1)"}},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T02:50:44.735Z","createdAt":"2026-08-04T16:35:30.610Z"},{"_id":"6a72149640a65f13df647135","parent":"6a72149640a65f13df647133","component":"data2-blocks@Html","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":21,"height":20,"exactWidth":21,"exactHeight":20}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":"234","y":"9","exactX":false,"exactY":false,"right":false,"top":true,"left":true}}},"text":{"component":"data2-core-primitives@String","params":{"content":"<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"100%\" height=\"100%\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#1a1a1a\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"feather feather-chevron-down\"><polyline points=\"6 9 12 15 18 9\"></polyline></svg>"}}},"updatedAt":"2026-08-05T02:51:45.074Z","createdAt":"2026-08-04T16:35:30.610Z"},{"_id":"6a72149640a65f13df647136","parent":"6a72149640a65f13df647133","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":132,"height":23,"exactWidth":131.78,"exactHeight":22.8}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":288,"y":15,"exactX":287.74,"exactY":14.75,"top":true,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"left","textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-primitives@String","params":{"content":"2 / 5"}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(43,43,43,1)"}},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"20"}},"opacity":{"params":{},"component":"data2-core-types@Opacity"}},"updatedAt":"2026-08-04T17:06:03.844Z","createdAt":"2026-08-04T16:35:30.610Z"},{"_id":"6a72159a40a65f13df64713c","parent":"6a64499070fbd195b8e6aa5d","component":"natura-geomarketing@4hvch1V6MXqBr9rL-nvAu","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1326,"height":60,"exactWidth":1326,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":20,"y":0,"exactX":20,"exactY":0,"fixed":false,"left":true,"top":true,"right":true,"growH":false}},"border":{"disabled":false,"component":"data2-core-types@Border","params":{"width":{"bottom":"1"},"color":"#e7e7e7"}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"componentState":{"component":"data2-core-primitives@String","params":{"content":"simulador"}}},"index":0,"updatedAt":"2026-08-04T16:40:04.408Z","createdAt":"2026-08-04T16:40:04.408Z"},{"_id":"6a7216c840a65f13df647148","parent":"6a5fcabb3a34c57f2ac6b340","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":27,"height":22,"exactWidth":27.04,"exactHeight":22}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":247,"y":34,"exactX":247.41,"exactY":34.05,"left":true,"top":false}},"childrenMode":"cols","border":{"disabled":false,"component":"data2-core-types@Border","params":{"radius":{"leftTop":"5"}}},"fill":{"disabled":false,"component":"data2-core-types@Fill","params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(244,245,245,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]}}},"updatedAt":"2026-08-04T16:48:19.265Z","createdAt":"2026-08-04T16:44:58.745Z"},{"_id":"6a7216c840a65f13df64714a","parent":"6a7216c840a65f13df647148","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":19,"height":22,"exactWidth":19.47,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":5,"y":0,"exactX":false,"exactY":false,"fixed":false,"left":true,"top":true,"right":false,"growH":false,"bottom":true,"growV":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"v1"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left","fontStyle":"normal","fontWeight":400},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-04T16:47:50.580Z","createdAt":"2026-08-04T16:44:58.745Z"},{"_id":"6a72182840a65f13df64714c","parent":"6a72149640a65f13df647133","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":208,"height":21,"exactWidth":207.78,"exactHeight":20.53}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":288,"y":-7,"exactX":288.05,"exactY":-6.98,"left":true}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"left","textOverflow":false,"verticalAlignment":"middle","fontWeight":400,"letterSpacing":1}},"text":{"component":"data2-core-primitives@String","params":{"content":"Movimentações"}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(105,105,105,1)"}},"hide":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}}},"updatedAt":"2026-08-04T17:06:03.684Z","createdAt":"2026-08-04T16:51:07.234Z"},{"_id":"6a72289748537d17e1a1d3c7","parent":"6a7177b1dce5924aba1393f9","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":220,"height":28}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":20,"y":10,"exactX":false,"exactY":false,"fixed":false,"right":true,"top":true,"left":true,"growH":false}},"childrenMode":"rows","shadow":[]},"index":1,"updatedAt":"2026-08-04T18:06:34.918Z","createdAt":"2026-08-04T18:00:47.336Z"},{"_id":"6a722c9448537d17e1a1d3ca","parent":"6a72149640a65f13df647133","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":266,"height":278,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":"40","exactX":false,"exactY":false,"bottom":false,"right":false,"top":true,"growV":false,"fixed":false,"left":false,"growH":false}},"border":{"component":"data2-core-types@Border","params":{"color":"#e6e6e6","radius":{"leftTop":"3"},"width":{"left":"1","top":"1","right":"1","bottom":"1"}}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"fill":{"disabled":false,"component":"data2-core-types@Fill","params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(241,241,248,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]}},"style":{"transform":{"params":{"compare":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6a72149640a65f13df647133"}},"key":{"component":"data2-core-primitives@String","params":{"content":"focused"}}}}},"component":"data2-core-types@Getter"},"else":{"component":"data2-core-primitives@String","params":{"content":"scale(1,0)"}},"then":{"component":"data2-core-primitives@String","params":{"content":"scale(1,1)"}}},"component":"data2-core-flow@If"},"transformOrigin":{"component":"data2-core-primitives@String","params":{"content":"top center"}},"padding":{"component":"data2-core-primitives@String","params":{"content":"10px 0px 10px 0px"}}},"scroll":{"disabled":false,"component":"data2-core-types@Scroll","params":{"y":true}},"repeat":{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@DataSetReference","params":{"reference":"FhlWyAglkQB5EL4hrbzmq"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"f"}}],"body":{"params":{"compare":{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6a5fcabb3a34c57f2ac6b344"}},"key":{"component":"data2-core-primitives@String","params":{"content":"sector"}}}}}}},"component":"data2-core-comparison-operators@Equal"},"then":{"params":{"content":true},"component":"data2-core-primitives@Boolean"},"else":{"params":{"module":{"params":{"pattern":{"params":{"flags":{"component":"data2-core-primitives@String","params":{"content":"i"}},"pattern":{"params":{"portions":[{"component":"data2-core-primitives@String","params":{"content":"("}},{"params":{"array":{"params":{"array":{"params":{"haystack":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6a5fcabb3a34c57f2ac6b344"}},"key":{"component":"data2-core-primitives@String","params":{"content":"sector"}}}}}}},"component":"data2-core-functions@Split"},"mapper":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"elm"}}],"body":{"params":{"compare":[{"params":{"pattern":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"elm"}}}},"subject":{"component":"data2-core-primitives@String","params":{"content":"$^[]().,?{}|\\/:=*-+"}}},"component":"data2-core-functions@Includes"}],"else":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"elm"}}}},"then":{"params":{"portions":[{"component":"data2-core-primitives@String","params":{"content":"\\"}},{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"elm"}}}}]},"component":"data2-core-functions@StringConcat"}},"component":"data2-core-flow@If"}}}},"component":"data2-core-functions@ArrayMap"}},"component":"data2-core-functions@ArrayJoin"},{"component":"data2-core-primitives@String","params":{"content":")"}}]},"component":"data2-core-functions@StringConcat"}},"component":"data2-core-types@Regex","pattern":"[A-Z]","flags":"gm","break":true},"excludesInput":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"text":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"f.setor"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-functions@Match"},"prop":{"component":"data2-core-primitives@String","params":{"content":"0"}}},"component":"data2-core-types@Getter"}},"component":"data2-core-flow@If"}}}},"component":"data2-core-functions@ArrayFilter"},"childrenMode":"grid","repeatReference":{"component":"data2-core-primitives@String","params":{"content":"s"}}},"updatedAt":"2026-08-04T18:20:13.123Z","createdAt":"2026-08-04T18:18:02.741Z"},{"_id":"6a722c9448537d17e1a1d3cb","parent":"6a722c9448537d17e1a1d3ca","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":358,"height":22,"exactWidth":false,"exactHeight":22}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":false,"exactY":false,"fixed":false,"top":true,"left":false,"right":false,"growH":false}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"center","textOverflow":false,"verticalAlignment":"middle"}},"text":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"sRepeater.setor"}}},"component":"data2-core-types@Reference"},"textSize":{"component":"data2-core-primitives@Number","params":{"content":20}},"onMouseDown":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6a5fcabb3a34c57f2ac6b344"}},"key":{"component":"data2-core-primitives@String","params":{"content":"sector"}}}},"value":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"sRepeater.setor"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-types@Setter"},"cursor":"pointer"},"index":0,"updatedAt":"2026-08-04T18:23:49.916Z","createdAt":"2026-08-04T18:18:02.741Z"},{"_id":"6a72a39a8ad1d21d283b9d05","parent":"6a650c67879c2f24acad741b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"Copy of logoLabel","params":{"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"},"disabled":true},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"params":{"content":"https://natura-hr-demo.data2.media/file/COiL3GBKUjCMIQHLigPb4"},"component":"data2-core-primitives@String"},"positionX":"center","positionY":"center","repeat":"no-repeat","size":"contain"},"component":"data2-core-types@Background","break":true}]},"component":"data2-core-types@Fill","break":true},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":120,"height":28,"exactWidth":120,"exactHeight":27.72}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":"50","y":3,"exactX":false,"exactY":false,"left":true,"top":false,"bottom":false}},"transitions":[{"component":"data2-core-types@Transition","params":{"scope":"ALL","duration":"220","easing":"cubic-bezier(0.013157894736842105,0.0063750000000000195,0.2894736842105263,0.830375)"}}],"shadow":[{"component":"data2-core-types@Shadow","params":{"type":"complex","offsetX":"-1","offsetY":"-1","color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(168,157,243,1)"}},"blur":"1"}},{"component":"data2-core-types@Shadow","params":{"type":"complex","offsetX":"0","offsetY":"0","color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(168,157,243,1)"}},"blur":"2"}}],"filter":[{"component":"data2-core-types@BitmapFilter","params":{"type":"invert","unit":"%","value":100}}]},"reference":"logoLabel","updatedAt":"2026-08-05T02:48:39.011Z","createdAt":"2026-08-05T02:47:18.797Z"},{"_id":"6a72a51b8ad1d21d283b9d07","parent":"6a7172879c26d69dd14e254a","component":"natura-geomarketing@4hvch1V6MXqBr9rL-nvAu","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1326,"height":60,"exactWidth":1326,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":20,"y":0,"exactX":20,"exactY":0,"fixed":false,"left":true,"top":true,"right":true,"growH":false}},"border":{"disabled":false,"component":"data2-core-types@Border","params":{"width":{"bottom":"1"},"color":"#e7e7e7"}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"componentState":{"component":"data2-core-primitives@String","params":{"content":"simulador"}}},"index":0,"updatedAt":"2026-08-05T02:52:08.677Z","createdAt":"2026-08-05T02:52:08.677Z"},{"_id":"6a72acfd8ad1d21d283b9d08","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"New Artboard (55)","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768}},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"reference":"btfxYRDb4x0y_j4XYoBAc","updatedAt":"2026-08-05T03:25:42.910Z","createdAt":"2026-08-05T03:25:42.910Z"},{"_id":"6a72acfe8ad1d21d283b9d32","parent":"6a72acfd8ad1d21d283b9d08","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":259,"height":531,"exactWidth":259,"exactHeight":530.54,"growHeightWithContent":false,"maintainAspectRatio":true}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":20,"y":30,"exactX":false,"exactY":false,"bottom":true,"right":false,"top":true,"growV":false,"fixed":false,"left":true,"growH":false}},"childrenMode":"rows","fill":{"disabled":false,"component":"data2-core-types@Fill","params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]}},"border":{"disabled":false,"component":"data2-core-types@Border","params":{"radius":{"leftTop":"27"},"width":{"top":"1","bottom":"1","left":"1","right":"1"},"color":"#d4d4d4"}},"shadow":[{"component":"data2-core-types@Shadow","params":{"type":"outset","spread":"-15","blur":"25","color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(132,132,132,1)"}},"offsetY":"10"}}]},"index":1,"updatedAt":"2026-08-05T03:25:59.234Z","createdAt":"2026-08-05T03:25:59.234Z"},{"_id":"6a72acfe8ad1d21d283b9d33","parent":"6a72acfe8ad1d21d283b9d32","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(116,116,211,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":258,"height":99,"exactWidth":258,"exactHeight":false,"maintainAspectRatio":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":false,"exactY":false,"left":true,"top":true,"right":true,"growH":false}}},"updatedAt":"2026-08-05T03:25:59.234Z","createdAt":"2026-08-05T03:25:59.234Z"},{"_id":"6a72acfe8ad1d21d283b9d34","parent":"6a72acfe8ad1d21d283b9d33","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":217,"height":62,"exactWidth":false,"exactHeight":62.39}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":20,"y":22,"exactX":false,"exactY":21.8}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"bottom"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":22}},"text":{"component":"data2-core-primitives@String","params":{"content":"Município"}},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:25:59.234Z","createdAt":"2026-08-05T03:25:59.234Z"},{"_id":"6a72acfe8ad1d21d283b9d35","parent":"6a72acfe8ad1d21d283b9d33","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":217,"height":51,"exactWidth":false,"exactHeight":51.38}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":20,"y":1,"exactX":20,"exactY":1.3900000000000001}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(229,229,229,1)"}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"bottom"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":16}},"text":{"component":"data2-core-primitives@String","params":{"content":"Visão por"}},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:25:59.234Z","createdAt":"2026-08-05T03:25:59.234Z"},{"_id":"6a72acfe8ad1d21d283b9d36","parent":"6a72acfe8ad1d21d283b9d33","component":"data2-blocks@Html","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":25,"height":23,"exactWidth":24.72,"exactHeight":23.47}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":124,"y":62,"exactX":124.06,"exactY":61.6}}},"text":{"component":"data2-core-primitives@String","params":{"content":"<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#ffffff\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"feather feather-chevron-down\"><polyline points=\"6 9 12 15 18 9\"></polyline></svg>"}}},"updatedAt":"2026-08-05T03:25:59.234Z","createdAt":"2026-08-05T03:25:59.234Z"},{"_id":"6a72acfe8ad1d21d283b9d37","parent":"6a72acfe8ad1d21d283b9d32","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":257,"height":429,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":100,"exactX":false,"exactY":false,"bottom":true,"left":true,"top":true,"growV":false,"right":true,"growH":false}}},"updatedAt":"2026-08-05T03:25:59.234Z","createdAt":"2026-08-05T03:25:59.234Z"},{"_id":"6a72acfe8ad1d21d283b9d38","parent":"6a72acfe8ad1d21d283b9d37","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":246,"height":170,"exactWidth":246,"exactHeight":169.94}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":1,"y":10,"exactX":false,"exactY":false,"fixed":false,"top":true,"left":true,"right":true,"growH":false}},"text":{"component":"data2-core-primitives@String","params":{"content":""}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"bottom","horizontalAlignment":"center","fontStyle":"italic"},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"}},"index":1,"updatedAt":"2026-08-05T03:25:59.234Z","createdAt":"2026-08-05T03:25:59.234Z"},{"_id":"6a72acfe8ad1d21d283b9d39","parent":"6a72acfe8ad1d21d283b9d38","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":6,"rightTop":6,"leftBottom":6,"rightBottom":6},"width":{"left":0,"top":0,"right":0,"bottom":0},"type":"solid"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":43,"height":20,"exactWidth":43,"exactHeight":20.49}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":20,"y":"0","exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"BA"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"center","fontStyle":"normal"},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0.07)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"index":0,"updatedAt":"2026-08-05T03:25:59.234Z","createdAt":"2026-08-05T03:25:59.234Z"},{"_id":"6a72acfe8ad1d21d283b9d3a","parent":"6a72acfe8ad1d21d283b9d38","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":216,"height":32,"exactWidth":216,"exactHeight":31.970000000000002}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":20,"y":0,"exactX":false,"exactY":false,"fixed":false}},"childrenMode":"cols","childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"index":2,"updatedAt":"2026-08-05T03:25:59.234Z","createdAt":"2026-08-05T03:25:59.234Z"},{"_id":"6a72acfe8ad1d21d283b9d3b","parent":"6a72acfe8ad1d21d283b9d3a","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":39,"height":22,"exactWidth":39.36,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":5,"exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"3576"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left","fontStyle":"normal","fontWeight":400},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"NaturaCo"},"component":"data2-core-primitives@String"},"textDecoration":{"params":{"line":"line-through"},"component":"data2-core-types@TextDecoration"}},"updatedAt":"2026-08-05T03:25:59.234Z","createdAt":"2026-08-05T03:25:59.234Z"},{"_id":"6a72acfe8ad1d21d283b9d3c","parent":"6a72acfe8ad1d21d283b9d3a","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":14,"height":22,"exactWidth":13.58,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":46,"y":5,"exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"->"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left","fontStyle":"normal","fontWeight":400},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:25:59.234Z","createdAt":"2026-08-05T03:25:59.234Z"},{"_id":"6a72acfe8ad1d21d283b9d3d","parent":"6a72acfe8ad1d21d283b9d3a","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":72,"height":22,"exactWidth":72.30999999999999,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":144,"y":5,"exactX":144.07,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"228 CBs"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"right","fontStyle":"normal","fontWeight":400},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:25:59.234Z","createdAt":"2026-08-05T03:25:59.234Z"},{"_id":"6a72acfe8ad1d21d283b9d3e","parent":"6a72acfe8ad1d21d283b9d3a","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":66,"height":22,"exactWidth":66}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":66,"y":5}},"childrenMode":"cols","border":{"disabled":false,"component":"data2-core-types@Border","params":{"radius":{"leftTop":"5"}}},"fill":{"disabled":false,"component":"data2-core-types@Fill","params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(244,245,245,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]}}},"updatedAt":"2026-08-05T03:25:59.234Z","createdAt":"2026-08-05T03:25:59.234Z"},{"_id":"6a72acfe8ad1d21d283b9d3f","parent":"6a72acfe8ad1d21d283b9d3e","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"2"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(48,209,88,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":12,"height":12,"exactWidth":12,"exactHeight":12}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":"49","y":5,"exactX":false,"exactY":false}}},"updatedAt":"2026-08-05T03:25:59.234Z","createdAt":"2026-08-05T03:25:59.234Z"},{"_id":"6a72acfe8ad1d21d283b9d40","parent":"6a72acfe8ad1d21d283b9d3e","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":40,"height":22,"exactWidth":40.38,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":5,"y":0,"exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"2778"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left","fontStyle":"normal","fontWeight":400},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"NaturaCo"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:25:59.234Z","createdAt":"2026-08-05T03:25:59.234Z"},{"_id":"6a72acfe8ad1d21d283b9d41","parent":"6a72acfe8ad1d21d283b9d38","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":216,"height":32,"exactWidth":216,"exactHeight":31.970000000000002}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":20,"y":0,"exactX":false,"exactY":false,"fixed":false,"top":true,"left":true}},"childrenMode":"cols","childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"index":3,"updatedAt":"2026-08-05T03:25:59.234Z","createdAt":"2026-08-05T03:25:59.234Z"},{"_id":"6a72acfe8ad1d21d283b9d42","parent":"6a72acfe8ad1d21d283b9d41","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"2"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(48,209,88,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":12,"height":12,"exactWidth":12,"exactHeight":12}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":44,"y":10,"exactX":false,"exactY":false}}},"updatedAt":"2026-08-05T03:25:59.234Z","createdAt":"2026-08-05T03:25:59.234Z"},{"_id":"6a72acfe8ad1d21d283b9d43","parent":"6a72acfe8ad1d21d283b9d41","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"999"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":40,"height":40,"exactWidth":40,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":178,"y":-4,"exactX":false,"exactY":false}}},"updatedAt":"2026-08-05T03:25:59.234Z","createdAt":"2026-08-05T03:25:59.234Z"},{"_id":"6a72acfe8ad1d21d283b9d44","parent":"6a72acfe8ad1d21d283b9d41","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":40,"height":22,"exactWidth":40.38,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":5,"exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"2778"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left","fontStyle":"normal","fontWeight":400},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"NaturaCo"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:25:59.234Z","createdAt":"2026-08-05T03:25:59.234Z"},{"_id":"6a72acfe8ad1d21d283b9d45","parent":"6a72acfe8ad1d21d283b9d41","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":72,"height":22,"exactWidth":72.30999999999999,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":144,"y":5,"exactX":144.07,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"228 CBs"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"right","fontStyle":"normal","fontWeight":400},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:25:59.234Z","createdAt":"2026-08-05T03:25:59.234Z"},{"_id":"6a72acfe8ad1d21d283b9d46","parent":"6a72acfe8ad1d21d283b9d38","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":216,"height":32,"exactWidth":216,"exactHeight":31.970000000000002}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":20,"y":0,"exactX":false,"exactY":false,"fixed":false,"top":true,"left":true}},"childrenMode":"cols","childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"index":4,"updatedAt":"2026-08-05T03:25:59.234Z","createdAt":"2026-08-05T03:25:59.234Z"},{"_id":"6a72acfe8ad1d21d283b9d47","parent":"6a72acfe8ad1d21d283b9d46","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"2"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(48,209,88,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":12,"height":12,"exactWidth":12,"exactHeight":12}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":44,"y":10,"exactX":false,"exactY":false}}},"updatedAt":"2026-08-05T03:25:59.234Z","createdAt":"2026-08-05T03:25:59.234Z"},{"_id":"6a72acfe8ad1d21d283b9d48","parent":"6a72acfe8ad1d21d283b9d46","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"999"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":40,"height":40,"exactWidth":40,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":178,"y":-4,"exactX":false,"exactY":false}}},"updatedAt":"2026-08-05T03:25:59.234Z","createdAt":"2026-08-05T03:25:59.234Z"},{"_id":"6a72acfe8ad1d21d283b9d49","parent":"6a72acfe8ad1d21d283b9d46","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":40,"height":22,"exactWidth":40.38,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":5,"exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"2778"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left","fontStyle":"normal","fontWeight":400},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"NaturaCo"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:25:59.234Z","createdAt":"2026-08-05T03:25:59.234Z"},{"_id":"6a72acfe8ad1d21d283b9d4a","parent":"6a72acfe8ad1d21d283b9d46","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":72,"height":22,"exactWidth":72.30999999999999,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":144,"y":5,"exactX":144.07,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"228 CBs"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"right","fontStyle":"normal","fontWeight":400},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:25:59.234Z","createdAt":"2026-08-05T03:25:59.234Z"},{"_id":"6a72acfe8ad1d21d283b9d4b","parent":"6a72acfe8ad1d21d283b9d38","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(191,191,191,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":226,"height":1,"exactWidth":226,"exactHeight":1,"growWidthWithContent":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":"15","exactX":false,"exactY":false,"fixed":false}}},"index":5,"updatedAt":"2026-08-05T03:25:59.234Z","createdAt":"2026-08-05T03:25:59.234Z"},{"_id":"6a72acfe8ad1d21d283b9d4c","parent":"6a72acfe8ad1d21d283b9d38","component":"data2-blocks@Html","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":22,"height":28,"exactWidth":22.259999999999998,"exactHeight":28}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":218,"y":0,"exactX":218,"exactY":0}}},"text":{"component":"data2-core-primitives@String","params":{"content":"<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\" class=\"size-6\">\n  <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M8.625 12a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0Zm0 0H8.25m4.125 0a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0Zm0 0H12m4.125 0a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0Zm0 0h-.375M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z\" />\n</svg>\n"}}},"index":6,"updatedAt":"2026-08-05T03:25:59.234Z","createdAt":"2026-08-05T03:25:59.234Z"},{"_id":"6a72acfe8ad1d21d283b9d4d","parent":"6a72acfe8ad1d21d283b9d38","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":220,"height":28}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":20,"y":10,"exactX":false,"exactY":false,"fixed":false,"right":true,"top":true,"left":true,"growH":false}},"childrenMode":"rows","shadow":[]},"index":1,"updatedAt":"2026-08-05T03:25:59.234Z","createdAt":"2026-08-05T03:25:59.234Z"},{"_id":"6a72acfe8ad1d21d283b9d4e","parent":"6a72acfe8ad1d21d283b9d4d","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":131,"height":28,"exactWidth":130.86,"exactHeight":28,"growHeightWithContent":true}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":false,"exactY":false,"fixed":false,"left":true,"top":true,"right":true,"growH":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"Campinas (3)"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"18"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"top","horizontalAlignment":"left","fontStyle":"normal","fontWeight":700},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(100,100,104,1)"},"component":"data2-core-types@Color"},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"3px 0px 3px 0px"}}},"repeat":{"params":{},"component":"data2-core-types@DataSetReference","disabled":true}},"index":1,"updatedAt":"2026-08-05T03:25:59.234Z","createdAt":"2026-08-05T03:25:59.234Z"},{"_id":"6a72acfe8ad1d21d283b9d4f","parent":"6a72acfe8ad1d21d283b9d4d","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":84,"height":22,"exactWidth":83.84,"exactHeight":22}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":132,"y":3,"exactX":false,"exactY":false,"fixed":false,"right":true,"top":true}},"text":{"component":"data2-core-primitives@String","params":{"content":"2440 CBs"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"right","fontStyle":"normal","fontWeight":600},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(100,100,104,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:25:59.234Z","createdAt":"2026-08-05T03:25:59.234Z"},{"_id":"6a72acfe8ad1d21d283b9d50","parent":"6a72acfe8ad1d21d283b9d37","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":246,"height":106,"exactWidth":246,"exactHeight":106.06}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":1,"y":10,"exactX":false,"exactY":false,"fixed":false,"top":true,"right":true,"left":true,"growH":false}},"text":{"component":"data2-core-primitives@String","params":{"content":""}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"bottom","horizontalAlignment":"center","fontStyle":"italic"},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"}},"index":1,"updatedAt":"2026-08-05T03:25:59.234Z","createdAt":"2026-08-05T03:25:59.234Z"},{"_id":"6a72acfe8ad1d21d283b9d51","parent":"6a72acfe8ad1d21d283b9d50","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":220,"height":28,"exactWidth":220,"exactHeight":28.38}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":20,"y":10,"exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"Valinhos (1)"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"18"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left","fontStyle":"normal","fontWeight":700},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(100,100,104,1)"},"component":"data2-core-types@Color"}},"index":1,"updatedAt":"2026-08-05T03:25:59.234Z","createdAt":"2026-08-05T03:25:59.234Z"},{"_id":"6a72acfe8ad1d21d283b9d52","parent":"6a72acfe8ad1d21d283b9d50","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":6,"rightTop":6,"leftBottom":6,"rightBottom":6},"width":{"left":0,"top":0,"right":0,"bottom":0},"type":"solid"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":43,"height":20,"exactWidth":43,"exactHeight":20.49}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":20,"y":0,"exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"BA"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"center","fontStyle":"normal"},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0.07)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"index":0,"updatedAt":"2026-08-05T03:25:59.234Z","createdAt":"2026-08-05T03:25:59.234Z"},{"_id":"6a72acfe8ad1d21d283b9d53","parent":"6a72acfe8ad1d21d283b9d50","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":216,"height":32,"exactWidth":216,"exactHeight":31.970000000000002}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":20,"y":0,"exactX":false,"exactY":false,"fixed":false}},"childrenMode":"cols","childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"index":2,"updatedAt":"2026-08-05T03:25:59.234Z","createdAt":"2026-08-05T03:25:59.234Z"},{"_id":"6a72acfe8ad1d21d283b9d54","parent":"6a72acfe8ad1d21d283b9d53","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"2"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(48,209,88,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":12,"height":12,"exactWidth":12,"exactHeight":12}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":44,"y":10,"exactX":false,"exactY":false}}},"updatedAt":"2026-08-05T03:25:59.234Z","createdAt":"2026-08-05T03:25:59.234Z"},{"_id":"6a72acfe8ad1d21d283b9d55","parent":"6a72acfe8ad1d21d283b9d53","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"999"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":40,"height":40,"exactWidth":40,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":178,"y":-4,"exactX":false,"exactY":false}}},"updatedAt":"2026-08-05T03:25:59.234Z","createdAt":"2026-08-05T03:25:59.234Z"},{"_id":"6a72acfe8ad1d21d283b9d56","parent":"6a72acfe8ad1d21d283b9d53","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":40,"height":22,"exactWidth":40.38,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":5,"exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"2778"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left","fontStyle":"normal","fontWeight":400},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"NaturaCo"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:25:59.234Z","createdAt":"2026-08-05T03:25:59.234Z"},{"_id":"6a72acfe8ad1d21d283b9d57","parent":"6a72acfe8ad1d21d283b9d53","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":72,"height":22,"exactWidth":72.30999999999999,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":144,"y":5,"exactX":144.07,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"228 CBs"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"right","fontStyle":"normal","fontWeight":400},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:25:59.234Z","createdAt":"2026-08-05T03:25:59.234Z"},{"_id":"6a72acfe8ad1d21d283b9d58","parent":"6a72acfe8ad1d21d283b9d50","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(191,191,191,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":226,"height":1,"exactWidth":226,"exactHeight":1,"growWidthWithContent":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":"10","y":105,"exactX":false,"exactY":false}}},"updatedAt":"2026-08-05T03:25:59.234Z","createdAt":"2026-08-05T03:25:59.234Z"},{"_id":"6a72acfe8ad1d21d283b9d59","parent":"6a72acfe8ad1d21d283b9d50","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":71,"height":22,"exactWidth":71.24,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":165,"y":32,"exactX":165.04,"exactY":32.16,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"2440 CBs"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"right","fontStyle":"normal","fontWeight":600},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(100,100,104,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:25:59.234Z","createdAt":"2026-08-05T03:25:59.234Z"},{"_id":"6a72acfe8ad1d21d283b9d5a","parent":"6a72acfe8ad1d21d283b9d50","component":"data2-blocks@Html","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":22,"height":28,"exactWidth":22.259999999999998,"exactHeight":28}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":218,"y":0,"exactX":218,"exactY":0}}},"text":{"component":"data2-core-primitives@String","params":{"content":"<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\" class=\"size-6\">\n  <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M8.625 12a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0Zm0 0H8.25m4.125 0a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0Zm0 0H12m4.125 0a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0Zm0 0h-.375M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z\" />\n</svg>\n"}}},"updatedAt":"2026-08-05T03:25:59.234Z","createdAt":"2026-08-05T03:25:59.234Z"},{"_id":"6a72ad0d8ad1d21d283b9d84","parent":"6a72acfd8ad1d21d283b9d08","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":259,"height":531,"exactWidth":259,"exactHeight":530.54,"growHeightWithContent":false,"maintainAspectRatio":true}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":554,"y":30,"exactX":false,"exactY":false,"bottom":true,"right":false,"top":true,"growV":false,"fixed":false,"left":true,"growH":false}},"childrenMode":"rows","fill":{"disabled":false,"component":"data2-core-types@Fill","params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]}},"border":{"disabled":false,"component":"data2-core-types@Border","params":{"radius":{"leftTop":"27"},"width":{"top":"1","bottom":"1","left":"1","right":"1"},"color":"#d4d4d4"}},"shadow":[{"component":"data2-core-types@Shadow","params":{"type":"outset","spread":"-15","blur":"25","color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(132,132,132,1)"}},"offsetY":"10"}}]},"index":1,"updatedAt":"2026-08-05T03:26:04.077Z","createdAt":"2026-08-05T03:26:04.077Z"},{"_id":"6a72ad0d8ad1d21d283b9d85","parent":"6a72ad0d8ad1d21d283b9d84","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(116,116,211,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":258,"height":99,"exactWidth":258,"exactHeight":false,"maintainAspectRatio":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":false,"exactY":false,"left":true,"top":true,"right":true,"growH":false}}},"updatedAt":"2026-08-05T03:26:04.077Z","createdAt":"2026-08-05T03:26:04.077Z"},{"_id":"6a72ad0d8ad1d21d283b9d86","parent":"6a72ad0d8ad1d21d283b9d85","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":217,"height":62,"exactWidth":false,"exactHeight":62.39}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":20,"y":22,"exactX":false,"exactY":21.8}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"bottom"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":22}},"text":{"component":"data2-core-primitives@String","params":{"content":"Setor"}},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:26:10.768Z","createdAt":"2026-08-05T03:26:04.077Z"},{"_id":"6a72ad0d8ad1d21d283b9d87","parent":"6a72ad0d8ad1d21d283b9d85","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":217,"height":51,"exactWidth":false,"exactHeight":51.38}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":20,"y":1,"exactX":20,"exactY":1.3900000000000001}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(229,229,229,1)"}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"bottom"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":16}},"text":{"component":"data2-core-primitives@String","params":{"content":"Visão por"}},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:26:04.077Z","createdAt":"2026-08-05T03:26:04.077Z"},{"_id":"6a72ad0d8ad1d21d283b9d88","parent":"6a72ad0d8ad1d21d283b9d85","component":"data2-blocks@Html","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":25,"height":23,"exactWidth":24.72,"exactHeight":23.47}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":"82","y":62,"exactX":false,"exactY":false}}},"text":{"component":"data2-core-primitives@String","params":{"content":"<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#ffffff\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"feather feather-chevron-down\"><polyline points=\"6 9 12 15 18 9\"></polyline></svg>"}}},"updatedAt":"2026-08-05T03:26:46.581Z","createdAt":"2026-08-05T03:26:04.077Z"},{"_id":"6a72ad0d8ad1d21d283b9d89","parent":"6a72ad0d8ad1d21d283b9d84","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":257,"height":429,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":100,"exactX":false,"exactY":false,"bottom":true,"left":true,"top":true,"growV":false,"right":true,"growH":false}}},"updatedAt":"2026-08-05T03:45:11.485Z","createdAt":"2026-08-05T03:26:04.077Z"},{"_id":"6a72ad0d8ad1d21d283b9d8a","parent":"6a72ad0d8ad1d21d283b9d89","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":246,"height":183,"exactWidth":246,"exactHeight":183.24}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":1,"y":10,"exactX":1,"exactY":10,"fixed":false,"top":true,"left":true,"right":true,"growH":false}},"text":{"component":"data2-core-primitives@String","params":{"content":""}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"bottom","horizontalAlignment":"center","fontStyle":"italic"},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"}},"index":0,"updatedAt":"2026-08-05T03:45:18.130Z","createdAt":"2026-08-05T03:26:04.077Z"},{"_id":"6a72ad0d8ad1d21d283b9d8b","parent":"6a72ad0d8ad1d21d283b9d8a","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":6,"rightTop":6,"leftBottom":6,"rightBottom":6},"width":{"left":0,"top":0,"right":0,"bottom":0},"type":"solid"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":77,"height":20,"exactWidth":77.36000000000001,"exactHeight":20.49}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":20,"y":"0","exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"Campinas"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"center","fontStyle":"normal"},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0.07)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"index":0,"updatedAt":"2026-08-05T03:28:28.065Z","createdAt":"2026-08-05T03:26:04.077Z"},{"_id":"6a72ad0d8ad1d21d283b9d8c","parent":"6a72ad0d8ad1d21d283b9d8a","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":216,"height":62,"exactWidth":216,"exactHeight":61.69}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":20,"y":0,"exactX":false,"exactY":false,"fixed":false}},"childrenMode":"cols","childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"index":2,"updatedAt":"2026-08-05T03:42:53.799Z","createdAt":"2026-08-05T03:26:04.077Z"},{"_id":"6a72ad0d8ad1d21d283b9d8d","parent":"6a72ad0d8ad1d21d283b9d8c","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":85,"height":22,"exactWidth":84.80999999999999,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":5,"exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"Campinas"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left","fontStyle":"normal","fontWeight":400,"letterSpacing":1},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:46:31.391Z","createdAt":"2026-08-05T03:26:04.077Z"},{"_id":"6a72ad0d8ad1d21d283b9d8f","parent":"6a72ad0d8ad1d21d283b9d8c","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":72,"height":22,"exactWidth":72.30999999999999,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":144,"y":5,"exactX":144.07,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"228 CBs"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"right","fontStyle":"normal","fontWeight":400},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:26:04.077Z","createdAt":"2026-08-05T03:26:04.077Z"},{"_id":"6a72ad0d8ad1d21d283b9d90","parent":"6a72ad0d8ad1d21d283b9d8c","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":66,"height":22,"exactWidth":66}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":31,"exactX":-0.36,"exactY":31.43}},"childrenMode":"cols","border":{"disabled":false,"component":"data2-core-types@Border","params":{"radius":{"leftTop":"5"}}},"fill":{"disabled":false,"component":"data2-core-types@Fill","params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(244,245,245,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]}}},"updatedAt":"2026-08-05T03:42:37.039Z","createdAt":"2026-08-05T03:26:04.077Z"},{"_id":"6a72ad0d8ad1d21d283b9d91","parent":"6a72ad0d8ad1d21d283b9d90","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"2"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(48,209,88,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":12,"height":12,"exactWidth":12,"exactHeight":12}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":"49","y":5,"exactX":false,"exactY":false}}},"updatedAt":"2026-08-05T03:26:04.077Z","createdAt":"2026-08-05T03:26:04.077Z"},{"_id":"6a72ad0d8ad1d21d283b9d92","parent":"6a72ad0d8ad1d21d283b9d90","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":40,"height":22,"exactWidth":40.38,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":5,"y":0,"exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"2778"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left","fontStyle":"normal","fontWeight":400},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"NaturaCo"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:26:04.077Z","createdAt":"2026-08-05T03:26:04.077Z"},{"_id":"6a72ad0d8ad1d21d283b9d93","parent":"6a72ad0d8ad1d21d283b9d8a","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":216,"height":32,"exactWidth":216,"exactHeight":31.970000000000002}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":20,"y":0,"exactX":false,"exactY":false,"fixed":false,"top":true,"left":true}},"childrenMode":"cols","childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"index":3,"updatedAt":"2026-08-05T03:26:04.077Z","createdAt":"2026-08-05T03:26:04.077Z"},{"_id":"6a72ad0d8ad1d21d283b9d95","parent":"6a72ad0d8ad1d21d283b9d93","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"999"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":40,"height":40,"exactWidth":40,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":178,"y":-4,"exactX":false,"exactY":false}}},"updatedAt":"2026-08-05T03:26:04.077Z","createdAt":"2026-08-05T03:26:04.077Z"},{"_id":"6a72ad0d8ad1d21d283b9d96","parent":"6a72ad0d8ad1d21d283b9d93","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":50,"height":22,"exactWidth":49.97,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":5,"exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"22788"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left","fontStyle":"normal","fontWeight":400},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"NaturaCo"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:44:07.737Z","createdAt":"2026-08-05T03:26:04.077Z"},{"_id":"6a72ad0d8ad1d21d283b9d97","parent":"6a72ad0d8ad1d21d283b9d93","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":72,"height":22,"exactWidth":72.30999999999999,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":144,"y":5,"exactX":144.07,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"228 CBs"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"right","fontStyle":"normal","fontWeight":400},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:26:04.077Z","createdAt":"2026-08-05T03:26:04.077Z"},{"_id":"6a72ad0d8ad1d21d283b9d9d","parent":"6a72ad0d8ad1d21d283b9d8a","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(191,191,191,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":226,"height":1,"exactWidth":226,"exactHeight":1,"growWidthWithContent":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":5,"exactX":false,"exactY":false,"fixed":false}}},"index":5,"updatedAt":"2026-08-05T03:45:25.490Z","createdAt":"2026-08-05T03:26:04.077Z"},{"_id":"6a72ad0d8ad1d21d283b9d9e","parent":"6a72ad0d8ad1d21d283b9d8a","component":"data2-blocks@Html","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":22,"height":28,"exactWidth":22.259999999999998,"exactHeight":28}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":218,"y":0,"exactX":218,"exactY":0}}},"text":{"component":"data2-core-primitives@String","params":{"content":"<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\" class=\"size-6\">\n  <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M8.625 12a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0Zm0 0H8.25m4.125 0a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0Zm0 0H12m4.125 0a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0Zm0 0h-.375M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z\" />\n</svg>\n"}}},"index":6,"updatedAt":"2026-08-05T03:26:04.077Z","createdAt":"2026-08-05T03:26:04.077Z"},{"_id":"6a72ad0d8ad1d21d283b9d9f","parent":"6a72ad0d8ad1d21d283b9d8a","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":220,"height":28}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":20,"y":10,"exactX":false,"exactY":false,"fixed":false,"right":true,"top":true,"left":true,"growH":false}},"childrenMode":"rows","shadow":[]},"index":1,"updatedAt":"2026-08-05T03:26:04.077Z","createdAt":"2026-08-05T03:26:04.077Z"},{"_id":"6a72ad0d8ad1d21d283b9da0","parent":"6a72ad0d8ad1d21d283b9d9f","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":109,"height":27,"exactWidth":109.36,"exactHeight":26.74,"growHeightWithContent":true}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":22,"y":1,"exactX":21.5,"exactY":1.26,"fixed":false,"left":true,"top":true,"right":true,"growH":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"3576"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"19"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"top","horizontalAlignment":"left","fontStyle":"normal","fontWeight":700},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(100,100,104,1)"},"component":"data2-core-types@Color"},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"3px 0px 3px 0px"}}},"repeat":{"params":{},"component":"data2-core-types@DataSetReference","disabled":true},"textDecoration":{"params":{"line":"line-through"},"component":"data2-core-types@TextDecoration"}},"index":1,"updatedAt":"2026-08-05T03:39:39.512Z","createdAt":"2026-08-05T03:26:04.077Z"},{"_id":"6a72ad0d8ad1d21d283b9da1","parent":"6a72ad0d8ad1d21d283b9d9f","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":84,"height":22,"exactWidth":83.84,"exactHeight":22}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":132,"y":3,"exactX":false,"exactY":false,"fixed":false,"right":true,"top":true}},"text":{"component":"data2-core-primitives@String","params":{"content":"0 CBs"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"right","fontStyle":"normal","fontWeight":600},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(100,100,104,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:39:45.705Z","createdAt":"2026-08-05T03:26:04.077Z"},{"_id":"6a72ad0d8ad1d21d283b9da2","parent":"6a72ad0d8ad1d21d283b9d89","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":246,"height":106,"exactWidth":246,"exactHeight":106.06}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":1,"y":10,"exactX":false,"exactY":false,"fixed":false,"top":true,"right":true,"left":true,"growH":false}},"text":{"component":"data2-core-primitives@String","params":{"content":""}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"bottom","horizontalAlignment":"center","fontStyle":"italic"},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"}},"index":2,"updatedAt":"2026-08-05T03:39:29.893Z","createdAt":"2026-08-05T03:26:04.077Z"},{"_id":"6a72ad0d8ad1d21d283b9da3","parent":"6a72ad0d8ad1d21d283b9da2","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":220,"height":28,"exactWidth":220,"exactHeight":28.38}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":20,"y":10,"exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"Valinhos (1)"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"18"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left","fontStyle":"normal","fontWeight":700},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(100,100,104,1)"},"component":"data2-core-types@Color"}},"index":1,"updatedAt":"2026-08-05T03:26:04.077Z","createdAt":"2026-08-05T03:26:04.077Z"},{"_id":"6a72ad0d8ad1d21d283b9da4","parent":"6a72ad0d8ad1d21d283b9da2","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":6,"rightTop":6,"leftBottom":6,"rightBottom":6},"width":{"left":0,"top":0,"right":0,"bottom":0},"type":"solid"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":43,"height":20,"exactWidth":43,"exactHeight":20.49}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":20,"y":0,"exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"BA"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"center","fontStyle":"normal"},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0.07)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"index":0,"updatedAt":"2026-08-05T03:26:04.077Z","createdAt":"2026-08-05T03:26:04.077Z"},{"_id":"6a72ad0d8ad1d21d283b9da5","parent":"6a72ad0d8ad1d21d283b9da2","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":216,"height":32,"exactWidth":216,"exactHeight":31.970000000000002}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":20,"y":0,"exactX":false,"exactY":false,"fixed":false}},"childrenMode":"cols","childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"index":2,"updatedAt":"2026-08-05T03:26:04.077Z","createdAt":"2026-08-05T03:26:04.077Z"},{"_id":"6a72ad0d8ad1d21d283b9da6","parent":"6a72ad0d8ad1d21d283b9da5","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"2"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(48,209,88,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":12,"height":12,"exactWidth":12,"exactHeight":12}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":44,"y":10,"exactX":false,"exactY":false}}},"updatedAt":"2026-08-05T03:26:04.077Z","createdAt":"2026-08-05T03:26:04.077Z"},{"_id":"6a72ad0d8ad1d21d283b9da7","parent":"6a72ad0d8ad1d21d283b9da5","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"999"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":40,"height":40,"exactWidth":40,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":178,"y":-4,"exactX":false,"exactY":false}}},"updatedAt":"2026-08-05T03:26:04.077Z","createdAt":"2026-08-05T03:26:04.077Z"},{"_id":"6a72ad0d8ad1d21d283b9da8","parent":"6a72ad0d8ad1d21d283b9da5","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":40,"height":22,"exactWidth":40.38,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":5,"exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"2778"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left","fontStyle":"normal","fontWeight":400},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"NaturaCo"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:26:04.077Z","createdAt":"2026-08-05T03:26:04.077Z"},{"_id":"6a72ad0d8ad1d21d283b9da9","parent":"6a72ad0d8ad1d21d283b9da5","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":72,"height":22,"exactWidth":72.30999999999999,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":144,"y":5,"exactX":144.07,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"228 CBs"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"right","fontStyle":"normal","fontWeight":400},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:26:04.077Z","createdAt":"2026-08-05T03:26:04.077Z"},{"_id":"6a72ad0d8ad1d21d283b9daa","parent":"6a72ad0d8ad1d21d283b9da2","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(191,191,191,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":226,"height":1,"exactWidth":226,"exactHeight":1,"growWidthWithContent":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":"10","y":105,"exactX":false,"exactY":false}}},"updatedAt":"2026-08-05T03:26:04.077Z","createdAt":"2026-08-05T03:26:04.077Z"},{"_id":"6a72ad0d8ad1d21d283b9dab","parent":"6a72ad0d8ad1d21d283b9da2","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":71,"height":22,"exactWidth":71.24,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":165,"y":32,"exactX":165.04,"exactY":32.16,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"2440 CBs"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"right","fontStyle":"normal","fontWeight":600},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(100,100,104,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:26:04.077Z","createdAt":"2026-08-05T03:26:04.077Z"},{"_id":"6a72ad0d8ad1d21d283b9dac","parent":"6a72ad0d8ad1d21d283b9da2","component":"data2-blocks@Html","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":22,"height":28,"exactWidth":22.259999999999998,"exactHeight":28}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":218,"y":0,"exactX":218,"exactY":0}}},"text":{"component":"data2-core-primitives@String","params":{"content":"<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\" class=\"size-6\">\n  <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M8.625 12a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0Zm0 0H8.25m4.125 0a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0Zm0 0H12m4.125 0a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0Zm0 0h-.375M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z\" />\n</svg>\n"}}},"updatedAt":"2026-08-05T03:26:04.077Z","createdAt":"2026-08-05T03:26:04.077Z"},{"_id":"6a72ad4a8ad1d21d283b9dae","parent":"6a72ad0d8ad1d21d283b9d9f","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"2"},"width":{"left":"1","top":"1","right":"1","bottom":"1"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":12,"height":12,"exactWidth":12,"exactHeight":12}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":8,"exactX":false,"exactY":false}}},"updatedAt":"2026-08-05T03:47:06.486Z","createdAt":"2026-08-05T03:27:07.234Z"},{"_id":"6a72ada28ad1d21d283b9db0","parent":"6a72ad0d8ad1d21d283b9d8a","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":6,"rightTop":6,"leftBottom":6,"rightBottom":6},"width":{"left":0,"top":0,"right":0,"bottom":0},"type":"solid"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":67,"height":20,"exactWidth":67.28999999999999,"exactHeight":20.49}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":102,"y":0,"exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"Valinhos"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"center","fontStyle":"normal"},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0.07)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"index":0,"updatedAt":"2026-08-05T03:28:42.369Z","createdAt":"2026-08-05T03:28:42.369Z"},{"_id":"6a72ade68ad1d21d283b9db2","parent":"6a72ad0d8ad1d21d283b9d8a","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":6,"rightTop":6,"leftBottom":6,"rightBottom":6},"width":{"left":0,"top":0,"right":0,"bottom":0},"type":"solid"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":56,"height":20,"exactWidth":56.239999999999995,"exactHeight":20.49}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":20,"y":"5","exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"Sousas"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"center","fontStyle":"normal"},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0.07)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"index":0,"updatedAt":"2026-08-05T03:29:58.227Z","createdAt":"2026-08-05T03:29:55.886Z"},{"_id":"6a72aee58ad1d21d283b9db4","parent":"6a72acfe8ad1d21d283b9d33","component":"data2-blocks@Html","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":22,"height":28,"exactWidth":22.259999999999998,"exactHeight":28}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":216,"y":16,"exactX":215.84,"exactY":16.02}},"filter":[{"component":"data2-core-types@BitmapFilter","params":{"type":"invert","unit":"%","value":100}}]},"text":{"component":"data2-core-primitives@String","params":{"content":"<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\" class=\"size-6\">\n  <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M3.75 3.75v4.5m0-4.5h4.5m-4.5 0L9 9M3.75 20.25v-4.5m0 4.5h4.5m-4.5 0L9 15M20.25 3.75h-4.5m4.5 0v4.5m0-4.5L15 9m5.25 11.25h-4.5m4.5 0v-4.5m0 4.5L15 15\" />\n</svg>\n"}}},"index":6,"updatedAt":"2026-08-05T03:34:17.848Z","createdAt":"2026-08-05T03:34:17.848Z"},{"_id":"6a72aeff8ad1d21d283b9db5","parent":"6a72acfe8ad1d21d283b9d33","component":"data2-blocks@Html","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":22,"height":28,"exactWidth":22.259999999999998,"exactHeight":28}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":178,"y":16,"exactX":177.97,"exactY":16.369999999999997}},"filter":[{"component":"data2-core-types@BitmapFilter","params":{"type":"invert","unit":"%","value":100}}]},"text":{"component":"data2-core-primitives@String","params":{"content":"<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"100%\" height=\"100%\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"feather feather-settings\"><circle cx=\"12\" cy=\"12\" r=\"3\"></circle><path d=\"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z\"></path></svg>"}}},"index":6,"updatedAt":"2026-08-05T03:35:14.301Z","createdAt":"2026-08-05T03:34:53.301Z"},{"_id":"6a72af998ad1d21d283b9db8","parent":"6a72ad0d8ad1d21d283b9d85","component":"data2-blocks@Html","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":22,"height":28,"exactWidth":22.259999999999998,"exactHeight":28}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":216,"y":16,"exactX":215.84,"exactY":16.02}},"filter":[{"component":"data2-core-types@BitmapFilter","params":{"type":"invert","unit":"%","value":100}}]},"text":{"component":"data2-core-primitives@String","params":{"content":"<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\" class=\"size-6\">\n  <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M3.75 3.75v4.5m0-4.5h4.5m-4.5 0L9 9M3.75 20.25v-4.5m0 4.5h4.5m-4.5 0L9 15M20.25 3.75h-4.5m4.5 0v4.5m0-4.5L15 9m5.25 11.25h-4.5m4.5 0v-4.5m0 4.5L15 15\" />\n</svg>\n"}}},"index":6,"updatedAt":"2026-08-05T03:36:52.972Z","createdAt":"2026-08-05T03:36:52.972Z"},{"_id":"6a72af998ad1d21d283b9dbb","parent":"6a72ad0d8ad1d21d283b9d85","component":"data2-blocks@Html","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":22,"height":28,"exactWidth":22.259999999999998,"exactHeight":28}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":178,"y":16,"exactX":177.97,"exactY":16.369999999999997}},"filter":[{"component":"data2-core-types@BitmapFilter","params":{"type":"invert","unit":"%","value":100}}]},"text":{"component":"data2-core-primitives@String","params":{"content":"<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"100%\" height=\"100%\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"feather feather-settings\"><circle cx=\"12\" cy=\"12\" r=\"3\"></circle><path d=\"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z\"></path></svg>"}}},"index":6,"updatedAt":"2026-08-05T03:36:52.972Z","createdAt":"2026-08-05T03:36:52.972Z"},{"_id":"6a72b0358ad1d21d283b9dd7","parent":"6a72ad0d8ad1d21d283b9d89","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":246,"height":195,"exactWidth":246,"exactHeight":195}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":1,"y":10,"exactX":1,"exactY":10,"fixed":false,"top":true,"left":true,"right":true,"growH":false}},"text":{"component":"data2-core-primitives@String","params":{"content":""}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"bottom","horizontalAlignment":"center","fontStyle":"italic"},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"}},"index":1,"updatedAt":"2026-08-05T03:39:29.654Z","createdAt":"2026-08-05T03:39:29.654Z"},{"_id":"6a72b0358ad1d21d283b9dd8","parent":"6a72b0358ad1d21d283b9dd7","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":6,"rightTop":6,"leftBottom":6,"rightBottom":6},"width":{"left":0,"top":0,"right":0,"bottom":0},"type":"solid"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":77,"height":20,"exactWidth":77.36000000000001,"exactHeight":20.49}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":20,"y":"0","exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"Campinas"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"center","fontStyle":"normal"},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0.07)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"index":0,"updatedAt":"2026-08-05T03:39:29.654Z","createdAt":"2026-08-05T03:39:29.654Z"},{"_id":"6a72b0358ad1d21d283b9dd9","parent":"6a72b0358ad1d21d283b9dd7","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":216,"height":32,"exactWidth":216,"exactHeight":31.970000000000002}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":20,"y":0,"exactX":false,"exactY":false,"fixed":false}},"childrenMode":"cols","childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"index":2,"updatedAt":"2026-08-05T03:39:29.654Z","createdAt":"2026-08-05T03:39:29.654Z"},{"_id":"6a72b0358ad1d21d283b9dda","parent":"6a72b0358ad1d21d283b9dd9","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":39,"height":22,"exactWidth":39.36,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":5,"exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"3576"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left","fontStyle":"normal","fontWeight":400},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"NaturaCo"},"component":"data2-core-primitives@String"},"textDecoration":{"params":{"line":"line-through"},"component":"data2-core-types@TextDecoration"}},"updatedAt":"2026-08-05T03:39:29.654Z","createdAt":"2026-08-05T03:39:29.654Z"},{"_id":"6a72b0358ad1d21d283b9ddb","parent":"6a72b0358ad1d21d283b9dd9","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":14,"height":22,"exactWidth":13.58,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":46,"y":5,"exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"->"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left","fontStyle":"normal","fontWeight":400},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:39:29.654Z","createdAt":"2026-08-05T03:39:29.654Z"},{"_id":"6a72b0358ad1d21d283b9ddc","parent":"6a72b0358ad1d21d283b9dd9","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":72,"height":22,"exactWidth":72.30999999999999,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":144,"y":5,"exactX":144.07,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"228 CBs"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"right","fontStyle":"normal","fontWeight":400},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:39:29.654Z","createdAt":"2026-08-05T03:39:29.654Z"},{"_id":"6a72b0358ad1d21d283b9ddd","parent":"6a72b0358ad1d21d283b9dd9","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":66,"height":22,"exactWidth":66}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":66,"y":5}},"childrenMode":"cols","border":{"disabled":false,"component":"data2-core-types@Border","params":{"radius":{"leftTop":"5"}}},"fill":{"disabled":false,"component":"data2-core-types@Fill","params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(244,245,245,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]}}},"updatedAt":"2026-08-05T03:39:29.654Z","createdAt":"2026-08-05T03:39:29.654Z"},{"_id":"6a72b0358ad1d21d283b9dde","parent":"6a72b0358ad1d21d283b9ddd","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"2"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(48,209,88,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":12,"height":12,"exactWidth":12,"exactHeight":12}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":"49","y":5,"exactX":false,"exactY":false}}},"updatedAt":"2026-08-05T03:39:29.654Z","createdAt":"2026-08-05T03:39:29.654Z"},{"_id":"6a72b0358ad1d21d283b9ddf","parent":"6a72b0358ad1d21d283b9ddd","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":40,"height":22,"exactWidth":40.38,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":5,"y":0,"exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"2778"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left","fontStyle":"normal","fontWeight":400},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"NaturaCo"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:39:29.654Z","createdAt":"2026-08-05T03:39:29.654Z"},{"_id":"6a72b0358ad1d21d283b9de0","parent":"6a72b0358ad1d21d283b9dd7","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":216,"height":32,"exactWidth":216,"exactHeight":31.970000000000002}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":20,"y":0,"exactX":false,"exactY":false,"fixed":false,"top":true,"left":true}},"childrenMode":"cols","childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"index":3,"updatedAt":"2026-08-05T03:39:29.654Z","createdAt":"2026-08-05T03:39:29.654Z"},{"_id":"6a72b0358ad1d21d283b9de1","parent":"6a72b0358ad1d21d283b9de0","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"2"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(48,209,88,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":12,"height":12,"exactWidth":12,"exactHeight":12}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":44,"y":10,"exactX":false,"exactY":false}}},"updatedAt":"2026-08-05T03:39:29.654Z","createdAt":"2026-08-05T03:39:29.654Z"},{"_id":"6a72b0358ad1d21d283b9de2","parent":"6a72b0358ad1d21d283b9de0","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"999"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":40,"height":40,"exactWidth":40,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":178,"y":-4,"exactX":false,"exactY":false}}},"updatedAt":"2026-08-05T03:39:29.654Z","createdAt":"2026-08-05T03:39:29.654Z"},{"_id":"6a72b0358ad1d21d283b9de3","parent":"6a72b0358ad1d21d283b9de0","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":40,"height":22,"exactWidth":40.38,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":5,"exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"2778"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left","fontStyle":"normal","fontWeight":400},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"NaturaCo"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:39:29.654Z","createdAt":"2026-08-05T03:39:29.654Z"},{"_id":"6a72b0358ad1d21d283b9de4","parent":"6a72b0358ad1d21d283b9de0","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":72,"height":22,"exactWidth":72.30999999999999,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":144,"y":5,"exactX":144.07,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"228 CBs"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"right","fontStyle":"normal","fontWeight":400},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:39:29.654Z","createdAt":"2026-08-05T03:39:29.654Z"},{"_id":"6a72b0358ad1d21d283b9de5","parent":"6a72b0358ad1d21d283b9dd7","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":216,"height":32,"exactWidth":216,"exactHeight":31.970000000000002}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":20,"y":0,"exactX":false,"exactY":false,"fixed":false,"top":true,"left":true}},"childrenMode":"cols","childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"index":4,"updatedAt":"2026-08-05T03:39:29.654Z","createdAt":"2026-08-05T03:39:29.654Z"},{"_id":"6a72b0358ad1d21d283b9de6","parent":"6a72b0358ad1d21d283b9de5","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"2"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(48,209,88,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":12,"height":12,"exactWidth":12,"exactHeight":12}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":44,"y":10,"exactX":false,"exactY":false}}},"updatedAt":"2026-08-05T03:39:29.654Z","createdAt":"2026-08-05T03:39:29.654Z"},{"_id":"6a72b0358ad1d21d283b9de7","parent":"6a72b0358ad1d21d283b9de5","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"999"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":40,"height":40,"exactWidth":40,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":178,"y":-4,"exactX":false,"exactY":false}}},"updatedAt":"2026-08-05T03:39:29.654Z","createdAt":"2026-08-05T03:39:29.654Z"},{"_id":"6a72b0358ad1d21d283b9de8","parent":"6a72b0358ad1d21d283b9de5","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":40,"height":22,"exactWidth":40.38,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":5,"exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"2778"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left","fontStyle":"normal","fontWeight":400},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"NaturaCo"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:39:29.654Z","createdAt":"2026-08-05T03:39:29.654Z"},{"_id":"6a72b0358ad1d21d283b9de9","parent":"6a72b0358ad1d21d283b9de5","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":72,"height":22,"exactWidth":72.30999999999999,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":144,"y":5,"exactX":144.07,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"228 CBs"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"right","fontStyle":"normal","fontWeight":400},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:39:29.654Z","createdAt":"2026-08-05T03:39:29.654Z"},{"_id":"6a72b0358ad1d21d283b9dea","parent":"6a72b0358ad1d21d283b9dd7","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(191,191,191,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":226,"height":1,"exactWidth":226,"exactHeight":1,"growWidthWithContent":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":"15","exactX":false,"exactY":false,"fixed":false}}},"index":5,"updatedAt":"2026-08-05T03:39:29.654Z","createdAt":"2026-08-05T03:39:29.654Z"},{"_id":"6a72b0358ad1d21d283b9deb","parent":"6a72b0358ad1d21d283b9dd7","component":"data2-blocks@Html","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":22,"height":28,"exactWidth":22.259999999999998,"exactHeight":28}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":218,"y":0,"exactX":218,"exactY":0}}},"text":{"component":"data2-core-primitives@String","params":{"content":"<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\" class=\"size-6\">\n  <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M8.625 12a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0Zm0 0H8.25m4.125 0a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0Zm0 0H12m4.125 0a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0Zm0 0h-.375M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z\" />\n</svg>\n"}}},"index":6,"updatedAt":"2026-08-05T03:39:29.654Z","createdAt":"2026-08-05T03:39:29.654Z"},{"_id":"6a72b0358ad1d21d283b9dec","parent":"6a72b0358ad1d21d283b9dd7","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":220,"height":28}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":20,"y":10,"exactX":false,"exactY":false,"fixed":false,"right":true,"top":true,"left":true,"growH":false}},"childrenMode":"rows","shadow":[]},"index":1,"updatedAt":"2026-08-05T03:39:29.654Z","createdAt":"2026-08-05T03:39:29.654Z"},{"_id":"6a72b0358ad1d21d283b9ded","parent":"6a72b0358ad1d21d283b9dec","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":109,"height":27,"exactWidth":109.36,"exactHeight":26.74,"growHeightWithContent":true}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":22,"y":1,"exactX":21.5,"exactY":1.26,"fixed":false,"left":true,"top":true,"right":true,"growH":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"2778"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"19"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"top","horizontalAlignment":"left","fontStyle":"normal","fontWeight":700},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(100,100,104,1)"},"component":"data2-core-types@Color"},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"3px 0px 3px 0px"}}},"repeat":{"params":{},"component":"data2-core-types@DataSetReference","disabled":true}},"index":1,"updatedAt":"2026-08-05T03:39:29.654Z","createdAt":"2026-08-05T03:39:29.654Z"},{"_id":"6a72b0358ad1d21d283b9dee","parent":"6a72b0358ad1d21d283b9dec","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":84,"height":22,"exactWidth":83.84,"exactHeight":22}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":132,"y":3,"exactX":false,"exactY":false,"fixed":false,"right":true,"top":true}},"text":{"component":"data2-core-primitives@String","params":{"content":"2440 CBs"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"right","fontStyle":"normal","fontWeight":600},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(100,100,104,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:39:29.654Z","createdAt":"2026-08-05T03:39:29.654Z"},{"_id":"6a72b0358ad1d21d283b9def","parent":"6a72b0358ad1d21d283b9dec","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"2"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(48,209,88,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":12,"height":12,"exactWidth":12,"exactHeight":12}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":8,"exactX":false,"exactY":false}}},"updatedAt":"2026-08-05T03:39:29.654Z","createdAt":"2026-08-05T03:39:29.654Z"},{"_id":"6a72b0358ad1d21d283b9df0","parent":"6a72b0358ad1d21d283b9dd7","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":6,"rightTop":6,"leftBottom":6,"rightBottom":6},"width":{"left":0,"top":0,"right":0,"bottom":0},"type":"solid"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":67,"height":20,"exactWidth":67.28999999999999,"exactHeight":20.49}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":102,"y":0,"exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"Valinhos"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"center","fontStyle":"normal"},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0.07)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"index":0,"updatedAt":"2026-08-05T03:39:29.654Z","createdAt":"2026-08-05T03:39:29.654Z"},{"_id":"6a72b0358ad1d21d283b9df1","parent":"6a72b0358ad1d21d283b9dd7","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":6,"rightTop":6,"leftBottom":6,"rightBottom":6},"width":{"left":0,"top":0,"right":0,"bottom":0},"type":"solid"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":56,"height":20,"exactWidth":56.239999999999995,"exactHeight":20.49}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":20,"y":"5","exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"Sousas"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"center","fontStyle":"normal"},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0.07)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"index":0,"updatedAt":"2026-08-05T03:39:29.654Z","createdAt":"2026-08-05T03:39:29.654Z"},{"_id":"6a72b1548ad1d21d283b9df5","parent":"6a72ad0d8ad1d21d283b9d93","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":66,"height":22,"exactWidth":66}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":57,"y":5,"exactX":57.35,"exactY":4.51}},"childrenMode":"cols","border":{"disabled":false,"component":"data2-core-types@Border","params":{"radius":{"leftTop":"5"}}},"fill":{"disabled":false,"component":"data2-core-types@Fill","params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(244,245,245,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]}}},"updatedAt":"2026-08-05T03:44:26.446Z","createdAt":"2026-08-05T03:44:26.446Z"},{"_id":"6a72b1548ad1d21d283b9df6","parent":"6a72b1548ad1d21d283b9df5","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"2"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(48,209,88,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":12,"height":12,"exactWidth":12,"exactHeight":12}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":"49","y":5,"exactX":false,"exactY":false}}},"updatedAt":"2026-08-05T03:44:26.446Z","createdAt":"2026-08-05T03:44:26.446Z"},{"_id":"6a72b1548ad1d21d283b9df7","parent":"6a72b1548ad1d21d283b9df5","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":40,"height":22,"exactWidth":40.38,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":5,"y":0,"exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"2778"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left","fontStyle":"normal","fontWeight":400},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"NaturaCo"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:44:26.446Z","createdAt":"2026-08-05T03:44:26.446Z"},{"_id":"6a72b2158ad1d21d283b9e3d","parent":"6a72acfd8ad1d21d283b9d08","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":259,"height":531,"exactWidth":259,"exactHeight":530.54,"growHeightWithContent":false,"maintainAspectRatio":true}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":"1087","y":30,"exactX":false,"exactY":false,"bottom":true,"right":false,"top":true,"growV":false,"fixed":false,"left":true,"growH":false}},"childrenMode":"rows","fill":{"disabled":false,"component":"data2-core-types@Fill","params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]}},"border":{"disabled":false,"component":"data2-core-types@Border","params":{"radius":{"leftTop":"27"},"width":{"top":"1","bottom":"1","left":"1","right":"1"},"color":"#d4d4d4"}},"shadow":[{"component":"data2-core-types@Shadow","params":{"type":"outset","spread":"-15","blur":"25","color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(132,132,132,1)"}},"offsetY":"10"}}]},"index":1,"updatedAt":"2026-08-05T03:47:34.835Z","createdAt":"2026-08-05T03:47:34.835Z"},{"_id":"6a72b2158ad1d21d283b9e3e","parent":"6a72b2158ad1d21d283b9e3d","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(116,116,211,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":258,"height":99,"exactWidth":258,"exactHeight":false,"maintainAspectRatio":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":false,"exactY":false,"left":true,"top":true,"right":true,"growH":false}}},"updatedAt":"2026-08-05T03:47:34.835Z","createdAt":"2026-08-05T03:47:34.835Z"},{"_id":"6a72b2158ad1d21d283b9e3f","parent":"6a72b2158ad1d21d283b9e3e","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":217,"height":62,"exactWidth":false,"exactHeight":62.39}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":20,"y":22,"exactX":false,"exactY":21.8}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"bottom"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":22}},"text":{"component":"data2-core-primitives@String","params":{"content":"Grupo de venda"}},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:47:43.330Z","createdAt":"2026-08-05T03:47:34.835Z"},{"_id":"6a72b2158ad1d21d283b9e40","parent":"6a72b2158ad1d21d283b9e3e","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":217,"height":51,"exactWidth":false,"exactHeight":51.38}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":20,"y":1,"exactX":20,"exactY":1.3900000000000001}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(229,229,229,1)"}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"bottom"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":16}},"text":{"component":"data2-core-primitives@String","params":{"content":"Visão por"}},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:47:34.835Z","createdAt":"2026-08-05T03:47:34.835Z"},{"_id":"6a72b2158ad1d21d283b9e41","parent":"6a72b2158ad1d21d283b9e3e","component":"data2-blocks@Html","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":25,"height":23,"exactWidth":24.72,"exactHeight":23.47}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":"189","y":62,"exactX":false,"exactY":false}}},"text":{"component":"data2-core-primitives@String","params":{"content":"<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#ffffff\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"feather feather-chevron-down\"><polyline points=\"6 9 12 15 18 9\"></polyline></svg>"}}},"updatedAt":"2026-08-05T03:48:00.364Z","createdAt":"2026-08-05T03:47:34.835Z"},{"_id":"6a72b2158ad1d21d283b9e42","parent":"6a72b2158ad1d21d283b9e3e","component":"data2-blocks@Html","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":22,"height":28,"exactWidth":22.259999999999998,"exactHeight":28}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":216,"y":16,"exactX":215.84,"exactY":16.02}},"filter":[{"component":"data2-core-types@BitmapFilter","params":{"type":"invert","unit":"%","value":100}}]},"text":{"component":"data2-core-primitives@String","params":{"content":"<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\" class=\"size-6\">\n  <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M3.75 3.75v4.5m0-4.5h4.5m-4.5 0L9 9M3.75 20.25v-4.5m0 4.5h4.5m-4.5 0L9 15M20.25 3.75h-4.5m4.5 0v4.5m0-4.5L15 9m5.25 11.25h-4.5m4.5 0v-4.5m0 4.5L15 15\" />\n</svg>\n"}}},"index":6,"updatedAt":"2026-08-05T03:47:34.835Z","createdAt":"2026-08-05T03:47:34.835Z"},{"_id":"6a72b2158ad1d21d283b9e43","parent":"6a72b2158ad1d21d283b9e3e","component":"data2-blocks@Html","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":22,"height":28,"exactWidth":22.259999999999998,"exactHeight":28}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":178,"y":16,"exactX":177.97,"exactY":16.369999999999997}},"filter":[{"component":"data2-core-types@BitmapFilter","params":{"type":"invert","unit":"%","value":100}}]},"text":{"component":"data2-core-primitives@String","params":{"content":"<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"100%\" height=\"100%\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"feather feather-settings\"><circle cx=\"12\" cy=\"12\" r=\"3\"></circle><path d=\"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z\"></path></svg>"}}},"index":6,"updatedAt":"2026-08-05T03:47:34.835Z","createdAt":"2026-08-05T03:47:34.835Z"},{"_id":"6a72b2158ad1d21d283b9e44","parent":"6a72b2158ad1d21d283b9e3d","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":257,"height":429,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":100,"exactX":false,"exactY":false,"bottom":true,"left":true,"top":true,"growV":false,"right":true,"growH":false}}},"updatedAt":"2026-08-05T03:47:34.835Z","createdAt":"2026-08-05T03:47:34.835Z"},{"_id":"6a72b2158ad1d21d283b9e45","parent":"6a72b2158ad1d21d283b9e44","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":246,"height":183,"exactWidth":246,"exactHeight":183.24}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":1,"y":10,"exactX":1,"exactY":10,"fixed":false,"top":true,"left":true,"right":true,"growH":false}},"text":{"component":"data2-core-primitives@String","params":{"content":""}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"bottom","horizontalAlignment":"center","fontStyle":"italic"},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"}},"index":0,"updatedAt":"2026-08-05T03:47:34.835Z","createdAt":"2026-08-05T03:47:34.835Z"},{"_id":"6a72b2158ad1d21d283b9e46","parent":"6a72b2158ad1d21d283b9e45","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":6,"rightTop":6,"leftBottom":6,"rightBottom":6},"width":{"left":0,"top":0,"right":0,"bottom":0},"type":"solid"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":77,"height":20,"exactWidth":77.36000000000001,"exactHeight":20.49}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":20,"y":"0","exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"Campinas"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"center","fontStyle":"normal"},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0.07)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"index":0,"updatedAt":"2026-08-05T03:47:34.835Z","createdAt":"2026-08-05T03:47:34.835Z"},{"_id":"6a72b2158ad1d21d283b9e47","parent":"6a72b2158ad1d21d283b9e45","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":216,"height":62,"exactWidth":216,"exactHeight":61.69}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":20,"y":0,"exactX":false,"exactY":false,"fixed":false}},"childrenMode":"cols","childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"index":2,"updatedAt":"2026-08-05T03:47:34.835Z","createdAt":"2026-08-05T03:47:34.835Z"},{"_id":"6a72b2158ad1d21d283b9e48","parent":"6a72b2158ad1d21d283b9e47","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":85,"height":22,"exactWidth":84.80999999999999,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":5,"exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"Campinas"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left","fontStyle":"normal","fontWeight":400,"letterSpacing":1},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:47:34.835Z","createdAt":"2026-08-05T03:47:34.835Z"},{"_id":"6a72b2158ad1d21d283b9e49","parent":"6a72b2158ad1d21d283b9e47","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":72,"height":22,"exactWidth":72.30999999999999,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":144,"y":5,"exactX":144.07,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"228 CBs"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"right","fontStyle":"normal","fontWeight":400},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:47:34.835Z","createdAt":"2026-08-05T03:47:34.835Z"},{"_id":"6a72b2158ad1d21d283b9e4a","parent":"6a72b2158ad1d21d283b9e47","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":66,"height":22,"exactWidth":66}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":31,"exactX":-0.36,"exactY":31.43}},"childrenMode":"cols","border":{"disabled":false,"component":"data2-core-types@Border","params":{"radius":{"leftTop":"5"}}},"fill":{"disabled":false,"component":"data2-core-types@Fill","params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(244,245,245,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]}}},"updatedAt":"2026-08-05T03:47:34.835Z","createdAt":"2026-08-05T03:47:34.835Z"},{"_id":"6a72b2158ad1d21d283b9e4b","parent":"6a72b2158ad1d21d283b9e4a","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"2"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(48,209,88,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":12,"height":12,"exactWidth":12,"exactHeight":12}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":"49","y":5,"exactX":false,"exactY":false}}},"updatedAt":"2026-08-05T03:47:34.835Z","createdAt":"2026-08-05T03:47:34.835Z"},{"_id":"6a72b2158ad1d21d283b9e4c","parent":"6a72b2158ad1d21d283b9e4a","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":40,"height":22,"exactWidth":40.38,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":5,"y":0,"exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"2778"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left","fontStyle":"normal","fontWeight":400},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"NaturaCo"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:47:34.835Z","createdAt":"2026-08-05T03:47:34.835Z"},{"_id":"6a72b2158ad1d21d283b9e4d","parent":"6a72b2158ad1d21d283b9e45","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":216,"height":32,"exactWidth":216,"exactHeight":31.970000000000002}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":20,"y":0,"exactX":false,"exactY":false,"fixed":false,"top":true,"left":true}},"childrenMode":"cols","childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"index":3,"updatedAt":"2026-08-05T03:47:34.835Z","createdAt":"2026-08-05T03:47:34.835Z"},{"_id":"6a72b2158ad1d21d283b9e4e","parent":"6a72b2158ad1d21d283b9e4d","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"999"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":40,"height":40,"exactWidth":40,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":178,"y":-4,"exactX":false,"exactY":false}}},"updatedAt":"2026-08-05T03:47:34.835Z","createdAt":"2026-08-05T03:47:34.835Z"},{"_id":"6a72b2158ad1d21d283b9e4f","parent":"6a72b2158ad1d21d283b9e4d","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":50,"height":22,"exactWidth":49.97,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":5,"exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"22788"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left","fontStyle":"normal","fontWeight":400},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"NaturaCo"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:47:34.835Z","createdAt":"2026-08-05T03:47:34.835Z"},{"_id":"6a72b2158ad1d21d283b9e50","parent":"6a72b2158ad1d21d283b9e4d","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":72,"height":22,"exactWidth":72.30999999999999,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":144,"y":5,"exactX":144.07,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"228 CBs"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"right","fontStyle":"normal","fontWeight":400},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:47:34.835Z","createdAt":"2026-08-05T03:47:34.835Z"},{"_id":"6a72b2158ad1d21d283b9e51","parent":"6a72b2158ad1d21d283b9e4d","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":66,"height":22,"exactWidth":66}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":57,"y":5,"exactX":57.35,"exactY":4.51}},"childrenMode":"cols","border":{"disabled":false,"component":"data2-core-types@Border","params":{"radius":{"leftTop":"5"}}},"fill":{"disabled":false,"component":"data2-core-types@Fill","params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(244,245,245,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]}}},"updatedAt":"2026-08-05T03:47:34.835Z","createdAt":"2026-08-05T03:47:34.835Z"},{"_id":"6a72b2158ad1d21d283b9e52","parent":"6a72b2158ad1d21d283b9e51","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"2"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(48,209,88,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":12,"height":12,"exactWidth":12,"exactHeight":12}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":"49","y":5,"exactX":false,"exactY":false}}},"updatedAt":"2026-08-05T03:47:34.835Z","createdAt":"2026-08-05T03:47:34.835Z"},{"_id":"6a72b2158ad1d21d283b9e53","parent":"6a72b2158ad1d21d283b9e51","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":40,"height":22,"exactWidth":40.38,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":5,"y":0,"exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"2778"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left","fontStyle":"normal","fontWeight":400},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"NaturaCo"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:47:34.835Z","createdAt":"2026-08-05T03:47:34.835Z"},{"_id":"6a72b2158ad1d21d283b9e54","parent":"6a72b2158ad1d21d283b9e45","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(191,191,191,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":226,"height":1,"exactWidth":226,"exactHeight":1,"growWidthWithContent":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":5,"exactX":false,"exactY":false,"fixed":false}}},"index":5,"updatedAt":"2026-08-05T03:47:34.835Z","createdAt":"2026-08-05T03:47:34.835Z"},{"_id":"6a72b2158ad1d21d283b9e55","parent":"6a72b2158ad1d21d283b9e45","component":"data2-blocks@Html","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":22,"height":28,"exactWidth":22.259999999999998,"exactHeight":28}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":218,"y":0,"exactX":218,"exactY":0}}},"text":{"component":"data2-core-primitives@String","params":{"content":"<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\" class=\"size-6\">\n  <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M8.625 12a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0Zm0 0H8.25m4.125 0a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0Zm0 0H12m4.125 0a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0Zm0 0h-.375M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z\" />\n</svg>\n"}}},"index":6,"updatedAt":"2026-08-05T03:47:34.835Z","createdAt":"2026-08-05T03:47:34.835Z"},{"_id":"6a72b2158ad1d21d283b9e56","parent":"6a72b2158ad1d21d283b9e45","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":220,"height":28}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":20,"y":10,"exactX":false,"exactY":false,"fixed":false,"right":true,"top":true,"left":true,"growH":false}},"childrenMode":"rows","shadow":[]},"index":1,"updatedAt":"2026-08-05T03:47:34.835Z","createdAt":"2026-08-05T03:47:34.835Z"},{"_id":"6a72b2158ad1d21d283b9e57","parent":"6a72b2158ad1d21d283b9e56","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":109,"height":27,"exactWidth":109.36,"exactHeight":26.74,"growHeightWithContent":true}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":22,"y":1,"exactX":21.5,"exactY":1.26,"fixed":false,"left":true,"top":true,"right":true,"growH":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"3576"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"19"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"top","horizontalAlignment":"left","fontStyle":"normal","fontWeight":700},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(100,100,104,1)"},"component":"data2-core-types@Color"},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"3px 0px 3px 0px"}}},"repeat":{"params":{},"component":"data2-core-types@DataSetReference","disabled":true},"textDecoration":{"params":{"line":"line-through"},"component":"data2-core-types@TextDecoration"}},"index":1,"updatedAt":"2026-08-05T03:47:34.835Z","createdAt":"2026-08-05T03:47:34.835Z"},{"_id":"6a72b2158ad1d21d283b9e58","parent":"6a72b2158ad1d21d283b9e56","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":84,"height":22,"exactWidth":83.84,"exactHeight":22}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":132,"y":3,"exactX":false,"exactY":false,"fixed":false,"right":true,"top":true}},"text":{"component":"data2-core-primitives@String","params":{"content":"0 CBs"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"right","fontStyle":"normal","fontWeight":600},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(100,100,104,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:47:34.835Z","createdAt":"2026-08-05T03:47:34.835Z"},{"_id":"6a72b2158ad1d21d283b9e59","parent":"6a72b2158ad1d21d283b9e56","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"2"},"width":{"left":"1","top":"1","right":"1","bottom":"1"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":12,"height":12,"exactWidth":12,"exactHeight":12}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":8,"exactX":false,"exactY":false}}},"updatedAt":"2026-08-05T03:47:34.835Z","createdAt":"2026-08-05T03:47:34.835Z"},{"_id":"6a72b2158ad1d21d283b9e5a","parent":"6a72b2158ad1d21d283b9e45","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":6,"rightTop":6,"leftBottom":6,"rightBottom":6},"width":{"left":0,"top":0,"right":0,"bottom":0},"type":"solid"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":67,"height":20,"exactWidth":67.28999999999999,"exactHeight":20.49}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":102,"y":0,"exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"Valinhos"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"center","fontStyle":"normal"},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0.07)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"index":0,"updatedAt":"2026-08-05T03:47:34.835Z","createdAt":"2026-08-05T03:47:34.835Z"},{"_id":"6a72b2158ad1d21d283b9e5b","parent":"6a72b2158ad1d21d283b9e45","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":6,"rightTop":6,"leftBottom":6,"rightBottom":6},"width":{"left":0,"top":0,"right":0,"bottom":0},"type":"solid"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":56,"height":20,"exactWidth":56.239999999999995,"exactHeight":20.49}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":20,"y":"5","exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"Sousas"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"center","fontStyle":"normal"},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0.07)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"index":0,"updatedAt":"2026-08-05T03:47:34.835Z","createdAt":"2026-08-05T03:47:34.835Z"},{"_id":"6a72b2158ad1d21d283b9e5c","parent":"6a72b2158ad1d21d283b9e44","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":246,"height":106,"exactWidth":246,"exactHeight":106.06}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":1,"y":10,"exactX":false,"exactY":false,"fixed":false,"top":true,"right":true,"left":true,"growH":false}},"text":{"component":"data2-core-primitives@String","params":{"content":""}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"bottom","horizontalAlignment":"center","fontStyle":"italic"},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"}},"index":2,"updatedAt":"2026-08-05T03:47:34.835Z","createdAt":"2026-08-05T03:47:34.835Z"},{"_id":"6a72b2158ad1d21d283b9e5d","parent":"6a72b2158ad1d21d283b9e5c","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":220,"height":28,"exactWidth":220,"exactHeight":28.38}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":20,"y":10,"exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"Valinhos (1)"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"18"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left","fontStyle":"normal","fontWeight":700},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(100,100,104,1)"},"component":"data2-core-types@Color"}},"index":1,"updatedAt":"2026-08-05T03:47:34.835Z","createdAt":"2026-08-05T03:47:34.835Z"},{"_id":"6a72b2158ad1d21d283b9e5e","parent":"6a72b2158ad1d21d283b9e5c","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":6,"rightTop":6,"leftBottom":6,"rightBottom":6},"width":{"left":0,"top":0,"right":0,"bottom":0},"type":"solid"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":43,"height":20,"exactWidth":43,"exactHeight":20.49}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":20,"y":0,"exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"BA"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"center","fontStyle":"normal"},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0.07)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"index":0,"updatedAt":"2026-08-05T03:47:34.835Z","createdAt":"2026-08-05T03:47:34.835Z"},{"_id":"6a72b2158ad1d21d283b9e5f","parent":"6a72b2158ad1d21d283b9e5c","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":216,"height":32,"exactWidth":216,"exactHeight":31.970000000000002}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":20,"y":0,"exactX":false,"exactY":false,"fixed":false}},"childrenMode":"cols","childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"index":2,"updatedAt":"2026-08-05T03:47:34.835Z","createdAt":"2026-08-05T03:47:34.835Z"},{"_id":"6a72b2158ad1d21d283b9e60","parent":"6a72b2158ad1d21d283b9e5f","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"2"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(48,209,88,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":12,"height":12,"exactWidth":12,"exactHeight":12}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":44,"y":10,"exactX":false,"exactY":false}}},"updatedAt":"2026-08-05T03:47:34.835Z","createdAt":"2026-08-05T03:47:34.835Z"},{"_id":"6a72b2158ad1d21d283b9e61","parent":"6a72b2158ad1d21d283b9e5f","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"999"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":40,"height":40,"exactWidth":40,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":178,"y":-4,"exactX":false,"exactY":false}}},"updatedAt":"2026-08-05T03:47:34.835Z","createdAt":"2026-08-05T03:47:34.835Z"},{"_id":"6a72b2158ad1d21d283b9e62","parent":"6a72b2158ad1d21d283b9e5f","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":40,"height":22,"exactWidth":40.38,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":5,"exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"2778"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left","fontStyle":"normal","fontWeight":400},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"NaturaCo"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:47:34.835Z","createdAt":"2026-08-05T03:47:34.835Z"},{"_id":"6a72b2158ad1d21d283b9e63","parent":"6a72b2158ad1d21d283b9e5f","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":72,"height":22,"exactWidth":72.30999999999999,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":144,"y":5,"exactX":144.07,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"228 CBs"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"right","fontStyle":"normal","fontWeight":400},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:47:34.835Z","createdAt":"2026-08-05T03:47:34.835Z"},{"_id":"6a72b2158ad1d21d283b9e64","parent":"6a72b2158ad1d21d283b9e5c","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(191,191,191,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":226,"height":1,"exactWidth":226,"exactHeight":1,"growWidthWithContent":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":"10","y":105,"exactX":false,"exactY":false}}},"updatedAt":"2026-08-05T03:47:34.835Z","createdAt":"2026-08-05T03:47:34.835Z"},{"_id":"6a72b2158ad1d21d283b9e65","parent":"6a72b2158ad1d21d283b9e5c","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":71,"height":22,"exactWidth":71.24,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":165,"y":32,"exactX":165.04,"exactY":32.16,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"2440 CBs"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"right","fontStyle":"normal","fontWeight":600},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(100,100,104,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:47:34.835Z","createdAt":"2026-08-05T03:47:34.835Z"},{"_id":"6a72b2158ad1d21d283b9e66","parent":"6a72b2158ad1d21d283b9e5c","component":"data2-blocks@Html","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":22,"height":28,"exactWidth":22.259999999999998,"exactHeight":28}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":218,"y":0,"exactX":218,"exactY":0}}},"text":{"component":"data2-core-primitives@String","params":{"content":"<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\" class=\"size-6\">\n  <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M8.625 12a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0Zm0 0H8.25m4.125 0a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0Zm0 0H12m4.125 0a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0Zm0 0h-.375M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z\" />\n</svg>\n"}}},"updatedAt":"2026-08-05T03:47:34.835Z","createdAt":"2026-08-05T03:47:34.835Z"},{"_id":"6a72b2158ad1d21d283b9e67","parent":"6a72b2158ad1d21d283b9e44","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":246,"height":195,"exactWidth":246,"exactHeight":195}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":1,"y":10,"exactX":1,"exactY":10,"fixed":false,"top":true,"left":true,"right":true,"growH":false}},"text":{"component":"data2-core-primitives@String","params":{"content":""}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"bottom","horizontalAlignment":"center","fontStyle":"italic"},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"}},"index":1,"updatedAt":"2026-08-05T03:47:34.835Z","createdAt":"2026-08-05T03:47:34.835Z"},{"_id":"6a72b2158ad1d21d283b9e68","parent":"6a72b2158ad1d21d283b9e67","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":6,"rightTop":6,"leftBottom":6,"rightBottom":6},"width":{"left":0,"top":0,"right":0,"bottom":0},"type":"solid"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":77,"height":20,"exactWidth":77.36000000000001,"exactHeight":20.49}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":20,"y":"0","exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"Campinas"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"center","fontStyle":"normal"},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0.07)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"index":0,"updatedAt":"2026-08-05T03:47:34.835Z","createdAt":"2026-08-05T03:47:34.835Z"},{"_id":"6a72b2158ad1d21d283b9e69","parent":"6a72b2158ad1d21d283b9e67","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":216,"height":32,"exactWidth":216,"exactHeight":31.970000000000002}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":20,"y":0,"exactX":false,"exactY":false,"fixed":false}},"childrenMode":"cols","childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"index":2,"updatedAt":"2026-08-05T03:47:34.835Z","createdAt":"2026-08-05T03:47:34.835Z"},{"_id":"6a72b2158ad1d21d283b9e6a","parent":"6a72b2158ad1d21d283b9e69","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":39,"height":22,"exactWidth":39.36,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":5,"exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"3576"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left","fontStyle":"normal","fontWeight":400},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"NaturaCo"},"component":"data2-core-primitives@String"},"textDecoration":{"params":{"line":"line-through"},"component":"data2-core-types@TextDecoration"}},"updatedAt":"2026-08-05T03:47:34.835Z","createdAt":"2026-08-05T03:47:34.835Z"},{"_id":"6a72b2158ad1d21d283b9e6b","parent":"6a72b2158ad1d21d283b9e69","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":14,"height":22,"exactWidth":13.58,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":46,"y":5,"exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"->"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left","fontStyle":"normal","fontWeight":400},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:47:34.835Z","createdAt":"2026-08-05T03:47:34.835Z"},{"_id":"6a72b2158ad1d21d283b9e6c","parent":"6a72b2158ad1d21d283b9e69","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":72,"height":22,"exactWidth":72.30999999999999,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":144,"y":5,"exactX":144.07,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"228 CBs"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"right","fontStyle":"normal","fontWeight":400},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:47:34.835Z","createdAt":"2026-08-05T03:47:34.835Z"},{"_id":"6a72b2158ad1d21d283b9e6d","parent":"6a72b2158ad1d21d283b9e69","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":66,"height":22,"exactWidth":66}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":66,"y":5}},"childrenMode":"cols","border":{"disabled":false,"component":"data2-core-types@Border","params":{"radius":{"leftTop":"5"}}},"fill":{"disabled":false,"component":"data2-core-types@Fill","params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(244,245,245,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]}}},"updatedAt":"2026-08-05T03:47:34.835Z","createdAt":"2026-08-05T03:47:34.835Z"},{"_id":"6a72b2158ad1d21d283b9e6e","parent":"6a72b2158ad1d21d283b9e6d","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"2"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(48,209,88,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":12,"height":12,"exactWidth":12,"exactHeight":12}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":"49","y":5,"exactX":false,"exactY":false}}},"updatedAt":"2026-08-05T03:47:34.835Z","createdAt":"2026-08-05T03:47:34.835Z"},{"_id":"6a72b2158ad1d21d283b9e6f","parent":"6a72b2158ad1d21d283b9e6d","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":40,"height":22,"exactWidth":40.38,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":5,"y":0,"exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"2778"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left","fontStyle":"normal","fontWeight":400},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"NaturaCo"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:47:34.835Z","createdAt":"2026-08-05T03:47:34.835Z"},{"_id":"6a72b2158ad1d21d283b9e70","parent":"6a72b2158ad1d21d283b9e67","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":216,"height":32,"exactWidth":216,"exactHeight":31.970000000000002}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":20,"y":0,"exactX":false,"exactY":false,"fixed":false,"top":true,"left":true}},"childrenMode":"cols","childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"index":3,"updatedAt":"2026-08-05T03:47:34.835Z","createdAt":"2026-08-05T03:47:34.835Z"},{"_id":"6a72b2158ad1d21d283b9e71","parent":"6a72b2158ad1d21d283b9e70","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"2"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(48,209,88,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":12,"height":12,"exactWidth":12,"exactHeight":12}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":44,"y":10,"exactX":false,"exactY":false}}},"updatedAt":"2026-08-05T03:47:34.835Z","createdAt":"2026-08-05T03:47:34.835Z"},{"_id":"6a72b2158ad1d21d283b9e72","parent":"6a72b2158ad1d21d283b9e70","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"999"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":40,"height":40,"exactWidth":40,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":178,"y":-4,"exactX":false,"exactY":false}}},"updatedAt":"2026-08-05T03:47:34.835Z","createdAt":"2026-08-05T03:47:34.835Z"},{"_id":"6a72b2158ad1d21d283b9e73","parent":"6a72b2158ad1d21d283b9e70","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":40,"height":22,"exactWidth":40.38,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":5,"exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"2778"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left","fontStyle":"normal","fontWeight":400},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"NaturaCo"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:47:34.835Z","createdAt":"2026-08-05T03:47:34.835Z"},{"_id":"6a72b2158ad1d21d283b9e74","parent":"6a72b2158ad1d21d283b9e70","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":72,"height":22,"exactWidth":72.30999999999999,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":144,"y":5,"exactX":144.07,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"228 CBs"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"right","fontStyle":"normal","fontWeight":400},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:47:34.835Z","createdAt":"2026-08-05T03:47:34.835Z"},{"_id":"6a72b2158ad1d21d283b9e75","parent":"6a72b2158ad1d21d283b9e67","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":216,"height":32,"exactWidth":216,"exactHeight":31.970000000000002}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":20,"y":0,"exactX":false,"exactY":false,"fixed":false,"top":true,"left":true}},"childrenMode":"cols","childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"index":4,"updatedAt":"2026-08-05T03:47:34.835Z","createdAt":"2026-08-05T03:47:34.835Z"},{"_id":"6a72b2158ad1d21d283b9e76","parent":"6a72b2158ad1d21d283b9e75","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"2"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(48,209,88,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":12,"height":12,"exactWidth":12,"exactHeight":12}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":44,"y":10,"exactX":false,"exactY":false}}},"updatedAt":"2026-08-05T03:47:34.835Z","createdAt":"2026-08-05T03:47:34.835Z"},{"_id":"6a72b2158ad1d21d283b9e77","parent":"6a72b2158ad1d21d283b9e75","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"999"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":40,"height":40,"exactWidth":40,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":178,"y":-4,"exactX":false,"exactY":false}}},"updatedAt":"2026-08-05T03:47:34.835Z","createdAt":"2026-08-05T03:47:34.835Z"},{"_id":"6a72b2158ad1d21d283b9e78","parent":"6a72b2158ad1d21d283b9e75","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":40,"height":22,"exactWidth":40.38,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":5,"exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"2778"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left","fontStyle":"normal","fontWeight":400},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"NaturaCo"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:47:34.835Z","createdAt":"2026-08-05T03:47:34.835Z"},{"_id":"6a72b2158ad1d21d283b9e79","parent":"6a72b2158ad1d21d283b9e75","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":72,"height":22,"exactWidth":72.30999999999999,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":144,"y":5,"exactX":144.07,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"228 CBs"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"right","fontStyle":"normal","fontWeight":400},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:47:34.835Z","createdAt":"2026-08-05T03:47:34.835Z"},{"_id":"6a72b2158ad1d21d283b9e7a","parent":"6a72b2158ad1d21d283b9e67","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(191,191,191,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":226,"height":1,"exactWidth":226,"exactHeight":1,"growWidthWithContent":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":"15","exactX":false,"exactY":false,"fixed":false}}},"index":5,"updatedAt":"2026-08-05T03:47:34.835Z","createdAt":"2026-08-05T03:47:34.835Z"},{"_id":"6a72b2158ad1d21d283b9e7b","parent":"6a72b2158ad1d21d283b9e67","component":"data2-blocks@Html","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":22,"height":28,"exactWidth":22.259999999999998,"exactHeight":28}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":218,"y":0,"exactX":218,"exactY":0}}},"text":{"component":"data2-core-primitives@String","params":{"content":"<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\" class=\"size-6\">\n  <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M8.625 12a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0Zm0 0H8.25m4.125 0a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0Zm0 0H12m4.125 0a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0Zm0 0h-.375M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z\" />\n</svg>\n"}}},"index":6,"updatedAt":"2026-08-05T03:47:34.835Z","createdAt":"2026-08-05T03:47:34.835Z"},{"_id":"6a72b2158ad1d21d283b9e7c","parent":"6a72b2158ad1d21d283b9e67","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":220,"height":28}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":20,"y":10,"exactX":false,"exactY":false,"fixed":false,"right":true,"top":true,"left":true,"growH":false}},"childrenMode":"rows","shadow":[]},"index":1,"updatedAt":"2026-08-05T03:47:34.835Z","createdAt":"2026-08-05T03:47:34.835Z"},{"_id":"6a72b2158ad1d21d283b9e7d","parent":"6a72b2158ad1d21d283b9e7c","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":109,"height":27,"exactWidth":109.36,"exactHeight":26.74,"growHeightWithContent":true}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":22,"y":1,"exactX":21.5,"exactY":1.26,"fixed":false,"left":true,"top":true,"right":true,"growH":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"2778"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"19"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"top","horizontalAlignment":"left","fontStyle":"normal","fontWeight":700},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(100,100,104,1)"},"component":"data2-core-types@Color"},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"3px 0px 3px 0px"}}},"repeat":{"params":{},"component":"data2-core-types@DataSetReference","disabled":true}},"index":1,"updatedAt":"2026-08-05T03:47:34.835Z","createdAt":"2026-08-05T03:47:34.835Z"},{"_id":"6a72b2158ad1d21d283b9e7e","parent":"6a72b2158ad1d21d283b9e7c","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":84,"height":22,"exactWidth":83.84,"exactHeight":22}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":132,"y":3,"exactX":false,"exactY":false,"fixed":false,"right":true,"top":true}},"text":{"component":"data2-core-primitives@String","params":{"content":"2440 CBs"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"right","fontStyle":"normal","fontWeight":600},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(100,100,104,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:47:34.835Z","createdAt":"2026-08-05T03:47:34.835Z"},{"_id":"6a72b2158ad1d21d283b9e7f","parent":"6a72b2158ad1d21d283b9e7c","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"2"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(48,209,88,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":12,"height":12,"exactWidth":12,"exactHeight":12}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":8,"exactX":false,"exactY":false}}},"updatedAt":"2026-08-05T03:47:34.835Z","createdAt":"2026-08-05T03:47:34.835Z"},{"_id":"6a72b2158ad1d21d283b9e80","parent":"6a72b2158ad1d21d283b9e67","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":6,"rightTop":6,"leftBottom":6,"rightBottom":6},"width":{"left":0,"top":0,"right":0,"bottom":0},"type":"solid"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":67,"height":20,"exactWidth":67.28999999999999,"exactHeight":20.49}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":102,"y":0,"exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"Valinhos"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"center","fontStyle":"normal"},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0.07)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"index":0,"updatedAt":"2026-08-05T03:47:34.835Z","createdAt":"2026-08-05T03:47:34.835Z"},{"_id":"6a72b2158ad1d21d283b9e81","parent":"6a72b2158ad1d21d283b9e67","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":6,"rightTop":6,"leftBottom":6,"rightBottom":6},"width":{"left":0,"top":0,"right":0,"bottom":0},"type":"solid"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":56,"height":20,"exactWidth":56.239999999999995,"exactHeight":20.49}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":20,"y":"5","exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"Sousas"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"center","fontStyle":"normal"},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0.07)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"index":0,"updatedAt":"2026-08-05T03:47:34.835Z","createdAt":"2026-08-05T03:47:34.835Z"},{"_id":"6a72b3228ad1d21d283b9e82","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"inspector component","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":259,"height":531,"exactWidth":259,"exactHeight":530.54,"growHeightWithContent":false,"maintainAspectRatio":true}},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"reference":"_vEaAs5FO7rpmXZ9YH-9I","updatedAt":"2026-08-05T03:52:08.701Z","createdAt":"2026-08-05T03:51:55.822Z"},{"_id":"6a72b3318ad1d21d283b9e83","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"inspector component - municipio","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":259,"height":531,"exactWidth":259,"exactHeight":530.54,"growHeightWithContent":false,"maintainAspectRatio":true}}},"reference":"qgGEUylFf3f2QaUYQLb1J","updatedAt":"2026-08-05T03:52:31.116Z","createdAt":"2026-08-05T03:52:21.166Z"},{"_id":"6a72b33f8ad1d21d283b9eaf","parent":"6a72b3318ad1d21d283b9e83","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":259,"height":531,"exactWidth":259,"exactHeight":530.54,"growHeightWithContent":false,"maintainAspectRatio":true}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":false,"exactY":false,"bottom":true,"right":true,"top":true,"growV":false,"fixed":false,"left":true,"growH":false}},"childrenMode":"rows","fill":{"disabled":false,"component":"data2-core-types@Fill","params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]}},"border":{"disabled":false,"component":"data2-core-types@Border","params":{"radius":{"leftTop":"27"},"width":{"top":"1","bottom":"1","left":"1","right":"1"},"color":"#d4d4d4"}},"shadow":[{"component":"data2-core-types@Shadow","params":{"type":"outset","spread":"-15","blur":"25","color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(132,132,132,1)"}},"offsetY":"10"}}]},"index":1,"updatedAt":"2026-08-05T03:52:29.927Z","createdAt":"2026-08-05T03:52:25.714Z"},{"_id":"6a72b33f8ad1d21d283b9eb0","parent":"6a72b33f8ad1d21d283b9eaf","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(116,116,211,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":258,"height":99,"exactWidth":258,"exactHeight":false,"maintainAspectRatio":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":false,"exactY":false,"left":true,"top":true,"right":true,"growH":false}}},"updatedAt":"2026-08-05T03:52:25.714Z","createdAt":"2026-08-05T03:52:25.714Z"},{"_id":"6a72b33f8ad1d21d283b9eb1","parent":"6a72b33f8ad1d21d283b9eb0","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":217,"height":62,"exactWidth":false,"exactHeight":62.39}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":20,"y":22,"exactX":false,"exactY":21.8}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"bottom"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":22}},"text":{"component":"data2-core-primitives@String","params":{"content":"Município"}},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:52:25.714Z","createdAt":"2026-08-05T03:52:25.714Z"},{"_id":"6a72b33f8ad1d21d283b9eb2","parent":"6a72b33f8ad1d21d283b9eb0","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":217,"height":51,"exactWidth":false,"exactHeight":51.38}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":20,"y":1,"exactX":20,"exactY":1.3900000000000001}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(229,229,229,1)"}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"bottom"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":16}},"text":{"component":"data2-core-primitives@String","params":{"content":"Visão por"}},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:52:25.714Z","createdAt":"2026-08-05T03:52:25.714Z"},{"_id":"6a72b33f8ad1d21d283b9eb3","parent":"6a72b33f8ad1d21d283b9eb0","component":"data2-blocks@Html","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":25,"height":23,"exactWidth":24.72,"exactHeight":23.47}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":124,"y":62,"exactX":124.06,"exactY":61.6}}},"text":{"component":"data2-core-primitives@String","params":{"content":"<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#ffffff\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"feather feather-chevron-down\"><polyline points=\"6 9 12 15 18 9\"></polyline></svg>"}}},"updatedAt":"2026-08-05T03:52:25.714Z","createdAt":"2026-08-05T03:52:25.714Z"},{"_id":"6a72b33f8ad1d21d283b9eb4","parent":"6a72b33f8ad1d21d283b9eb0","component":"data2-blocks@Html","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":22,"height":28,"exactWidth":22.259999999999998,"exactHeight":28}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":216,"y":16,"exactX":215.84,"exactY":16.02}},"filter":[{"component":"data2-core-types@BitmapFilter","params":{"type":"invert","unit":"%","value":100}}]},"text":{"component":"data2-core-primitives@String","params":{"content":"<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\" class=\"size-6\">\n  <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M3.75 3.75v4.5m0-4.5h4.5m-4.5 0L9 9M3.75 20.25v-4.5m0 4.5h4.5m-4.5 0L9 15M20.25 3.75h-4.5m4.5 0v4.5m0-4.5L15 9m5.25 11.25h-4.5m4.5 0v-4.5m0 4.5L15 15\" />\n</svg>\n"}}},"index":6,"updatedAt":"2026-08-05T03:52:25.714Z","createdAt":"2026-08-05T03:52:25.714Z"},{"_id":"6a72b33f8ad1d21d283b9eb5","parent":"6a72b33f8ad1d21d283b9eb0","component":"data2-blocks@Html","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":22,"height":28,"exactWidth":22.259999999999998,"exactHeight":28}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":178,"y":16,"exactX":177.97,"exactY":16.369999999999997}},"filter":[{"component":"data2-core-types@BitmapFilter","params":{"type":"invert","unit":"%","value":100}}]},"text":{"component":"data2-core-primitives@String","params":{"content":"<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"100%\" height=\"100%\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"feather feather-settings\"><circle cx=\"12\" cy=\"12\" r=\"3\"></circle><path d=\"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z\"></path></svg>"}}},"index":6,"updatedAt":"2026-08-05T03:52:25.714Z","createdAt":"2026-08-05T03:52:25.714Z"},{"_id":"6a72b33f8ad1d21d283b9eb6","parent":"6a72b33f8ad1d21d283b9eaf","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":257,"height":429,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":100,"exactX":false,"exactY":false,"bottom":true,"left":true,"top":true,"growV":false,"right":true,"growH":false}}},"updatedAt":"2026-08-05T03:52:25.715Z","createdAt":"2026-08-05T03:52:25.715Z"},{"_id":"6a72b33f8ad1d21d283b9eb7","parent":"6a72b33f8ad1d21d283b9eb6","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":246,"height":170,"exactWidth":246,"exactHeight":169.94}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":1,"y":10,"exactX":1,"exactY":10,"fixed":false,"top":true,"left":true,"right":true,"growH":false}},"text":{"component":"data2-core-primitives@String","params":{"content":""}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"bottom","horizontalAlignment":"center","fontStyle":"italic"},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"}},"index":1,"updatedAt":"2026-08-05T03:52:40.377Z","createdAt":"2026-08-05T03:52:25.715Z"},{"_id":"6a72b33f8ad1d21d283b9eb8","parent":"6a72b3608ad1d21d283b9edc","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":6,"rightTop":6,"leftBottom":6,"rightBottom":6},"width":{"left":0,"top":0,"right":0,"bottom":0},"type":"solid"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":43,"height":20,"exactWidth":43,"exactHeight":20.49}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":5,"y":5,"exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"BA"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"center","fontStyle":"normal"},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0.07)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"index":0,"updatedAt":"2026-08-05T03:53:37.037Z","createdAt":"2026-08-05T03:52:25.715Z"},{"_id":"6a72b33f8ad1d21d283b9eb9","parent":"6a72b3d78ad1d21d283b9edd","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":216,"height":32,"exactWidth":216,"exactHeight":31.970000000000002}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":false,"exactY":false,"fixed":false}},"childrenMode":"cols","childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"index":2,"updatedAt":"2026-08-05T03:54:59.493Z","createdAt":"2026-08-05T03:52:25.715Z"},{"_id":"6a72b33f8ad1d21d283b9eba","parent":"6a72b33f8ad1d21d283b9eb9","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":39,"height":22,"exactWidth":39.36,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":5,"exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"3576"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left","fontStyle":"normal","fontWeight":400},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"NaturaCo"},"component":"data2-core-primitives@String"},"textDecoration":{"params":{"line":"line-through"},"component":"data2-core-types@TextDecoration"}},"updatedAt":"2026-08-05T03:52:25.715Z","createdAt":"2026-08-05T03:52:25.715Z"},{"_id":"6a72b33f8ad1d21d283b9ebb","parent":"6a72b33f8ad1d21d283b9eb9","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":14,"height":22,"exactWidth":13.58,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":46,"y":5,"exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"->"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left","fontStyle":"normal","fontWeight":400},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:52:25.715Z","createdAt":"2026-08-05T03:52:25.715Z"},{"_id":"6a72b33f8ad1d21d283b9ebc","parent":"6a72b33f8ad1d21d283b9eb9","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":72,"height":22,"exactWidth":72.30999999999999,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":144,"y":5,"exactX":144.07,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"228 CBs"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"right","fontStyle":"normal","fontWeight":400},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:52:25.715Z","createdAt":"2026-08-05T03:52:25.715Z"},{"_id":"6a72b33f8ad1d21d283b9ebd","parent":"6a72b33f8ad1d21d283b9eb9","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":66,"height":22,"exactWidth":66}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":66,"y":5}},"childrenMode":"cols","border":{"disabled":false,"component":"data2-core-types@Border","params":{"radius":{"leftTop":"5"}}},"fill":{"disabled":false,"component":"data2-core-types@Fill","params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(244,245,245,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]}}},"updatedAt":"2026-08-05T03:52:25.715Z","createdAt":"2026-08-05T03:52:25.715Z"},{"_id":"6a72b33f8ad1d21d283b9ebe","parent":"6a72b33f8ad1d21d283b9ebd","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"2"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(48,209,88,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":12,"height":12,"exactWidth":12,"exactHeight":12}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":"49","y":5,"exactX":false,"exactY":false}}},"updatedAt":"2026-08-05T03:52:25.715Z","createdAt":"2026-08-05T03:52:25.715Z"},{"_id":"6a72b33f8ad1d21d283b9ebf","parent":"6a72b33f8ad1d21d283b9ebd","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":40,"height":22,"exactWidth":40.38,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":5,"y":0,"exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"2778"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left","fontStyle":"normal","fontWeight":400},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"NaturaCo"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:52:25.715Z","createdAt":"2026-08-05T03:52:25.715Z"},{"_id":"6a72b33f8ad1d21d283b9ec0","parent":"6a72b3d78ad1d21d283b9edd","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":216,"height":32,"exactWidth":216,"exactHeight":31.970000000000002}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":false,"exactY":false,"fixed":false,"top":true,"left":true}},"childrenMode":"cols","childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"index":3,"updatedAt":"2026-08-05T03:54:59.728Z","createdAt":"2026-08-05T03:52:25.715Z"},{"_id":"6a72b33f8ad1d21d283b9ec1","parent":"6a72b33f8ad1d21d283b9ec0","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"2"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(48,209,88,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":12,"height":12,"exactWidth":12,"exactHeight":12}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":44,"y":10,"exactX":false,"exactY":false}}},"updatedAt":"2026-08-05T03:52:25.715Z","createdAt":"2026-08-05T03:52:25.715Z"},{"_id":"6a72b33f8ad1d21d283b9ec2","parent":"6a72b33f8ad1d21d283b9ec0","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"999"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":40,"height":40,"exactWidth":40,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":178,"y":-4,"exactX":false,"exactY":false}}},"updatedAt":"2026-08-05T03:52:25.715Z","createdAt":"2026-08-05T03:52:25.715Z"},{"_id":"6a72b33f8ad1d21d283b9ec3","parent":"6a72b33f8ad1d21d283b9ec0","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":40,"height":22,"exactWidth":40.38,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":5,"exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"2778"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left","fontStyle":"normal","fontWeight":400},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"NaturaCo"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:52:25.715Z","createdAt":"2026-08-05T03:52:25.715Z"},{"_id":"6a72b33f8ad1d21d283b9ec4","parent":"6a72b33f8ad1d21d283b9ec0","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":72,"height":22,"exactWidth":72.30999999999999,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":144,"y":5,"exactX":144.07,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"228 CBs"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"right","fontStyle":"normal","fontWeight":400},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:52:25.715Z","createdAt":"2026-08-05T03:52:25.715Z"},{"_id":"6a72b33f8ad1d21d283b9ec5","parent":"6a72b3d78ad1d21d283b9edd","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":216,"height":32,"exactWidth":216,"exactHeight":31.970000000000002}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":false,"exactY":false,"fixed":false,"top":true,"left":true}},"childrenMode":"cols","childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"index":4,"updatedAt":"2026-08-05T03:54:59.595Z","createdAt":"2026-08-05T03:52:25.715Z"},{"_id":"6a72b33f8ad1d21d283b9ec6","parent":"6a72b33f8ad1d21d283b9ec5","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"2"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(48,209,88,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":12,"height":12,"exactWidth":12,"exactHeight":12}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":44,"y":10,"exactX":false,"exactY":false}}},"updatedAt":"2026-08-05T03:52:25.715Z","createdAt":"2026-08-05T03:52:25.715Z"},{"_id":"6a72b33f8ad1d21d283b9ec7","parent":"6a72b33f8ad1d21d283b9ec5","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"999"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":40,"height":40,"exactWidth":40,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":178,"y":-4,"exactX":false,"exactY":false}}},"updatedAt":"2026-08-05T03:52:25.715Z","createdAt":"2026-08-05T03:52:25.715Z"},{"_id":"6a72b33f8ad1d21d283b9ec8","parent":"6a72b33f8ad1d21d283b9ec5","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":40,"height":22,"exactWidth":40.38,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":5,"exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"2778"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left","fontStyle":"normal","fontWeight":400},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"NaturaCo"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:52:25.715Z","createdAt":"2026-08-05T03:52:25.715Z"},{"_id":"6a72b33f8ad1d21d283b9ec9","parent":"6a72b33f8ad1d21d283b9ec5","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":72,"height":22,"exactWidth":72.30999999999999,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":144,"y":5,"exactX":144.07,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"228 CBs"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"right","fontStyle":"normal","fontWeight":400},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:52:25.715Z","createdAt":"2026-08-05T03:52:25.715Z"},{"_id":"6a72b33f8ad1d21d283b9eca","parent":"6a72b33f8ad1d21d283b9eb7","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(191,191,191,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":226,"height":1,"exactWidth":226,"exactHeight":1,"growWidthWithContent":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"10","y":"15","exactX":false,"exactY":false,"fixed":false}}},"index":2,"updatedAt":"2026-08-05T03:55:26.869Z","createdAt":"2026-08-05T03:52:25.715Z"},{"_id":"6a72b33f8ad1d21d283b9ecb","parent":"6a72b33f8ad1d21d283b9eb7","component":"data2-blocks@Html","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":22,"height":28,"exactWidth":22.259999999999998,"exactHeight":28}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":218,"y":0,"exactX":218,"exactY":0}}},"text":{"component":"data2-core-primitives@String","params":{"content":"<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\" class=\"size-6\">\n  <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M8.625 12a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0Zm0 0H8.25m4.125 0a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0Zm0 0H12m4.125 0a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0Zm0 0h-.375M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z\" />\n</svg>\n"}}},"index":3,"updatedAt":"2026-08-05T03:55:26.919Z","createdAt":"2026-08-05T03:52:25.715Z"},{"_id":"6a72b33f8ad1d21d283b9ecc","parent":"6a72b3d78ad1d21d283b9edd","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":220,"height":28}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":false,"exactY":false,"fixed":false,"right":true,"top":true,"left":true,"growH":false}},"childrenMode":"rows","shadow":[]},"index":1,"updatedAt":"2026-08-05T03:54:59.895Z","createdAt":"2026-08-05T03:52:25.715Z"},{"_id":"6a72b33f8ad1d21d283b9ecd","parent":"6a72b33f8ad1d21d283b9ecc","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":131,"height":28,"exactWidth":130.86,"exactHeight":28,"growHeightWithContent":true}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":false,"exactY":false,"fixed":false,"left":true,"top":true,"right":true,"growH":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"Campinas (3)"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"18"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"top","horizontalAlignment":"left","fontStyle":"normal","fontWeight":700},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(100,100,104,1)"},"component":"data2-core-types@Color"},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"3px 0px 3px 0px"}}},"repeat":{"params":{},"component":"data2-core-types@DataSetReference","disabled":true}},"index":1,"updatedAt":"2026-08-05T03:52:25.715Z","createdAt":"2026-08-05T03:52:25.715Z"},{"_id":"6a72b33f8ad1d21d283b9ece","parent":"6a72b33f8ad1d21d283b9ecc","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":84,"height":22,"exactWidth":83.84,"exactHeight":22}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":132,"y":3,"exactX":false,"exactY":false,"fixed":false,"right":true,"top":true}},"text":{"component":"data2-core-primitives@String","params":{"content":"2440 CBs"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"right","fontStyle":"normal","fontWeight":600},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(100,100,104,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:52:25.715Z","createdAt":"2026-08-05T03:52:25.715Z"},{"_id":"6a72b33f8ad1d21d283b9ecf","parent":"6a72b33f8ad1d21d283b9eb6","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":246,"height":106,"exactWidth":246,"exactHeight":106.06}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":1,"y":10,"exactX":false,"exactY":false,"fixed":false,"top":true,"right":true,"left":true,"growH":false}},"text":{"component":"data2-core-primitives@String","params":{"content":""}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"bottom","horizontalAlignment":"center","fontStyle":"italic"},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"}},"index":1,"updatedAt":"2026-08-05T03:52:25.715Z","createdAt":"2026-08-05T03:52:25.715Z"},{"_id":"6a72b33f8ad1d21d283b9ed0","parent":"6a72b33f8ad1d21d283b9ecf","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":220,"height":28,"exactWidth":220,"exactHeight":28.38}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":20,"y":10,"exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"Valinhos (1)"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"18"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left","fontStyle":"normal","fontWeight":700},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(100,100,104,1)"},"component":"data2-core-types@Color"}},"index":1,"updatedAt":"2026-08-05T03:52:25.715Z","createdAt":"2026-08-05T03:52:25.715Z"},{"_id":"6a72b33f8ad1d21d283b9ed1","parent":"6a72b33f8ad1d21d283b9ecf","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":6,"rightTop":6,"leftBottom":6,"rightBottom":6},"width":{"left":0,"top":0,"right":0,"bottom":0},"type":"solid"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":43,"height":20,"exactWidth":43,"exactHeight":20.49}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":20,"y":0,"exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"BA"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"center","fontStyle":"normal"},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0.07)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"index":0,"updatedAt":"2026-08-05T03:52:25.715Z","createdAt":"2026-08-05T03:52:25.715Z"},{"_id":"6a72b33f8ad1d21d283b9ed2","parent":"6a72b33f8ad1d21d283b9ecf","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":216,"height":32,"exactWidth":216,"exactHeight":31.970000000000002}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":20,"y":0,"exactX":false,"exactY":false,"fixed":false}},"childrenMode":"cols","childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"index":2,"updatedAt":"2026-08-05T03:52:25.715Z","createdAt":"2026-08-05T03:52:25.715Z"},{"_id":"6a72b33f8ad1d21d283b9ed3","parent":"6a72b33f8ad1d21d283b9ed2","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"2"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(48,209,88,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":12,"height":12,"exactWidth":12,"exactHeight":12}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":44,"y":10,"exactX":false,"exactY":false}}},"updatedAt":"2026-08-05T03:52:25.715Z","createdAt":"2026-08-05T03:52:25.715Z"},{"_id":"6a72b33f8ad1d21d283b9ed4","parent":"6a72b33f8ad1d21d283b9ed2","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"999"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":40,"height":40,"exactWidth":40,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":178,"y":-4,"exactX":false,"exactY":false}}},"updatedAt":"2026-08-05T03:52:25.715Z","createdAt":"2026-08-05T03:52:25.715Z"},{"_id":"6a72b33f8ad1d21d283b9ed5","parent":"6a72b33f8ad1d21d283b9ed2","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":40,"height":22,"exactWidth":40.38,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":5,"exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"2778"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left","fontStyle":"normal","fontWeight":400},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"NaturaCo"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:52:25.715Z","createdAt":"2026-08-05T03:52:25.715Z"},{"_id":"6a72b33f8ad1d21d283b9ed6","parent":"6a72b33f8ad1d21d283b9ed2","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":72,"height":22,"exactWidth":72.30999999999999,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":144,"y":5,"exactX":144.07,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"228 CBs"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"right","fontStyle":"normal","fontWeight":400},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:52:25.715Z","createdAt":"2026-08-05T03:52:25.715Z"},{"_id":"6a72b33f8ad1d21d283b9ed7","parent":"6a72b33f8ad1d21d283b9ecf","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(191,191,191,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":226,"height":1,"exactWidth":226,"exactHeight":1,"growWidthWithContent":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":"10","y":105,"exactX":false,"exactY":false}}},"updatedAt":"2026-08-05T03:52:25.715Z","createdAt":"2026-08-05T03:52:25.715Z"},{"_id":"6a72b33f8ad1d21d283b9ed8","parent":"6a72b33f8ad1d21d283b9ecf","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":71,"height":22,"exactWidth":71.24,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":165,"y":32,"exactX":165.04,"exactY":32.16,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"2440 CBs"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"right","fontStyle":"normal","fontWeight":600},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(100,100,104,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:52:25.715Z","createdAt":"2026-08-05T03:52:25.715Z"},{"_id":"6a72b33f8ad1d21d283b9ed9","parent":"6a72b33f8ad1d21d283b9ecf","component":"data2-blocks@Html","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":22,"height":28,"exactWidth":22.259999999999998,"exactHeight":28}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":218,"y":0,"exactX":218,"exactY":0}}},"text":{"component":"data2-core-primitives@String","params":{"content":"<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\" class=\"size-6\">\n  <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M8.625 12a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0Zm0 0H8.25m4.125 0a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0Zm0 0H12m4.125 0a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0Zm0 0h-.375M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z\" />\n</svg>\n"}}},"updatedAt":"2026-08-05T03:52:25.715Z","createdAt":"2026-08-05T03:52:25.715Z"},{"_id":"6a72b35b8ad1d21d283b9edb","parent":"6a72b3608ad1d21d283b9edc","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":6,"rightTop":6,"leftBottom":6,"rightBottom":6},"width":{"left":0,"top":0,"right":0,"bottom":0},"type":"solid"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":43,"height":20,"exactWidth":43,"exactHeight":20.49}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":5,"y":5,"exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"BA"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"center","fontStyle":"normal"},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0.07)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"index":0,"updatedAt":"2026-08-05T03:53:41.435Z","createdAt":"2026-08-05T03:52:54.940Z"},{"_id":"6a72b3608ad1d21d283b9edc","parent":"6a72b33f8ad1d21d283b9eb7","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"tagRepeater","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":188,"height":25,"exactWidth":187.56,"exactHeight":25,"growHeightWithContent":true}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"15","y":"-5","exactX":false,"exactY":false,"fixed":false,"top":true,"left":true,"right":true,"growH":false}},"childrenMode":"grid"},"index":0,"updatedAt":"2026-08-05T03:54:28.900Z","createdAt":"2026-08-05T03:53:22.368Z"},{"_id":"6a72b3d78ad1d21d283b9edd","parent":"6a72b33f8ad1d21d283b9eb7","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":220,"height":124}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":20,"y":5,"fixed":false,"exactX":false,"exactY":false}}},"index":1,"updatedAt":"2026-08-05T03:55:26.884Z","createdAt":"2026-08-05T03:54:59.142Z"},{"_id":"6a72b3f98ad1d21d283b9ede","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"inspectorPropComponent - municipio","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":220,"height":124}},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"reference":"Kg8oR12EgRtpM8G8HGax8","updatedAt":"2026-08-05T03:56:09.977Z","createdAt":"2026-08-05T03:55:30.912Z"},{"_id":"6a72b3fd8ad1d21d283b9ef4","parent":"6a72b3f98ad1d21d283b9ede","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":220,"height":124}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"fixed":false,"exactX":false,"exactY":false}}},"index":1,"updatedAt":"2026-08-05T03:55:41.022Z","createdAt":"2026-08-05T03:55:35.737Z"},{"_id":"6a72b3fd8ad1d21d283b9ef5","parent":"6a72b3fd8ad1d21d283b9ef4","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":216,"height":32,"exactWidth":216,"exactHeight":31.970000000000002}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":false,"exactY":false,"fixed":false}},"childrenMode":"cols","childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"index":2,"updatedAt":"2026-08-05T03:55:35.737Z","createdAt":"2026-08-05T03:55:35.737Z"},{"_id":"6a72b3fd8ad1d21d283b9ef6","parent":"6a72b3fd8ad1d21d283b9ef5","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":39,"height":22,"exactWidth":39.36,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":5,"exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"3576"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left","fontStyle":"normal","fontWeight":400},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"NaturaCo"},"component":"data2-core-primitives@String"},"textDecoration":{"params":{"line":"line-through"},"component":"data2-core-types@TextDecoration"}},"updatedAt":"2026-08-05T03:55:35.737Z","createdAt":"2026-08-05T03:55:35.737Z"},{"_id":"6a72b3fd8ad1d21d283b9ef7","parent":"6a72b3fd8ad1d21d283b9ef5","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":14,"height":22,"exactWidth":13.58,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":46,"y":5,"exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"->"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left","fontStyle":"normal","fontWeight":400},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:55:35.737Z","createdAt":"2026-08-05T03:55:35.737Z"},{"_id":"6a72b3fd8ad1d21d283b9ef8","parent":"6a72b3fd8ad1d21d283b9ef5","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":72,"height":22,"exactWidth":72.30999999999999,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":144,"y":5,"exactX":144.07,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"228 CBs"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"right","fontStyle":"normal","fontWeight":400},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:55:35.737Z","createdAt":"2026-08-05T03:55:35.737Z"},{"_id":"6a72b3fd8ad1d21d283b9ef9","parent":"6a72b3fd8ad1d21d283b9ef5","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":66,"height":22,"exactWidth":66}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":66,"y":5}},"childrenMode":"cols","border":{"disabled":false,"component":"data2-core-types@Border","params":{"radius":{"leftTop":"5"}}},"fill":{"disabled":false,"component":"data2-core-types@Fill","params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(244,245,245,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]}}},"updatedAt":"2026-08-05T03:55:35.737Z","createdAt":"2026-08-05T03:55:35.737Z"},{"_id":"6a72b3fd8ad1d21d283b9efa","parent":"6a72b3fd8ad1d21d283b9ef9","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"2"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(48,209,88,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":12,"height":12,"exactWidth":12,"exactHeight":12}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":"49","y":5,"exactX":false,"exactY":false}}},"updatedAt":"2026-08-05T03:55:35.737Z","createdAt":"2026-08-05T03:55:35.737Z"},{"_id":"6a72b3fd8ad1d21d283b9efb","parent":"6a72b3fd8ad1d21d283b9ef9","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":40,"height":22,"exactWidth":40.38,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":5,"y":0,"exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"2778"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left","fontStyle":"normal","fontWeight":400},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"NaturaCo"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:55:35.737Z","createdAt":"2026-08-05T03:55:35.737Z"},{"_id":"6a72b3fd8ad1d21d283b9efc","parent":"6a72b3fd8ad1d21d283b9ef4","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":216,"height":32,"exactWidth":216,"exactHeight":31.970000000000002}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":false,"exactY":false,"fixed":false,"top":true,"left":true}},"childrenMode":"cols","childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"index":3,"updatedAt":"2026-08-05T03:55:35.737Z","createdAt":"2026-08-05T03:55:35.737Z"},{"_id":"6a72b3fd8ad1d21d283b9efd","parent":"6a72b3fd8ad1d21d283b9efc","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"2"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(48,209,88,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":12,"height":12,"exactWidth":12,"exactHeight":12}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":44,"y":10,"exactX":false,"exactY":false}}},"updatedAt":"2026-08-05T03:55:35.737Z","createdAt":"2026-08-05T03:55:35.737Z"},{"_id":"6a72b3fd8ad1d21d283b9efe","parent":"6a72b3fd8ad1d21d283b9efc","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"999"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":40,"height":40,"exactWidth":40,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":178,"y":-4,"exactX":false,"exactY":false}}},"updatedAt":"2026-08-05T03:55:35.737Z","createdAt":"2026-08-05T03:55:35.737Z"},{"_id":"6a72b3fd8ad1d21d283b9eff","parent":"6a72b3fd8ad1d21d283b9efc","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":40,"height":22,"exactWidth":40.38,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":5,"exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"2778"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left","fontStyle":"normal","fontWeight":400},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"NaturaCo"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:55:35.737Z","createdAt":"2026-08-05T03:55:35.737Z"},{"_id":"6a72b3fd8ad1d21d283b9f00","parent":"6a72b3fd8ad1d21d283b9efc","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":72,"height":22,"exactWidth":72.30999999999999,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":144,"y":5,"exactX":144.07,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"228 CBs"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"right","fontStyle":"normal","fontWeight":400},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:55:35.737Z","createdAt":"2026-08-05T03:55:35.737Z"},{"_id":"6a72b3fd8ad1d21d283b9f01","parent":"6a72b3fd8ad1d21d283b9ef4","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":216,"height":32,"exactWidth":216,"exactHeight":31.970000000000002}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":false,"exactY":false,"fixed":false,"top":true,"left":true}},"childrenMode":"cols","childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"index":4,"updatedAt":"2026-08-05T03:55:35.737Z","createdAt":"2026-08-05T03:55:35.737Z"},{"_id":"6a72b3fd8ad1d21d283b9f02","parent":"6a72b3fd8ad1d21d283b9f01","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"2"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(48,209,88,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":12,"height":12,"exactWidth":12,"exactHeight":12}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":44,"y":10,"exactX":false,"exactY":false}}},"updatedAt":"2026-08-05T03:55:35.737Z","createdAt":"2026-08-05T03:55:35.737Z"},{"_id":"6a72b3fd8ad1d21d283b9f03","parent":"6a72b3fd8ad1d21d283b9f01","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"999"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":40,"height":40,"exactWidth":40,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":178,"y":-4,"exactX":false,"exactY":false}}},"updatedAt":"2026-08-05T03:55:35.737Z","createdAt":"2026-08-05T03:55:35.737Z"},{"_id":"6a72b3fd8ad1d21d283b9f04","parent":"6a72b3fd8ad1d21d283b9f01","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":40,"height":22,"exactWidth":40.38,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":5,"exactX":false,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"2778"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"left","fontStyle":"normal","fontWeight":400},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"NaturaCo"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:55:35.737Z","createdAt":"2026-08-05T03:55:35.737Z"},{"_id":"6a72b3fd8ad1d21d283b9f05","parent":"6a72b3fd8ad1d21d283b9f01","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":72,"height":22,"exactWidth":72.30999999999999,"exactHeight":21.58}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":144,"y":5,"exactX":144.07,"exactY":false,"fixed":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"228 CBs"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"right","fontStyle":"normal","fontWeight":400},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(134,134,134,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:55:35.737Z","createdAt":"2026-08-05T03:55:35.737Z"},{"_id":"6a72b3fd8ad1d21d283b9f06","parent":"6a72b3fd8ad1d21d283b9ef4","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":220,"height":28}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":false,"exactY":false,"fixed":false,"right":true,"top":true,"left":true,"growH":false}},"childrenMode":"rows","shadow":[]},"index":1,"updatedAt":"2026-08-05T03:55:35.737Z","createdAt":"2026-08-05T03:55:35.737Z"},{"_id":"6a72b3fd8ad1d21d283b9f07","parent":"6a72b3fd8ad1d21d283b9f06","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":131,"height":28,"exactWidth":130.86,"exactHeight":28,"growHeightWithContent":true,"minHeight":28}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":false,"exactY":false,"fixed":false,"left":true,"top":true,"right":true,"growH":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"Campinas (3)"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"18"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"top","horizontalAlignment":"left","fontStyle":"normal","fontWeight":700},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(100,100,104,1)"},"component":"data2-core-types@Color"},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"3px 0px 3px 0px"}}},"repeat":{"params":{},"component":"data2-core-types@DataSetReference","disabled":true}},"index":1,"updatedAt":"2026-08-05T04:12:41.595Z","createdAt":"2026-08-05T03:55:35.737Z"},{"_id":"6a72b3fd8ad1d21d283b9f08","parent":"6a72b3fd8ad1d21d283b9f06","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":84,"height":22,"exactWidth":83.84,"exactHeight":22}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":132,"y":3,"exactX":false,"exactY":false,"fixed":false,"right":true,"top":true}},"text":{"component":"data2-core-primitives@String","params":{"content":"2440 CBs"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"textFormat":{"params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"right","fontStyle":"normal","fontWeight":600},"component":"data2-core-types@TextFormat"},"textColor":{"params":{"rgba":"rgba(100,100,104,1)"},"component":"data2-core-types@Color"},"font":{"params":{"content":"InstrumentSans"},"component":"data2-core-primitives@String"}},"updatedAt":"2026-08-05T03:55:35.737Z","createdAt":"2026-08-05T03:55:35.737Z"},{"_id":"6a72b4048ad1d21d283b9f09","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"inspectorPropComponent","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":220,"height":124}},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"reference":"TnU4WSgNXaoOgwxJl3J_I","updatedAt":"2026-08-05T03:56:04.142Z","createdAt":"2026-08-05T03:55:44.165Z"},{"_id":"6a734359cd184fed1af67dea","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"New Artboard (60)","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1545,"height":1019,"exactWidth":1544.8,"exactHeight":1019.11}},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"reference":"BiqdBa0OqWxrySGzIe8Jo","updatedAt":"2026-08-05T14:22:45.949Z","createdAt":"2026-08-05T14:05:13.264Z"},{"_id":"6a734361cd184fed1af67deb","parent":"6a734359cd184fed1af67dea","component":"data2-blocks@JsonViewer","system":"6a57cfe9673eb7e3c5e57784","displayName":"cbs","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":280,"height":673}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":53,"y":50,"exactX":53.33,"exactY":49.5}}},"json":[{"cbId":{"component":"data2-core-primitives@String","params":{}},"sector":{"component":"data2-core-primitives@String","params":{}},"groupId":{"component":"data2-core-primitives@String","params":{}},"leader":{"component":"data2-core-primitives@String","params":{}},"municipality":{"component":"data2-core-primitives@String","params":{}},"municipalityKey":{"component":"data2-core-primitives@String","params":{}},"state":{"component":"data2-core-primitives@String","params":{}},"level":{"component":"data2-core-primitives@String","params":{}},"active":{"component":"data2-core-primitives@String","params":{}},"revenue":{"component":"data2-core-primitives@String","params":{}},"revenueNatura":{"component":"data2-core-primitives@String","params":{}},"revenuaAvon":{"component":"data2-core-primitives@String","params":{}},"points":{"component":"data2-core-primitives@String","params":{}},"orders":{"component":"data2-core-primitives@String","params":{}}}],"collapsed":{"component":"data2-core-primitives@Number","params":{"content":"2"}}},"updatedAt":"2026-08-05T14:09:54.218Z","createdAt":"2026-08-05T14:05:21.422Z"},{"_id":"6a7343e4cd184fed1af67dec","parent":"6a734359cd184fed1af67dea","component":"data2-blocks@JsonViewer","system":"6a57cfe9673eb7e3c5e57784","displayName":"sector","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":280,"height":673}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":351,"y":51,"exactX":351.43,"exactY":51.02}}},"json":{"closing_sector":{"component":"data2-core-primitives@String","params":{}},"dominant_municipalities":{"component":"data2-core-primitives@String","params":{}}},"collapsed":{"component":"data2-core-primitives@Number","params":{"content":"2"}}},"updatedAt":"2026-08-05T14:09:45.044Z","createdAt":"2026-08-05T14:08:34.783Z"},{"_id":"6a734470cd184fed1af67dee","parent":"6a734359cd184fed1af67dea","component":"data2-blocks@JsonViewer","system":"6a57cfe9673eb7e3c5e57784","displayName":"movimentações","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":280,"height":673}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":651,"y":55,"exactX":650.84,"exactY":55.300000000000004}}},"json":[{"index":{"params":{"content":0},"component":"data2-core-primitives@Number"},"sector":{"closing_sector":{"component":"data2-core-primitives@String","params":{}},"dominant_municipalities":{"component":"data2-core-primitives@String","params":{}}},"cbs":[{"cbId":{"component":"data2-core-primitives@String","params":{}},"sector":{"component":"data2-core-primitives@String","params":{}},"groupId":{"component":"data2-core-primitives@String","params":{}},"leader":{"component":"data2-core-primitives@String","params":{}},"municipality":{"component":"data2-core-primitives@String","params":{}},"municipalityKey":{"component":"data2-core-primitives@String","params":{}},"state":{"component":"data2-core-primitives@String","params":{}},"level":{"component":"data2-core-primitives@String","params":{}},"active":{"component":"data2-core-primitives@String","params":{}},"revenue":{"component":"data2-core-primitives@String","params":{}},"revenueNatura":{"component":"data2-core-primitives@String","params":{}},"revenuaAvon":{"component":"data2-core-primitives@String","params":{}},"points":{"component":"data2-core-primitives@String","params":{}},"orders":{"component":"data2-core-primitives@String","params":{}}}]}],"collapsed":{"component":"data2-core-primitives@Number","params":{"content":"2"}}},"updatedAt":"2026-08-05T14:11:58.828Z","createdAt":"2026-08-05T14:10:00.275Z"},{"_id":"6a7344fecd184fed1af67def","parent":"6a734359cd184fed1af67dea","component":"data2-blocks@JsonViewer","system":"6a57cfe9673eb7e3c5e57784","displayName":"Copy of movimentações","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":459,"height":924,"exactWidth":458.8,"exactHeight":924.11}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":951,"y":57,"exactX":951.4,"exactY":57.22}}},"json":{"title":{"component":"data2-core-primitives@String","params":{"content":"project title"}},"extracted_data":{"component":"data2-core-primitives@String","params":{"content":"[formatted payload from databricks]"}},"date_of_extracted_data":{"component":"data2-core-primitives@String","params":{"content":"[specified date of data batch to exxtracted from]"}},"versions":[{"version":{"params":{"content":1},"component":"data2-core-primitives@Number"},"modified_data":[{"index":{"params":{"content":0},"component":"data2-core-primitives@Number"},"sector":{"closing_sector":{"component":"data2-core-primitives@String","params":{}},"dominant_municipalities":{"component":"data2-core-primitives@String","params":{}}},"cbs":[{"cbId":{"component":"data2-core-primitives@String","params":{}},"sector":{"component":"data2-core-primitives@String","params":{}},"groupId":{"component":"data2-core-primitives@String","params":{}},"leader":{"component":"data2-core-primitives@String","params":{}},"municipality":{"component":"data2-core-primitives@String","params":{}},"municipalityKey":{"component":"data2-core-primitives@String","params":{}},"state":{"component":"data2-core-primitives@String","params":{}},"level":{"component":"data2-core-primitives@String","params":{}},"active":{"component":"data2-core-primitives@String","params":{}},"revenue":{"component":"data2-core-primitives@String","params":{}},"revenueNatura":{"component":"data2-core-primitives@String","params":{}},"revenuaAvon":{"component":"data2-core-primitives@String","params":{}},"points":{"component":"data2-core-primitives@String","params":{}},"orders":{"component":"data2-core-primitives@String","params":{}}}]}],"interactions":[{"user":{"component":"data2-core-primitives@String","params":{}},"comment":{"component":"data2-core-primitives@String","params":{}},"approved":{"component":"data2-core-primitives@String","params":{}}}]}]},"collapsed":{"component":"data2-core-primitives@Number","params":{"content":99}}},"updatedAt":"2026-08-05T14:22:45.792Z","createdAt":"2026-08-05T14:12:14.845Z"},{"_id":"6a7386993e60b28639e25a6b","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"New Artboard (60)","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":1799,"exactHeight":1799.03}},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"reference":"OYI2i4RL32HnP5J9a6OtX","updatedAt":"2026-08-05T19:10:58.200Z","createdAt":"2026-08-05T18:52:09.819Z"},{"_id":"6a7386a03e60b28639e25a6c","parent":"6a7386993e60b28639e25a6b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":1799,"exactWidth":false,"exactHeight":1799.03}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":0,"exactY":0,"bottom":true,"left":true,"top":true,"growV":false,"right":true,"growH":false}},"repeatReference":{"component":"data2-core-primitives@String","params":{"content":"e"}},"font":{"disabled":false,"component":"data2-core-web@GoogleFont","params":{"fontFamily":"Inter"}}},"updatedAt":"2026-08-05T19:10:58.501Z","createdAt":"2026-08-05T18:52:16.909Z"},{"_id":"6a7386ab3e60b28639e25a6d","parent":"6a7386a03e60b28639e25a6c","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1325,"height":58,"exactHeight":58.4}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":21,"y":19,"exactX":21,"exactY":19,"fixed":false}},"childrenMode":"cols"},"updatedAt":"2026-08-05T19:00:52.736Z","createdAt":"2026-08-05T18:52:27.423Z"},{"_id":"6a7388873e60b28639e25a6e","parent":"6a7386ab3e60b28639e25a6d","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":182,"height":38}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":8,"y":9,"fixed":false,"exactX":false,"exactY":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"snapshot atual"}}},"updatedAt":"2026-08-05T19:01:17.469Z","createdAt":"2026-08-05T19:00:23.812Z"},{"_id":"6a7388a43e60b28639e25a70","parent":"6a7386ab3e60b28639e25a6d","component":"data2-blocks@DataFieldBlock","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":182,"height":38}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":8,"y":9,"fixed":false,"exactX":false,"exactY":false}}},"type":"date"},"updatedAt":"2026-08-05T19:01:04.834Z","createdAt":"2026-08-05T19:00:52.584Z"},{"_id":"6a7388b33e60b28639e25a72","parent":"6a7386ab3e60b28639e25a6d","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":38,"height":38,"exactWidth":38}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":9,"fixed":false,"exactX":false,"exactY":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"go!"}}},"updatedAt":"2026-08-05T19:01:50.126Z","createdAt":"2026-08-05T19:01:14.292Z"},{"_id":"6a7388c93e60b28639e25a74","parent":"6a7386ab3e60b28639e25a6d","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":182,"height":38}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":8,"y":9,"fixed":false,"exactX":false,"exactY":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"latest"}}},"updatedAt":"2026-08-05T19:01:30.030Z","createdAt":"2026-08-05T19:01:30.030Z"},{"_id":"6a7389513e60b28639e25a76","parent":"6a7386ab3e60b28639e25a6d","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(220,0,0,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":false},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":683,"height":38,"exactWidth":683.4799999999999}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":8,"y":9,"fixed":false,"exactX":8,"exactY":9}},"text":{"component":"data2-core-primitives@String","params":{"content":"SNAP = (SELECT MAX(DT_HISTORICO) FROM product.perfil_cb.crm_perfil_cb_diaria_historico WHERE CD_PAIS=1)"}}},"updatedAt":"2026-08-05T19:49:12.571Z","createdAt":"2026-08-05T19:03:45.270Z"},{"_id":"6a7389683e60b28639e25a7d","parent":"6a7386a03e60b28639e25a6c","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1325,"height":156,"exactHeight":155.66}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":21,"y":19,"exactX":21,"exactY":19,"fixed":false}},"childrenMode":"cols"},"updatedAt":"2026-08-05T19:50:29.562Z","createdAt":"2026-08-05T19:04:25.207Z"},{"_id":"6a7389683e60b28639e25a7e","parent":"6a7389683e60b28639e25a7d","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":182,"height":38}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":8,"y":9,"fixed":false,"exactX":false,"exactY":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"listagem de setores"}}},"updatedAt":"2026-08-05T19:04:33.746Z","createdAt":"2026-08-05T19:04:25.207Z"},{"_id":"6a7389683e60b28639e25a82","parent":"6a7389683e60b28639e25a7d","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(220,0,0,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":false},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1101,"height":135,"exactWidth":1101.25,"exactHeight":135.24}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":8,"y":9,"fixed":false,"exactX":8,"exactY":9}},"text":{"component":"data2-core-primitives@String","params":{"content":"SELECT CD_SETOR setor, MAX(DS_ESTADO) uf,\n       COUNT(DISTINCT CD_CONSULTORA) cbs,\n       COUNT(DISTINCT DS_MUNICIPIO) munis\nFROM product.perfil_cb.crm_perfil_cb_diaria_historico\nWHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR>0 AND DT_HISTORICO=SNAP\nGROUP BY CD_SETOR\nORDER BY CD_SETOR"}}},"updatedAt":"2026-08-05T19:50:29.493Z","createdAt":"2026-08-05T19:04:25.207Z"},{"_id":"6a7389b93e60b28639e25a86","parent":"6a7386a03e60b28639e25a6c","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1325,"height":226,"exactHeight":226.01000000000002}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":21,"y":19,"exactX":21,"exactY":19,"fixed":false}},"childrenMode":"cols"},"updatedAt":"2026-08-05T19:51:39.173Z","createdAt":"2026-08-05T19:06:51.006Z"},{"_id":"6a7389b93e60b28639e25a87","parent":"6a7389b93e60b28639e25a86","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":324,"height":38,"exactWidth":323.78000000000003}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":8,"y":9,"fixed":false,"exactX":false,"exactY":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"matriz\nmunicipio x grupo"}}},"updatedAt":"2026-08-05T19:07:46.281Z","createdAt":"2026-08-05T19:06:51.006Z"},{"_id":"6a738a463e60b28639e25a8b","parent":"6a7386a03e60b28639e25a6c","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1325,"height":57,"exactHeight":57.3}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":21,"y":19,"exactX":21,"exactY":19,"fixed":false}},"childrenMode":"cols"},"updatedAt":"2026-08-05T19:07:51.062Z","createdAt":"2026-08-05T19:07:50.931Z"},{"_id":"6a738a463e60b28639e25a8c","parent":"6a738a463e60b28639e25a8b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":324,"height":38,"exactWidth":323.78000000000003}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":8,"y":9,"fixed":false,"exactX":false,"exactY":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"UF dominante"}}},"updatedAt":"2026-08-05T19:08:34.401Z","createdAt":"2026-08-05T19:07:50.931Z"},{"_id":"6a738a733e60b28639e25a8f","parent":"6a7386a03e60b28639e25a6c","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1325,"height":57,"exactHeight":57.3}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":21,"y":19,"exactX":21,"exactY":19,"fixed":false}},"childrenMode":"cols"},"updatedAt":"2026-08-05T19:08:36.133Z","createdAt":"2026-08-05T19:08:36.133Z"},{"_id":"6a738a733e60b28639e25a90","parent":"6a738a733e60b28639e25a8f","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":351,"height":38,"exactWidth":350.63}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":8,"y":9,"fixed":false,"exactX":8,"exactY":9}},"text":{"component":"data2-core-primitives@String","params":{"content":"tendência (revenue/points from past cicles)"}}},"updatedAt":"2026-08-05T19:10:06.478Z","createdAt":"2026-08-05T19:08:36.133Z"},{"_id":"6a738aea3e60b28639e25a93","parent":"6a7386a03e60b28639e25a6c","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1325,"height":57,"exactHeight":57.3}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":21,"y":19,"exactX":21,"exactY":19,"fixed":false}},"childrenMode":"cols"},"updatedAt":"2026-08-05T19:10:37.927Z","createdAt":"2026-08-05T19:10:37.927Z"},{"_id":"6a738aea3e60b28639e25a94","parent":"6a738aea3e60b28639e25a93","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":841,"height":38,"exactWidth":841.47}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":8,"y":9,"fixed":false,"exactX":8,"exactY":9}},"text":{"component":"data2-core-primitives@String","params":{"content":"soma por nível para o setor destino, conforme cada município é realocado (tabela \"Consultoras por nível — antes → depois\")."}}},"updatedAt":"2026-08-05T19:13:37.012Z","createdAt":"2026-08-05T19:10:37.927Z"},{"_id":"6a738c1e3e60b28639e25a97","parent":"6a7386a03e60b28639e25a6c","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1325,"height":57,"exactHeight":57.3}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":21,"y":19,"exactX":21,"exactY":19,"fixed":false}},"childrenMode":"cols"},"updatedAt":"2026-08-05T19:15:42.418Z","createdAt":"2026-08-05T19:15:42.418Z"},{"_id":"6a738c1e3e60b28639e25a98","parent":"6a738c1e3e60b28639e25a97","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":841,"height":38,"exactWidth":841.47}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":8,"y":9,"fixed":false,"exactX":8,"exactY":9}},"text":{"component":"data2-core-primitives@String","params":{"content":"Definir setores vizinhos"}}},"updatedAt":"2026-08-05T19:15:58.503Z","createdAt":"2026-08-05T19:15:42.418Z"},{"_id":"6a738c423e60b28639e25a9b","parent":"6a7386a03e60b28639e25a6c","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1325,"height":57,"exactHeight":57.3}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":21,"y":19,"exactX":21,"exactY":19,"fixed":false}},"childrenMode":"cols"},"updatedAt":"2026-08-05T19:16:19.204Z","createdAt":"2026-08-05T19:16:19.204Z"},{"_id":"6a738c423e60b28639e25a9c","parent":"6a738c423e60b28639e25a9b","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":841,"height":38,"exactWidth":841.47}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":8,"y":9,"fixed":false,"exactX":8,"exactY":9}},"text":{"component":"data2-core-primitives@String","params":{"content":"métricas dos setores destinos"}}},"updatedAt":"2026-08-05T19:16:30.653Z","createdAt":"2026-08-05T19:16:19.204Z"},{"_id":"6a738ee63e60b28639e25a9f","parent":"6a7386a03e60b28639e25a6c","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1325,"height":57,"exactHeight":57.3}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":21,"y":19,"exactX":21,"exactY":19,"fixed":false}},"childrenMode":"cols"},"updatedAt":"2026-08-05T19:27:34.808Z","createdAt":"2026-08-05T19:27:34.808Z"},{"_id":"6a738ee63e60b28639e25aa0","parent":"6a738ee63e60b28639e25a9f","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":841,"height":38,"exactWidth":841.47}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":8,"y":9,"fixed":false,"exactX":8,"exactY":9}},"text":{"component":"data2-core-primitives@String","params":{"content":"antes de cada setor destino no relatório e nas barras de span."}}},"updatedAt":"2026-08-05T19:27:46.123Z","createdAt":"2026-08-05T19:27:34.808Z"},{"_id":"6a738f3a3e60b28639e25aa3","parent":"6a7386a03e60b28639e25a6c","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1325,"height":57,"exactHeight":57.3}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":21,"y":19,"exactX":21,"exactY":19,"fixed":false}},"childrenMode":"cols"},"updatedAt":"2026-08-05T19:28:59.018Z","createdAt":"2026-08-05T19:28:59.018Z"},{"_id":"6a738f3a3e60b28639e25aa4","parent":"6a738f3a3e60b28639e25aa3","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":841,"height":38,"exactWidth":841.47}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":8,"y":9,"fixed":false,"exactX":8,"exactY":9}},"text":{"component":"data2-core-primitives@String","params":{"content":"antes por nível na tabela de níveis do relatório."}}},"updatedAt":"2026-08-05T19:29:09.882Z","createdAt":"2026-08-05T19:28:59.018Z"},{"_id":"6a7394743e60b28639e25aa6","parent":"6a7389b93e60b28639e25a86","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(220,0,0,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":false},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":985,"height":210,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":3,"y":8,"fixed":false,"exactX":false,"exactY":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"SELECT DS_MUNICIPIO municipio, CD_GRUPO grupo, MAX(DS_LEADER_NAME) lider,\n       COUNT(DISTINCT CD_CONSULTORA) cbs,\n       ROUND(SUM(VL_PEDIDOS_CICLO),0) receita,\n       ROUND(SUM(VL_PEDIDOS_NATURA_CICLO),0) rec_nat,\n       ROUND(SUM(VL_PEDIDOS_AVON_CICLO),0) rec_avon,\n       ROUND(SUM(QT_PONTOS_CICLO),0) pontos,\n       ROUND(SUM(QT_PEDIDOS_CICLO),0) pedidos,\n       SUM(CASE WHEN ST_FEZ_PED_CICLO_ATUAL THEN 1 ELSE 0 END) ativas\nFROM T\nWHERE CD_PAIS=1 AND CD_GRUPO>0 AND CD_SETOR=<sec> AND DT_HISTORICO=SNAP\nGROUP BY DS_MUNICIPIO, CD_GRUPO"}}},"updatedAt":"2026-08-05T21:01:24.162Z","createdAt":"2026-08-05T19:51:21.140Z"},{"_id":"6a73b922cac879773098b7cc","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"Timeline Simulator - QA","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Timeline Simulator - QA"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1440,"height":900}},"position":{"component":"data2-core-types@Position","params":{"x":1348,"y":55,"exactX":1348.49,"exactY":55.11}}},"reference":"Th2nHPjNFrOqHNoCJzgjg","updatedAt":"2026-08-05T22:38:17.017Z","createdAt":"2026-08-05T22:28:50.653Z"},{"_id":"6a73e3355d2b6915f110298f","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"New Artboard (62)","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768}},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"reference":"JKvR0WYFQxva6mrt1wWSQ","updatedAt":"2026-08-13T20:33:01.264Z","createdAt":"2026-08-06T01:27:18.028Z"},{"_id":"6a73e33c5d2b6915f1102990","parent":"6a73e3355d2b6915f110298f","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":90,"exactWidth":false,"exactHeight":90}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":false,"exactY":false}}},"updatedAt":"2026-08-06T01:29:05.074Z","createdAt":"2026-08-06T01:27:24.433Z"},{"_id":"6a73edc3a442d66150643e98","parent":"6a7172879c26d69dd14e254b","component":"natura-geomarketing@FjpgPxu84sgMMjMKJhyUm","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1326,"height":618,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":1,"y":0,"exactX":0.96,"exactY":0,"left":true,"top":true,"bottom":true,"growV":false,"growH":false,"right":true,"fixed":false}},"style":{"transformOrigin":{"component":"data2-core-primitives@String","params":{"content":"top left"}}}},"should_render_neighbors":true,"municipality_list":[{"location_id":{"component":"data2-core-primitives@String","params":{"content":"Campinas"}},"location_colors":[{"color":{"params":{"rgba":"rgba(255,0,0,1)"},"component":"data2-core-types@Color"},"onClick":{"params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__DialogsService"}},"prop":"confirm","args":[{"component":"data2-core-primitives@String","params":{"content":"aiainnnn"}}]},"component":"data2-core-types@Interaction"},"color_id":{"component":"data2-core-primitives@String","params":{"content":"red"}},"color_label":{"component":"data2-core-primitives@String","params":{"content":"vermelho"}}}]},{"location_id":{"component":"data2-core-primitives@String","params":{"content":"Indaiatuba"}},"location_colors":[{"color":{"params":{"rgba":"rgba(255,0,0,1)"},"component":"data2-core-types@Color"},"onClick":{"params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__DialogsService"}},"prop":"confirm","args":[{"component":"data2-core-primitives@String","params":{"content":"aiainnnn"}}]},"component":"data2-core-types@Interaction"},"color_id":{"component":"data2-core-primitives@String","params":{"content":"red"}},"color_label":{"component":"data2-core-primitives@String","params":{"content":"vermelho"}}},{"color":{"params":{"rgba":"rgba(7,0,255,1)"},"component":"data2-core-types@Color"},"onClick":{"params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__DialogsService"}},"prop":"confirm","args":[{"component":"data2-core-primitives@String","params":{"content":"que arrombado"}}]},"component":"data2-core-types@Interaction"},"color_id":{"component":"data2-core-primitives@String","params":{"content":"blue"}},"color_label":{"component":"data2-core-primitives@String","params":{"content":"azul"}}}]},{"location_id":{"component":"data2-core-primitives@String","params":{"content":"Valinhos"}},"location_colors":[{"color":{"params":{"rgba":"rgba(255,0,0,1)"},"component":"data2-core-types@Color"},"onClick":{"params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__DialogsService"}},"prop":"confirm","args":[{"component":"data2-core-primitives@String","params":{"content":"aiainnnn"}}]},"component":"data2-core-types@Interaction"},"color_id":{"component":"data2-core-primitives@String","params":{"content":"red"}},"color_label":{"component":"data2-core-primitives@String","params":{"content":"vermelho"}}},{"color":{"params":{"rgba":"rgba(7,0,255,1)"},"component":"data2-core-types@Color"},"onClick":{"params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__DialogsService"}},"prop":"confirm","args":[{"component":"data2-core-primitives@String","params":{"content":"que arrombado"}}]},"component":"data2-core-types@Interaction"},"color_id":{"component":"data2-core-primitives@String","params":{"content":"blue"}},"color_label":{"component":"data2-core-primitives@String","params":{"content":"azul"}}}]}],"region_list":[{"location_id":{"component":"data2-core-primitives@String","params":{"content":"SE"}}}]},"index":0,"updatedAt":"2026-08-06T02:14:47.270Z","createdAt":"2026-08-06T02:13:10.500Z"},{"_id":"6a748ae1d5f1c611ff739810","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"Timeline Simulator - V2","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Timeline Simulator - QA"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1440,"height":900}}},"reference":"1L3-KwatnsigsPC4ssO-A","updatedAt":"2026-08-06T13:22:51.882Z","createdAt":"2026-08-06T13:22:51.882Z"},{"_id":"6a748ae1d5f1c611ff739811","parent":"6a748ae1d5f1c611ff739810","component":"natura-geomarketing@dmWryf3W3mTD8791kudqM","system":"6a57cfe9673eb7e3c5e57784","displayName":"Timeline simulator instance","params":{"sessionsDataset":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"geo-timeline-sessionsDataSet"}},"super":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":0,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":true,"exactX":0,"exactY":0}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1440,"height":900}}}},"reference":"hvMneki0Bgu70fK1GZhDA","updatedAt":"2026-08-06T14:31:50.291Z","createdAt":"2026-08-06T13:22:51.882Z"},{"_id":"6a74abe6468fc70c2ef50103","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"main","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768}},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"reference":"kYmaNnWZ5NlRgXfOSuhwp","updatedAt":"2026-08-06T15:43:55.384Z","createdAt":"2026-08-06T15:43:34.544Z"},{"_id":"6a74acf3dad5912765097ccb","component":"data2-core-primitives@Router","system":"6a57cfe9673eb7e3c5e57784","displayName":"TimelineSimulator-Router","params":{"routes":[{"component":"data2-core-primitives@Route","params":{"path":"/","name":"Timeline de Fechamentos","content":{"component":"data2-core-types@ArtboardReference","params":{"reference":"kYmaNnWZ5NlRgXfOSuhwp"}},"policies":[{"component":"data2-core-auth@Policy","params":{"authenticationStrategy":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"timelineSimAuthFinal"}}}}]}},{"component":"data2-core-primitives@Route","params":{"path":"/sessions/:session_id","name":"Sessão compartilhada","content":{"component":"data2-core-types@ArtboardReference","params":{"reference":"__C6d2F-yqwEkSNWNK9IH"}},"policies":[{"component":"data2-core-auth@Policy","params":{"authenticationStrategy":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"timelineSimAuthFinal"}}}}]}}],"login":{"component":"data2-core-types@ArtboardReference","params":{"reference":"OjHwaLdtsQ130Tg6z4N_t"}}},"reference":"timelineSimRouter","updatedAt":"2026-08-14T15:14:09.667Z","createdAt":"2026-08-06T15:49:07.807Z"},{"_id":"6a74aea863667431f75e46f0","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"login","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"login"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768}},"position":{"component":"data2-core-types@Position","params":{"x":0,"y":0}}},"reference":"OjHwaLdtsQ130Tg6z4N_t","updatedAt":"2026-08-06T15:56:24.107Z","createdAt":"2026-08-06T15:56:24.107Z"},{"_id":"6a74b63815209eb021fcad40","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"sessao compartilhada","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"sessao compartilhada"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":900}},"position":{"component":"data2-core-types@Position","params":{"x":0,"y":0}}},"reference":"__C6d2F-yqwEkSNWNK9IH","updatedAt":"2026-08-06T16:28:40.117Z","createdAt":"2026-08-06T16:28:40.117Z"},{"_id":"6a74f5c218b4e7dadbed5af1","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"New Artboard (67)","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768}},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"reference":"noijWuajqXH2If07QOvDG","updatedAt":"2026-08-06T20:58:42.783Z","createdAt":"2026-08-06T20:58:42.783Z"},{"_id":"6a74f5c618b4e7dadbed5af2","parent":"6a74f5c218b4e7dadbed5af1","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":210,"height":114}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":476,"y":57}},"text":{"params":{},"component":"data2-core-id@NanoId"}},"updatedAt":"2026-08-06T20:59:08.193Z","createdAt":"2026-08-06T20:58:46.192Z"},{"_id":"6a753f1170e1884d068ff6b2","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"New Artboard (68)","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768}},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"reference":"yOAcyFMF4w23taqGC1DdW","updatedAt":"2026-08-07T02:11:29.757Z","createdAt":"2026-08-07T02:11:29.757Z"},{"_id":"6a753f1370e1884d068ff6b3","parent":"6a753f1170e1884d068ff6b2","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":434,"height":292}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":186,"y":144}},"text":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"73tdR9WHFwuG_0ffq_bfy"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"files.1.fileUrl"}}},"component":"data2-core-types@Getter"}},"updatedAt":"2026-08-07T02:11:45.924Z","createdAt":"2026-08-07T02:11:31.628Z"},{"_id":"6a75621ae45e25fa9e450a5e","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"Senso de rede — CBs","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Senso de rede — CBs"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1440,"height":900}},"position":{"component":"data2-core-types@Position","params":{"x":0,"y":0}}},"reference":"cLjnfyJtVTGInijJTZznT","updatedAt":"2026-08-07T04:42:02.555Z","createdAt":"2026-08-07T04:42:02.555Z"},{"_id":"6a7563aef808d47b3237cd9a","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"New Artboard (70)","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768}},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"reference":"DXBlx4aB8H1AQ0GwS-CRG","updatedAt":"2026-08-07T04:49:45.355Z","createdAt":"2026-08-07T04:49:45.355Z"},{"_id":"6a7563b0f808d47b3237cd9b","parent":"6a7563aef808d47b3237cd9a","component":"natura-geomarketing@cb-senso-de-rede","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":0,"exactY":0}}}},"updatedAt":"2026-08-07T04:50:33.043Z","createdAt":"2026-08-07T04:49:46.743Z"},{"_id":"6a7568efdc05e47d0b34ca18","component":"data2-core-primitives@Router","system":"6a57cfe9673eb7e3c5e57784","displayName":"Network-Router","params":{"routerType":{"component":"data2-core-primitives@String","params":{"content":"browser"}},"routes":[{"component":"data2-core-primitives@Route","params":{"path":"/","name":"Senso de rede — consultoras","content":{"component":"data2-core-types@ArtboardReference","params":{"reference":"cLjnfyJtVTGInijJTZznT"}},"policies":[{"component":"data2-core-auth@Policy","params":{"authenticationStrategy":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"timelineSimAuthFinal"}}}}]}}],"login":{"component":"data2-core-types@ArtboardReference","params":{"reference":"OjHwaLdtsQ130Tg6z4N_t"}}},"reference":"networkRouter","updatedAt":"2026-08-07T05:11:11.224Z","createdAt":"2026-08-07T05:11:11.224Z"},{"_id":"6a79f188abad3677a0deede8","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"New Artboard (71)","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768}},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"reference":"DwXxSwWXTxY-JQeKs5lJ8","updatedAt":"2026-08-10T15:44:09.302Z","createdAt":"2026-08-10T15:44:09.302Z"},{"_id":"6a79f189abad3677a0deede9","parent":"6a79f188abad3677a0deede8","component":"natura-geomarketing@h8dxop6kvgOHQgccdhbQr","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":false,"exactY":false}}},"dominantesCsvUrl":{"component":"data2-core-types@FileComponentUrlReference","params":{"reference":"yw_TQdp0QXEk6JsrliAqP"}},"sessionsDataset":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"timeline-shared-sessionsDataSet"}},"sharedDataset":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"timeline-shared-sessionsDataSet"}}},"updatedAt":"2026-08-10T15:44:34.271Z","createdAt":"2026-08-10T15:44:10.361Z"},{"_id":"6a7a3d6baaf2888959833394","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"New Artboard (72)","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768}},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"reference":"tXTiGZ_1DYEKpyeF2jzEy","updatedAt":"2026-08-10T21:07:57.772Z","createdAt":"2026-08-10T21:07:57.772Z"},{"_id":"6a7a3e4faaf288895983339b","parent":"6a7a3d6baaf2888959833394","component":"natura-geomarketing@FjpgPxu84sgMMjMKJhyUm","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":false,"exactY":false}}},"municipality_list":[{"location_id":{"component":"data2-core-primitives@String","params":{"content":"Barao de Grajau"}}}],"should_render_neighbors":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"updatedAt":"2026-08-10T21:29:24.719Z","createdAt":"2026-08-10T21:29:24.719Z"},{"_id":"6a7a4288aaf288895983339d","parent":"6a74abe6468fc70c2ef50103","component":"natura-geomarketing@xoLKR_Mb_n2vkwfmdExLH","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":0,"exactY":0,"bottom":true,"left":true,"top":true,"growV":false,"right":true,"growH":false}}},"sessionsDataset":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"timeline-shared-sessionsDataSet"}},"sharedDataset":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"timeline-shared-sessionsDataSet"}},"dominantesCsvUrl":{"component":"data2-core-types@FileComponentUrlReference","params":{"reference":"yw_TQdp0QXEk6JsrliAqP"}}},"updatedAt":"2026-08-13T01:10:57.152Z","createdAt":"2026-08-10T21:29:51.263Z"},{"_id":"6a7dc330114b59df1758cf9e","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"New Artboard (73)","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768}},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"reference":"2gBPjYIbz7Tk0OPLAJv-A","updatedAt":"2026-08-13T13:15:33.240Z","createdAt":"2026-08-13T13:15:33.240Z","deleteMetadata":{}},{"_id":"6a7dc3e1114b59df1758cfa3","parent":"6a7dc330114b59df1758cf9e","component":"natura-geomarketing@FjpgPxu84sgMMjMKJhyUm","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":0,"exactY":0}}},"municipality_list":{"params":{"array":{"params":{"needle":{"component":"data2-core-primitives@String","params":{"content":"\n"}},"haystack":{"component":"data2-core-primitives@String","params":{"content":"Passa Vinte\nBarra Mansa\nItatiaia\nPorto Real\nQuatis\nResende\nRio Claro\nArapeí\nAreias\nBananal\nSão José do Barreiro\nRio de Janeiro\nRio de Janeiro\nRio de Janeiro\nRio de Janeiro\nDuque de Caxias\nSão João de Meriti\nAngra dos Reis\nMangaratiba\nParaty\nChiador\nRio Preto\nSanta Bárbara do Monte Verde\nAreal\nBarra do Piraí\nComendador Levy Gasparian\nEngenheiro Paulo de Frontin\nMendes\nMiguel Pereira\nParaíba do Sul\nPaty do Alferes\nPiraí\nRio das Flores\nSapucaia\nTrês Rios\nValença\nVassouras\nBelford Roxo\nMesquita\nNilópolis\nDuque de Caxias\nBelford Roxo\nMesquita\nNilópolis\nJaperi\nNova Iguaçu\nPinheiral\nVolta Redonda\nNova Iguaçu\nDuque de Caxias\nBelford Roxo\nMesquita\nNilópolis\nItaguaí\nParacambi\nSeropédica\nRio de Janeiro\nNova Iguaçu\nQueimados"}}},"component":"data2-core-functions@Split"},"mapper":{"params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"m"}}],"body":{"location_id":{"params":{"reference":"m"},"component":"data2-core-types@Reference"}}},"component":"data2-core-functions@Function"}},"component":"data2-core-functions@ArrayMap"},"state_list":[{"location_id":{"component":"data2-core-primitives@String","params":{"content":"SP"}}},{"location_id":{"component":"data2-core-primitives@String","params":{"content":"RJ"}}},{"location_id":{"component":"data2-core-primitives@String","params":{"content":"MG"}}}]},"updatedAt":"2026-08-13T13:28:15.525Z","createdAt":"2026-08-13T13:28:15.525Z","deleteMetadata":{}},{"_id":"6a7e314f1f2bcb9760909e08","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"New Artboard (74)","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768}},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"reference":"YQUlnQwegeVcqRJ7T2To6","updatedAt":"2026-08-13T21:05:22.263Z","createdAt":"2026-08-13T21:05:22.263Z","deleteMetadata":{}},{"_id":"6a7e31501f2bcb9760909e09","parent":"6a7e314f1f2bcb9760909e08","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":249,"height":93}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":251,"y":253}},"text":{"params":{},"component":"data2-core-id@NanoId"}},"updatedAt":"2026-08-13T21:05:34.708Z","createdAt":"2026-08-13T21:05:23.334Z","deleteMetadata":{}},{"_id":"6a7f2e9015e4ff6ced75d8dd","component":"data2-core-primitives@Router","system":"6a57cfe9673eb7e3c5e57784","displayName":"Ventura Router","params":{"login":{"component":"data2-core-types@ArtboardReference","params":{"reference":"zPsva5l3OJc-eA29zid8R"}},"routes":[{"component":"data2-core-primitives@Route","params":{"path":"/","name":{"component":"data2-core-primitives@String","params":{"content":"Ventura — Simulador"}},"content":{"component":"data2-core-types@ArtboardReference","params":{"reference":"1O-LAQ5VN164eve_RbxNz"}},"policies":[{"component":"data2-core-auth@Policy","params":{"authenticationStrategy":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"timelineSimAuthFinal"}}}}]}},{"component":"data2-core-primitives@Route","params":{"path":"/sessions/:session_id","name":{"component":"data2-core-primitives@String","params":{"content":"Ventura — Leitor de cenários"}},"content":{"component":"data2-core-types@ArtboardReference","params":{"reference":"8veifi5J96w7MRQe7uHN4"}},"policies":[{"component":"data2-core-auth@Policy","params":{"authenticationStrategy":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"timelineSimAuthFinal"}}}}]}}]},"reference":"aBini246xOvYSwav_X5ad","updatedAt":"2026-08-14T15:35:20.448Z","createdAt":"2026-08-14T15:05:59.148Z","deleteMetadata":{}},{"_id":"6a7f305c15e4ff6ced75d8df","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"Ventura — Login artboard","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"login"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768}}},"reference":"zPsva5l3OJc-eA29zid8R","updatedAt":"2026-08-14T15:16:01.910Z","createdAt":"2026-08-14T15:13:43.700Z","deleteMetadata":{}},{"_id":"6a7f305c15e4ff6ced75d8e0","parent":"6a7f305c15e4ff6ced75d8df","component":"natura-geomarketing@ZbSMa0nRld-Ond2eo6tjs","system":"6a57cfe9673eb7e3c5e57784","displayName":"Login form instance","params":{"super":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":0,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":true,"exactX":false,"exactY":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768,"exactWidth":false,"exactHeight":false}}}},"reference":"Y87XaCN1xFnP4It1hGn6u","updatedAt":"2026-08-14T15:16:55.580Z","createdAt":"2026-08-14T15:13:43.700Z","deleteMetadata":{}},{"_id":"6a7f305c15e4ff6ced75d8e1","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"Ventura — Simulador artboard","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768}},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"reference":"1O-LAQ5VN164eve_RbxNz","updatedAt":"2026-08-14T15:15:19.911Z","createdAt":"2026-08-14T15:13:43.700Z","deleteMetadata":{}},{"_id":"6a7f305c15e4ff6ced75d8e2","parent":"6a7f305c15e4ff6ced75d8e1","component":"natura-geomarketing@KRgNUar3hCwC4PglklYuS","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":false,"exactY":false,"bottom":true,"left":true,"top":true,"growV":false,"right":true,"growH":false}}},"sessionsDataset":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"timeline-shared-sessionsDataSet"}},"sharedDataset":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"timeline-shared-sessionsDataSet"}},"dominantesCsvUrl":{"component":"data2-core-types@FileComponentUrlReference","params":{"reference":"yw_TQdp0QXEk6JsrliAqP"}}},"updatedAt":"2026-08-14T15:19:52.510Z","createdAt":"2026-08-14T15:13:43.700Z","deleteMetadata":{}},{"_id":"6a7f305c15e4ff6ced75d8e3","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"Ventura — Leitor de Cenários artboard","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"sessao compartilhada"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":900}}},"reference":"8veifi5J96w7MRQe7uHN4","updatedAt":"2026-08-14T15:15:47.518Z","createdAt":"2026-08-14T15:13:43.700Z","deleteMetadata":{}},{"_id":"6a7f305c15e4ff6ced75d8e4","parent":"6a7f305c15e4ff6ced75d8e3","component":"natura-geomarketing@CNL_4z20SJcX0NMp2I2vz","system":"6a57cfe9673eb7e3c5e57784","displayName":"Session read instance","params":{"shared":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"timeline-shared-sessionsDataSet"}},"super":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":0,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":true}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":900}}}},"reference":"2xQ6i0KYfzxTWFEJPJCv6","updatedAt":"2026-08-14T15:19:57.801Z","createdAt":"2026-08-14T15:13:43.700Z","deleteMetadata":{}},{"_id":"6a7f347315e4ff6ced75d8e6","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"Ventura DEV — Login artboard","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"login"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768}}},"reference":"RMRrwg-if93tX6Bqz6ddF","updatedAt":"2026-08-14T15:31:24.646Z","createdAt":"2026-08-14T15:31:08.977Z","deleteMetadata":{}},{"_id":"6a7f347315e4ff6ced75d8e7","parent":"6a7f347315e4ff6ced75d8e6","component":"natura-geomarketing@ZbSMa0nRld-Ond2eo6tjs","system":"6a57cfe9673eb7e3c5e57784","displayName":"Login form instance","params":{"super":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":0,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":true,"exactX":false,"exactY":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768,"exactWidth":false,"exactHeight":false}}}},"reference":"Y87XaCN1xFnP4It1hGn6u","updatedAt":"2026-08-14T15:31:08.977Z","createdAt":"2026-08-14T15:31:08.977Z","deleteMetadata":{}},{"_id":"6a7f347315e4ff6ced75d8e8","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"Ventura DEV — Simulador artboard","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768}},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"reference":"1QUL0_NB5FeBEhHT8AWkL","updatedAt":"2026-08-14T15:31:27.572Z","createdAt":"2026-08-14T15:31:08.978Z","deleteMetadata":{}},{"_id":"6a7f347315e4ff6ced75d8e9","parent":"6a7f347315e4ff6ced75d8e8","component":"natura-geomarketing@pS1W650RpCdVhLm9IkwFi","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":false,"exactY":false,"bottom":true,"left":true,"top":true,"growV":false,"right":true,"growH":false}}},"sessionsDataset":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"timeline-shared-sessionsDataSet"}},"sharedDataset":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"timeline-shared-sessionsDataSet"}},"dominantesCsvUrl":{"component":"data2-core-types@FileComponentUrlReference","params":{"reference":"yw_TQdp0QXEk6JsrliAqP"}}},"updatedAt":"2026-08-14T15:33:03.210Z","createdAt":"2026-08-14T15:31:08.978Z","deleteMetadata":{}},{"_id":"6a7f347315e4ff6ced75d8ea","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"Ventura DEV — Leitor de Cenários artboard","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"sessao compartilhada"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":900}}},"reference":"Rn3M0oZh38UcnELI98qvf","updatedAt":"2026-08-14T15:31:35.824Z","createdAt":"2026-08-14T15:31:08.978Z","deleteMetadata":{}},{"_id":"6a7f347315e4ff6ced75d8eb","parent":"6a7f347315e4ff6ced75d8ea","component":"natura-geomarketing@Y7eEvdJeC4azwvfDtwrYP","system":"6a57cfe9673eb7e3c5e57784","displayName":"Session read instance","params":{"shared":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"timeline-shared-sessionsDataSet"}},"super":{"position":{"component":"data2-core-types@Position","params":{"x":-6,"y":0,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":true,"exactX":-5.94,"exactY":0}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":900}}}},"reference":"2xQ6i0KYfzxTWFEJPJCv6","updatedAt":"2026-08-14T15:33:06.565Z","createdAt":"2026-08-14T15:31:08.978Z","deleteMetadata":{}},{"_id":"6a7f349e15e4ff6ced75d8ec","component":"data2-core-primitives@Router","system":"6a57cfe9673eb7e3c5e57784","displayName":"Ventura DEV Router","params":{"login":{"component":"data2-core-types@ArtboardReference","params":{"reference":"RMRrwg-if93tX6Bqz6ddF"}},"routes":[{"component":"data2-core-primitives@Route","params":{"path":"/","name":{"component":"data2-core-primitives@String","params":{"content":"Ventura DEV — Simulador"}},"content":{"component":"data2-core-types@ArtboardReference","params":{"reference":"1QUL0_NB5FeBEhHT8AWkL"}},"policies":[{"component":"data2-core-auth@Policy","params":{"authenticationStrategy":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"timelineSimAuthFinal"}}}}]}},{"component":"data2-core-primitives@Route","params":{"path":"/sessions/:session_id","name":{"component":"data2-core-primitives@String","params":{"content":"Ventura DEV — Leitor de cenários"}},"content":{"component":"data2-core-types@ArtboardReference","params":{"reference":"Rn3M0oZh38UcnELI98qvf"}},"policies":[{"component":"data2-core-auth@Policy","params":{"authenticationStrategy":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"timelineSimAuthFinal"}}}}]}}]},"reference":"9z5Gvm-fsg1UoCHgxubhz","updatedAt":"2026-08-14T15:35:15.547Z","createdAt":"2026-08-14T15:31:53.856Z","deleteMetadata":{}},{"_id":"6a7f36a815e4ff6ced75d8ee","component":"data2-core-primitives@Artboard","system":"6a57cfe9673eb7e3c5e57784","displayName":"New Artboard (81)","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768}}},"reference":"QtWcC5ZgYFWiMP-E6MHsx","updatedAt":"2026-08-14T15:41:07.608Z","createdAt":"2026-08-14T15:40:30.861Z","deleteMetadata":{}},{"_id":"d795a39d143c368fd4dc57b1","parent":"4b4e51042eb63d563e8fc2c7","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"OptUF","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":0,"freeTransform":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":219,"height":44}},"text":{"component":"data2-core-primitives@String","params":{"content":"UF"}},"textSize":15,"textColor":{"component":"data2-core-types@Color","params":{"rgba":"#3c3c40"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"verticalAlignment":"middle","horizontalAlignment":"left"}},"style":{"padding":"0px 0px 0px 20px"},"cursor":"pointer","onClick":{"component":"data2-core-flow@Series","params":{"actions":[{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":"6a7172879c26d69dd14e254c","key":"currentView"}},"value":"UF"}},{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":"6a7172879c26d69dd14e254c","key":"viewMenuOpen"}},"value":false}}]}}},"index":2,"reference":"dLNvL3dUo9_oogaxOMofj","updatedAt":"2026-08-05T23:38:31.762Z","createdAt":"2026-08-05T23:38:02.920Z"},{"_id":"e7b4ab79076c59dcdee68c4b","parent":"4b4e51042eb63d563e8fc2c7","component":"data2-core-primitives@Block","system":"6a57cfe9673eb7e3c5e57784","displayName":"OptMunicipio","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":0,"freeTransform":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":219,"height":44}},"text":{"component":"data2-core-primitives@String","params":{"content":"Município"}},"textSize":15,"textColor":{"component":"data2-core-types@Color","params":{"rgba":"#3c3c40"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"verticalAlignment":"middle","horizontalAlignment":"left"}},"style":{"padding":"0px 0px 0px 20px"},"cursor":"pointer","onClick":{"component":"data2-core-flow@Series","params":{"actions":[{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":"6a7172879c26d69dd14e254c","key":"currentView"}},"value":"Município"}},{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":"6a7172879c26d69dd14e254c","key":"viewMenuOpen"}},"value":false}}]}}},"index":0,"reference":"ZhN-jWdge4xIT3BmXF_i2","updatedAt":"2026-08-05T23:38:23.769Z","createdAt":"2026-08-05T23:37:54.785Z"},{"_id":"edee90b922e5038ec1d1c76c","parent":"6a74aea863667431f75e46f0","component":"natura-geomarketing@timeline-sim-login","system":"6a57cfe9673eb7e3c5e57784","displayName":"Login form instance","params":{"super":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":0,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":true,"exactX":false,"exactY":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768,"exactWidth":false,"exactHeight":false}}}},"reference":"Y87XaCN1xFnP4It1hGn6u","updatedAt":"2026-08-14T15:06:37.982Z","createdAt":"2026-08-06T15:56:33.129Z"}]}},{"_id":"5fc4faeec8da12be8bf3d08a","component":"data2-core@Data2TableDataSource","system":"5e3b796d6228227ca637d0f4","params":{"paginate":{"default":1000},"super":{},"table":"fileComponentInstances","schema":[{"component":"data2-core-types@Field","params":{"key":"component","title":"Component","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"system","title":"System","component":"data2-core-primitives@ObjectId"}},{"component":"data2-core-types@Field","params":{"key":"displayName","title":"Display Name","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"params","title":"Params","component":"data2-core-primitives@Object"}},{"component":"data2-core-types@Field","params":{"key":"reference","title":"Reference","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"fileId"}},"title":"File ID","component":"data2-core-primitives@ObjectId"},"break":true}],"hooks":{"before":{"all":[{"hook":"softDelete"}],"find":[{"hook":"useCache","options":{"additionalGroupKeys":["$and.0.system","$and.1.system"],"skipCache":true}}],"create":[{"hook":"timestamp","options":{"fields":["createdAt","updatedAt"]}}],"update":[{"hook":"timestamp","options":{"fields":["updatedAt"]}}],"patch":[{"hook":"timestamp","options":{"fields":["updatedAt"]}}]},"after":{"all":[{"hook":"fileUrl","options":{"downloadField":"params.fileUrl","uploadField":"params.uploadFileUrl","enhanceSchema":false}}],"find":[{"hook":"useCache","options":{"additionalGroupKeys":["$and.0.system","$and.1.system"],"skipCache":true}}],"create":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["system"],"secondaryUniqueKeys":["reference"]}},{"hook":"invalidateEnvCache"}],"update":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["system"],"secondaryUniqueKeys":["reference"]}},{"hook":"invalidateEnvCache"}],"patch":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["system"],"secondaryUniqueKeys":["reference"]}},{"hook":"invalidateEnvCache"}],"remove":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["system"],"secondaryUniqueKeys":["reference"]}},{"hook":"invalidateEnvCache"}]}},"multi":["create"],"useEstimatedDocumentCount":true},"reference":"FileComponentInstancesTableDataSource","updatedAt":"2022-12-19T20:42:51.837Z","createdAt":"2020-11-30T13:59:52.294Z"},{"reference":"ApplicationsTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[{"_id":"6a5e89d15c2b589c492f4469","displayName":"Hub-App","reference":"zcVHYTqjED3Nk5Rj0SWHl","params":{"responseHeaders":{"X-Frame-Options":{"params":{"content":""},"component":"data2-core-primitives@String"},"Content-Security-Policy":{"params":{"content":""},"component":"data2-core-primitives@String"},"X-XSS-Protection":{"params":{"content":""},"component":"data2-core-primitives@String"}},"domain":{"component":"data2-core-primitives@String","params":{"content":"hub"}},"name":{"component":"data2-core-primitives@String","params":{"content":"Hub - Geomarketing"}},"shortName":{"component":"data2-core-primitives@String","params":{"content":"Hub - Geomarketing"}},"entryPoint":{"disabled":false,"component":"data2-core-types@ComponentInstanceReference","params":{"component":"data2-core-primitives@Router","reference":"MNv9vHdKUB_s3iOqiMkiB"}},"font":{"params":{"fonts":[{"params":{"family":{"component":"data2-core-primitives@String","params":{"content":"instrumentSans"}},"faces":[{"src":{"component":"data2-core-types@FileComponentUrlReference","params":{"reference":"nrYoNtsk0eEXl6idp81hc"}},"format":"truetype"}]},"component":"data2-core-web@Font"},{"component":"data2-core-web@Font","params":{"family":{"component":"data2-core-primitives@String","params":{"content":"NaturaCo"}},"faces":[{"format":"opentype","style":"normal","weight":"normal","src":{"component":"data2-core-types@FileComponentUrlReference","params":{"reference":"2zxSHUwz93sk1ruAO9TrY"}}},{"format":"opentype","style":"normal","weight":"bold","src":{"component":"data2-core-types@FileComponentUrlReference","params":{"reference":"O4yB3yzwEUsWuSLUedK8v"}}},{"style":"normal","format":"opentype","weight":"100","src":{"component":"data2-core-types@FileComponentUrlReference","params":{"reference":"RvhhKo1F_K1wzhwpdh9Iq"}}},{"format":"opentype","style":"italic","weight":"100","src":{"component":"data2-core-types@FileComponentUrlReference","params":{"reference":"6bbmw2LPbYaVCzkZJVaIk"}}}]},"displayName":"NaturaCo"}]},"component":"data2-core-web@Fonts"},"icon":{"disabled":true,"component":"data2-core-types@FileComponentUrlReference","params":{}},"themeColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(165,165,246,1)"}},"backgroundColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}}},"system":"6a57cfe9673eb7e3c5e57784","component":"data2-core-primitives@Application","updatedAt":"2026-07-23T23:05:22.637Z","createdAt":"2026-07-20T20:49:48.335Z"},{"_id":"6a74ad00a3c269c78fe7ada7","displayName":"TimelineSimulator-App","reference":"3TIqIMsYCKjuQcyffDB2C","params":{"name":{"component":"data2-core-primitives@String","params":{"content":"Timeline de Fechamentos"}},"shortName":{"component":"data2-core-primitives@String","params":{"content":"Timeline"}},"domain":{"component":"data2-core-primitives@String","params":{"content":"timeline"}},"serverSideRendering":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"entryPoint":{"component":"data2-core-types@ComponentInstanceReference","params":{"component":"data2-core-primitives@Router","reference":"timelineSimRouter"}},"responseHeaders":{"X-Frame-Options":{"component":"data2-core-primitives@String","params":{"content":""}},"Content-Security-Policy":{"component":"data2-core-primitives@String","params":{"content":""}},"X-XSS-Protection":{"component":"data2-core-primitives@String","params":{"content":""}}}},"system":"6a57cfe9673eb7e3c5e57784","component":"data2-core-primitives@Application","updatedAt":"2026-08-06T15:49:20.106Z","createdAt":"2026-08-06T15:49:20.106Z"},{"_id":"6a7568f7dc05e47d0b34ca1f","displayName":"Network-App","reference":"MStFJxCPTrbzFORpDU4Mx","params":{"name":{"component":"data2-core-primitives@String","params":{"content":"Senso de Rede"}},"shortName":{"component":"data2-core-primitives@String","params":{"content":"Network"}},"domain":{"component":"data2-core-primitives@String","params":{"content":"network"}},"serverSideRendering":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"entryPoint":{"component":"data2-core-types@ComponentInstanceReference","params":{"component":"data2-core-primitives@Router","reference":"networkRouter"}},"responseHeaders":{"X-Frame-Options":{"component":"data2-core-primitives@String","params":{"content":""}},"Content-Security-Policy":{"component":"data2-core-primitives@String","params":{"content":""}},"X-XSS-Protection":{"component":"data2-core-primitives@String","params":{"content":""}}}},"system":"6a57cfe9673eb7e3c5e57784","component":"data2-core-primitives@Application","updatedAt":"2026-08-07T05:11:19.850Z","createdAt":"2026-08-07T05:11:19.850Z"},{"_id":"6a7f2e6d15e4ff6ced75d8dc","displayName":"Ventura App","reference":"djHEd_NXybd8WPAPeTbxA","params":{"responseHeaders":{"X-Frame-Options":{"params":{"content":""},"component":"data2-core-primitives@String"},"Content-Security-Policy":{"params":{"content":""},"component":"data2-core-primitives@String"},"X-XSS-Protection":{"params":{"content":""},"component":"data2-core-primitives@String"}},"domain":{"component":"data2-core-primitives@String","params":{"content":"ventura"}},"entryPoint":{"params":{"component":"data2-core-primitives@Router","reference":"aBini246xOvYSwav_X5ad"},"component":"data2-core-types@ComponentInstanceReference"},"name":{"component":"data2-core-primitives@String","params":{"content":"Ventura"}},"icon":{"component":"data2-core-types@FileComponentUrlReference","params":{"reference":"EK42rEq1XMmRyLtWXhRbq"}}},"system":"6a57cfe9673eb7e3c5e57784","component":"data2-core-primitives@Application","updatedAt":"2026-08-14T15:43:13.277Z","createdAt":"2026-08-14T15:05:23.667Z"},{"_id":"6a7f343d15e4ff6ced75d8e5","displayName":"Ventura App DEV","reference":"TUv8LP5Np6Ar2TcaHj4rC","params":{"responseHeaders":{"X-Frame-Options":{"params":{"content":""},"component":"data2-core-primitives@String"},"Content-Security-Policy":{"params":{"content":""},"component":"data2-core-primitives@String"},"X-XSS-Protection":{"params":{"content":""},"component":"data2-core-primitives@String"}},"domain":{"component":"data2-core-primitives@String","params":{"content":"ventura-dev"}},"name":{"component":"data2-core-primitives@String","params":{"content":"Ventura DEV"}},"entryPoint":{"params":{"component":"data2-core-primitives@Router","reference":"9z5Gvm-fsg1UoCHgxubhz"},"component":"data2-core-types@ComponentInstanceReference"},"icon":{"component":"data2-core-types@FileComponentUrlReference","params":{"reference":"EK42rEq1XMmRyLtWXhRbq"}}},"system":"6a57cfe9673eb7e3c5e57784","component":"data2-core-primitives@Application","updatedAt":"2026-08-14T15:43:19.881Z","createdAt":"2026-08-14T15:30:12.106Z"}]}},{"reference":"DataComponentInstancesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[{"_id":"6a5e89c55c2b589c492f4468","displayName":"usuarios","component":"data2-core@Data2TableDataSource","system":"6a57cfe9673eb7e3c5e57784","params":{"table":"76F6DtuCCd1wGRBMLERZE","multi":["create"],"super":{},"schema":[{"component":"data2-core-types@Field","params":{"title":"email","key":"email","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"senha","key":"senha","component":"data2-core-types@Password"}},{"component":"data2-core-types@Field","params":{"title":"nome","key":"nome","component":"data2-core-primitives@String"}}]},"reference":"76F6DtuCCd1wGRBMLERZE","updatedAt":"2026-07-20T20:59:49.400Z","createdAt":"2026-07-20T20:49:36.140Z"},{"_id":"6a5e8bff5c2b589c492f446a","displayName":"todos-usuarios","component":"data2-core@DataSet","system":"6a57cfe9673eb7e3c5e57784","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"76F6DtuCCd1wGRBMLERZE"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"policies":[{"params":{},"component":"data2-core-auth@InvokedByBuilder"}]},"reference":"tFznon1CqdR98RwcHH1w_","updatedAt":"2026-08-13T21:07:30.157Z","createdAt":"2026-07-20T20:59:05.787Z"},{"_id":"6a5e8c055c2b589c492f446b","displayName":"usuario-logado","component":"data2-core@DataSet","system":"6a57cfe9673eb7e3c5e57784","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"76F6DtuCCd1wGRBMLERZE"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"pagination":{"size":20},"policies":[{"component":"data2-core-types@PolicyReference","params":{"allow":{"component":"data2-core-auth@InvokedByBuilder","params":{}}}}]},"reference":"O0AkmoRwDUBFAASfIic_m","updatedAt":"2026-08-06T16:47:30.320Z","createdAt":"2026-07-20T20:59:12.290Z"},{"_id":"6a5e8d7c5c2b589c492f447b","displayName":"Hub-AuthenticationStrategy","component":"data2-core@AuthenticationStrategy","system":"6a57cfe9673eb7e3c5e57784","params":{"resetPassword":{"resetEmail":{"artboard":{"params":{"preventEvaluation":true},"component":"data2-core-types@ArtboardReference"}},"resetSuccessEmail":{"artboard":{"params":{"preventEvaluation":true},"component":"data2-core-types@ArtboardReference"}}},"verifier":{"disabled":false,"component":"data2-core-types@DataSetReference","params":{"reference":"O0AkmoRwDUBFAASfIic_m"}},"email":{"disabled":false,"component":"data2-core-types@DataSetColumnReference","params":{"column":"email"}},"password":{"disabled":false,"component":"data2-core-types@DataSetColumnReference","params":{"column":"senha"}}},"reference":"FhiMOvd_RB6KwykvNtij0","updatedAt":"2026-07-20T21:06:41.354Z","createdAt":"2026-07-20T21:05:26.729Z"},{"_id":"6a5f2542951c23b007767648","displayName":"HubStore","component":"data2-core@Store","system":"6a57cfe9673eb7e3c5e57784","params":{},"reference":"A7W_yE-inCOBw24Fo8BzY","updatedAt":"2026-07-21T07:53:15.774Z","createdAt":"2026-07-21T07:53:05.728Z"},{"_id":"6a626dc261501108689e9734","displayName":"HubSimulatorStore","component":"data2-core@Store","system":"6a57cfe9673eb7e3c5e57784","params":{},"reference":"kfqDiL83O6CTlKOfellwq","updatedAt":"2026-07-23T19:39:30.650Z","createdAt":"2026-07-23T19:39:15.880Z"},{"_id":"6a692869a8f059878f14c3eb","displayName":"Sector list","component":"http@CustomHTTPDataSource","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{},"find":{"params":{"actions":[{"params":{"url":{"component":"data2-core-primitives@String","params":{"content":"https://natura-geomarketing.data2.media/file/KomiqgWenIVasWeRzeSlW"}},"method":"GET"},"component":"http@Request"},{"params":{"csv":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"prevResult"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-functions@CSVParse"},{"params":{"column":{"component":"data2-core-primitives@String","params":{"content":"CD_SETOR"}},"subject":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"prevResult.data"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-functions@Group"},{"params":{"array":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"prevResult"}}},"component":"data2-core-types@Reference"},"mapper":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"m"}}],"body":{"setor":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m.group"}}},"component":"data2-core-types@Reference"}}}}},"component":"data2-core-functions@ArrayMap"},{"records":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"prevResult"}}},"component":"data2-core-types@Reference"},"count":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"prevResult.length"}}},"component":"data2-core-types@Reference"}}]},"component":"data2-core-flow@Series"},"countKey":{"component":"data2-core-primitives@String","params":{"content":"count"}},"recordsKey":{"component":"data2-core-primitives@String","params":{"content":"records"}},"policies":[{"component":"data2-core-types@PolicyReference","params":{"allow":{"component":"data2-core-auth@InvokedByBuilder","params":{}}}}]},"reference":"40C0Kka9Nw6QCf_-OTbbr","updatedAt":"2026-08-06T16:47:19.664Z","createdAt":"2026-07-28T22:09:23.922Z"},{"_id":"6a692a3a9b51c69afae51b0a","displayName":"sector-list-ds","component":"data2-core@DataSet","system":"6a57cfe9673eb7e3c5e57784","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"40C0Kka9Nw6QCf_-OTbbr"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":10}}},"policies":[{"component":"data2-core-types@PolicyReference","params":{"allow":{"component":"data2-core-auth@InvokedByBuilder","params":{}}}}]},"reference":"FhlWyAglkQB5EL4hrbzmq","updatedAt":"2026-08-06T16:47:20.491Z","createdAt":"2026-07-28T22:17:08.318Z"},{"_id":"6a6937679b51c69afae51b0e","displayName":"Selected sector","component":"http@CustomHTTPDataSource","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{},"find":{"params":{"actions":[{"params":{"url":{"component":"data2-core-primitives@String","params":{"content":"https://natura-geomarketing.data2.media/file/KomiqgWenIVasWeRzeSlW"}},"method":"GET"},"component":"http@Request"},{"params":{"csv":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"prevResult"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-functions@CSVParse"},{"params":{"array":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"prevResult.data"}}},"component":"data2-core-types@Reference"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"f"}}],"body":{"params":{"compare":{"params":{"subject":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"query.MUNICIPIO"}}},"component":"data2-core-types@Reference"},"comparisonSubject":{"params":{},"component":"data2-core-primitives@Undefined"}},"component":"data2-core-comparison-operators@Equal"},"then":{"params":{"subject":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"f.CD_SETOR"}}},"component":"data2-core-types@Reference"},"comparisonSubject":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"query.CD_SETOR"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-comparison-operators@Equal"},"else":{"params":{"pattern":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"f.MUNICIPIO"}}},"component":"data2-core-types@Reference"},"subject":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"query.MUNICIPIO.$in"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-functions@Includes"}},"component":"data2-core-flow@If"}}}},"component":"data2-core-functions@ArrayFilter"},{"records":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"prevResult"}}},"component":"data2-core-types@Reference"},"count":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"prevResult.length"}}},"component":"data2-core-types@Reference"}}]},"component":"data2-core-flow@Series"},"countKey":{"component":"data2-core-primitives@String","params":{"content":"count"}},"recordsKey":{"component":"data2-core-primitives@String","params":{"content":"records"}}},"reference":"RCNSJz611z4PJMwRKk0Al","updatedAt":"2026-07-30T17:33:37.602Z","createdAt":"2026-07-28T23:13:27.063Z"},{"_id":"6a6937679b51c69afae51b0f","displayName":"selected-sector","component":"data2-core@DataSet","system":"6a57cfe9673eb7e3c5e57784","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"RCNSJz611z4PJMwRKk0Al"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"filter":{"params":{"CD_SETOR":{"component":"data2-core-primitives@String","params":{"content":"0000000"}}},"component":"data2-core-types@DataSetFilter"},"policies":[{"component":"data2-core-types@PolicyReference","params":{"allow":{"component":"data2-core-auth@InvokedByBuilder","params":{}}}}]},"reference":"2A0QvRsDzftCYYnjJ_hIe","updatedAt":"2026-08-06T16:47:24.759Z","createdAt":"2026-07-28T23:13:27.063Z"},{"_id":"6a699f5197aef987ef45b37a","displayName":"Simulador TOBE","component":"data2-core@Store","system":"6a57cfe9673eb7e3c5e57784","params":{},"reference":"NLO6dHteJxVmbynNHsqPv","updatedAt":"2026-07-29T06:36:52.353Z","createdAt":"2026-07-29T06:36:41.791Z"},{"_id":"6a699f5d97aef987ef45b37b","displayName":"Simulador ASIS","component":"data2-core@Store","system":"6a57cfe9673eb7e3c5e57784","params":{},"reference":"Y0MVeSB0t_bjBEppVYgQJ","updatedAt":"2026-07-29T06:39:44.562Z","createdAt":"2026-07-29T06:39:44.562Z"},{"_id":"6a6b4d276dd0259eb0b8fc3e","displayName":"simulador-setor","component":"data2-core@DataSet","system":"6a57cfe9673eb7e3c5e57784","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"KugnlUKJX2XGPnuL8YCnj"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"policies":[{"component":"data2-core-types@PolicyReference","params":{"allow":{"component":"data2-core-auth@InvokedByBuilder","params":{}}}}]},"reference":"7rq4WNBhLtN4x9qy-262L","updatedAt":"2026-08-06T16:47:26.101Z","createdAt":"2026-07-30T13:10:49.885Z"},{"_id":"6a6b4d276dd0259eb0b8fc3d","displayName":"Copy of Sectors","component":"http@CustomHTTPDataSource","system":"6a57cfe9673eb7e3c5e57784","params":{"super":{},"countKey":{"component":"data2-core-primitives@String","params":{"content":"count"}},"recordsKey":{"component":"data2-core-primitives@String","params":{"content":"records"}},"find":{"params":{"actions":[{"params":{"url":{"component":"data2-core-primitives@String","params":{"content":"https://natura-geomarketing.data2.media/file/KomiqgWenIVasWeRzeSlW"}},"method":"GET"},"component":"http@Request"},{"params":{"csv":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"prevResult"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-functions@CSVParse"},{"params":{"array":{"params":{"array":{"params":{"array":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"prevResult.data"}}},"component":"data2-core-types@Reference"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"f"}}],"body":{"params":{"compare":{"params":{"comparisonSubject":{"params":{},"component":"data2-core-primitives@Undefined"},"subject":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"query.CD_SETOR"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-comparison-operators@Equal"},"then":{"params":{"content":true},"component":"data2-core-primitives@Boolean"},"else":{"params":{"comparisonSubject":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"f.CD_SETOR"}}},"component":"data2-core-types@Reference"},"subject":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"query.CD_SETOR"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-comparison-operators@Equal"}},"component":"data2-core-flow@If"}}}},"component":"data2-core-functions@ArrayFilter"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"f"}}],"body":{"params":{"compare":{"params":{"comparisonSubject":{"params":{},"component":"data2-core-primitives@Undefined"},"subject":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"query.b"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-comparison-operators@Equal"},"then":{"params":{"content":true},"component":"data2-core-primitives@Boolean"},"else":{"params":{"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"ff"}}],"body":{"params":{"subject":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"f.MUNICIPIO"}}},"component":"data2-core-types@Reference"},"comparisonSubject":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"ff"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-comparison-operators@Equal"}}},"array":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"query.b"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-functions@ArrayFind"}},"component":"data2-core-flow@If"}}}},"component":"data2-core-functions@ArrayFilter"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"f"}}],"body":{"params":{"compare":{"params":{"comparisonSubject":{"params":{},"component":"data2-core-primitives@Undefined"},"subject":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"query.a"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-comparison-operators@Equal"},"then":{"params":{"content":true},"component":"data2-core-primitives@Boolean"},"else":{"params":{"subject":{"params":{"subject":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"f.CD_SETOR"}}},"component":"data2-core-types@Reference"},"comparisonSubject":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"query.a"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-comparison-operators@Equal"}},"component":"data2-core-logical-operators@Not"}},"component":"data2-core-flow@If"}}}},"component":"data2-core-functions@ArrayFilter"},{"records":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"prevResult"}}},"component":"data2-core-types@Reference"},"count":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"prevResult.length"}}},"component":"data2-core-types@Reference"}}]},"component":"data2-core-flow@Series"},"policies":[{"component":"data2-core-types@PolicyReference","params":{"allow":{"component":"data2-core-auth@InvokedByBuilder","params":{}}}}]},"reference":"KugnlUKJX2XGPnuL8YCnj","updatedAt":"2026-08-06T16:47:18.772Z","createdAt":"2026-07-30T13:10:49.885Z"},{"_id":"6a6b50226dd0259eb0b8fc3f","displayName":"sectors-of-municipios","component":"data2-core@DataSet","system":"6a57cfe9673eb7e3c5e57784","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"RCNSJz611z4PJMwRKk0Al"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"pagination":{"size":20},"filter":{"params":{"MUNICIPIO":{"in":{"component":"data2-core-primitives@String","params":{"content":"---"}}}},"component":"data2-core-types@DataSetFilter"},"policies":[{"component":"data2-core-types@PolicyReference","params":{"allow":{"component":"data2-core-auth@InvokedByBuilder","params":{}}}}]},"reference":"UI2RIyzH2ZnVnYlZtETzi","updatedAt":"2026-08-06T16:47:21.447Z","createdAt":"2026-07-30T13:23:30.655Z"},{"_id":"6a6c306417b8ebd6c23e2daf","displayName":"simulador-setores-destino","component":"data2-core@DataSet","system":"6a57cfe9673eb7e3c5e57784","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"KugnlUKJX2XGPnuL8YCnj"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"policies":[{"component":"data2-core-types@PolicyReference","params":{"allow":{"component":"data2-core-auth@InvokedByBuilder","params":{}}}}]},"reference":"umJZo_TTyw0E3lOwBNmk2","updatedAt":"2026-08-06T16:47:27.058Z","createdAt":"2026-07-31T05:20:18.033Z"},{"_id":"6a6c311217b8ebd6c23e2db0","displayName":"map store","component":"data2-core@Store","system":"6a57cfe9673eb7e3c5e57784","params":{},"reference":"ziIl3zJpxF2x8qsRQy10a","updatedAt":"2026-07-31T05:23:16.856Z","createdAt":"2026-07-31T05:23:11.955Z"},{"_id":"6a7240510a6d3b3e0d299411","displayName":"Databricks Probe Token (natura-x-app)","component":"data2-core-id@KeyVault","system":"6a57cfe9673eb7e3c5e57784","params":{"keys":[{"name":"GEOMARKETING_PROBE_TOKEN","value":"nW0mAVZZ84RLeniI0DUvkXSKHugHgTy07M8GyIYeATPYAjgZ5aEI+u07vnU59CCZ5njiQKzp/Wbsi7HsVSQ7gghWgs2OaU2cJIDnWjwJdzVfIDJRHyAbRq7xkHswjEqMzg7q0NjsVfCF7oqK06Y/omNDVF4cd7E/hJxgsxDfNEwcSE65F4ewZYqBIzVYaJmV7qx87pQ05jVuo4l4iNYyWI2XwCFQOSvdyl49Gsyrm8JVpXeQkJF4JOOPXIPtkYTWIygs8KdsKMimRAB5D7abSFfhoQeQ+pvU+E4zlyjSs6A8oG5kNlOmhwjnP4FXHnEMIiUFcVkdyT2YidQvTpse2RVPBi70za/uoZLHplBEI/rzqT2QcU1udVFIEZo6yDC4P9WE5gOs62vGbSRgQBJuib9z4D9boznAKN3HBifiDnocAuwx1meov3dZRgthzrNhGQE/J6xz0KX2eG6QMP1Y3jd3ILLB4//CvhVZDV7gCDINRjHKf4Gq5hwAh6l5CspQSqKnT109qzMbTDiO7O8A/8jssSbt4CmTVm7P3OQqDL/jjEehDs5GHlkeg7rbxbX90R26xMX96ZH63sgUJIvGXwOm0OaJops2jhPfdiLTWVJDg2z9whT/DCDm8z3xeAC/QYxK89QCl0qPgmyO3GI+D5o/wo/kIgHvx1DU/1K9qLg="}]},"reference":"keyvault-HwPHTveDB-1SF3LoQhpJ2","updatedAt":"2026-08-04T19:41:05.862Z","createdAt":"2026-08-04T19:41:05.862Z"},{"_id":"6a7240aab368d4f982f83d65","displayName":"[Data2] Table for Rush HTTPListener AwW_11Nkg-dKksP7ic8V8","component":"data2-core@Data2TableDataSource","system":"6a57cfe9673eb7e3c5e57784","params":{"table":{"component":"data2-core-primitives@String","params":{"content":"d2-rush-http-logs--AwW_11Nkg-dKksP7ic8V8"}},"multi":["create"],"useEstimatedDocumentCount":true},"reference":"d2-rush-http-logs--AwW_11Nkg-dKksP7ic8V8","type":"logs","updatedAt":"2026-08-04T19:42:34.100Z","createdAt":"2026-08-04T19:42:34.100Z"},{"_id":"6a7240aa9995499d32f99ceb","displayName":"[Data2] DataSet to read logs for Rush HTTPListener AwW_11Nkg-dKksP7ic8V8","component":"data2-core@DataSet","system":"6a57cfe9673eb7e3c5e57784","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"d2-rush-http-logs--AwW_11Nkg-dKksP7ic8V8"}},"pagination":{"size":20},"sort":{"_id":-1},"policies":[{"component":"data2-core-auth@Policy","params":{"deny":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"patch"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"remove"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"find"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"params":{"module":{"params":{"reference":"environment.layers.HostApplicationLayer"},"component":"data2-core-types@Reference"},"prop":{"component":"data2-core-primitives@String","params":{"content":"getProcess"}},"args":[{"component":"data2-core-primitives@String","params":{"content":"Data2BuilderAuthentication"}}]},"component":"data2-core-types@Getter"},"prop":{"component":"data2-core-primitives@String","params":{"content":"getSelectedSession"}}}}},"component":"data2-core-logical-operators@Not"}]},"component":"data2-core-logical-operators@And","displayName":"Read - Deny non builder user"}]},"component":"data2-core-logical-operators@Or"}}}]},"reference":"AwW_11Nkg-dKksP7ic8V8LogReadDataSet","type":"logs","updatedAt":"2026-08-04T19:42:34.218Z","createdAt":"2026-08-04T19:42:34.218Z"},{"_id":"6a7240aa6ebea53ab94dc3e2","displayName":"[Data2] DataSet to insert logs for Rush HTTPListener AwW_11Nkg-dKksP7ic8V8","component":"data2-core@DataSet","system":"6a57cfe9673eb7e3c5e57784","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"d2-rush-http-logs--AwW_11Nkg-dKksP7ic8V8"}},"pagination":{"size":0},"policies":[{"component":"data2-core-auth@Policy","params":{"deny":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"patch"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"remove"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"find"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"params":{"module":{"params":{"reference":"environment.layers.HostApplicationLayer"},"component":"data2-core-types@Reference"},"prop":{"component":"data2-core-primitives@String","params":{"content":"getProcess"}},"args":[{"component":"data2-core-primitives@String","params":{"content":"Data2BuilderAuthentication"}}]},"component":"data2-core-types@Getter"},"prop":{"component":"data2-core-primitives@String","params":{"content":"getSelectedSession"}}}}},"component":"data2-core-logical-operators@Not"}]},"component":"data2-core-logical-operators@And","displayName":"Read - Deny non builder user"}]},"component":"data2-core-logical-operators@Or"}}}]},"reference":"AwW_11Nkg-dKksP7ic8V8LogInsertDataSet","type":"logs","updatedAt":"2026-08-04T19:42:34.852Z","createdAt":"2026-08-04T19:42:34.852Z"},{"_id":"6a73b4fd1204b3d36b62e37e","displayName":"Geomarketing Timeline Sessions","component":"data2-core@Data2TableDataSource","system":"6a57cfe9673eb7e3c5e57784","params":{"table":"geo-timeline-sessions","schema":[{"component":"data2-core-types@Field","params":{"key":"label","title":"Nome","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"snapshotRaw","title":"Snapshot (raw)","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"snapLiteral","title":"Snapshot (SQL literal)","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"eloMaxCycle","title":"Ciclo maximo ELO","component":"data2-core-primitives@Number"}},{"component":"data2-core-types@Field","params":{"key":"movements","title":"Movimentos","component":"data2-core-primitives@Array"}},{"component":"data2-core-types@Field","params":{"key":"createdAt","title":"Criado em","component":"data2-core-primitives@Date"}},{"component":"data2-core-types@Field","params":{"key":"updatedAt","title":"Atualizado em","component":"data2-core-primitives@Date"}},{"component":"data2-core-types@Field","params":{"key":"settings","title":"Configuracoes da sessao","component":"data2-core-primitives@Object"}}],"policies":[{"component":"data2-core-auth@Policy","params":{"authenticationStrategy":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"timelineSimAuthFinal"}}}},{"component":"data2-core-auth@BuilderPolicy","params":{}}]},"reference":"geo-timeline-sessions","updatedAt":"2026-08-06T18:01:48.967Z","createdAt":"2026-08-05T22:11:09.878Z"},{"_id":"6a73b4fe95b7c25ed7cf54ee","displayName":"Geomarketing Timeline Sessions","component":"data2-core@DataSet","system":"6a57cfe9673eb7e3c5e57784","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"geo-timeline-sessions"}},"policies":[{"component":"data2-core-auth@Policy","params":{"authenticationStrategy":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"timelineSimAuthFinal"}}}},{"component":"data2-core-auth@BuilderPolicy","params":{}}]},"reference":"geo-timeline-sessionsDataSet","updatedAt":"2026-08-06T18:01:48.828Z","createdAt":"2026-08-05T22:11:10.008Z"},{"_id":"6a74ae1b8bf67595bba6dcfb","displayName":"Ventura — Usuários","component":"data2-core@Data2TableDataSource","system":"6a57cfe9673eb7e3c5e57784","params":{"table":"timeline-sim-users","schema":[{"component":"data2-core-types@Field","params":{"key":"nome","title":"Nome","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"email","title":"E-mail","component":"data2-core-primitives@String","required":true}},{"component":"data2-core-types@Field","params":{"key":"password","title":"Senha","component":"data2-core-types@Password","required":true}},{"component":"data2-core-types@Field","params":{"key":"role","title":"Perfil","component":"data2-core-primitives@String"}}]},"reference":"timeline-sim-users","updatedAt":"2026-08-14T15:22:23.361Z","createdAt":"2026-08-06T15:54:03.538Z"},{"_id":"6a74ae1b15209eb021fc9c07","displayName":"Ventura — Todos usuários ds","component":"data2-core@DataSet","system":"6a57cfe9673eb7e3c5e57784","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"timeline-sim-users"}},"policies":[{"component":"data2-core-auth@RushPolicy","params":{"rushes":{"allow":[],"deny":[]},"systems":{"allow":[],"deny":[]}}},{"component":"data2-core-auth@BuilderPolicy","params":{}}]},"reference":"timeline-sim-usersDataSet","updatedAt":"2026-08-14T15:22:35.966Z","createdAt":"2026-08-06T15:54:03.636Z"},{"_id":"6a74ae2663667431f75e45b2","displayName":"Ventura Auth","component":"data2-core@AuthenticationStrategy","system":"6a57cfe9673eb7e3c5e57784","params":{"verifier":{"component":"data2-core-types@DataSetReference","params":{"reference":"AEKK_Z4OsZ2njfQxg7tS6"}},"credentials":[{"component":"data2-core-types@FieldReference","params":{"key":"email"}},{"component":"data2-core-types@FieldReference","params":{"key":"password"}}],"email":{"params":{"column":"email"},"component":"data2-core-types@DataSetColumnReference"},"password":{"params":{"column":"password"},"component":"data2-core-types@DataSetColumnReference"}},"reference":"timelineSimAuthFinal","updatedAt":"2026-08-14T15:25:44.883Z","createdAt":"2026-08-06T15:54:14.875Z"},{"_id":"6a74b5a3a3c269c78fe7bf7c","displayName":"Timeline Shared Sessions","component":"data2-core@Data2TableDataSource","system":"6a57cfe9673eb7e3c5e57784","params":{"table":"timeline-shared-sessions","schema":[{"component":"data2-core-types@Field","params":{"key":"label","title":"Nome da sessao","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"snapshotRaw","title":"Snapshot congelado","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"settings","title":"Regras da sessao","component":"data2-core-primitives@Object"}},{"component":"data2-core-types@Field","params":{"key":"stages","title":"Etapas (display model)","component":"data2-core-primitives@Array"}},{"component":"data2-core-types@Field","params":{"key":"summary","title":"Resumo","component":"data2-core-primitives@Object"}},{"component":"data2-core-types@Field","params":{"key":"sharedBy","title":"Compartilhado por","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"sharedAt","title":"Compartilhado em","component":"data2-core-primitives@Date"}},{"component":"data2-core-types@Field","params":{"key":"snapLiteral","title":"Snapshot (SQL literal)","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"eloMaxCycle","title":"Ciclo maximo ELO","component":"data2-core-primitives@Number"}},{"component":"data2-core-types@Field","params":{"key":"movements","title":"Movimentos","component":"data2-core-primitives@Array"}},{"component":"data2-core-types@Field","params":{"key":"createdAt","title":"Criado em","component":"data2-core-primitives@Date"}},{"component":"data2-core-types@Field","params":{"key":"updatedAt","title":"Atualizado em","component":"data2-core-primitives@Date"}}],"policies":[{"component":"data2-core-auth@Policy","params":{"authenticationStrategy":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"timelineSimAuthFinal"}}}},{"component":"data2-core-auth@BuilderPolicy","params":{}}]},"reference":"timeline-shared-sessions","updatedAt":"2026-08-06T20:45:34.979Z","createdAt":"2026-08-06T16:26:11.428Z"},{"_id":"6a74b5a363667431f75e53d9","displayName":"Timeline Shared Sessions","component":"data2-core@DataSet","system":"6a57cfe9673eb7e3c5e57784","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"timeline-shared-sessions"}},"policies":[{"component":"data2-core-auth@Policy","params":{"authenticationStrategy":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"timelineSimAuthFinal"}}}},{"component":"data2-core-auth@BuilderPolicy","params":{}}]},"reference":"timeline-shared-sessionsDataSet","updatedAt":"2026-08-06T18:01:49.273Z","createdAt":"2026-08-06T16:26:11.546Z"},{"_id":"6a74bb3c32c4b185b93738ce","displayName":"Ventura — Usuário verifier ds","component":"data2-core@DataSet","system":"6a57cfe9673eb7e3c5e57784","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"timeline-sim-users"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"pagination":{"size":20}},"reference":"AEKK_Z4OsZ2njfQxg7tS6","updatedAt":"2026-08-14T15:22:55.925Z","createdAt":"2026-08-06T16:49:00.573Z"},{"_id":"6a7c812c8157bd3190aac387","displayName":"[Data2] Table for Rush HTTPListener overpassRoads","component":"data2-core@Data2TableDataSource","system":"6a57cfe9673eb7e3c5e57784","params":{"table":{"component":"data2-core-primitives@String","params":{"content":"d2-rush-http-logs--overpassRoads"}},"multi":["create"],"useEstimatedDocumentCount":true},"reference":"d2-rush-http-logs--overpassRoads","type":"logs","updatedAt":"2026-08-12T14:20:28.176Z","createdAt":"2026-08-12T14:20:28.176Z","deleteMetadata":{}},{"_id":"6a7c812c8157bd3190aac38c","displayName":"[Data2] DataSet to read logs for Rush HTTPListener overpassRoads","component":"data2-core@DataSet","system":"6a57cfe9673eb7e3c5e57784","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"d2-rush-http-logs--overpassRoads"}},"pagination":{"size":20},"sort":{"_id":-1},"policies":[{"component":"data2-core-auth@Policy","params":{"deny":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"patch"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"remove"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"find"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"params":{"module":{"params":{"reference":"environment.layers.HostApplicationLayer"},"component":"data2-core-types@Reference"},"prop":{"component":"data2-core-primitives@String","params":{"content":"getProcess"}},"args":[{"component":"data2-core-primitives@String","params":{"content":"Data2BuilderAuthentication"}}]},"component":"data2-core-types@Getter"},"prop":{"component":"data2-core-primitives@String","params":{"content":"getSelectedSession"}}}}},"component":"data2-core-logical-operators@Not"}]},"component":"data2-core-logical-operators@And","displayName":"Read - Deny non builder user"}]},"component":"data2-core-logical-operators@Or"}}}]},"reference":"overpassRoadsLogReadDataSet","type":"logs","updatedAt":"2026-08-12T14:20:28.401Z","createdAt":"2026-08-12T14:20:28.401Z","deleteMetadata":{}},{"_id":"6a7c812c7c3ad3f0fdbc2f03","displayName":"[Data2] DataSet to insert logs for Rush HTTPListener overpassRoads","component":"data2-core@DataSet","system":"6a57cfe9673eb7e3c5e57784","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"d2-rush-http-logs--overpassRoads"}},"pagination":{"size":0},"policies":[{"component":"data2-core-auth@Policy","params":{"deny":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"patch"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"remove"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$method"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"find"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"params":{"module":{"params":{"reference":"environment.layers.HostApplicationLayer"},"component":"data2-core-types@Reference"},"prop":{"component":"data2-core-primitives@String","params":{"content":"getProcess"}},"args":[{"component":"data2-core-primitives@String","params":{"content":"Data2BuilderAuthentication"}}]},"component":"data2-core-types@Getter"},"prop":{"component":"data2-core-primitives@String","params":{"content":"getSelectedSession"}}}}},"component":"data2-core-logical-operators@Not"}]},"component":"data2-core-logical-operators@And","displayName":"Read - Deny non builder user"}]},"component":"data2-core-logical-operators@Or"}}}]},"reference":"overpassRoadsLogInsertDataSet","type":"logs","updatedAt":"2026-08-12T14:20:28.492Z","createdAt":"2026-08-12T14:20:28.492Z","deleteMetadata":{}}]}},{"reference":"UsersSystemsDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"reference":"BundlesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"reference":"WorkspaceInstancesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"reference":"CustomDomainsTable","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"reference":"WorkspacesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"reference":"SystemAccessDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"reference":"n5c1QXCr2tLnpGEOAAw8p","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"reference":"6cWacdzSi8_bvYvdaFjr8","component":"data2-core@MemoryDataSource","params":{"initialData":[]}}],"processesParams":{}}}}